From ae805a0bcfd970323e016492cc7d76836e9f8d59 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Sat, 29 Sep 2018 09:16:49 -0500 Subject: [PATCH 001/448] Improve README.md (#5331) - `
` and `
+

+
How big is it? @@ -1659,6 +1722,8 @@ A small Next main bundle is around 65kb gzipped.
+

+
Is this like `create-react-app`? @@ -1678,12 +1743,16 @@ If you want to create re-usable React components that you can embed in your Next
+

+
How do I use CSS-in-JS solutions? Next.js bundles [styled-jsx](https://github.com/zeit/styled-jsx) supporting scoped css. However you can use any CSS-in-JS solution in your Next app by just including your favorite library [as mentioned before](#css-in-js) in the document.
+

+
What syntactic features are transpiled? How do I change them? @@ -1693,6 +1762,8 @@ See the documentation about [customizing the babel config](#customizing-babel-c
+

+
Why a new Router? @@ -1711,6 +1782,8 @@ We tested the flexibility of the routing with some interesting scenarios. For an
+

+
How do I define a custom fancy route? @@ -1719,12 +1792,16 @@ We [added](#custom-server-and-routing) the ability to map between an arbitrary U On the client side, we have a parameter call `as` on `` that _decorates_ the URL differently from the URL it _fetches_.
+

+
How do I fetch data? It’s up to you. `getInitialProps` is an `async` function (or a regular function that returns a `Promise`). It can retrieve data from anywhere.
+

+
Can I use it with GraphQL? @@ -1732,18 +1809,24 @@ Yes! Here's an example with [Apollo](./examples/with-apollo).
+

+
Can I use it with Redux? Yes! Here's an [example](./examples/with-redux)
+

+
Can I use Next with my favorite Javascript library or toolkit? Since our first release we've had **many** example contributions, you can check them out in the [examples](./examples) directory
+

+
What is this inspired by? @@ -1757,6 +1840,8 @@ As we were researching options for server-rendering React that didn’t involve
+

+ ## Contributing Please see our [contributing.md](./contributing.md) From b1c4f3aec4ca2d51b0ed849914cc8fc97805740a Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 1 Oct 2018 01:02:10 +0200 Subject: [PATCH 002/448] Monorepo (#5341) - Implements Lerna - Moves all source code into `packages/next` - Keeps integration tests in the root directory --- .circleci/config.yml | 1 + .flowconfig | 3 - .travis.yml | 1 + appveyor.yml | 1 + lerna.json | 14 ++ package.json | 128 +++--------------- packages/next/.flowconfig | 2 + README.md => packages/next/README.md | 0 app.js => packages/next/app.js | 0 asset.js => packages/next/asset.js | 0 .babelrc.js => packages/next/babel.config.js | 0 babel.js => packages/next/babel.js | 0 {bin => packages/next/bin}/next | 0 {bin => packages/next/bin}/next-build | 0 {bin => packages/next/bin}/next-dev | 0 {bin => packages/next/bin}/next-export | 0 {bin => packages/next/bin}/next-init | 0 {bin => packages/next/bin}/next-start | 0 .../babel/plugins/react-loadable-plugin.js | 0 .../next/build}/babel/preset.js | 0 {build => packages/next/build}/index.js | 0 {build => packages/next/build}/webpack.js | 0 .../webpack/loaders/emit-file-loader.js | 0 .../webpack/loaders/hot-self-accept-loader.js | 0 .../webpack/loaders/next-babel-loader.js | 0 .../webpack/plugins/build-manifest-plugin.js | 0 .../webpack/plugins/chunk-names-plugin.js | 0 .../nextjs-require-cache-hot-reloader.js | 0 .../webpack/plugins/nextjs-ssr-import.js | 0 .../plugins/nextjs-ssr-module-cache.js | 0 .../webpack/plugins/pages-manifest-plugin.js | 0 .../build}/webpack/plugins/pages-plugin.js | 0 .../webpack/plugins/react-loadable-plugin.js | 0 .../webpack/plugins/unlink-file-plugin.js | 0 .../next/build}/webpack/utils.js | 0 client.js => packages/next/client.js | 0 .../client}/dev-error-overlay/eventsource.js | 0 .../format-webpack-messages.js | 0 .../dev-error-overlay/hot-dev-client.js | 0 .../next/client}/error-boundary.js | 0 .../next/client}/head-manager.js | 0 {client => packages/next/client}/index.js | 0 {client => packages/next/client}/next-dev.js | 0 {client => packages/next/client}/next.js | 0 {client => packages/next/client}/noop.js | 0 .../next/client}/on-demand-entries-client.js | 0 .../next/client}/source-map-support.js | 0 .../client}/webpack-hot-middleware-client.js | 0 config.js => packages/next/config.js | 0 constants.js => packages/next/constants.js | 0 .../next/contributing.md | 0 document.js => packages/next/document.js | 0 dynamic.js => packages/next/dynamic.js | 0 error.js => packages/next/error.js | 0 {export => packages/next/export}/index.js | 0 .../npm/autodll-webpack-plugin_vx.x.x.js | 0 .../next/flow-typed}/npm/glob_vx.x.x.js | 0 .../flow-typed}/npm/loader-utils_vx.x.x.js | 0 .../npm/react-lifecycles-compat_vx.x.x.js | 0 .../next/flow-typed}/npm/source-map_vx.x.x.js | 0 .../npm/terser-webpack-plugin_vx.x.x.js | 0 .../npm/uglifyjs-webpack-plugin_vx.x.x.js | 0 .../next/flow-typed}/npm/unfetch_vx.x.x.js | 0 .../flow-typed}/npm/webpack-sources_vx.x.x.js | 0 .../next/flow-typed}/npm/webpack_vx.x.x.js | 0 .../next/flow-typed}/npm/webpackbar_vx.x.x.js | 0 .../npm/write-file-webpack-plugin_vx.x.x.js | 0 head.js => packages/next/head.js | 0 {lib => packages/next/lib}/EventEmitter.js | 0 {lib => packages/next/lib}/app.js | 0 {lib => packages/next/lib}/asset.js | 0 {lib => packages/next/lib}/constants.js | 0 {lib => packages/next/lib}/dynamic.js | 0 {lib => packages/next/lib}/error-debug.js | 0 {lib => packages/next/lib}/error.js | 0 {lib => packages/next/lib}/head.js | 0 {lib => packages/next/lib}/link.js | 0 .../next/lib}/loadable-capture.js | 0 {lib => packages/next/lib}/loadable.js | 0 {lib => packages/next/lib}/p-queue.js | 0 {lib => packages/next/lib}/page-loader.js | 0 {lib => packages/next/lib}/promisify.js | 0 {lib => packages/next/lib}/router/index.js | 0 {lib => packages/next/lib}/router/router.js | 0 .../next/lib}/router/with-router.js | 0 {lib => packages/next/lib}/runtime-config.js | 0 {lib => packages/next/lib}/shallow-equals.js | 0 {lib => packages/next/lib}/side-effect.js | 0 {lib => packages/next/lib}/utils.js | 0 license.md => packages/next/license.md | 0 link.js => packages/next/link.js | 0 packages/next/package.json | 114 ++++++++++++++++ {pages => packages/next/pages}/_app.js | 0 {pages => packages/next/pages}/_document.js | 0 {pages => packages/next/pages}/_error.js | 0 prefetch.js => packages/next/prefetch.js | 0 router.js => packages/next/router.js | 0 {server => packages/next/server}/config.js | 0 {server => packages/next/server}/document.js | 0 .../next/server}/hot-reloader.js | 0 .../server}/lib/error-overlay-middleware.js | 0 .../next/server}/lib/path-match.js | 0 .../next/server}/lib/start-server.js | 0 {server => packages/next/server}/lib/utils.js | 0 .../next/server}/next-dev-server.js | 0 .../next/server}/next-server.js | 0 {server => packages/next/server}/next.js | 0 .../next/server}/on-demand-entry-handler.js | 0 {server => packages/next/server}/render.js | 0 {server => packages/next/server}/require.js | 0 {server => packages/next/server}/router.js | 0 {server => packages/next/server}/utils.js | 0 .../next/taskfile-babel.js | 0 packages/next/taskfile.js | 68 ++++++++++ readme.md | 1 + taskfile.js | 91 ++----------- test/integration/basic/test/rendering.js | 1 - test/isolated/require-page.test.js | 2 +- test/isolated/webpack-utils.test.js | 2 +- test/lib/next-test-utils.js | 2 +- test/node_modules/next | 2 +- test/unit/EventEmitter.test.js | 2 +- test/unit/getDisplayName.test.js | 2 +- test/unit/loadGetInitialProps.test.js | 2 +- 124 files changed, 242 insertions(+), 197 deletions(-) delete mode 100644 .flowconfig create mode 100644 lerna.json create mode 100644 packages/next/.flowconfig rename README.md => packages/next/README.md (100%) rename app.js => packages/next/app.js (100%) rename asset.js => packages/next/asset.js (100%) rename .babelrc.js => packages/next/babel.config.js (100%) rename babel.js => packages/next/babel.js (100%) rename {bin => packages/next/bin}/next (100%) rename {bin => packages/next/bin}/next-build (100%) rename {bin => packages/next/bin}/next-dev (100%) rename {bin => packages/next/bin}/next-export (100%) rename {bin => packages/next/bin}/next-init (100%) rename {bin => packages/next/bin}/next-start (100%) rename {build => packages/next/build}/babel/plugins/react-loadable-plugin.js (100%) rename {build => packages/next/build}/babel/preset.js (100%) rename {build => packages/next/build}/index.js (100%) rename {build => packages/next/build}/webpack.js (100%) rename {build => packages/next/build}/webpack/loaders/emit-file-loader.js (100%) rename {build => packages/next/build}/webpack/loaders/hot-self-accept-loader.js (100%) rename {build => packages/next/build}/webpack/loaders/next-babel-loader.js (100%) rename {build => packages/next/build}/webpack/plugins/build-manifest-plugin.js (100%) rename {build => packages/next/build}/webpack/plugins/chunk-names-plugin.js (100%) rename {build => packages/next/build}/webpack/plugins/nextjs-require-cache-hot-reloader.js (100%) rename {build => packages/next/build}/webpack/plugins/nextjs-ssr-import.js (100%) rename {build => packages/next/build}/webpack/plugins/nextjs-ssr-module-cache.js (100%) rename {build => packages/next/build}/webpack/plugins/pages-manifest-plugin.js (100%) rename {build => packages/next/build}/webpack/plugins/pages-plugin.js (100%) rename {build => packages/next/build}/webpack/plugins/react-loadable-plugin.js (100%) rename {build => packages/next/build}/webpack/plugins/unlink-file-plugin.js (100%) rename {build => packages/next/build}/webpack/utils.js (100%) rename client.js => packages/next/client.js (100%) rename {client => packages/next/client}/dev-error-overlay/eventsource.js (100%) rename {client => packages/next/client}/dev-error-overlay/format-webpack-messages.js (100%) rename {client => packages/next/client}/dev-error-overlay/hot-dev-client.js (100%) rename {client => packages/next/client}/error-boundary.js (100%) rename {client => packages/next/client}/head-manager.js (100%) rename {client => packages/next/client}/index.js (100%) rename {client => packages/next/client}/next-dev.js (100%) rename {client => packages/next/client}/next.js (100%) rename {client => packages/next/client}/noop.js (100%) rename {client => packages/next/client}/on-demand-entries-client.js (100%) rename {client => packages/next/client}/source-map-support.js (100%) rename {client => packages/next/client}/webpack-hot-middleware-client.js (100%) rename config.js => packages/next/config.js (100%) rename constants.js => packages/next/constants.js (100%) rename contributing.md => packages/next/contributing.md (100%) rename document.js => packages/next/document.js (100%) rename dynamic.js => packages/next/dynamic.js (100%) rename error.js => packages/next/error.js (100%) rename {export => packages/next/export}/index.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/autodll-webpack-plugin_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/glob_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/loader-utils_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/react-lifecycles-compat_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/source-map_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/terser-webpack-plugin_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/uglifyjs-webpack-plugin_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/unfetch_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/webpack-sources_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/webpack_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/webpackbar_vx.x.x.js (100%) rename {flow-typed => packages/next/flow-typed}/npm/write-file-webpack-plugin_vx.x.x.js (100%) rename head.js => packages/next/head.js (100%) rename {lib => packages/next/lib}/EventEmitter.js (100%) rename {lib => packages/next/lib}/app.js (100%) rename {lib => packages/next/lib}/asset.js (100%) rename {lib => packages/next/lib}/constants.js (100%) rename {lib => packages/next/lib}/dynamic.js (100%) rename {lib => packages/next/lib}/error-debug.js (100%) rename {lib => packages/next/lib}/error.js (100%) rename {lib => packages/next/lib}/head.js (100%) rename {lib => packages/next/lib}/link.js (100%) rename {lib => packages/next/lib}/loadable-capture.js (100%) rename {lib => packages/next/lib}/loadable.js (100%) rename {lib => packages/next/lib}/p-queue.js (100%) rename {lib => packages/next/lib}/page-loader.js (100%) rename {lib => packages/next/lib}/promisify.js (100%) rename {lib => packages/next/lib}/router/index.js (100%) rename {lib => packages/next/lib}/router/router.js (100%) rename {lib => packages/next/lib}/router/with-router.js (100%) rename {lib => packages/next/lib}/runtime-config.js (100%) rename {lib => packages/next/lib}/shallow-equals.js (100%) rename {lib => packages/next/lib}/side-effect.js (100%) rename {lib => packages/next/lib}/utils.js (100%) rename license.md => packages/next/license.md (100%) rename link.js => packages/next/link.js (100%) create mode 100644 packages/next/package.json rename {pages => packages/next/pages}/_app.js (100%) rename {pages => packages/next/pages}/_document.js (100%) rename {pages => packages/next/pages}/_error.js (100%) rename prefetch.js => packages/next/prefetch.js (100%) rename router.js => packages/next/router.js (100%) rename {server => packages/next/server}/config.js (100%) rename {server => packages/next/server}/document.js (100%) rename {server => packages/next/server}/hot-reloader.js (100%) rename {server => packages/next/server}/lib/error-overlay-middleware.js (100%) rename {server => packages/next/server}/lib/path-match.js (100%) rename {server => packages/next/server}/lib/start-server.js (100%) rename {server => packages/next/server}/lib/utils.js (100%) rename {server => packages/next/server}/next-dev-server.js (100%) rename {server => packages/next/server}/next-server.js (100%) rename {server => packages/next/server}/next.js (100%) rename {server => packages/next/server}/on-demand-entry-handler.js (100%) rename {server => packages/next/server}/render.js (100%) rename {server => packages/next/server}/require.js (100%) rename {server => packages/next/server}/router.js (100%) rename {server => packages/next/server}/utils.js (100%) rename taskfile-babel.js => packages/next/taskfile-babel.js (100%) create mode 100644 packages/next/taskfile.js create mode 120000 readme.md diff --git a/.circleci/config.yml b/.circleci/config.yml index 4df30336..ae60df93 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,4 +7,5 @@ jobs: steps: - checkout - run: yarn install + - run: yarn bootstrap - run: yarn test diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 4d38b2da..00000000 --- a/.flowconfig +++ /dev/null @@ -1,3 +0,0 @@ -[ignore] -/examples/.* -/.*.json \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index f5ca2ee8..f67a0815 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ before_cache: [ "rm -rf node_modules/.cache" ], + before_script: ["npm run bootstrap"], after_script: ["npm run coveralls"], deploy: { provider: "npm", diff --git a/appveyor.yml b/appveyor.yml index 8ee5e51e..1c1d3269 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,6 +10,7 @@ install: - ps: Install-Product node $env:nodejs_version x64 # install modules - npm install + - npm run bootstrap # Post-install test scripts. test_script: diff --git a/lerna.json b/lerna.json new file mode 100644 index 00000000..825d36ff --- /dev/null +++ b/lerna.json @@ -0,0 +1,14 @@ +{ + "npmClient": "yarn", + "useWorkspaces": true, + "packages": [ + "packages/*" + ], + "command": { + "publish": { + "allowBranch": "canary", + "registry": "https://registry.npmjs.org/" + } + }, + "version": "0.0.0" +} diff --git a/package.json b/package.json index fc3cc078..be9e93f6 100644 --- a/package.json +++ b/package.json @@ -1,50 +1,26 @@ { - "name": "next", - "version": "7.0.1", - "description": "Minimalistic framework for server-rendered React applications", - "main": "./dist/server/next.js", - "license": "MIT", - "repository": "zeit/next.js", - "bugs": "https://github.com/zeit/next.js/issues", - "homepage": "https://github.com/zeit/next.js", - "files": [ - "dist", - "app.js", - "asset.js", - "babel.js", - "client.js", - "config.js", - "constants.js", - "document.js", - "dynamic.js", - "error.js", - "head.js", - "link.js", - "prefetch.js", - "router.js" + "name": "nextjs-project", + "private": true, + "workspaces": [ + "packages/*" ], - "bin": { - "next": "./dist/bin/next" - }, "scripts": { - "build": "taskr", - "release": "taskr release", + "lerna": "lerna", + "bootstrap": "lerna bootstrap", "pretestonly": "taskr pretest", "testonly": "cross-env NODE_PATH=test/lib jest \\.test.js", "posttestonly": "taskr posttest", "testall": "npm run testonly -- --coverage --forceExit --runInBand --verbose --bail", - "pretest": "npm run lint && npm run flow", + "pretest": "npm run lint", "test": "cross-env npm run testall || npm run testall", "coveralls": "nyc --instrument=false --source-map=false report --temp-directory=./coverage --reporter=text-lcov | coveralls", - "flow": "flow check", - "lint": "standard 'bin/*' 'client/**/*.js' 'examples/**/*.js' 'lib/**/*.js' 'pages/**/*.js' 'server/**/*.js' 'build/**/*.js' 'test/**/*.js'", - "prepublish": "npm run release", - "precommit": "lint-staged" + "precommit": "lint-staged", + "lint": "lerna run lint", + "prepublish": "lerna run prepublish" }, - "taskr": { - "requires": [ - "./taskfile-babel.js" - ] + "lint-staged": { + "*.js": "standard", + "bin/*": "standard" }, "standard": { "parser": "babel-eslint", @@ -55,73 +31,22 @@ "**/examples/with-mobx/**" ] }, - "lint-staged": { - "*.js": "standard", - "bin/*": "standard" - }, - "dependencies": { - "@babel/core": "7.0.0", - "@babel/plugin-proposal-class-properties": "7.0.0", - "@babel/plugin-proposal-object-rest-spread": "7.0.0", - "@babel/plugin-syntax-dynamic-import": "7.0.0", - "@babel/plugin-transform-runtime": "7.0.0", - "@babel/preset-env": "7.0.0", - "@babel/preset-react": "7.0.0", - "@babel/runtime": "7.0.0", - "@babel/runtime-corejs2": "7.0.0", - "@babel/template": "7.0.0", - "ansi-html": "0.0.7", - "autodll-webpack-plugin": "0.4.2", - "babel-core": "7.0.0-bridge.0", - "babel-loader": "8.0.2", - "babel-plugin-react-require": "3.0.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.15", - "case-sensitive-paths-webpack-plugin": "2.1.2", - "cross-spawn": "5.1.0", - "del": "3.0.0", - "etag": "1.8.1", - "event-source-polyfill": "0.0.12", - "find-up": "2.1.0", - "fresh": "0.5.2", - "friendly-errors-webpack-plugin": "1.7.0", - "glob": "7.1.2", - "hoist-non-react-statics": "2.5.5", - "htmlescape": "1.1.1", - "http-errors": "1.6.2", - "http-status": "1.0.1", - "launch-editor": "2.2.1", - "loader-utils": "1.1.0", - "minimist": "1.2.0", - "mkdirp-then": "1.2.0", - "nanoid": "1.2.1", - "path-to-regexp": "2.1.0", - "prop-types": "15.6.2", - "prop-types-exact": "1.2.0", - "react-error-overlay": "4.0.0", - "recursive-copy": "2.0.6", - "resolve": "1.5.0", - "send": "0.16.1", - "source-map": "0.5.7", - "strip-ansi": "3.0.1", - "styled-jsx": "3.1.0", - "terser-webpack-plugin": "1.0.2", - "unfetch": "3.0.0", - "url": "0.11.0", - "webpack": "4.20.2", - "webpack-dev-middleware": "3.4.0", - "webpack-hot-middleware": "2.22.3", - "webpack-sources": "1.2.0", - "webpackbar": "2.6.3", - "write-file-webpack-plugin": "4.3.2" + "jest": { + "testEnvironment": "node", + "roots": [ + "test/" + ] }, "devDependencies": { - "@babel/preset-flow": "7.0.0", + "@babel/plugin-proposal-object-rest-spread": "7.0.0", + "@babel/preset-react": "7.0.0", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", "@zeit/next-css": "0.2.1-canary.1", "@zeit/next-sass": "0.2.1-canary.1", "@zeit/next-typescript": "1.1.0", + "babel-core": "7.0.0-bridge.0", "babel-eslint": "9.0.0", "babel-jest": "23.4.2", "babel-plugin-transform-define": "1.3.0", @@ -138,6 +63,7 @@ "get-port": "3.2.0", "husky": "0.14.3", "jest-cli": "21.2.0", + "lerna": "^3.4.0", "lint-staged": "4.2.3", "micro": "9.1.0", "mkdirp": "0.5.1", @@ -151,15 +77,5 @@ "standard": "11.0.1", "taskr": "1.1.0", "wd": "1.10.3" - }, - "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0" - }, - "jest": { - "testEnvironment": "node", - "roots": [ - "test/" - ] } } diff --git a/packages/next/.flowconfig b/packages/next/.flowconfig new file mode 100644 index 00000000..5183c2e1 --- /dev/null +++ b/packages/next/.flowconfig @@ -0,0 +1,2 @@ +[ignore] +/.*.json \ No newline at end of file diff --git a/README.md b/packages/next/README.md similarity index 100% rename from README.md rename to packages/next/README.md diff --git a/app.js b/packages/next/app.js similarity index 100% rename from app.js rename to packages/next/app.js diff --git a/asset.js b/packages/next/asset.js similarity index 100% rename from asset.js rename to packages/next/asset.js diff --git a/.babelrc.js b/packages/next/babel.config.js similarity index 100% rename from .babelrc.js rename to packages/next/babel.config.js diff --git a/babel.js b/packages/next/babel.js similarity index 100% rename from babel.js rename to packages/next/babel.js diff --git a/bin/next b/packages/next/bin/next similarity index 100% rename from bin/next rename to packages/next/bin/next diff --git a/bin/next-build b/packages/next/bin/next-build similarity index 100% rename from bin/next-build rename to packages/next/bin/next-build diff --git a/bin/next-dev b/packages/next/bin/next-dev similarity index 100% rename from bin/next-dev rename to packages/next/bin/next-dev diff --git a/bin/next-export b/packages/next/bin/next-export similarity index 100% rename from bin/next-export rename to packages/next/bin/next-export diff --git a/bin/next-init b/packages/next/bin/next-init similarity index 100% rename from bin/next-init rename to packages/next/bin/next-init diff --git a/bin/next-start b/packages/next/bin/next-start similarity index 100% rename from bin/next-start rename to packages/next/bin/next-start diff --git a/build/babel/plugins/react-loadable-plugin.js b/packages/next/build/babel/plugins/react-loadable-plugin.js similarity index 100% rename from build/babel/plugins/react-loadable-plugin.js rename to packages/next/build/babel/plugins/react-loadable-plugin.js diff --git a/build/babel/preset.js b/packages/next/build/babel/preset.js similarity index 100% rename from build/babel/preset.js rename to packages/next/build/babel/preset.js diff --git a/build/index.js b/packages/next/build/index.js similarity index 100% rename from build/index.js rename to packages/next/build/index.js diff --git a/build/webpack.js b/packages/next/build/webpack.js similarity index 100% rename from build/webpack.js rename to packages/next/build/webpack.js diff --git a/build/webpack/loaders/emit-file-loader.js b/packages/next/build/webpack/loaders/emit-file-loader.js similarity index 100% rename from build/webpack/loaders/emit-file-loader.js rename to packages/next/build/webpack/loaders/emit-file-loader.js diff --git a/build/webpack/loaders/hot-self-accept-loader.js b/packages/next/build/webpack/loaders/hot-self-accept-loader.js similarity index 100% rename from build/webpack/loaders/hot-self-accept-loader.js rename to packages/next/build/webpack/loaders/hot-self-accept-loader.js diff --git a/build/webpack/loaders/next-babel-loader.js b/packages/next/build/webpack/loaders/next-babel-loader.js similarity index 100% rename from build/webpack/loaders/next-babel-loader.js rename to packages/next/build/webpack/loaders/next-babel-loader.js diff --git a/build/webpack/plugins/build-manifest-plugin.js b/packages/next/build/webpack/plugins/build-manifest-plugin.js similarity index 100% rename from build/webpack/plugins/build-manifest-plugin.js rename to packages/next/build/webpack/plugins/build-manifest-plugin.js diff --git a/build/webpack/plugins/chunk-names-plugin.js b/packages/next/build/webpack/plugins/chunk-names-plugin.js similarity index 100% rename from build/webpack/plugins/chunk-names-plugin.js rename to packages/next/build/webpack/plugins/chunk-names-plugin.js diff --git a/build/webpack/plugins/nextjs-require-cache-hot-reloader.js b/packages/next/build/webpack/plugins/nextjs-require-cache-hot-reloader.js similarity index 100% rename from build/webpack/plugins/nextjs-require-cache-hot-reloader.js rename to packages/next/build/webpack/plugins/nextjs-require-cache-hot-reloader.js diff --git a/build/webpack/plugins/nextjs-ssr-import.js b/packages/next/build/webpack/plugins/nextjs-ssr-import.js similarity index 100% rename from build/webpack/plugins/nextjs-ssr-import.js rename to packages/next/build/webpack/plugins/nextjs-ssr-import.js diff --git a/build/webpack/plugins/nextjs-ssr-module-cache.js b/packages/next/build/webpack/plugins/nextjs-ssr-module-cache.js similarity index 100% rename from build/webpack/plugins/nextjs-ssr-module-cache.js rename to packages/next/build/webpack/plugins/nextjs-ssr-module-cache.js diff --git a/build/webpack/plugins/pages-manifest-plugin.js b/packages/next/build/webpack/plugins/pages-manifest-plugin.js similarity index 100% rename from build/webpack/plugins/pages-manifest-plugin.js rename to packages/next/build/webpack/plugins/pages-manifest-plugin.js diff --git a/build/webpack/plugins/pages-plugin.js b/packages/next/build/webpack/plugins/pages-plugin.js similarity index 100% rename from build/webpack/plugins/pages-plugin.js rename to packages/next/build/webpack/plugins/pages-plugin.js diff --git a/build/webpack/plugins/react-loadable-plugin.js b/packages/next/build/webpack/plugins/react-loadable-plugin.js similarity index 100% rename from build/webpack/plugins/react-loadable-plugin.js rename to packages/next/build/webpack/plugins/react-loadable-plugin.js diff --git a/build/webpack/plugins/unlink-file-plugin.js b/packages/next/build/webpack/plugins/unlink-file-plugin.js similarity index 100% rename from build/webpack/plugins/unlink-file-plugin.js rename to packages/next/build/webpack/plugins/unlink-file-plugin.js diff --git a/build/webpack/utils.js b/packages/next/build/webpack/utils.js similarity index 100% rename from build/webpack/utils.js rename to packages/next/build/webpack/utils.js diff --git a/client.js b/packages/next/client.js similarity index 100% rename from client.js rename to packages/next/client.js diff --git a/client/dev-error-overlay/eventsource.js b/packages/next/client/dev-error-overlay/eventsource.js similarity index 100% rename from client/dev-error-overlay/eventsource.js rename to packages/next/client/dev-error-overlay/eventsource.js diff --git a/client/dev-error-overlay/format-webpack-messages.js b/packages/next/client/dev-error-overlay/format-webpack-messages.js similarity index 100% rename from client/dev-error-overlay/format-webpack-messages.js rename to packages/next/client/dev-error-overlay/format-webpack-messages.js diff --git a/client/dev-error-overlay/hot-dev-client.js b/packages/next/client/dev-error-overlay/hot-dev-client.js similarity index 100% rename from client/dev-error-overlay/hot-dev-client.js rename to packages/next/client/dev-error-overlay/hot-dev-client.js diff --git a/client/error-boundary.js b/packages/next/client/error-boundary.js similarity index 100% rename from client/error-boundary.js rename to packages/next/client/error-boundary.js diff --git a/client/head-manager.js b/packages/next/client/head-manager.js similarity index 100% rename from client/head-manager.js rename to packages/next/client/head-manager.js diff --git a/client/index.js b/packages/next/client/index.js similarity index 100% rename from client/index.js rename to packages/next/client/index.js diff --git a/client/next-dev.js b/packages/next/client/next-dev.js similarity index 100% rename from client/next-dev.js rename to packages/next/client/next-dev.js diff --git a/client/next.js b/packages/next/client/next.js similarity index 100% rename from client/next.js rename to packages/next/client/next.js diff --git a/client/noop.js b/packages/next/client/noop.js similarity index 100% rename from client/noop.js rename to packages/next/client/noop.js diff --git a/client/on-demand-entries-client.js b/packages/next/client/on-demand-entries-client.js similarity index 100% rename from client/on-demand-entries-client.js rename to packages/next/client/on-demand-entries-client.js diff --git a/client/source-map-support.js b/packages/next/client/source-map-support.js similarity index 100% rename from client/source-map-support.js rename to packages/next/client/source-map-support.js diff --git a/client/webpack-hot-middleware-client.js b/packages/next/client/webpack-hot-middleware-client.js similarity index 100% rename from client/webpack-hot-middleware-client.js rename to packages/next/client/webpack-hot-middleware-client.js diff --git a/config.js b/packages/next/config.js similarity index 100% rename from config.js rename to packages/next/config.js diff --git a/constants.js b/packages/next/constants.js similarity index 100% rename from constants.js rename to packages/next/constants.js diff --git a/contributing.md b/packages/next/contributing.md similarity index 100% rename from contributing.md rename to packages/next/contributing.md diff --git a/document.js b/packages/next/document.js similarity index 100% rename from document.js rename to packages/next/document.js diff --git a/dynamic.js b/packages/next/dynamic.js similarity index 100% rename from dynamic.js rename to packages/next/dynamic.js diff --git a/error.js b/packages/next/error.js similarity index 100% rename from error.js rename to packages/next/error.js diff --git a/export/index.js b/packages/next/export/index.js similarity index 100% rename from export/index.js rename to packages/next/export/index.js diff --git a/flow-typed/npm/autodll-webpack-plugin_vx.x.x.js b/packages/next/flow-typed/npm/autodll-webpack-plugin_vx.x.x.js similarity index 100% rename from flow-typed/npm/autodll-webpack-plugin_vx.x.x.js rename to packages/next/flow-typed/npm/autodll-webpack-plugin_vx.x.x.js diff --git a/flow-typed/npm/glob_vx.x.x.js b/packages/next/flow-typed/npm/glob_vx.x.x.js similarity index 100% rename from flow-typed/npm/glob_vx.x.x.js rename to packages/next/flow-typed/npm/glob_vx.x.x.js diff --git a/flow-typed/npm/loader-utils_vx.x.x.js b/packages/next/flow-typed/npm/loader-utils_vx.x.x.js similarity index 100% rename from flow-typed/npm/loader-utils_vx.x.x.js rename to packages/next/flow-typed/npm/loader-utils_vx.x.x.js diff --git a/flow-typed/npm/react-lifecycles-compat_vx.x.x.js b/packages/next/flow-typed/npm/react-lifecycles-compat_vx.x.x.js similarity index 100% rename from flow-typed/npm/react-lifecycles-compat_vx.x.x.js rename to packages/next/flow-typed/npm/react-lifecycles-compat_vx.x.x.js diff --git a/flow-typed/npm/source-map_vx.x.x.js b/packages/next/flow-typed/npm/source-map_vx.x.x.js similarity index 100% rename from flow-typed/npm/source-map_vx.x.x.js rename to packages/next/flow-typed/npm/source-map_vx.x.x.js diff --git a/flow-typed/npm/terser-webpack-plugin_vx.x.x.js b/packages/next/flow-typed/npm/terser-webpack-plugin_vx.x.x.js similarity index 100% rename from flow-typed/npm/terser-webpack-plugin_vx.x.x.js rename to packages/next/flow-typed/npm/terser-webpack-plugin_vx.x.x.js diff --git a/flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js b/packages/next/flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js similarity index 100% rename from flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js rename to packages/next/flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js diff --git a/flow-typed/npm/unfetch_vx.x.x.js b/packages/next/flow-typed/npm/unfetch_vx.x.x.js similarity index 100% rename from flow-typed/npm/unfetch_vx.x.x.js rename to packages/next/flow-typed/npm/unfetch_vx.x.x.js diff --git a/flow-typed/npm/webpack-sources_vx.x.x.js b/packages/next/flow-typed/npm/webpack-sources_vx.x.x.js similarity index 100% rename from flow-typed/npm/webpack-sources_vx.x.x.js rename to packages/next/flow-typed/npm/webpack-sources_vx.x.x.js diff --git a/flow-typed/npm/webpack_vx.x.x.js b/packages/next/flow-typed/npm/webpack_vx.x.x.js similarity index 100% rename from flow-typed/npm/webpack_vx.x.x.js rename to packages/next/flow-typed/npm/webpack_vx.x.x.js diff --git a/flow-typed/npm/webpackbar_vx.x.x.js b/packages/next/flow-typed/npm/webpackbar_vx.x.x.js similarity index 100% rename from flow-typed/npm/webpackbar_vx.x.x.js rename to packages/next/flow-typed/npm/webpackbar_vx.x.x.js diff --git a/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js b/packages/next/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js similarity index 100% rename from flow-typed/npm/write-file-webpack-plugin_vx.x.x.js rename to packages/next/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js diff --git a/head.js b/packages/next/head.js similarity index 100% rename from head.js rename to packages/next/head.js diff --git a/lib/EventEmitter.js b/packages/next/lib/EventEmitter.js similarity index 100% rename from lib/EventEmitter.js rename to packages/next/lib/EventEmitter.js diff --git a/lib/app.js b/packages/next/lib/app.js similarity index 100% rename from lib/app.js rename to packages/next/lib/app.js diff --git a/lib/asset.js b/packages/next/lib/asset.js similarity index 100% rename from lib/asset.js rename to packages/next/lib/asset.js diff --git a/lib/constants.js b/packages/next/lib/constants.js similarity index 100% rename from lib/constants.js rename to packages/next/lib/constants.js diff --git a/lib/dynamic.js b/packages/next/lib/dynamic.js similarity index 100% rename from lib/dynamic.js rename to packages/next/lib/dynamic.js diff --git a/lib/error-debug.js b/packages/next/lib/error-debug.js similarity index 100% rename from lib/error-debug.js rename to packages/next/lib/error-debug.js diff --git a/lib/error.js b/packages/next/lib/error.js similarity index 100% rename from lib/error.js rename to packages/next/lib/error.js diff --git a/lib/head.js b/packages/next/lib/head.js similarity index 100% rename from lib/head.js rename to packages/next/lib/head.js diff --git a/lib/link.js b/packages/next/lib/link.js similarity index 100% rename from lib/link.js rename to packages/next/lib/link.js diff --git a/lib/loadable-capture.js b/packages/next/lib/loadable-capture.js similarity index 100% rename from lib/loadable-capture.js rename to packages/next/lib/loadable-capture.js diff --git a/lib/loadable.js b/packages/next/lib/loadable.js similarity index 100% rename from lib/loadable.js rename to packages/next/lib/loadable.js diff --git a/lib/p-queue.js b/packages/next/lib/p-queue.js similarity index 100% rename from lib/p-queue.js rename to packages/next/lib/p-queue.js diff --git a/lib/page-loader.js b/packages/next/lib/page-loader.js similarity index 100% rename from lib/page-loader.js rename to packages/next/lib/page-loader.js diff --git a/lib/promisify.js b/packages/next/lib/promisify.js similarity index 100% rename from lib/promisify.js rename to packages/next/lib/promisify.js diff --git a/lib/router/index.js b/packages/next/lib/router/index.js similarity index 100% rename from lib/router/index.js rename to packages/next/lib/router/index.js diff --git a/lib/router/router.js b/packages/next/lib/router/router.js similarity index 100% rename from lib/router/router.js rename to packages/next/lib/router/router.js diff --git a/lib/router/with-router.js b/packages/next/lib/router/with-router.js similarity index 100% rename from lib/router/with-router.js rename to packages/next/lib/router/with-router.js diff --git a/lib/runtime-config.js b/packages/next/lib/runtime-config.js similarity index 100% rename from lib/runtime-config.js rename to packages/next/lib/runtime-config.js diff --git a/lib/shallow-equals.js b/packages/next/lib/shallow-equals.js similarity index 100% rename from lib/shallow-equals.js rename to packages/next/lib/shallow-equals.js diff --git a/lib/side-effect.js b/packages/next/lib/side-effect.js similarity index 100% rename from lib/side-effect.js rename to packages/next/lib/side-effect.js diff --git a/lib/utils.js b/packages/next/lib/utils.js similarity index 100% rename from lib/utils.js rename to packages/next/lib/utils.js diff --git a/license.md b/packages/next/license.md similarity index 100% rename from license.md rename to packages/next/license.md diff --git a/link.js b/packages/next/link.js similarity index 100% rename from link.js rename to packages/next/link.js diff --git a/packages/next/package.json b/packages/next/package.json new file mode 100644 index 00000000..420af47a --- /dev/null +++ b/packages/next/package.json @@ -0,0 +1,114 @@ +{ + "name": "next", + "version": "7.0.1", + "description": "Minimalistic framework for server-rendered React applications", + "main": "./dist/server/next.js", + "license": "MIT", + "repository": "zeit/next.js", + "bugs": "https://github.com/zeit/next.js/issues", + "homepage": "https://github.com/zeit/next.js", + "files": [ + "dist", + "app.js", + "asset.js", + "babel.js", + "client.js", + "config.js", + "constants.js", + "document.js", + "dynamic.js", + "error.js", + "head.js", + "link.js", + "prefetch.js", + "router.js" + ], + "bin": { + "next": "./dist/bin/next" + }, + "scripts": { + "build": "taskr", + "release": "taskr release", + "flow": "flow check", + "lint": "standard 'bin/*' 'client/**/*.js' 'examples/**/*.js' 'lib/**/*.js' 'pages/**/*.js' 'server/**/*.js' 'build/**/*.js' 'test/**/*.js'", + "prepublish": "npm run release" + }, + "taskr": { + "requires": [ + "./taskfile-babel.js" + ] + }, + "standard": { + "parser": "babel-eslint", + "ignore": [ + "**/node_modules/**", + "**/examples/with-ioc/**", + "**/examples/with-kea/**", + "**/examples/with-mobx/**" + ] + }, + "dependencies": { + "@babel/core": "7.1.2", + "@babel/plugin-proposal-class-properties": "7.1.0", + "@babel/plugin-proposal-object-rest-spread": "7.0.0", + "@babel/plugin-syntax-dynamic-import": "7.0.0", + "@babel/plugin-transform-runtime": "7.1.0", + "@babel/preset-env": "7.1.0", + "@babel/preset-react": "7.0.0", + "@babel/runtime": "7.1.2", + "@babel/runtime-corejs2": "7.1.2", + "@babel/template": "7.1.2", + "ansi-html": "0.0.7", + "autodll-webpack-plugin": "0.4.2", + "babel-core": "7.0.0-bridge.0", + "babel-loader": "8.0.2", + "babel-plugin-react-require": "3.0.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.15", + "case-sensitive-paths-webpack-plugin": "2.1.2", + "cross-spawn": "5.1.0", + "del": "3.0.0", + "etag": "1.8.1", + "event-source-polyfill": "0.0.12", + "find-up": "2.1.0", + "fresh": "0.5.2", + "friendly-errors-webpack-plugin": "1.7.0", + "glob": "7.1.2", + "hoist-non-react-statics": "2.5.5", + "htmlescape": "1.1.1", + "http-errors": "1.6.2", + "http-status": "1.0.1", + "launch-editor": "2.2.1", + "loader-utils": "1.1.0", + "minimist": "1.2.0", + "mkdirp-then": "1.2.0", + "nanoid": "1.2.1", + "path-to-regexp": "2.1.0", + "prop-types": "15.6.2", + "prop-types-exact": "1.2.0", + "react-error-overlay": "4.0.0", + "recursive-copy": "2.0.6", + "resolve": "1.5.0", + "send": "0.16.1", + "source-map": "0.5.7", + "strip-ansi": "3.0.1", + "styled-jsx": "3.1.0", + "terser-webpack-plugin": "1.0.2", + "unfetch": "3.0.0", + "url": "0.11.0", + "webpack": "4.20.2", + "webpack-dev-middleware": "3.4.0", + "webpack-hot-middleware": "2.22.3", + "webpack-sources": "1.2.0", + "webpackbar": "2.6.3", + "write-file-webpack-plugin": "4.3.2" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "@babel/preset-flow": "7.0.0", + "@taskr/clear": "1.1.0", + "@taskr/watch": "1.1.0" + } +} diff --git a/pages/_app.js b/packages/next/pages/_app.js similarity index 100% rename from pages/_app.js rename to packages/next/pages/_app.js diff --git a/pages/_document.js b/packages/next/pages/_document.js similarity index 100% rename from pages/_document.js rename to packages/next/pages/_document.js diff --git a/pages/_error.js b/packages/next/pages/_error.js similarity index 100% rename from pages/_error.js rename to packages/next/pages/_error.js diff --git a/prefetch.js b/packages/next/prefetch.js similarity index 100% rename from prefetch.js rename to packages/next/prefetch.js diff --git a/router.js b/packages/next/router.js similarity index 100% rename from router.js rename to packages/next/router.js diff --git a/server/config.js b/packages/next/server/config.js similarity index 100% rename from server/config.js rename to packages/next/server/config.js diff --git a/server/document.js b/packages/next/server/document.js similarity index 100% rename from server/document.js rename to packages/next/server/document.js diff --git a/server/hot-reloader.js b/packages/next/server/hot-reloader.js similarity index 100% rename from server/hot-reloader.js rename to packages/next/server/hot-reloader.js diff --git a/server/lib/error-overlay-middleware.js b/packages/next/server/lib/error-overlay-middleware.js similarity index 100% rename from server/lib/error-overlay-middleware.js rename to packages/next/server/lib/error-overlay-middleware.js diff --git a/server/lib/path-match.js b/packages/next/server/lib/path-match.js similarity index 100% rename from server/lib/path-match.js rename to packages/next/server/lib/path-match.js diff --git a/server/lib/start-server.js b/packages/next/server/lib/start-server.js similarity index 100% rename from server/lib/start-server.js rename to packages/next/server/lib/start-server.js diff --git a/server/lib/utils.js b/packages/next/server/lib/utils.js similarity index 100% rename from server/lib/utils.js rename to packages/next/server/lib/utils.js diff --git a/server/next-dev-server.js b/packages/next/server/next-dev-server.js similarity index 100% rename from server/next-dev-server.js rename to packages/next/server/next-dev-server.js diff --git a/server/next-server.js b/packages/next/server/next-server.js similarity index 100% rename from server/next-server.js rename to packages/next/server/next-server.js diff --git a/server/next.js b/packages/next/server/next.js similarity index 100% rename from server/next.js rename to packages/next/server/next.js diff --git a/server/on-demand-entry-handler.js b/packages/next/server/on-demand-entry-handler.js similarity index 100% rename from server/on-demand-entry-handler.js rename to packages/next/server/on-demand-entry-handler.js diff --git a/server/render.js b/packages/next/server/render.js similarity index 100% rename from server/render.js rename to packages/next/server/render.js diff --git a/server/require.js b/packages/next/server/require.js similarity index 100% rename from server/require.js rename to packages/next/server/require.js diff --git a/server/router.js b/packages/next/server/router.js similarity index 100% rename from server/router.js rename to packages/next/server/router.js diff --git a/server/utils.js b/packages/next/server/utils.js similarity index 100% rename from server/utils.js rename to packages/next/server/utils.js diff --git a/taskfile-babel.js b/packages/next/taskfile-babel.js similarity index 100% rename from taskfile-babel.js rename to packages/next/taskfile-babel.js diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js new file mode 100644 index 00000000..c97c4b5d --- /dev/null +++ b/packages/next/taskfile.js @@ -0,0 +1,68 @@ +const notifier = require('node-notifier') + +export async function compile (task) { + await task.parallel(['bin', 'server', 'nextbuild', 'nextbuildstatic', 'lib', 'client']) +} + +export async function bin (task, opts) { + await task.source(opts.src || 'bin/*').babel().target('dist/bin', {mode: '0755'}) + notify('Compiled binaries') +} + +export async function lib (task, opts) { + await task.source(opts.src || 'lib/**/*.js').babel().target('dist/lib') + notify('Compiled lib files') +} + +export async function server (task, opts) { + await task.source(opts.src || 'server/**/*.js').babel().target('dist/server') + notify('Compiled server files') +} + +export async function nextbuild (task, opts) { + await task.source(opts.src || 'build/**/*.js').babel().target('dist/build') + notify('Compiled build files') +} + +export async function client (task, opts) { + await task.source(opts.src || 'client/**/*.js').babel().target('dist/client') + notify('Compiled client files') +} + +// export is a reserved keyword for functions +export async function nextbuildstatic (task, opts) { + await task.source(opts.src || 'export/**/*.js').babel().target('dist/export') + notify('Compiled export files') +} + +export async function copy (task) { + await task.source('pages/**/*.js').target('dist/pages') +} + +export async function build (task) { + await task.serial(['copy', 'compile']) +} + +export default async function (task) { + await task.start('build') + await task.watch('bin/*', 'bin') + await task.watch('pages/**/*.js', 'copy') + await task.watch('server/**/*.js', 'server') + await task.watch('build/**/*.js', 'nextbuild') + await task.watch('export/**/*.js', 'nextexport') + await task.watch('client/**/*.js', 'client') + await task.watch('lib/**/*.js', 'lib') +} + +export async function release (task) { + await task.clear('dist').start('build') +} + +// notification helper +function notify (msg) { + return notifier.notify({ + title: '▲ Next', + message: msg, + icon: false + }) +} diff --git a/readme.md b/readme.md new file mode 120000 index 00000000..29e4f303 --- /dev/null +++ b/readme.md @@ -0,0 +1 @@ +packages/next/README.md \ No newline at end of file diff --git a/taskfile.js b/taskfile.js index 135c4aac..b6ffaf2e 100644 --- a/taskfile.js +++ b/taskfile.js @@ -1,82 +1,22 @@ -const notifier = require('node-notifier') +const isWindows = /^win/.test(process.platform) const childProcess = require('child_process') const rimraf = require('rimraf') const mkdirp = require('mkdirp') -const isWindows = /^win/.test(process.platform) -export async function compile (task) { - await task.parallel(['bin', 'server', 'nextbuild', 'nextbuildstatic', 'lib', 'client']) -} - -export async function bin (task, opts) { - await task.source(opts.src || 'bin/*').babel().target('dist/bin', {mode: '0755'}) - notify('Compiled binaries') -} - -export async function lib (task, opts) { - await task.source(opts.src || 'lib/**/*.js').babel().target('dist/lib') - notify('Compiled lib files') -} - -export async function server (task, opts) { - await task.source(opts.src || 'server/**/*.js').babel().target('dist/server') - notify('Compiled server files') -} - -export async function nextbuild (task, opts) { - await task.source(opts.src || 'build/**/*.js').babel().target('dist/build') - notify('Compiled build files') -} - -export async function client (task, opts) { - await task.source(opts.src || 'client/**/*.js').babel().target('dist/client') - notify('Compiled client files') -} - -// export is a reserved keyword for functions -export async function nextbuildstatic (task, opts) { - await task.source(opts.src || 'export/**/*.js').babel().target('dist/export') - notify('Compiled export files') -} - -// Create node_modules/next for the use of test apps -export async function symlinkNextForTesting () { +export async function pretest (task) { + // Create node_modules/next for the use of test apps rimraf.sync('test/node_modules/next') mkdirp.sync('test/node_modules') - const symlinkCommand = isWindows ? 'mklink /D "next" "..\\..\\"' : 'ln -s ../../ next' - childProcess.execSync(symlinkCommand, { cwd: 'test/node_modules' }) -} + if (isWindows) { + const symlinkCommand = 'mklink /D "next" "..\\..\\packages\\next"' + childProcess.execSync(symlinkCommand, { cwd: 'test/node_modules' }) + } -export async function copy (task) { - await task.source('pages/**/*.js').target('dist/pages') -} - -export async function build (task) { - await task.serial(['symlinkNextForTesting', 'copy', 'compile']) -} - -export default async function (task) { - await task.start('build') - await task.watch('bin/*', 'bin') - await task.watch('pages/**/*.js', 'copy') - await task.watch('server/**/*.js', 'server') - await task.watch('build/**/*.js', 'nextbuild') - await task.watch('export/**/*.js', 'nextexport') - await task.watch('client/**/*.js', 'client') - await task.watch('lib/**/*.js', 'lib') -} - -export async function release (task) { - await task.clear('dist').start('build') -} - -// We run following task inside a NPM script chain and it runs chromedriver -// inside a child process tree. -// Even though we kill this task's process, chromedriver exists throughout -// the lifetime of the original npm script. - -export async function pretest (task) { + // We run following task inside a NPM script chain and it runs chromedriver + // inside a child process tree. + // Even though we kill this task's process, chromedriver exists throughout + // the lifetime of the original npm script. // Start chromedriver const processName = isWindows ? 'chromedriver.cmd' : 'chromedriver' childProcess.spawn(processName, { stdio: 'inherit' }) @@ -93,12 +33,3 @@ export async function posttest (task) { // Do nothing } } - -// notification helper -function notify (msg) { - return notifier.notify({ - title: '▲ Next', - message: msg, - icon: false - }) -} diff --git a/test/integration/basic/test/rendering.js b/test/integration/basic/test/rendering.js index 8ad9a85b..8bd8292d 100644 --- a/test/integration/basic/test/rendering.js +++ b/test/integration/basic/test/rendering.js @@ -173,7 +173,6 @@ export default function ({ app }, suiteName, render, fetch, appPort) { await fetch('/dynamic/ssr') const buildManifest = require(join('../.next', BUILD_MANIFEST)) - console.log(buildManifest) const reactLoadableManifest = require(join('../.next', REACT_LOADABLE_MANIFEST)) const resources = [] diff --git a/test/isolated/require-page.test.js b/test/isolated/require-page.test.js index 839479ac..e25481f6 100644 --- a/test/isolated/require-page.test.js +++ b/test/isolated/require-page.test.js @@ -2,7 +2,7 @@ import { join } from 'path' import {SERVER_DIRECTORY, CLIENT_STATIC_FILES_PATH} from 'next/constants' -import requirePage, {getPagePath, normalizePagePath, pageNotFoundError} from '../../dist/server/require' +import requirePage, {getPagePath, normalizePagePath, pageNotFoundError} from 'next/dist/server/require' const sep = '/' const distDir = join(__dirname, '_resolvedata') diff --git a/test/isolated/webpack-utils.test.js b/test/isolated/webpack-utils.test.js index de38f8e8..577d1f9e 100644 --- a/test/isolated/webpack-utils.test.js +++ b/test/isolated/webpack-utils.test.js @@ -1,7 +1,7 @@ /* global describe, it, expect */ import {normalize, join} from 'path' -import {getPageEntries, createEntry} from '../../dist/build/webpack/utils' +import {getPageEntries, createEntry} from 'next/dist/build/webpack/utils' const buildId = 'development' diff --git a/test/lib/next-test-utils.js b/test/lib/next-test-utils.js index 6673f373..a30f5395 100644 --- a/test/lib/next-test-utils.js +++ b/test/lib/next-test-utils.js @@ -71,7 +71,7 @@ export function findPort () { // Launch the app in dev mode. export function launchApp (dir, port) { - const cwd = path.resolve(__dirname, '../../') + const cwd = path.dirname(require.resolve('next/package')) return new Promise((resolve, reject) => { const instance = spawn('node', ['dist/bin/next', dir, '-p', port], { cwd }) diff --git a/test/node_modules/next b/test/node_modules/next index 6581736d..0127bcd4 120000 --- a/test/node_modules/next +++ b/test/node_modules/next @@ -1 +1 @@ -../../ \ No newline at end of file +../../packages/next \ No newline at end of file diff --git a/test/unit/EventEmitter.test.js b/test/unit/EventEmitter.test.js index 8c04ca28..1f564602 100644 --- a/test/unit/EventEmitter.test.js +++ b/test/unit/EventEmitter.test.js @@ -1,5 +1,5 @@ /* global describe, it, expect */ -import EventEmitter from '../../dist/lib/EventEmitter' +import EventEmitter from 'next/dist/lib/EventEmitter' describe('EventEmitter', () => { describe('With listeners', () => { diff --git a/test/unit/getDisplayName.test.js b/test/unit/getDisplayName.test.js index 8181de67..84f6e628 100644 --- a/test/unit/getDisplayName.test.js +++ b/test/unit/getDisplayName.test.js @@ -1,6 +1,6 @@ /* global describe, it, expect */ import { Component } from 'react' -import { getDisplayName } from '../../dist/lib/utils' +import { getDisplayName } from 'next/dist/lib/utils' describe('getDisplayName', () => { it('gets the proper display name of a component', () => { diff --git a/test/unit/loadGetInitialProps.test.js b/test/unit/loadGetInitialProps.test.js index 0c3087a2..6963c78d 100644 --- a/test/unit/loadGetInitialProps.test.js +++ b/test/unit/loadGetInitialProps.test.js @@ -1,5 +1,5 @@ /* global describe, it, expect */ -import { loadGetInitialProps } from '../../dist/lib/utils' +import { loadGetInitialProps } from 'next/dist/lib/utils' describe('loadGetInitialProps', () => { it('should throw if getInitialProps is defined as an instance method', () => { From 334b46e8d90b8f3f6199df85d17af433457d9da9 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 1 Oct 2018 07:24:27 +0800 Subject: [PATCH 003/448] Add analyze bundles example (#5332) * Add analyze-bundles example * housekeeping: with-webpack-bundle-analyzer example * analyze-bundles example: revert the version of faker library * analyze-bundles add analyze:server and analyze:browser to scripts * with-webpack-bundle-analyzer example: fix typo --- examples/analyze-bundles/README.md | 50 +++++++++++++++++++ examples/analyze-bundles/next.config.js | 21 ++++++++ .../package.json | 11 ++-- .../pages/about.js | 0 .../pages/contact.js | 0 .../pages/index.js | 0 .../with-webpack-bundle-analyzer/README.md | 45 +---------------- .../next.config.js | 17 ------- 8 files changed, 78 insertions(+), 66 deletions(-) create mode 100644 examples/analyze-bundles/README.md create mode 100644 examples/analyze-bundles/next.config.js rename examples/{with-webpack-bundle-analyzer => analyze-bundles}/package.json (53%) rename examples/{with-webpack-bundle-analyzer => analyze-bundles}/pages/about.js (100%) rename examples/{with-webpack-bundle-analyzer => analyze-bundles}/pages/contact.js (100%) rename examples/{with-webpack-bundle-analyzer => analyze-bundles}/pages/index.js (100%) delete mode 100644 examples/with-webpack-bundle-analyzer/next.config.js diff --git a/examples/analyze-bundles/README.md b/examples/analyze-bundles/README.md new file mode 100644 index 00000000..381caffd --- /dev/null +++ b/examples/analyze-bundles/README.md @@ -0,0 +1,50 @@ +[![Deploy to now](https://deploy.now.sh/static/button.svg)](https://deploy.now.sh/?repo=https://github.com/zeit/next.js/tree/master/examples/analyze-bundles) + +# Analyzer Bundles example + +## How to use + +### Using `create-next-app` + +Execute [`create-next-app`](https://github.com/segmentio/create-next-app) with [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) or [npx](https://github.com/zkat/npx#readme) to bootstrap the example: + +```bash +npx create-next-app --example analyze-bundles analyze-bundles-app +# or +yarn create next-app --example analyze-bundles analyze-bundles-app +``` + +### Download manually + +Download the example: + +```bash +curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/analyze-bundles +cd analyze-bundles +``` + +Install it + +```bash +npm install +npm run dev +# or +yarn +yarn dev +``` + +## The idea behind the example + +This example shows how to analyze the output bundles using [@zeit/next-bundle-analyzer](https://github.com/zeit/next-plugins/tree/master/packages/next-bundle-analyzer) + +To analyze your webpack output, invoke the following command: + +```bash +npm run analyze +npm run analyze:server +npm run analyze:browser +# or +yarn analyze +yarn analyze:server +yarn analyze:browser +``` diff --git a/examples/analyze-bundles/next.config.js b/examples/analyze-bundles/next.config.js new file mode 100644 index 00000000..50e1200c --- /dev/null +++ b/examples/analyze-bundles/next.config.js @@ -0,0 +1,21 @@ +const withBundleAnalyzer = require('@zeit/next-bundle-analyzer') + +const nextConfig = { + analyzeServer: ['server', 'both'].includes(process.env.BUNDLE_ANALYZE), + analyzeBrowser: ['browser', 'both'].includes(process.env.BUNDLE_ANALYZE), + bundleAnalyzerConfig: { + server: { + analyzerMode: 'static', + reportFilename: '../bundles/server.html' + }, + browser: { + analyzerMode: 'static', + reportFilename: './bundles/client.html' + } + }, + webpack (config) { + return config + } +} + +module.exports = withBundleAnalyzer(nextConfig) diff --git a/examples/with-webpack-bundle-analyzer/package.json b/examples/analyze-bundles/package.json similarity index 53% rename from examples/with-webpack-bundle-analyzer/package.json rename to examples/analyze-bundles/package.json index 11e9315f..0f84eb24 100644 --- a/examples/with-webpack-bundle-analyzer/package.json +++ b/examples/analyze-bundles/package.json @@ -5,15 +5,16 @@ "dev": "next", "build": "next build", "start": "next start", - "analyze": "cross-env ANALYZE=1 next build" + "analyze": "BUNDLE_ANALYZE=both next build", + "analyze:server": "BUNDLE_ANALYZE=server next build", + "analyze:browser": "BUNDLE_ANALYZE=browser next build" }, "dependencies": { - "next": "latest", - "cross-env": "^5.0.1", + "@zeit/next-bundle-analyzer": "^0.1.2", "faker": "^4.1.0", + "next": "latest", "react": "^16.0.0", - "react-dom": "^16.0.0", - "webpack-bundle-analyzer": "^2.8.2" + "react-dom": "^16.0.0" }, "license": "ISC" } diff --git a/examples/with-webpack-bundle-analyzer/pages/about.js b/examples/analyze-bundles/pages/about.js similarity index 100% rename from examples/with-webpack-bundle-analyzer/pages/about.js rename to examples/analyze-bundles/pages/about.js diff --git a/examples/with-webpack-bundle-analyzer/pages/contact.js b/examples/analyze-bundles/pages/contact.js similarity index 100% rename from examples/with-webpack-bundle-analyzer/pages/contact.js rename to examples/analyze-bundles/pages/contact.js diff --git a/examples/with-webpack-bundle-analyzer/pages/index.js b/examples/analyze-bundles/pages/index.js similarity index 100% rename from examples/with-webpack-bundle-analyzer/pages/index.js rename to examples/analyze-bundles/pages/index.js diff --git a/examples/with-webpack-bundle-analyzer/README.md b/examples/with-webpack-bundle-analyzer/README.md index 5ea0dbab..a178c239 100644 --- a/examples/with-webpack-bundle-analyzer/README.md +++ b/examples/with-webpack-bundle-analyzer/README.md @@ -1,46 +1,3 @@ -[![Deploy to now](https://deploy.now.sh/static/button.svg)](https://deploy.now.sh/?repo=https://github.com/zeit/next.js/tree/master/examples/with-webpack-bundle-analyzer) - # Webpack Bundle Analyzer example -## How to use - -### Using `create-next-app` - -Execute [`create-next-app`](https://github.com/segmentio/create-next-app) with [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) or [npx](https://github.com/zkat/npx#readme) to bootstrap the example: - -```bash -npx create-next-app --example with-webpack-bundle-analyzer with-webpack-bundle-analyzer-app -# or -yarn create next-app --example with-webpack-bundle-analyzer with-webpack-bundle-analyzer-app -``` - -### Download manually - -Download the example: - -```bash -curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/with-webpack-bundle-analyzer -cd with-webpack-bundle-analyzer -``` - -Install it - -```bash -npm install -npm run dev -# or -yarn -yarn dev -``` - -## The idea behind the example - -This example shows how to analyze the output bundles using [webpack-bundle-analyzer](https://github.com/th0r/webpack-bundle-analyzer#as-plugin) - -To analyze your webpack output, invoke the following command: - -```bash -npm run analyze -# or -yarn analyze -``` +This example have been moved here: [analyze-bundles](https://github.com/zeit/next.js/tree/canary/examples/analyze-bundles) diff --git a/examples/with-webpack-bundle-analyzer/next.config.js b/examples/with-webpack-bundle-analyzer/next.config.js deleted file mode 100644 index 0ebbfb61..00000000 --- a/examples/with-webpack-bundle-analyzer/next.config.js +++ /dev/null @@ -1,17 +0,0 @@ -const { ANALYZE } = process.env - -module.exports = { - webpack: function (config, { isServer }) { - if (ANALYZE) { - const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') - - config.plugins.push(new BundleAnalyzerPlugin({ - analyzerMode: 'server', - analyzerPort: isServer ? 8888 : 8889, - openAnalyzer: true - })) - } - - return config - } -} From b18840b0ea42a677024de9cbc381dd3d522729be Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 1 Oct 2018 01:34:54 +0200 Subject: [PATCH 004/448] Update homepage (#5345) --- packages/next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/package.json b/packages/next/package.json index 420af47a..4bfc2958 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -6,7 +6,7 @@ "license": "MIT", "repository": "zeit/next.js", "bugs": "https://github.com/zeit/next.js/issues", - "homepage": "https://github.com/zeit/next.js", + "homepage": "https://nextjs.org", "files": [ "dist", "app.js", From 9c287f3c32aa097df15de4c00d0f9217f348a74c Mon Sep 17 00:00:00 2001 From: Evil Rabbit Date: Sun, 30 Sep 2018 23:32:43 -0300 Subject: [PATCH 005/448] Update repo banner --- packages/next/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/README.md b/packages/next/README.md index 0c7da996..0511e8cf 100644 --- a/packages/next/README.md +++ b/packages/next/README.md @@ -1,4 +1,4 @@ -screen shot 2016-10-25 at 2 37 27 pm +Next.js [![NPM version](https://img.shields.io/npm/v/next.svg)](https://www.npmjs.com/package/next) [![Build Status](https://travis-ci.org/zeit/next.js.svg?branch=master)](https://travis-ci.org/zeit/next.js) From b9461824ec097fc2b269aca95d30d21e97167a87 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 1 Oct 2018 11:15:52 +0200 Subject: [PATCH 006/448] Remove unused prefetch.js (#5344) --- packages/next/package.json | 1 - packages/next/prefetch.js | 1 - 2 files changed, 2 deletions(-) delete mode 100644 packages/next/prefetch.js diff --git a/packages/next/package.json b/packages/next/package.json index 4bfc2958..84bc43ce 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -20,7 +20,6 @@ "error.js", "head.js", "link.js", - "prefetch.js", "router.js" ], "bin": { diff --git a/packages/next/prefetch.js b/packages/next/prefetch.js deleted file mode 100644 index 283d8828..00000000 --- a/packages/next/prefetch.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/lib/prefetch') From 0b6ecf1fe467e8606033ec3a62300b4ccfdf75f9 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 1 Oct 2018 13:31:00 +0200 Subject: [PATCH 007/448] Set up CI with Azure Pipelines --- azure-pipelines.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 00000000..23baa835 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,28 @@ +pool: + vmImage: 'vs2017-win2016' + +strategy: + maxParallel: 10 + matrix: + node-10: + node_version: ^10.10.0 + node-8: + node_version: ^8.12.0 + +steps: +- task: NodeTool@0 + inputs: + versionSpec: $(node_version) + displayName: 'Install Node.js' + +- script: | + npm install + displayName: 'Install dependencies' + +- script: | + npm run bootstrap + displayName: 'Lerna bootstrap' + +- script: | + npm test + displayName: 'Run tests' \ No newline at end of file From 3d94ae0a7d3034c86f0a33904c8625f6ff92a9b8 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 1 Oct 2018 16:31:47 +0200 Subject: [PATCH 008/448] Drop prepare requirement from production server (#5351) As prepare is only needed to boot up the hot reloader + exportPathMap routes in development, it's not longer a requirement in the production server. --- packages/next/server/next-dev-server.js | 62 ++++++++++--------- packages/next/server/next-server.js | 30 +++------ packages/next/server/router.js | 25 ++++---- .../integration/production/test/index.test.js | 15 +++++ 4 files changed, 69 insertions(+), 63 deletions(-) diff --git a/packages/next/server/next-dev-server.js b/packages/next/server/next-dev-server.js index bcf84cad..34b0184a 100644 --- a/packages/next/server/next-dev-server.js +++ b/packages/next/server/next-dev-server.js @@ -1,6 +1,7 @@ import Server from './next-server' import { join } from 'path' import HotReloader from './hot-reloader' +import {route} from './router' import {PHASE_DEVELOPMENT_SERVER} from '../lib/constants' export default class DevServer extends Server { @@ -19,8 +20,37 @@ export default class DevServer extends Server { return 'development' } + async addExportPathMapRoutes () { + // Makes `next export` exportPathMap work in development mode. + // So that the user doesn't have to define a custom server reading the exportPathMap + if (this.nextConfig.exportPathMap) { + console.log('Defining routes from exportPathMap') + const exportPathMap = await this.nextConfig.exportPathMap({}, {dev: true, dir: this.dir, outDir: null, distDir: this.distDir, buildId: this.buildId}) // In development we can't give a default path mapping + for (const path in exportPathMap) { + const {page, query = {}} = exportPathMap[path] + + // We use unshift so that we're sure the routes is defined before Next's default routes + this.router.add({ + match: route(path), + fn: async (req, res, params, parsedUrl) => { + const { query: urlQuery } = parsedUrl + + Object.keys(urlQuery) + .filter(key => query[key] === undefined) + .forEach(key => console.warn(`Url defines a query parameter '${key}' that is missing in exportPathMap`)) + + const mergedQuery = {...urlQuery, ...query} + + await this.render(req, res, page, mergedQuery, parsedUrl) + } + }) + } + } + } + async prepare () { await super.prepare() + await this.addExportPathMapRoutes() await this.hotReloader.start() } @@ -37,45 +67,19 @@ export default class DevServer extends Server { return super.run(req, res, parsedUrl) } - async generateRoutes () { - const routes = await super.generateRoutes() + generateRoutes () { + const routes = super.generateRoutes() // In development we expose all compiled files for react-error-overlay's line show feature // We use unshift so that we're sure the routes is defined before Next's default routes routes.unshift({ - path: '/_next/development/:path*', + match: route('/_next/development/:path*'), fn: async (req, res, params) => { const p = join(this.distDir, ...(params.path || [])) await this.serveStatic(req, res, p) } }) - // Makes `next export` exportPathMap work in development mode. - // So that the user doesn't have to define a custom server reading the exportPathMap - if (this.nextConfig.exportPathMap) { - console.log('Defining routes from exportPathMap') - const exportPathMap = await this.nextConfig.exportPathMap({}, {dev: true, dir: this.dir, outDir: null, distDir: this.distDir, buildId: this.buildId}) // In development we can't give a default path mapping - for (const path in exportPathMap) { - const {page, query = {}} = exportPathMap[path] - - // We use unshift so that we're sure the routes is defined before Next's default routes - routes.unshift({ - path, - fn: async (req, res, params, parsedUrl) => { - const { query: urlQuery } = parsedUrl - - Object.keys(urlQuery) - .filter(key => query[key] === undefined) - .forEach(key => console.warn(`Url defines a query parameter '${key}' that is missing in exportPathMap`)) - - const mergedQuery = {...urlQuery, ...query} - - await this.render(req, res, page, mergedQuery, parsedUrl) - } - }) - } - } - return routes } diff --git a/packages/next/server/next-server.js b/packages/next/server/next-server.js index 04de276a..f3e85536 100644 --- a/packages/next/server/next-server.js +++ b/packages/next/server/next-server.js @@ -9,7 +9,7 @@ import { sendHTML, serveStatic } from './render' -import Router from './router' +import Router, {route} from './router' import { isInternalUrl } from './utils' import loadConfig from './config' import {PHASE_PRODUCTION_SERVER, BLOCKED_PAGES, BUILD_ID_FILE, CLIENT_STATIC_FILES_PATH, CLIENT_STATIC_FILES_RUNTIME} from '../lib/constants' @@ -21,7 +21,6 @@ export default class Server { constructor ({ dir = '.', staticMarkup = false, quiet = false, conf = null } = {}) { this.dir = resolve(dir) this.quiet = quiet - this.router = new Router() const phase = this.currentPhase() this.nextConfig = loadConfig(phase, this.dir, conf) this.distDir = join(this.dir, this.nextConfig.distDir) @@ -50,6 +49,8 @@ export default class Server { publicRuntimeConfig }) + const routes = this.generateRoutes() + this.router = new Router(routes) this.setAssetPrefix(assetPrefix) } @@ -86,9 +87,8 @@ export default class Server { asset.setAssetPrefix(this.renderOpts.assetPrefix) } - async prepare () { - await this.defineRoutes() - } + // Backwards compatibility + async prepare () {} // Backwards compatibility async close () {} @@ -97,10 +97,10 @@ export default class Server { res.setHeader('Cache-Control', 'public, max-age=31536000, immutable') } - async generateRoutes () { + generateRoutes () { const routes = [ { - path: '/_next/static/:path*', + match: route('/_next/static/:path*'), fn: async (req, res, params) => { // The commons folder holds commonschunk files // The chunks folder holds dynamic entries @@ -113,7 +113,7 @@ export default class Server { } }, { - path: '/_next/:path*', + match: route('/_next/:path*'), // This path is needed because `render()` does a check for `/_next` and the calls the routing again fn: async (req, res, params, parsedUrl) => { await this.render404(req, res, parsedUrl) @@ -124,7 +124,7 @@ export default class Server { // (but it should support as many as params, seperated by '/') // Othewise this will lead to a pretty simple DOS attack. // See more: https://github.com/zeit/next.js/issues/2617 - path: '/static/:path*', + match: route('/static/:path*'), fn: async (req, res, params) => { const p = join(this.dir, 'static', ...(params.path || [])) await this.serveStatic(req, res, p) @@ -138,7 +138,7 @@ export default class Server { // Othewise this will lead to a pretty simple DOS attack. // See more: https://github.com/zeit/next.js/issues/2617 routes.push({ - path: '/:path*', + match: route('/:path*'), fn: async (req, res, params, parsedUrl) => { const { pathname, query } = parsedUrl await this.render(req, res, pathname, query, parsedUrl) @@ -149,16 +149,6 @@ export default class Server { return routes } - async defineRoutes () { - const routes = await this.generateRoutes() - - for (const method of ['GET', 'HEAD']) { - for (const route of routes) { - this.router.add(method, route.path, route.fn) - } - } - } - async run (req, res, parsedUrl) { const fn = this.router.match(req, res, parsedUrl) if (fn) { diff --git a/packages/next/server/router.js b/packages/next/server/router.js index 50efd70e..90bab9a5 100644 --- a/packages/next/server/router.js +++ b/packages/next/server/router.js @@ -1,29 +1,26 @@ import pathMatch from './lib/path-match' -const route = pathMatch() +export const route = pathMatch() export default class Router { - constructor () { - this.routes = new Map() + constructor (routes = []) { + this.routes = routes } - add (method, path, fn) { - const routes = this.routes.get(method) || new Set() - routes.add({ match: route(path), fn }) - this.routes.set(method, routes) + add (route) { + this.routes.unshift(route) } match (req, res, parsedUrl) { - const routes = this.routes.get(req.method) - if (!routes) return + if (req.method !== 'GET' && req.method !== 'HEAD') { + return + } const { pathname } = parsedUrl - for (const r of routes) { - const params = r.match(pathname) + for (const route of this.routes) { + const params = route.match(pathname) if (params) { - return async () => { - return r.fn(req, res, params, parsedUrl) - } + return () => route.fn(req, res, params, parsedUrl) } } } diff --git a/test/integration/production/test/index.test.js b/test/integration/production/test/index.test.js index 1b78a0d0..e1c31c12 100644 --- a/test/integration/production/test/index.test.js +++ b/test/integration/production/test/index.test.js @@ -61,6 +61,21 @@ describe('Production Usage', () => { expect(res.status).toBe(404) }) + it('should render 501 if the HTTP method is not GET or HEAD', async () => { + const url = `http://localhost:${appPort}/_next/abcdef` + const methods = ['POST', 'PUT', 'DELETE'] + for (const method of methods) { + const res = await fetch(url, {method}) + expect(res.status).toBe(501) + } + }) + + it('should set Content-Length header', async () => { + const url = `http://localhost:${appPort}` + const res = await fetch(url) + expect(res.headers.get('Content-Length')).toBeDefined() + }) + it('should set Cache-Control header', async () => { const buildId = readFileSync(join(__dirname, '../.next/BUILD_ID'), 'utf8') const buildManifest = require(join('../.next', BUILD_MANIFEST)) From 532351ebcf3ab5603859aafc91c7f120f60c8e01 Mon Sep 17 00:00:00 2001 From: Martin Beierling-Mutz Date: Tue, 2 Oct 2018 00:41:35 +0200 Subject: [PATCH 009/448] Replace all relative links with absolute links in README (#5356) fixes #5355 --- packages/next/README.md | 79 +++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/packages/next/README.md b/packages/next/README.md index 0511e8cf..a732ef3f 100644 --- a/packages/next/README.md +++ b/packages/next/README.md @@ -145,7 +145,7 @@ export default () => (
Examples
@@ -189,12 +189,13 @@ Please see the [styled-jsx documentation](https://www.npmjs.com/package/styled-j Examples @@ -232,8 +233,8 @@ _Note: Don't name the `static` directory anything else. The name is required and
Examples
@@ -283,7 +284,7 @@ _Note: The contents of `` get cleared upon unmounting the component, so ma
Examples
@@ -359,7 +360,7 @@ export default Page
Examples
@@ -402,7 +403,7 @@ To inject the `pathname`, `query` or `asPath` in your component, you can use [wi
Examples
@@ -497,8 +498,8 @@ The default behaviour of `` is to scroll to the top of the page. When ther
Examples
@@ -620,7 +621,7 @@ Router.events.on('routeChangeError', (err, url) => {
Examples
@@ -664,7 +665,7 @@ componentDidUpdate(prevProps) {
Examples
@@ -705,7 +706,7 @@ The above `router` object comes with an API similar to [`next/router`](#imperati
Examples
@@ -799,12 +800,12 @@ export default withRouter(MyLink)
Examples
@@ -934,7 +935,7 @@ app.prepare().then(() => {
Examples
@@ -1032,8 +1033,8 @@ export default () =>
Examples
@@ -1080,8 +1081,8 @@ export default class MyApp extends App {
Examples
@@ -1089,7 +1090,7 @@ export default class MyApp extends App { - Is rendered on the server side - Is used to change the initial server side rendered document markup -- Commonly used to implement server side rendering for css-in-js libraries like [styled-components](./examples/with-styled-components), [glamorous](./examples/with-glamorous) or [emotion](with-emotion). [styled-jsx](https://github.com/zeit/styled-jsx) is included with Next.js by default. +- Commonly used to implement server side rendering for css-in-js libraries like [styled-components](/examples/with-styled-components), [glamorous](/examples/with-glamorous) or [emotion](/examples/with-emotion). [styled-jsx](https://github.com/zeit/styled-jsx) is included with Next.js by default. Pages in `Next.js` skip the definition of the surrounding document's markup. For example, you never include ``, ``, etc. To override that default behavior, you must create a file at `./pages/_document.js`, where you can extend the `Document` class: @@ -1212,7 +1213,7 @@ module.exports = (phase, {defaultConfig}) => { } ``` -`phase` is the current context in which the configuration is loaded. You can see all phases here: [constants](./lib/constants.js) +`phase` is the current context in which the configuration is loaded. You can see all phases here: [constants](/packages/next/lib/constants.js) Phases can be imported from `next/constants`: ```js @@ -1299,7 +1300,7 @@ module.exports = {
Examples
@@ -1386,7 +1387,7 @@ module.exports = {
Examples
@@ -1527,7 +1528,7 @@ The [polyfills](https://github.com/zeit/next.js/tree/canary/examples/with-polyfi
Examples
@@ -1655,7 +1656,7 @@ The `req` and `res` fields of the `context` object passed to `getInitialProps` a
Examples
@@ -1758,7 +1759,7 @@ Next.js bundles [styled-jsx](https://github.com/zeit/styled-jsx) supporting scop We track V8. Since V8 has wide support for ES6 and `async` and `await`, we transpile those. Since V8 doesn’t support class decorators, we don’t transpile those. -See the documentation about [customizing the babel config](#customizing-babel-config) and [next/preset](./build/babel/preset.js) for more information. +See the documentation about [customizing the babel config](#customizing-babel-config) and [next/preset](/packages/next/build/babel/preset.js) for more information. @@ -1805,7 +1806,7 @@ It’s up to you. `getInitialProps` is an `async` function (or a regular functio
Can I use it with GraphQL? -Yes! Here's an example with [Apollo](./examples/with-apollo). +Yes! Here's an example with [Apollo](/examples/with-apollo).
@@ -1814,7 +1815,7 @@ Yes! Here's an example with [Apollo](./examples/with-apollo).
Can I use it with Redux? -Yes! Here's an [example](./examples/with-redux) +Yes! Here's an [example](/examples/with-redux)

@@ -1822,7 +1823,7 @@ Yes! Here's an [example](./examples/with-redux)
Can I use Next with my favorite Javascript library or toolkit? -Since our first release we've had **many** example contributions, you can check them out in the [examples](./examples) directory +Since our first release we've had **many** example contributions, you can check them out in the [examples](/examples) directory

@@ -1844,7 +1845,7 @@ As we were researching options for server-rendering React that didn’t involve ## Contributing -Please see our [contributing.md](./contributing.md) +Please see our [contributing.md](/packages/next/contributing.md) ## Authors From 82d56e063aad12ac8fee5b9d5ed24ccf725b1a5b Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 00:55:31 +0200 Subject: [PATCH 010/448] next-server (#5357) --- packages/next-server/asset.js | 1 + packages/next-server/babel.config.js | 17 +++++ packages/next-server/config.js | 1 + packages/next-server/constants.js | 1 + packages/next-server/dynamic.js | 1 + packages/next-server/head.js | 1 + .../{next => next-server}/lib/EventEmitter.js | 0 packages/{next => next-server}/lib/asset.js | 0 packages/next-server/lib/constants.js | 27 ++++++++ packages/{next => next-server}/lib/dynamic.js | 0 .../{next => next-server}/lib/error-debug.js | 2 +- packages/{next => next-server}/lib/head.js | 0 packages/{next => next-server}/lib/link.js | 2 +- .../lib/loadable-capture.js | 0 .../{next => next-server}/lib/loadable.js | 0 packages/{next => next-server}/lib/p-queue.js | 0 .../{next => next-server}/lib/router/index.js | 0 .../lib/router/router.js | 0 .../lib/router/with-router.js | 0 .../lib/runtime-config.js | 0 .../lib/shallow-equals.js | 0 .../{next => next-server}/lib/side-effect.js | 0 packages/{next => next-server}/lib/utils.js | 22 +++---- packages/next-server/link.js | 1 + packages/next-server/next-config.js | 1 + packages/next-server/package.json | 45 +++++++++++++ packages/next-server/router.js | 1 + .../{next => next-server}/server/config.js | 2 +- .../server/lib/path-match.js | 0 .../server/next-server.js | 4 +- .../{next => next-server}/server/render.js | 2 +- .../{next => next-server}/server/require.js | 2 +- .../{next => next-server}/server/router.js | 0 packages/next-server/server/utils.js | 14 ++++ packages/next-server/taskfile-babel.js | 65 +++++++++++++++++++ packages/next-server/taskfile.js | 40 ++++++++++++ packages/next/asset.js | 2 +- packages/next/bin/next | 2 +- packages/next/build/index.js | 4 +- packages/next/build/webpack.js | 3 +- .../webpack/plugins/build-manifest-plugin.js | 2 +- .../plugins/nextjs-ssr-module-cache.js | 2 +- .../webpack/plugins/pages-manifest-plugin.js | 2 +- .../build/webpack/plugins/pages-plugin.js | 2 +- .../webpack/plugins/unlink-file-plugin.js | 2 +- packages/next/build/webpack/utils.js | 2 +- packages/next/client/index.js | 12 ++-- .../next/client/on-demand-entries-client.js | 2 +- .../client/webpack-hot-middleware-client.js | 2 +- packages/next/config.js | 2 +- packages/next/constants.js | 2 +- packages/next/dynamic.js | 2 +- packages/next/export/index.js | 10 +-- packages/next/head.js | 2 +- packages/next/lib/app.js | 4 +- packages/next/lib/constants.js | 26 -------- packages/next/lib/error.js | 2 +- packages/next/lib/page-loader.js | 2 +- packages/next/link.js | 2 +- packages/next/package.json | 1 + packages/next/router.js | 2 +- packages/next/server/hot-reloader.js | 31 +++++++-- packages/next/server/next-dev-server.js | 6 +- packages/next/server/next.js | 2 +- .../next/server/on-demand-entry-handler.js | 4 +- packages/next/server/utils.js | 35 ---------- test/integration/basic/test/rendering.js | 2 +- test/integration/dist-dir/test/index.test.js | 2 +- test/integration/export/next.config.js | 2 +- .../integration/production/test/index.test.js | 2 +- test/isolated/config.test.js | 4 +- test/isolated/require-page.test.js | 4 +- test/node_modules/next | 1 - test/unit/EventEmitter.test.js | 2 +- test/unit/getDisplayName.test.js | 2 +- test/unit/loadGetInitialProps.test.js | 2 +- test/unit/router.test.js | 2 +- test/unit/shallow-equal.test.js | 2 +- 78 files changed, 313 insertions(+), 140 deletions(-) create mode 100644 packages/next-server/asset.js create mode 100644 packages/next-server/babel.config.js create mode 100644 packages/next-server/config.js create mode 100644 packages/next-server/constants.js create mode 100644 packages/next-server/dynamic.js create mode 100644 packages/next-server/head.js rename packages/{next => next-server}/lib/EventEmitter.js (100%) rename packages/{next => next-server}/lib/asset.js (100%) create mode 100644 packages/next-server/lib/constants.js rename packages/{next => next-server}/lib/dynamic.js (100%) rename packages/{next => next-server}/lib/error-debug.js (98%) rename packages/{next => next-server}/lib/head.js (100%) rename packages/{next => next-server}/lib/link.js (98%) rename packages/{next => next-server}/lib/loadable-capture.js (100%) rename packages/{next => next-server}/lib/loadable.js (100%) rename packages/{next => next-server}/lib/p-queue.js (100%) rename packages/{next => next-server}/lib/router/index.js (100%) rename packages/{next => next-server}/lib/router/router.js (100%) rename packages/{next => next-server}/lib/router/with-router.js (100%) rename packages/{next => next-server}/lib/runtime-config.js (100%) rename packages/{next => next-server}/lib/shallow-equals.js (100%) rename packages/{next => next-server}/lib/side-effect.js (100%) rename packages/{next => next-server}/lib/utils.js (100%) create mode 100644 packages/next-server/link.js create mode 100644 packages/next-server/next-config.js create mode 100644 packages/next-server/package.json create mode 100644 packages/next-server/router.js rename packages/{next => next-server}/server/config.js (97%) rename packages/{next => next-server}/server/lib/path-match.js (100%) rename packages/{next => next-server}/server/next-server.js (98%) rename packages/{next => next-server}/server/render.js (99%) rename packages/{next => next-server}/server/require.js (94%) rename packages/{next => next-server}/server/router.js (100%) create mode 100644 packages/next-server/server/utils.js create mode 100644 packages/next-server/taskfile-babel.js create mode 100644 packages/next-server/taskfile.js delete mode 100644 packages/next/server/utils.js delete mode 120000 test/node_modules/next diff --git a/packages/next-server/asset.js b/packages/next-server/asset.js new file mode 100644 index 00000000..fd0bd5db --- /dev/null +++ b/packages/next-server/asset.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/asset') diff --git a/packages/next-server/babel.config.js b/packages/next-server/babel.config.js new file mode 100644 index 00000000..e8d3b951 --- /dev/null +++ b/packages/next-server/babel.config.js @@ -0,0 +1,17 @@ +module.exports = { + 'presets': [ + '@babel/preset-env', + '@babel/preset-react', + '@babel/preset-flow' + ], + 'plugins': [ + '@babel/plugin-proposal-object-rest-spread', + '@babel/plugin-proposal-class-properties', + ['@babel/plugin-transform-runtime', { + 'corejs': 2 + }], + ['babel-plugin-transform-define', { + 'process.env.NEXT_VERSION': require('./package.json').version + }] + ] +} diff --git a/packages/next-server/config.js b/packages/next-server/config.js new file mode 100644 index 00000000..c718915e --- /dev/null +++ b/packages/next-server/config.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/runtime-config') diff --git a/packages/next-server/constants.js b/packages/next-server/constants.js new file mode 100644 index 00000000..eabac1ce --- /dev/null +++ b/packages/next-server/constants.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/constants') \ No newline at end of file diff --git a/packages/next-server/dynamic.js b/packages/next-server/dynamic.js new file mode 100644 index 00000000..29e3d56c --- /dev/null +++ b/packages/next-server/dynamic.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/dynamic') diff --git a/packages/next-server/head.js b/packages/next-server/head.js new file mode 100644 index 00000000..c77f0848 --- /dev/null +++ b/packages/next-server/head.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/head') diff --git a/packages/next/lib/EventEmitter.js b/packages/next-server/lib/EventEmitter.js similarity index 100% rename from packages/next/lib/EventEmitter.js rename to packages/next-server/lib/EventEmitter.js diff --git a/packages/next/lib/asset.js b/packages/next-server/lib/asset.js similarity index 100% rename from packages/next/lib/asset.js rename to packages/next-server/lib/asset.js diff --git a/packages/next-server/lib/constants.js b/packages/next-server/lib/constants.js new file mode 100644 index 00000000..d9ac6d8c --- /dev/null +++ b/packages/next-server/lib/constants.js @@ -0,0 +1,27 @@ +import {join} from 'path' +export const PHASE_EXPORT = 'phase-export' +export const PHASE_PRODUCTION_BUILD = 'phase-production-build' +export const PHASE_PRODUCTION_SERVER = 'phase-production-server' +export const PHASE_DEVELOPMENT_SERVER = 'phase-development-server' +export const PAGES_MANIFEST = 'pages-manifest.json' +export const BUILD_MANIFEST = 'build-manifest.json' +export const REACT_LOADABLE_MANIFEST = 'react-loadable-manifest.json' +export const SERVER_DIRECTORY = 'server' +export const CONFIG_FILE = 'next.config.js' +export const BUILD_ID_FILE = 'BUILD_ID' +export const BLOCKED_PAGES = [ + '/_document', + '/_app', + '/_error' +] +export const CLIENT_STATIC_FILES_PATH = 'static' +export const CLIENT_STATIC_FILES_RUNTIME = 'runtime' +export const CLIENT_STATIC_FILES_RUNTIME_PATH = `${CLIENT_STATIC_FILES_PATH}/${CLIENT_STATIC_FILES_RUNTIME}` +// static/runtime/main.js +export const CLIENT_STATIC_FILES_RUNTIME_MAIN = `${CLIENT_STATIC_FILES_RUNTIME_PATH}/main.js` +// static/runtime/webpack.js +export const CLIENT_STATIC_FILES_RUNTIME_WEBPACK = `${CLIENT_STATIC_FILES_RUNTIME_PATH}/webpack.js` +// matches static//pages/.js +export const IS_BUNDLED_PAGE_REGEX = /^static[/\\][^/\\]+[/\\]pages.*\.js$/ +// matches static//pages/:page*.js +export const ROUTE_NAME_REGEX = /^static[/\\][^/\\]+[/\\]pages[/\\](.*)\.js$/ \ No newline at end of file diff --git a/packages/next/lib/dynamic.js b/packages/next-server/lib/dynamic.js similarity index 100% rename from packages/next/lib/dynamic.js rename to packages/next-server/lib/dynamic.js diff --git a/packages/next/lib/error-debug.js b/packages/next-server/lib/error-debug.js similarity index 98% rename from packages/next/lib/error-debug.js rename to packages/next-server/lib/error-debug.js index 6f1a7094..b1292507 100644 --- a/packages/next/lib/error-debug.js +++ b/packages/next-server/lib/error-debug.js @@ -1,7 +1,7 @@ // @flow import React from 'react' import ansiHTML from 'ansi-html' -import Head from './head' +import Head from 'next-server/head' // This component is rendered through dev-error-overlay on the client side. // On the server side it's rendered directly diff --git a/packages/next/lib/head.js b/packages/next-server/lib/head.js similarity index 100% rename from packages/next/lib/head.js rename to packages/next-server/lib/head.js diff --git a/packages/next/lib/link.js b/packages/next-server/lib/link.js similarity index 98% rename from packages/next/lib/link.js rename to packages/next-server/lib/link.js index ef66030b..971c7806 100644 --- a/packages/next/lib/link.js +++ b/packages/next-server/lib/link.js @@ -4,7 +4,7 @@ import { resolve, format, parse } from 'url' import React, { Component, Children } from 'react' import PropTypes from 'prop-types' import Router, { _rewriteUrlForNextExport } from './router' -import { execOnce, getLocationOrigin } from './utils' +import {execOnce, getLocationOrigin} from './utils' function isLocal (href) { const url = parse(href, false, true) diff --git a/packages/next/lib/loadable-capture.js b/packages/next-server/lib/loadable-capture.js similarity index 100% rename from packages/next/lib/loadable-capture.js rename to packages/next-server/lib/loadable-capture.js diff --git a/packages/next/lib/loadable.js b/packages/next-server/lib/loadable.js similarity index 100% rename from packages/next/lib/loadable.js rename to packages/next-server/lib/loadable.js diff --git a/packages/next/lib/p-queue.js b/packages/next-server/lib/p-queue.js similarity index 100% rename from packages/next/lib/p-queue.js rename to packages/next-server/lib/p-queue.js diff --git a/packages/next/lib/router/index.js b/packages/next-server/lib/router/index.js similarity index 100% rename from packages/next/lib/router/index.js rename to packages/next-server/lib/router/index.js diff --git a/packages/next/lib/router/router.js b/packages/next-server/lib/router/router.js similarity index 100% rename from packages/next/lib/router/router.js rename to packages/next-server/lib/router/router.js diff --git a/packages/next/lib/router/with-router.js b/packages/next-server/lib/router/with-router.js similarity index 100% rename from packages/next/lib/router/with-router.js rename to packages/next-server/lib/router/with-router.js diff --git a/packages/next/lib/runtime-config.js b/packages/next-server/lib/runtime-config.js similarity index 100% rename from packages/next/lib/runtime-config.js rename to packages/next-server/lib/runtime-config.js diff --git a/packages/next/lib/shallow-equals.js b/packages/next-server/lib/shallow-equals.js similarity index 100% rename from packages/next/lib/shallow-equals.js rename to packages/next-server/lib/shallow-equals.js diff --git a/packages/next/lib/side-effect.js b/packages/next-server/lib/side-effect.js similarity index 100% rename from packages/next/lib/side-effect.js rename to packages/next-server/lib/side-effect.js diff --git a/packages/next/lib/utils.js b/packages/next-server/lib/utils.js similarity index 100% rename from packages/next/lib/utils.js rename to packages/next-server/lib/utils.js index 89304aee..b6144951 100644 --- a/packages/next/lib/utils.js +++ b/packages/next-server/lib/utils.js @@ -8,6 +8,17 @@ export function execOnce (fn) { } } +export function getLocationOrigin () { + const { protocol, hostname, port } = window.location + return `${protocol}//${hostname}${port ? ':' + port : ''}` +} + +export function getURL () { + const { href } = window.location + const origin = getLocationOrigin() + return href.substring(origin.length) +} + export function getDisplayName (Component) { if (typeof Component === 'string') { return Component @@ -45,14 +56,3 @@ export async function loadGetInitialProps (Component, ctx) { return props } - -export function getLocationOrigin () { - const { protocol, hostname, port } = window.location - return `${protocol}//${hostname}${port ? ':' + port : ''}` -} - -export function getURL () { - const { href } = window.location - const origin = getLocationOrigin() - return href.substring(origin.length) -} diff --git a/packages/next-server/link.js b/packages/next-server/link.js new file mode 100644 index 00000000..c5afd84d --- /dev/null +++ b/packages/next-server/link.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/link') diff --git a/packages/next-server/next-config.js b/packages/next-server/next-config.js new file mode 100644 index 00000000..9c0de825 --- /dev/null +++ b/packages/next-server/next-config.js @@ -0,0 +1 @@ +module.exports = require('./dist/server/config') \ No newline at end of file diff --git a/packages/next-server/package.json b/packages/next-server/package.json new file mode 100644 index 00000000..b6342d26 --- /dev/null +++ b/packages/next-server/package.json @@ -0,0 +1,45 @@ +{ + "name": "next-server", + "version": "7.0.1", + "main": "./dist/server/next-server.js", + "scripts": { + "build": "taskr", + "release": "taskr release", + "prepublish": "npm run release" + }, + "taskr": { + "requires": [ + "./taskfile-babel.js" + ] + }, + "dependencies": { + "find-up": "3.0.0", + "http-errors": "1.6.2", + "path-to-regexp": "2.1.0", + "url": "0.11.0", + "ansi-html": "0.0.7", + "prop-types": "15.6.2", + "send": "0.16.1", + "styled-jsx": "3.1.0", + "etag": "1.8.1", + "fresh": "0.5.2", + "htmlescape": "1.1.1" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "@babel/core": "7.1.2", + "@babel/plugin-proposal-class-properties": "7.1.0", + "@babel/plugin-proposal-object-rest-spread": "7.0.0", + "@babel/plugin-syntax-dynamic-import": "7.0.0", + "@babel/plugin-transform-runtime": "7.1.0", + "@babel/preset-env": "7.1.0", + "@babel/preset-react": "7.0.0", + "@babel/runtime": "7.1.2", + "@babel/runtime-corejs2": "7.1.2", + "@taskr/clear": "1.1.0", + "@taskr/watch": "1.1.0" + } +} diff --git a/packages/next-server/router.js b/packages/next-server/router.js new file mode 100644 index 00000000..b8c9ff94 --- /dev/null +++ b/packages/next-server/router.js @@ -0,0 +1 @@ +module.exports = require('./dist/lib/router') diff --git a/packages/next/server/config.js b/packages/next-server/server/config.js similarity index 97% rename from packages/next/server/config.js rename to packages/next-server/server/config.js index 2e87b2ca..ad9653ea 100644 --- a/packages/next/server/config.js +++ b/packages/next-server/server/config.js @@ -1,6 +1,6 @@ // @flow import findUp from 'find-up' -import {CONFIG_FILE} from '../lib/constants' +import {CONFIG_FILE} from 'next-server/constants' type WebpackConfig = * diff --git a/packages/next/server/lib/path-match.js b/packages/next-server/server/lib/path-match.js similarity index 100% rename from packages/next/server/lib/path-match.js rename to packages/next-server/server/lib/path-match.js diff --git a/packages/next/server/next-server.js b/packages/next-server/server/next-server.js similarity index 98% rename from packages/next/server/next-server.js rename to packages/next-server/server/next-server.js index f3e85536..6f742a5b 100644 --- a/packages/next/server/next-server.js +++ b/packages/next-server/server/next-server.js @@ -11,8 +11,8 @@ import { } from './render' import Router, {route} from './router' import { isInternalUrl } from './utils' -import loadConfig from './config' -import {PHASE_PRODUCTION_SERVER, BLOCKED_PAGES, BUILD_ID_FILE, CLIENT_STATIC_FILES_PATH, CLIENT_STATIC_FILES_RUNTIME} from '../lib/constants' +import loadConfig from 'next-server/next-config' +import {PHASE_PRODUCTION_SERVER, BLOCKED_PAGES, BUILD_ID_FILE, CLIENT_STATIC_FILES_PATH, CLIENT_STATIC_FILES_RUNTIME} from 'next-server/constants' import * as asset from '../lib/asset' import * as envConfig from '../lib/runtime-config' import { isResSent } from '../lib/utils' diff --git a/packages/next/server/render.js b/packages/next-server/server/render.js similarity index 99% rename from packages/next/server/render.js rename to packages/next-server/server/render.js index 238d75eb..98d5d406 100644 --- a/packages/next/server/render.js +++ b/packages/next-server/server/render.js @@ -11,7 +11,7 @@ import Head, { defaultHead } from '../lib/head' import ErrorDebug from '../lib/error-debug' import Loadable from '../lib/loadable' import LoadableCapture from '../lib/loadable-capture' -import { BUILD_MANIFEST, REACT_LOADABLE_MANIFEST, SERVER_DIRECTORY, CLIENT_STATIC_FILES_PATH } from '../lib/constants' +import { BUILD_MANIFEST, REACT_LOADABLE_MANIFEST, SERVER_DIRECTORY, CLIENT_STATIC_FILES_PATH } from 'next-server/constants' // Based on https://github.com/jamiebuilds/react-loadable/pull/132 function getDynamicImportBundles (manifest, moduleIds) { diff --git a/packages/next/server/require.js b/packages/next-server/server/require.js similarity index 94% rename from packages/next/server/require.js rename to packages/next-server/server/require.js index f85f7ade..d5643472 100644 --- a/packages/next/server/require.js +++ b/packages/next-server/server/require.js @@ -1,5 +1,5 @@ import {join, posix} from 'path' -import {PAGES_MANIFEST, SERVER_DIRECTORY} from '../lib/constants' +import {PAGES_MANIFEST, SERVER_DIRECTORY} from 'next-server/constants' export function pageNotFoundError (page) { const err = new Error(`Cannot find module for page: ${page}`) diff --git a/packages/next/server/router.js b/packages/next-server/server/router.js similarity index 100% rename from packages/next/server/router.js rename to packages/next-server/server/router.js diff --git a/packages/next-server/server/utils.js b/packages/next-server/server/utils.js new file mode 100644 index 00000000..58e49c4d --- /dev/null +++ b/packages/next-server/server/utils.js @@ -0,0 +1,14 @@ +const internalPrefixes = [ + /^\/_next\//, + /^\/static\// +] + +export function isInternalUrl (url) { + for (const prefix of internalPrefixes) { + if (prefix.test(url)) { + return true + } + } + + return false +} diff --git a/packages/next-server/taskfile-babel.js b/packages/next-server/taskfile-babel.js new file mode 100644 index 00000000..c44e9a1c --- /dev/null +++ b/packages/next-server/taskfile-babel.js @@ -0,0 +1,65 @@ +// taskr babel plugin with Babel 7 support +// https://github.com/lukeed/taskr/pull/305 +'use strict' + +const transform = require('@babel/core').transform +const flatten = require('flatten') + +const BABEL_REGEX = /(^@babel\/)(preset|plugin)-(.*)/i + +function getBabels () { + const pkg = require('./package.json') + return flatten( + ['devDependencies', 'dependencies'].map(s => Object.keys(pkg[s] || {})) + ).filter(s => BABEL_REGEX.test(s)) +} + +module.exports = function (task) { + let cache + + task.plugin('babel', {}, function * (file, opts) { + if (opts.preload) { + delete opts.preload + // get dependencies + cache = cache || getBabels() + + // attach any deps to babel's `opts` + cache.forEach(dep => { + const segs = BABEL_REGEX.exec(dep) + const type = `${segs[2]}s` + const name = `@babel/${segs[2]}-${segs[3]}` + + opts[type] = opts[type] || [] + + // flatten all (advanced entries are arrays) + if (flatten(opts[type]).indexOf(name) === -1) { + opts[type] = opts[type].concat(name) + } + }) + } + + // attach file's name + opts.filename = file.base + + const output = transform(file.data, opts) + + if (output.map) { + const map = `${file.base}.map` + + // append `sourceMappingURL` to original file + if (opts.sourceMaps !== 'both') { + output.code += Buffer.from(`\n//# sourceMappingURL=${map}`) + } + + // add sourcemap to `files` array + this._.files.push({ + base: map, + dir: file.dir, + data: Buffer.from(JSON.stringify(output.map)) + }) + } + + // update file's data + file.data = Buffer.from(output.code) + }) +} diff --git a/packages/next-server/taskfile.js b/packages/next-server/taskfile.js new file mode 100644 index 00000000..c317838c --- /dev/null +++ b/packages/next-server/taskfile.js @@ -0,0 +1,40 @@ +const notifier = require('node-notifier') + +export async function bin (task, opts) { + await task.source(opts.src || 'bin/*').babel().target('dist/bin', {mode: '0755'}) + notify('Compiled binaries') +} + +export async function lib (task, opts) { + await task.source(opts.src || 'lib/**/*.js').babel().target('dist/lib') + notify('Compiled lib files') +} + +export async function server (task, opts) { + await task.source(opts.src || 'server/**/*.js').babel().target('dist/server') + notify('Compiled server files') +} + +export async function build (task) { + await task.parallel(['bin', 'server', 'lib']) +} + +export default async function (task) { + await task.start('build') + await task.watch('bin/*', 'bin') + await task.watch('server/**/*.js', 'server') + await task.watch('lib/**/*.js', 'lib') +} + +export async function release (task) { + await task.clear('dist').start('build') +} + +// notification helper +function notify (msg) { + return notifier.notify({ + title: '▲ Next', + message: msg, + icon: false + }) +} diff --git a/packages/next/asset.js b/packages/next/asset.js index fd0bd5db..8164bb34 100644 --- a/packages/next/asset.js +++ b/packages/next/asset.js @@ -1 +1 @@ -module.exports = require('./dist/lib/asset') +module.exports = require('next-server/asset') diff --git a/packages/next/bin/next b/packages/next/bin/next index 3f4366f1..196f138e 100755 --- a/packages/next/bin/next +++ b/packages/next/bin/next @@ -2,7 +2,7 @@ import { join } from 'path' import { spawn } from 'cross-spawn' import pkg from '../../package.json' -import {CONFIG_FILE} from '../lib/constants' +import {CONFIG_FILE} from 'next-server/constants' if (pkg.peerDependencies) { Object.keys(pkg.peerDependencies).forEach(dependency => { diff --git a/packages/next/build/index.js b/packages/next/build/index.js index 5e66eaad..b1d3dd70 100644 --- a/packages/next/build/index.js +++ b/packages/next/build/index.js @@ -2,8 +2,8 @@ import { join } from 'path' import promisify from '../lib/promisify' import fs from 'fs' import webpack from 'webpack' -import loadConfig from '../server/config' -import { PHASE_PRODUCTION_BUILD, BUILD_ID_FILE } from '../lib/constants' +import loadConfig from 'next-server/next-config' +import { PHASE_PRODUCTION_BUILD, BUILD_ID_FILE } from 'next-server/constants' import getBaseWebpackConfig from './webpack' const access = promisify(fs.access) diff --git a/packages/next/build/webpack.js b/packages/next/build/webpack.js index 764fc6b8..d7c85323 100644 --- a/packages/next/build/webpack.js +++ b/packages/next/build/webpack.js @@ -17,7 +17,8 @@ import PagesManifestPlugin from './webpack/plugins/pages-manifest-plugin' import BuildManifestPlugin from './webpack/plugins/build-manifest-plugin' import ChunkNamesPlugin from './webpack/plugins/chunk-names-plugin' import { ReactLoadablePlugin } from './webpack/plugins/react-loadable-plugin' -import {SERVER_DIRECTORY, NEXT_PROJECT_ROOT, NEXT_PROJECT_ROOT_NODE_MODULES, NEXT_PROJECT_ROOT_DIST, DEFAULT_PAGES_DIR, REACT_LOADABLE_MANIFEST, CLIENT_STATIC_FILES_RUNTIME_WEBPACK, CLIENT_STATIC_FILES_RUNTIME_MAIN} from '../lib/constants' +import {SERVER_DIRECTORY, REACT_LOADABLE_MANIFEST, CLIENT_STATIC_FILES_RUNTIME_WEBPACK, CLIENT_STATIC_FILES_RUNTIME_MAIN} from 'next-server/constants' +import {NEXT_PROJECT_ROOT, NEXT_PROJECT_ROOT_NODE_MODULES, NEXT_PROJECT_ROOT_DIST, DEFAULT_PAGES_DIR} from '../lib/constants' import AutoDllPlugin from 'autodll-webpack-plugin' import TerserPlugin from 'terser-webpack-plugin' diff --git a/packages/next/build/webpack/plugins/build-manifest-plugin.js b/packages/next/build/webpack/plugins/build-manifest-plugin.js index 2139b6c3..a4374c4b 100644 --- a/packages/next/build/webpack/plugins/build-manifest-plugin.js +++ b/packages/next/build/webpack/plugins/build-manifest-plugin.js @@ -1,6 +1,6 @@ // @flow import { RawSource } from 'webpack-sources' -import {BUILD_MANIFEST, ROUTE_NAME_REGEX, IS_BUNDLED_PAGE_REGEX, CLIENT_STATIC_FILES_RUNTIME_MAIN} from '../../../lib/constants' +import {BUILD_MANIFEST, ROUTE_NAME_REGEX, IS_BUNDLED_PAGE_REGEX, CLIENT_STATIC_FILES_RUNTIME_MAIN} from 'next-server/constants' // This plugin creates a build-manifest.json for all assets that are being output // It has a mapping of "entry" filename to real filename. Because the real filename can be hashed in production diff --git a/packages/next/build/webpack/plugins/nextjs-ssr-module-cache.js b/packages/next/build/webpack/plugins/nextjs-ssr-module-cache.js index c09b3651..85981cb0 100644 --- a/packages/next/build/webpack/plugins/nextjs-ssr-module-cache.js +++ b/packages/next/build/webpack/plugins/nextjs-ssr-module-cache.js @@ -1,7 +1,7 @@ import webpack from 'webpack' import { RawSource } from 'webpack-sources' import { join, relative, dirname } from 'path' -import {IS_BUNDLED_PAGE_REGEX} from '../../../lib/constants' +import {IS_BUNDLED_PAGE_REGEX} from 'next-server/constants' const SSR_MODULE_CACHE_FILENAME = 'ssr-module-cache.js' diff --git a/packages/next/build/webpack/plugins/pages-manifest-plugin.js b/packages/next/build/webpack/plugins/pages-manifest-plugin.js index ff580637..9707df60 100644 --- a/packages/next/build/webpack/plugins/pages-manifest-plugin.js +++ b/packages/next/build/webpack/plugins/pages-manifest-plugin.js @@ -1,6 +1,6 @@ // @flow import { RawSource } from 'webpack-sources' -import {PAGES_MANIFEST, ROUTE_NAME_REGEX} from '../../../lib/constants' +import {PAGES_MANIFEST, ROUTE_NAME_REGEX} from 'next-server/constants' // This plugin creates a pages-manifest.json from page entrypoints. // This is used for mapping paths like `/` to `.next/server/static//pages/index.js` when doing SSR diff --git a/packages/next/build/webpack/plugins/pages-plugin.js b/packages/next/build/webpack/plugins/pages-plugin.js index 22adbc94..6e7f55c1 100644 --- a/packages/next/build/webpack/plugins/pages-plugin.js +++ b/packages/next/build/webpack/plugins/pages-plugin.js @@ -3,7 +3,7 @@ import { ConcatSource } from 'webpack-sources' import { IS_BUNDLED_PAGE_REGEX, ROUTE_NAME_REGEX -} from '../../../lib/constants' +} from 'next-server/constants' export default class PagesPlugin { apply (compiler: any) { diff --git a/packages/next/build/webpack/plugins/unlink-file-plugin.js b/packages/next/build/webpack/plugins/unlink-file-plugin.js index 7e98f75f..82f35486 100644 --- a/packages/next/build/webpack/plugins/unlink-file-plugin.js +++ b/packages/next/build/webpack/plugins/unlink-file-plugin.js @@ -2,7 +2,7 @@ import { join } from 'path' import promisify from '../../../lib/promisify' import fs from 'fs' -import { IS_BUNDLED_PAGE_REGEX } from '../../../lib/constants' +import { IS_BUNDLED_PAGE_REGEX } from 'next-server/constants' const unlink = promisify(fs.unlink) diff --git a/packages/next/build/webpack/utils.js b/packages/next/build/webpack/utils.js index 8be56e6c..3da43a31 100644 --- a/packages/next/build/webpack/utils.js +++ b/packages/next/build/webpack/utils.js @@ -1,7 +1,7 @@ import path from 'path' import promisify from '../../lib/promisify' import globModule from 'glob' -import {CLIENT_STATIC_FILES_PATH} from '../../lib/constants' +import {CLIENT_STATIC_FILES_PATH} from 'next-server/constants' const glob = promisify(globModule) diff --git a/packages/next/client/index.js b/packages/next/client/index.js index 4f7b83b9..0b8de558 100644 --- a/packages/next/client/index.js +++ b/packages/next/client/index.js @@ -1,14 +1,14 @@ import React from 'react' import ReactDOM from 'react-dom' import HeadManager from './head-manager' -import { createRouter } from '../lib/router' -import EventEmitter from '../lib/EventEmitter' -import { loadGetInitialProps, getURL } from '../lib/utils' +import { createRouter } from 'next-server/dist/lib/router' +import EventEmitter from 'next-server/dist/lib/EventEmitter' +import {loadGetInitialProps, getURL} from 'next-server/dist/lib/utils' import PageLoader from '../lib/page-loader' -import * as asset from '../lib/asset' -import * as envConfig from '../lib/runtime-config' +import * as asset from 'next-server/asset' +import * as envConfig from 'next-server/config' import ErrorBoundary from './error-boundary' -import Loadable from '../lib/loadable' +import Loadable from 'next-server/dist/lib/loadable' // Polyfill Promise globally // This is needed because Webpack's dynamic loading(common chunks) code diff --git a/packages/next/client/on-demand-entries-client.js b/packages/next/client/on-demand-entries-client.js index 5fe4bcf5..cc9fe9a4 100644 --- a/packages/next/client/on-demand-entries-client.js +++ b/packages/next/client/on-demand-entries-client.js @@ -1,6 +1,6 @@ /* global location */ -import Router from '../lib/router' +import Router from 'next-server/router' import fetch from 'unfetch' export default ({assetPrefix}) => { diff --git a/packages/next/client/webpack-hot-middleware-client.js b/packages/next/client/webpack-hot-middleware-client.js index 97b1be65..fb0cece4 100644 --- a/packages/next/client/webpack-hot-middleware-client.js +++ b/packages/next/client/webpack-hot-middleware-client.js @@ -1,6 +1,6 @@ import 'event-source-polyfill' import connect from './dev-error-overlay/hot-dev-client' -import Router from '../lib/router' +import Router from 'next-server/router' const handlers = { reload (route) { diff --git a/packages/next/config.js b/packages/next/config.js index c718915e..ee925f41 100644 --- a/packages/next/config.js +++ b/packages/next/config.js @@ -1 +1 @@ -module.exports = require('./dist/lib/runtime-config') +module.exports = require('next-server/config') diff --git a/packages/next/constants.js b/packages/next/constants.js index 707c6478..56c8359f 100644 --- a/packages/next/constants.js +++ b/packages/next/constants.js @@ -1 +1 @@ -module.exports = require('./dist/lib/constants') +module.exports = require('next-server/constants') diff --git a/packages/next/dynamic.js b/packages/next/dynamic.js index 29e3d56c..fdb9cb26 100644 --- a/packages/next/dynamic.js +++ b/packages/next/dynamic.js @@ -1 +1 @@ -module.exports = require('./dist/lib/dynamic') +module.exports = require('next-server/dynamic') diff --git a/packages/next/export/index.js b/packages/next/export/index.js index 881767e6..080b35dc 100644 --- a/packages/next/export/index.js +++ b/packages/next/export/index.js @@ -3,11 +3,11 @@ import cp from 'recursive-copy' import mkdirp from 'mkdirp-then' import { extname, resolve, join, dirname, sep } from 'path' import { existsSync, readFileSync, writeFileSync } from 'fs' -import loadConfig from '../server/config' -import {PHASE_EXPORT, SERVER_DIRECTORY, PAGES_MANIFEST, CONFIG_FILE, BUILD_ID_FILE, CLIENT_STATIC_FILES_PATH} from '../lib/constants' -import { renderToHTML } from '../server/render' -import { setAssetPrefix } from '../lib/asset' -import * as envConfig from '../lib/runtime-config' +import loadConfig from 'next-server/next-config' +import {PHASE_EXPORT, SERVER_DIRECTORY, PAGES_MANIFEST, CONFIG_FILE, BUILD_ID_FILE, CLIENT_STATIC_FILES_PATH} from 'next-server/constants' +import { renderToHTML } from 'next-server/dist/server/render' +import { setAssetPrefix } from 'next-server/asset' +import * as envConfig from 'next-server/config' export default async function (dir, options, configuration) { function log (message) { diff --git a/packages/next/head.js b/packages/next/head.js index c77f0848..114a05db 100644 --- a/packages/next/head.js +++ b/packages/next/head.js @@ -1 +1 @@ -module.exports = require('./dist/lib/head') +module.exports = require('next-server/head') \ No newline at end of file diff --git a/packages/next/lib/app.js b/packages/next/lib/app.js index 8d1df776..d0e558bd 100644 --- a/packages/next/lib/app.js +++ b/packages/next/lib/app.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { execOnce, loadGetInitialProps } from './utils' -import { makePublicRouterInstance } from './router' +import { execOnce, loadGetInitialProps } from 'next-server/dist/lib/utils' +import { makePublicRouterInstance } from 'next-server/router' export default class App extends Component { static childContextTypes = { diff --git a/packages/next/lib/constants.js b/packages/next/lib/constants.js index 5b2cca11..2b7de225 100644 --- a/packages/next/lib/constants.js +++ b/packages/next/lib/constants.js @@ -1,31 +1,5 @@ import {join} from 'path' -export const PHASE_EXPORT = 'phase-export' -export const PHASE_PRODUCTION_BUILD = 'phase-production-build' -export const PHASE_PRODUCTION_SERVER = 'phase-production-server' -export const PHASE_DEVELOPMENT_SERVER = 'phase-development-server' -export const PAGES_MANIFEST = 'pages-manifest.json' -export const BUILD_MANIFEST = 'build-manifest.json' -export const REACT_LOADABLE_MANIFEST = 'react-loadable-manifest.json' -export const SERVER_DIRECTORY = 'server' -export const CONFIG_FILE = 'next.config.js' -export const BUILD_ID_FILE = 'BUILD_ID' -export const BLOCKED_PAGES = [ - '/_document', - '/_app', - '/_error' -] -// matches static//pages/.js -export const IS_BUNDLED_PAGE_REGEX = /^static[/\\][^/\\]+[/\\]pages.*\.js$/ -// matches static//pages/:page*.js -export const ROUTE_NAME_REGEX = /^static[/\\][^/\\]+[/\\]pages[/\\](.*)\.js$/ export const NEXT_PROJECT_ROOT = join(__dirname, '..', '..') export const NEXT_PROJECT_ROOT_DIST = join(NEXT_PROJECT_ROOT, 'dist') export const NEXT_PROJECT_ROOT_NODE_MODULES = join(NEXT_PROJECT_ROOT, 'node_modules') export const DEFAULT_PAGES_DIR = join(NEXT_PROJECT_ROOT_DIST, 'pages') -export const CLIENT_STATIC_FILES_PATH = 'static' -export const CLIENT_STATIC_FILES_RUNTIME = 'runtime' -export const CLIENT_STATIC_FILES_RUNTIME_PATH = `${CLIENT_STATIC_FILES_PATH}/${CLIENT_STATIC_FILES_RUNTIME}` -// static/runtime/main.js -export const CLIENT_STATIC_FILES_RUNTIME_MAIN = `${CLIENT_STATIC_FILES_RUNTIME_PATH}/main.js` -// static/runtime/webpack.js -export const CLIENT_STATIC_FILES_RUNTIME_WEBPACK = `${CLIENT_STATIC_FILES_RUNTIME_PATH}/webpack.js` diff --git a/packages/next/lib/error.js b/packages/next/lib/error.js index 5927651e..cef92cf7 100644 --- a/packages/next/lib/error.js +++ b/packages/next/lib/error.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import HTTPStatus from 'http-status' -import Head from './head' +import Head from 'next-server/head' export default class Error extends React.Component { static getInitialProps ({ res, err }) { diff --git a/packages/next/lib/page-loader.js b/packages/next/lib/page-loader.js index 938d3c8f..f691b66c 100644 --- a/packages/next/lib/page-loader.js +++ b/packages/next/lib/page-loader.js @@ -1,5 +1,5 @@ /* global window, document */ -import EventEmitter from './EventEmitter' +import EventEmitter from 'next-server/dist/lib/EventEmitter' const webpackModule = module diff --git a/packages/next/link.js b/packages/next/link.js index c5afd84d..db85d92e 100644 --- a/packages/next/link.js +++ b/packages/next/link.js @@ -1 +1 @@ -module.exports = require('./dist/lib/link') +module.exports = require('next-server/link') diff --git a/packages/next/package.json b/packages/next/package.json index 84bc43ce..f7d36c8e 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -47,6 +47,7 @@ ] }, "dependencies": { + "next-server": "7.0.1", "@babel/core": "7.1.2", "@babel/plugin-proposal-class-properties": "7.1.0", "@babel/plugin-proposal-object-rest-spread": "7.0.0", diff --git a/packages/next/router.js b/packages/next/router.js index b8c9ff94..df64af7f 100644 --- a/packages/next/router.js +++ b/packages/next/router.js @@ -1 +1 @@ -module.exports = require('./dist/lib/router') +module.exports = require('next-server/router') diff --git a/packages/next/server/hot-reloader.js b/packages/next/server/hot-reloader.js index a5f04e43..5a2e64f2 100644 --- a/packages/next/server/hot-reloader.js +++ b/packages/next/server/hot-reloader.js @@ -6,14 +6,31 @@ import del from 'del' import onDemandEntryHandler, {normalizePage} from './on-demand-entry-handler' import webpack from 'webpack' import getBaseWebpackConfig from '../build/webpack' -import { - addCorsSupport -} from './utils' -import {IS_BUNDLED_PAGE_REGEX, ROUTE_NAME_REGEX, BLOCKED_PAGES, CLIENT_STATIC_FILES_PATH} from '../lib/constants' -import pathMatch from './lib/path-match' -import {renderScriptError} from './render' +import {IS_BUNDLED_PAGE_REGEX, ROUTE_NAME_REGEX, BLOCKED_PAGES, CLIENT_STATIC_FILES_PATH} from 'next-server/constants' +import {route} from 'next-server/dist/server/router' +import {renderScriptError} from 'next-server/dist/server/render' + +function addCorsSupport (req, res) { + if (!req.headers.origin) { + return { preflight: false } + } + + res.setHeader('Access-Control-Allow-Origin', req.headers.origin) + res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET') + // Based on https://github.com/primus/access-control/blob/4cf1bc0e54b086c91e6aa44fb14966fa5ef7549c/index.js#L158 + if (req.headers['access-control-request-headers']) { + res.setHeader('Access-Control-Allow-Headers', req.headers['access-control-request-headers']) + } + + if (req.method === 'OPTIONS') { + res.writeHead(200) + res.end() + return { preflight: true } + } + + return { preflight: false } +} -const route = pathMatch() const matchNextPageBundleRequest = route('/_next/static/:buildId/pages/:path*.js(.map)?') // Recursively look up the issuer till it ends up at the root diff --git a/packages/next/server/next-dev-server.js b/packages/next/server/next-dev-server.js index 34b0184a..a3824662 100644 --- a/packages/next/server/next-dev-server.js +++ b/packages/next/server/next-dev-server.js @@ -1,8 +1,8 @@ -import Server from './next-server' +import Server from 'next-server' import { join } from 'path' import HotReloader from './hot-reloader' -import {route} from './router' -import {PHASE_DEVELOPMENT_SERVER} from '../lib/constants' +import {route} from 'next-server/dist/server/router' +import {PHASE_DEVELOPMENT_SERVER} from 'next-server/constants' export default class DevServer extends Server { constructor (options) { diff --git a/packages/next/server/next.js b/packages/next/server/next.js index b79d9b7b..e2d99b52 100644 --- a/packages/next/server/next.js +++ b/packages/next/server/next.js @@ -1,5 +1,5 @@ // This file is used for when users run `require('next')` module.exports = (opts) => { - const Server = opts.dev ? require('./next-dev-server').default : require('./next-server').default + const Server = opts.dev ? require('./next-dev-server').default : require('next-server').default return new Server(opts) } diff --git a/packages/next/server/on-demand-entry-handler.js b/packages/next/server/on-demand-entry-handler.js index adfb7b7f..98c25b19 100644 --- a/packages/next/server/on-demand-entry-handler.js +++ b/packages/next/server/on-demand-entry-handler.js @@ -5,9 +5,9 @@ import { parse } from 'url' import fs from 'fs' import promisify from '../lib/promisify' import globModule from 'glob' -import {normalizePagePath, pageNotFoundError} from './require' +import {normalizePagePath, pageNotFoundError} from 'next-server/dist/server/require' import {createEntry} from '../build/webpack/utils' -import { ROUTE_NAME_REGEX, IS_BUNDLED_PAGE_REGEX } from '../lib/constants' +import { ROUTE_NAME_REGEX, IS_BUNDLED_PAGE_REGEX } from 'next-server/constants' const ADDED = Symbol('added') const BUILDING = Symbol('building') diff --git a/packages/next/server/utils.js b/packages/next/server/utils.js deleted file mode 100644 index 529c55ec..00000000 --- a/packages/next/server/utils.js +++ /dev/null @@ -1,35 +0,0 @@ -const internalPrefixes = [ - /^\/_next\//, - /^\/static\// -] - -export function isInternalUrl (url) { - for (const prefix of internalPrefixes) { - if (prefix.test(url)) { - return true - } - } - - return false -} - -export function addCorsSupport (req, res) { - if (!req.headers.origin) { - return { preflight: false } - } - - res.setHeader('Access-Control-Allow-Origin', req.headers.origin) - res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET') - // Based on https://github.com/primus/access-control/blob/4cf1bc0e54b086c91e6aa44fb14966fa5ef7549c/index.js#L158 - if (req.headers['access-control-request-headers']) { - res.setHeader('Access-Control-Allow-Headers', req.headers['access-control-request-headers']) - } - - if (req.method === 'OPTIONS') { - res.writeHead(200) - res.end() - return { preflight: true } - } - - return { preflight: false } -} diff --git a/test/integration/basic/test/rendering.js b/test/integration/basic/test/rendering.js index 8bd8292d..cde66d85 100644 --- a/test/integration/basic/test/rendering.js +++ b/test/integration/basic/test/rendering.js @@ -1,7 +1,7 @@ /* global describe, test, it, expect */ import cheerio from 'cheerio' -import {BUILD_MANIFEST, REACT_LOADABLE_MANIFEST} from 'next/constants' +import {BUILD_MANIFEST, REACT_LOADABLE_MANIFEST} from 'next-server/constants' import { join } from 'path' export default function ({ app }, suiteName, render, fetch, appPort) { diff --git a/test/integration/dist-dir/test/index.test.js b/test/integration/dist-dir/test/index.test.js index 984ebf1b..fc1071b7 100644 --- a/test/integration/dist-dir/test/index.test.js +++ b/test/integration/dist-dir/test/index.test.js @@ -2,7 +2,7 @@ import { join } from 'path' import { existsSync } from 'fs' -import {BUILD_ID_FILE} from 'next/constants' +import {BUILD_ID_FILE} from 'next-server/constants' import { nextServer, nextBuild, diff --git a/test/integration/export/next.config.js b/test/integration/export/next.config.js index 6e51f14a..d4cffa6a 100644 --- a/test/integration/export/next.config.js +++ b/test/integration/export/next.config.js @@ -1,4 +1,4 @@ -const {PHASE_DEVELOPMENT_SERVER} = require('next/constants') +const {PHASE_DEVELOPMENT_SERVER} = require('next-server/constants') module.exports = (phase) => { return { diff --git a/test/integration/production/test/index.test.js b/test/integration/production/test/index.test.js index e1c31c12..29c730ab 100644 --- a/test/integration/production/test/index.test.js +++ b/test/integration/production/test/index.test.js @@ -16,7 +16,7 @@ import fetch from 'node-fetch' import dynamicImportTests from './dynamic' import processEnv from './process-env' import security from './security' -import {BUILD_MANIFEST, REACT_LOADABLE_MANIFEST} from 'next/constants' +import {BUILD_MANIFEST, REACT_LOADABLE_MANIFEST} from 'next-server/constants' const appDir = join(__dirname, '../') let appPort diff --git a/test/isolated/config.test.js b/test/isolated/config.test.js index a77408b9..fc56fdfe 100644 --- a/test/isolated/config.test.js +++ b/test/isolated/config.test.js @@ -1,8 +1,8 @@ /* global describe, it, expect */ import {join} from 'path' -import loadConfig from 'next/dist/server/config' -import {PHASE_DEVELOPMENT_SERVER} from 'next/constants' +import loadConfig from 'next-server/next-config' +import {PHASE_DEVELOPMENT_SERVER} from 'next-server/constants' const pathToConfig = join(__dirname, '_resolvedata', 'without-function') const pathToConfigFn = join(__dirname, '_resolvedata', 'with-function') diff --git a/test/isolated/require-page.test.js b/test/isolated/require-page.test.js index e25481f6..34c6dda6 100644 --- a/test/isolated/require-page.test.js +++ b/test/isolated/require-page.test.js @@ -1,8 +1,8 @@ /* global describe, it, expect */ import { join } from 'path' -import {SERVER_DIRECTORY, CLIENT_STATIC_FILES_PATH} from 'next/constants' -import requirePage, {getPagePath, normalizePagePath, pageNotFoundError} from 'next/dist/server/require' +import {SERVER_DIRECTORY, CLIENT_STATIC_FILES_PATH} from 'next-server/constants' +import requirePage, {getPagePath, normalizePagePath, pageNotFoundError} from 'next-server/dist/server/require' const sep = '/' const distDir = join(__dirname, '_resolvedata') diff --git a/test/node_modules/next b/test/node_modules/next deleted file mode 120000 index 0127bcd4..00000000 --- a/test/node_modules/next +++ /dev/null @@ -1 +0,0 @@ -../../packages/next \ No newline at end of file diff --git a/test/unit/EventEmitter.test.js b/test/unit/EventEmitter.test.js index 1f564602..fb82f59c 100644 --- a/test/unit/EventEmitter.test.js +++ b/test/unit/EventEmitter.test.js @@ -1,5 +1,5 @@ /* global describe, it, expect */ -import EventEmitter from 'next/dist/lib/EventEmitter' +import EventEmitter from 'next-server/dist/lib/EventEmitter' describe('EventEmitter', () => { describe('With listeners', () => { diff --git a/test/unit/getDisplayName.test.js b/test/unit/getDisplayName.test.js index 84f6e628..a199663c 100644 --- a/test/unit/getDisplayName.test.js +++ b/test/unit/getDisplayName.test.js @@ -1,6 +1,6 @@ /* global describe, it, expect */ import { Component } from 'react' -import { getDisplayName } from 'next/dist/lib/utils' +import { getDisplayName } from 'next-server/dist/lib/utils' describe('getDisplayName', () => { it('gets the proper display name of a component', () => { diff --git a/test/unit/loadGetInitialProps.test.js b/test/unit/loadGetInitialProps.test.js index 6963c78d..38b2f7e4 100644 --- a/test/unit/loadGetInitialProps.test.js +++ b/test/unit/loadGetInitialProps.test.js @@ -1,5 +1,5 @@ /* global describe, it, expect */ -import { loadGetInitialProps } from 'next/dist/lib/utils' +import { loadGetInitialProps } from 'next-server/dist/lib/utils' describe('loadGetInitialProps', () => { it('should throw if getInitialProps is defined as an instance method', () => { diff --git a/test/unit/router.test.js b/test/unit/router.test.js index 08a9c930..661c7e3d 100644 --- a/test/unit/router.test.js +++ b/test/unit/router.test.js @@ -1,5 +1,5 @@ /* global describe, it, expect */ -import Router from 'next/dist/lib/router/router' +import Router from 'next-server/dist/lib/router/router' class PageLoader { constructor (options = {}) { diff --git a/test/unit/shallow-equal.test.js b/test/unit/shallow-equal.test.js index 23f39a4e..66b81042 100644 --- a/test/unit/shallow-equal.test.js +++ b/test/unit/shallow-equal.test.js @@ -1,6 +1,6 @@ /* global describe, it, expect */ -import shallowEquals from 'next/dist/lib/shallow-equals' +import shallowEquals from 'next-server/dist/lib/shallow-equals' describe('Shallow Equals', () => { it('should be true if both objects are the same', () => { From 4cf5ffb7a5d50472d185e002705e8f7a3441eb29 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 01:25:36 +0200 Subject: [PATCH 011/448] Update lerna.json to have a version --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 825d36ff..54a46710 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "0.0.0" + "version": "7.0.1" } From e994159e383765431780ca83eed8ab0618962c9b Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 01:35:56 +0200 Subject: [PATCH 012/448] Remove version prefix --- .npmrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmrc b/.npmrc index 1dab4ed4..d1504dcd 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ save-exact = true +tag-version-prefix="" From b041fa47829d2ed010665923935c41ce3a4f9fba Mon Sep 17 00:00:00 2001 From: Andy Date: Tue, 2 Oct 2018 13:10:07 +0200 Subject: [PATCH 013/448] Support for wasm (#5316) * Set a default path for wasm modules * Added the mimetype "application/wasm" for wasm files * Upgrade write-file-webpack-plugin to 4.4.1 * Made dynamic(import()) in test to dynamic(() => import()) --- packages/next-server/server/render.js | 3 +++ packages/next/build/webpack.js | 3 ++- test/integration/export/pages/dynamic-imports.js | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/next-server/server/render.js b/packages/next-server/server/render.js index 98d5d406..cbee517a 100644 --- a/packages/next-server/server/render.js +++ b/packages/next-server/server/render.js @@ -26,6 +26,9 @@ function getDynamicImportBundles (manifest, moduleIds) { const logger = console +// since send doesn't support wasm yet +send.mime.define({ 'application/wasm': ['wasm'] }) + export async function render (req, res, pathname, query, opts) { const html = await renderToHTML(req, res, pathname, query, opts) sendHTML(req, res, html, req.method, opts) diff --git a/packages/next/build/webpack.js b/packages/next/build/webpack.js index d7c85323..fb871e55 100644 --- a/packages/next/build/webpack.js +++ b/packages/next/build/webpack.js @@ -197,7 +197,8 @@ export default async function getBaseWebpackConfig (dir: string, {dev = false, i hotUpdateMainFilename: 'static/webpack/[hash].hot-update.json', // This saves chunks with the name given via `import()` chunkFilename: isServer ? `${dev ? '[name]' : '[name].[contenthash]'}.js` : `static/chunks/${dev ? '[name]' : '[name].[contenthash]'}.js`, - strictModuleExceptionHandling: true + strictModuleExceptionHandling: true, + webassemblyModuleFilename: 'static/wasm/[modulehash].wasm' }, performance: { hints: false }, resolve: resolveConfig, diff --git a/test/integration/export/pages/dynamic-imports.js b/test/integration/export/pages/dynamic-imports.js index 71a83519..b1eef236 100644 --- a/test/integration/export/pages/dynamic-imports.js +++ b/test/integration/export/pages/dynamic-imports.js @@ -1,7 +1,7 @@ import Link from 'next/link' import dynamic from 'next/dynamic' -const DynamicComponent = dynamic(import('../components/hello')) +const DynamicComponent = dynamic(() => import('../components/hello')) export default () => (
From 841eafc55e2ecec8b5e74bc29eda8daf9efbad88 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 14:17:49 +0200 Subject: [PATCH 014/448] Remove deploy from travis --- .travis.yml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index f67a0815..fbdf40a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,17 +21,5 @@ "rm -rf node_modules/.cache" ], before_script: ["npm run bootstrap"], - after_script: ["npm run coveralls"], - deploy: { - provider: "npm", - email: "leo@zeit.co", - tag: "canary", - api_key: { - secure: "MJfpcAJC1IvPL01NiGRLYAAgb7TZz5K0ukM1n+E+QcoF9+L1gn4WcP056ECchuohEFSwvO/ZcTZM5yhpp10cd72RZykeat/YYgRXFyUDkD3up2FHr4hYdcv/tBHCkeUMJZwt1ZNH4xM69Y02KAmpRBWZGKe6qETlZqxUg79Gi1g6W5PdhbsKedTp2tJJzG58nevKsSRP01S97K7kDC5oJNwuO+cbLwtzX5cB6Rd8hGx6lMetWLzSmSS689N0flfm/R9pxY/WjgBBQ0iYZkosb1VO2NhJMnrHtdr/Wfrkvnz8KSO/KD2n7RrOnSzUQBJSNxx35kr7HU4pKreMxEiOnEbOog4HZmWsM0UyRlbYeREfXLBvIjlnYoWCblZdVbdIl4R7NflVBSeK2eDkZQt2iCqP0fHvJ7kyLQx9J2janlr+96dKSudalercfmV9aXtbCeweqim5l4AZywSggpZAvopE6uN6KtFafO0JM760flbQfDVEQWHrHGvZvu05NrzJvZa6CN47rDHbaO6IibMXakogVz+AIuTZ3t/2bynetkericV8MGdOrwb807DLWTdqNKCj2wTmHgDiX8n3FF7VisLS54mKFfuuzzALdWtlBPbwS+bZ0235/35rs2EUidC5eunryWp4Y150xWfCK2swxM9xR0iCE0KSXrsdGDGyrvE=" - }, - skip_cleanup: true, - on: { - tags: true - } - } + after_script: ["npm run coveralls"] } From 1643165e9da158a67982ed4fad66f1faa8df52de Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 14:27:19 +0200 Subject: [PATCH 015/448] v7.0.2-canary.0 --- lerna.json | 2 +- packages/next-server/package.json | 12 ++++++------ packages/next/package.json | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lerna.json b/lerna.json index 54a46710..f82050f1 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "7.0.1" + "version": "7.0.2-canary.0" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index b6342d26..c5a0634e 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "7.0.1", + "version": "7.0.2-canary.0", "main": "./dist/server/next-server.js", "scripts": { "build": "taskr", @@ -13,17 +13,17 @@ ] }, "dependencies": { + "ansi-html": "0.0.7", + "etag": "1.8.1", "find-up": "3.0.0", + "fresh": "0.5.2", + "htmlescape": "1.1.1", "http-errors": "1.6.2", "path-to-regexp": "2.1.0", - "url": "0.11.0", - "ansi-html": "0.0.7", "prop-types": "15.6.2", "send": "0.16.1", "styled-jsx": "3.1.0", - "etag": "1.8.1", - "fresh": "0.5.2", - "htmlescape": "1.1.1" + "url": "0.11.0" }, "peerDependencies": { "react": "^16.0.0", diff --git a/packages/next/package.json b/packages/next/package.json index f7d36c8e..837730d4 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "7.0.1", + "version": "7.0.2-canary.0", "description": "Minimalistic framework for server-rendered React applications", "main": "./dist/server/next.js", "license": "MIT", @@ -47,7 +47,6 @@ ] }, "dependencies": { - "next-server": "7.0.1", "@babel/core": "7.1.2", "@babel/plugin-proposal-class-properties": "7.1.0", "@babel/plugin-proposal-object-rest-spread": "7.0.0", @@ -82,6 +81,7 @@ "minimist": "1.2.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", + "next-server": "^7.0.2-canary.0", "path-to-regexp": "2.1.0", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", From b91d4975aa1c3591d6625ee70d120c440cd9fdbb Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 14:49:39 +0200 Subject: [PATCH 016/448] Add circleci publish --- .circleci/config.yml | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index ae60df93..98324fe6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,3 +9,56 @@ jobs: - run: yarn install - run: yarn bootstrap - run: yarn test + - persist_to_workspace: + root: . + paths: + - dist + publish-stable: + docker: + - image: circleci/node:9.10.0 + working_directory: ~/repo + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Saving Authentication Information + command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + - run: + name: Publishing to Stable Channel + command: npm run lerna publish from-git + + publish-canary: + docker: + - image: circleci/node:9.10.0 + working_directory: ~/repo + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Saving Authentication Information + command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + - run: + name: Publishing to Canary Channel + command: npm run lerna publish from-git --npm-tag canary +workflows: + version: 2 + unscheduled: + jobs: + - build: + filters: + tags: + only: /.*/ + - publish-canary: + requires: + - build + filters: + tags: + only: /^.*canary.*($|\b)/ + - publish-stable: + requires: + - build + filters: + tags: + only: /^(\d+\.)?(\d+\.)?(\*|\d+)$/ \ No newline at end of file From be5dbe3cfd8b4f96422c97fc192d436aab241d9e Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 15:12:28 +0200 Subject: [PATCH 017/448] Persist dist directory under packages --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 98324fe6..2f4c45f7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ jobs: - persist_to_workspace: root: . paths: - - dist + - packages/*/dist publish-stable: docker: - image: circleci/node:9.10.0 From 2e01b3d34ad4a1931d717fbc15d97620aa887d0d Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 15:24:46 +0200 Subject: [PATCH 018/448] Add files key to next-server --- packages/next-server/package.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/next-server/package.json b/packages/next-server/package.json index c5a0634e..64a0395b 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -2,6 +2,17 @@ "name": "next-server", "version": "7.0.2-canary.0", "main": "./dist/server/next-server.js", + "files": [ + "dist", + "asset.js", + "config.js", + "constants.js", + "dynamic.js", + "head.js", + "link.js", + "router.js", + "next-config.js" + ], "scripts": { "build": "taskr", "release": "taskr release", From 41a570f59abc3f20a138c52c60c107cb7a31a702 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 15:38:22 +0200 Subject: [PATCH 019/448] v7.0.2-canary.1 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index f82050f1..f0211ba0 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "7.0.2-canary.0" + "version": "7.0.2-canary.1" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 64a0395b..3ddd6a21 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "7.0.2-canary.0", + "version": "7.0.2-canary.1", "main": "./dist/server/next-server.js", "files": [ "dist", diff --git a/packages/next/package.json b/packages/next/package.json index 837730d4..bb1fcaba 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "7.0.2-canary.0", + "version": "7.0.2-canary.1", "description": "Minimalistic framework for server-rendered React applications", "main": "./dist/server/next.js", "license": "MIT", @@ -81,7 +81,7 @@ "minimist": "1.2.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "^7.0.2-canary.0", + "next-server": "^7.0.2-canary.1", "path-to-regexp": "2.1.0", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", From 61b93e5291080d8e3be69b8586af4279d8ed3734 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 15:54:20 +0200 Subject: [PATCH 020/448] Install deps to publish --- .circleci/config.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2f4c45f7..229f1897 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,24 +9,20 @@ jobs: - run: yarn install - run: yarn bootstrap - run: yarn test - - persist_to_workspace: - root: . - paths: - - packages/*/dist publish-stable: docker: - image: circleci/node:9.10.0 working_directory: ~/repo steps: - checkout - - attach_workspace: - at: . + - run: yarn install + - run: yarn bootstrap - run: name: Saving Authentication Information command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - - run: - name: Publishing to Stable Channel - command: npm run lerna publish from-git + # - run: + # name: Publishing to Stable Channel + # command: npm run lerna publish from-git publish-canary: docker: @@ -34,8 +30,8 @@ jobs: working_directory: ~/repo steps: - checkout - - attach_workspace: - at: . + - run: yarn install + - run: yarn bootstrap - run: name: Saving Authentication Information command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc From 85b1c1a6b676cfa04ebf5d3da2eb7384e04bb90f Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 16:02:57 +0200 Subject: [PATCH 021/448] v7.0.2-canary.2 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index f0211ba0..09c057d9 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "7.0.2-canary.1" + "version": "7.0.2-canary.2" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 3ddd6a21..6d182860 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "7.0.2-canary.1", + "version": "7.0.2-canary.2", "main": "./dist/server/next-server.js", "files": [ "dist", diff --git a/packages/next/package.json b/packages/next/package.json index bb1fcaba..06f350cc 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "7.0.2-canary.1", + "version": "7.0.2-canary.2", "description": "Minimalistic framework for server-rendered React applications", "main": "./dist/server/next.js", "license": "MIT", @@ -81,7 +81,7 @@ "minimist": "1.2.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "^7.0.2-canary.1", + "next-server": "^7.0.2-canary.2", "path-to-regexp": "2.1.0", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", From 3f5524abd3d120e844de41119bd7ac29d13abd43 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 16:06:49 +0200 Subject: [PATCH 022/448] Disable publish on branch builds --- .circleci/config.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 229f1897..94adeaac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -52,9 +52,13 @@ workflows: filters: tags: only: /^.*canary.*($|\b)/ + branches: + ignore: /.*/ - publish-stable: requires: - build filters: tags: - only: /^(\d+\.)?(\d+\.)?(\*|\d+)$/ \ No newline at end of file + only: /^(\d+\.)?(\d+\.)?(\*|\d+)$/ + branches: + ignore: /.*/ \ No newline at end of file From f9d54c13363d349cc72752dfb9e37d4d21d01acf Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 16:16:03 +0200 Subject: [PATCH 023/448] Add yes to publish command --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 94adeaac..e9a33970 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,7 +22,7 @@ jobs: command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc # - run: # name: Publishing to Stable Channel - # command: npm run lerna publish from-git + # command: npm run lerna publish from-git --yes publish-canary: docker: @@ -37,7 +37,7 @@ jobs: command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - run: name: Publishing to Canary Channel - command: npm run lerna publish from-git --npm-tag canary + command: npm run lerna publish from-git --npm-tag canary --yes workflows: version: 2 unscheduled: From b1d8d775eeb689c8dd5cd4fe096bc7282a02c76b Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 16:16:22 +0200 Subject: [PATCH 024/448] v7.0.2-canary.3 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index 09c057d9..b4a5ee17 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "7.0.2-canary.2" + "version": "7.0.2-canary.3" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 6d182860..60f95f7f 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "7.0.2-canary.2", + "version": "7.0.2-canary.3", "main": "./dist/server/next-server.js", "files": [ "dist", diff --git a/packages/next/package.json b/packages/next/package.json index 06f350cc..66959b4b 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "7.0.2-canary.2", + "version": "7.0.2-canary.3", "description": "Minimalistic framework for server-rendered React applications", "main": "./dist/server/next.js", "license": "MIT", @@ -81,7 +81,7 @@ "minimist": "1.2.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "^7.0.2-canary.2", + "next-server": "^7.0.2-canary.3", "path-to-regexp": "2.1.0", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", From 57c61cde3a8f3b63ed465a0393a11b564c0153e6 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 16:54:36 +0200 Subject: [PATCH 025/448] Use yarn to correctly pass through arguments --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e9a33970..3ea76e76 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,7 +22,7 @@ jobs: command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc # - run: # name: Publishing to Stable Channel - # command: npm run lerna publish from-git --yes + # command: yarn run lerna publish from-git --yes publish-canary: docker: @@ -37,7 +37,7 @@ jobs: command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - run: name: Publishing to Canary Channel - command: npm run lerna publish from-git --npm-tag canary --yes + command: yarn run lerna publish from-git --npm-tag canary --yes workflows: version: 2 unscheduled: From 3246c32f637be52531217afba302aca33e475e99 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 16:55:08 +0200 Subject: [PATCH 026/448] v7.0.2-canary.4 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index b4a5ee17..f395f0a6 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "7.0.2-canary.3" + "version": "7.0.2-canary.4" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 60f95f7f..ceab1774 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "7.0.2-canary.3", + "version": "7.0.2-canary.4", "main": "./dist/server/next-server.js", "files": [ "dist", diff --git a/packages/next/package.json b/packages/next/package.json index 66959b4b..9d8b43dd 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "7.0.2-canary.3", + "version": "7.0.2-canary.4", "description": "Minimalistic framework for server-rendered React applications", "main": "./dist/server/next.js", "license": "MIT", @@ -81,7 +81,7 @@ "minimist": "1.2.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "^7.0.2-canary.3", + "next-server": "^7.0.2-canary.4", "path-to-regexp": "2.1.0", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", From 8db40b644f5ccfc5a6f673bae3566994377e19d5 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 17:10:07 +0200 Subject: [PATCH 027/448] Add npmClient for publish command --- lerna.json | 1 + 1 file changed, 1 insertion(+) diff --git a/lerna.json b/lerna.json index f395f0a6..9265e236 100644 --- a/lerna.json +++ b/lerna.json @@ -6,6 +6,7 @@ ], "command": { "publish": { + "npmClient": "npm", "allowBranch": "canary", "registry": "https://registry.npmjs.org/" } From e3ef9170771c0426a449e19a9345b4b9f7430014 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 17:11:00 +0200 Subject: [PATCH 028/448] v7.0.2-canary.5 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index 9265e236..f7d9166f 100644 --- a/lerna.json +++ b/lerna.json @@ -11,5 +11,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "7.0.2-canary.4" + "version": "7.0.2-canary.5" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index ceab1774..38ab5715 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "7.0.2-canary.4", + "version": "7.0.2-canary.5", "main": "./dist/server/next-server.js", "files": [ "dist", diff --git a/packages/next/package.json b/packages/next/package.json index 9d8b43dd..ea8df3c5 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "7.0.2-canary.4", + "version": "7.0.2-canary.5", "description": "Minimalistic framework for server-rendered React applications", "main": "./dist/server/next.js", "license": "MIT", @@ -81,7 +81,7 @@ "minimist": "1.2.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "^7.0.2-canary.4", + "next-server": "^7.0.2-canary.5", "path-to-regexp": "2.1.0", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", From d2cbabbae4728854e94897ec1068bb3f6baa5682 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 19:08:30 +0200 Subject: [PATCH 029/448] Make next-server expose the same handler function as next --- packages/next-server/index.js | 4 ++++ packages/next-server/package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 packages/next-server/index.js diff --git a/packages/next-server/index.js b/packages/next-server/index.js new file mode 100644 index 00000000..08697ba7 --- /dev/null +++ b/packages/next-server/index.js @@ -0,0 +1,4 @@ +const Server = require('./dist/server/next-server').default +module.exports = function (opts) { + return new Server(opts) +} diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 38ab5715..62dc836c 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,7 +1,7 @@ { "name": "next-server", "version": "7.0.2-canary.5", - "main": "./dist/server/next-server.js", + "main": "./index.js", "files": [ "dist", "asset.js", From de6d394d7365d2651614ac3517d51a91c63e3f1c Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 2 Oct 2018 23:11:01 +0200 Subject: [PATCH 030/448] Use correct server path since main was changed --- packages/next-server/index.js | 5 +++-- packages/next/server/next-dev-server.js | 2 +- packages/next/server/next.js | 11 ++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/next-server/index.js b/packages/next-server/index.js index 08697ba7..33cf9448 100644 --- a/packages/next-server/index.js +++ b/packages/next-server/index.js @@ -1,4 +1,5 @@ +// This file is used for when users run `require('next-server')` const Server = require('./dist/server/next-server').default -module.exports = function (opts) { - return new Server(opts) +module.exports = function (options) { + return new Server(options) } diff --git a/packages/next/server/next-dev-server.js b/packages/next/server/next-dev-server.js index a3824662..eda61d91 100644 --- a/packages/next/server/next-dev-server.js +++ b/packages/next/server/next-dev-server.js @@ -1,4 +1,4 @@ -import Server from 'next-server' +import Server from 'next-server/dist/server/next-server' import { join } from 'path' import HotReloader from './hot-reloader' import {route} from 'next-server/dist/server/router' diff --git a/packages/next/server/next.js b/packages/next/server/next.js index e2d99b52..95be10c8 100644 --- a/packages/next/server/next.js +++ b/packages/next/server/next.js @@ -1,5 +1,10 @@ // This file is used for when users run `require('next')` -module.exports = (opts) => { - const Server = opts.dev ? require('./next-dev-server').default : require('next-server').default - return new Server(opts) +module.exports = (options) => { + if (options.dev) { + const Server = require('./next-dev-server').default + return new Server(options) + } + + const next = require('next-server') + return next(options) } From 785377d3c306b5c89c566f59a846b7829e627654 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Wed, 3 Oct 2018 00:08:57 +0200 Subject: [PATCH 031/448] Add missing dependencies to server (#5369) - compile default pages correctly into `.next` - add missing runtime dependencies --- packages/next-server/package.json | 2 + packages/next/app.js | 2 +- packages/next/build/webpack.js | 10 +- packages/next/document.js | 2 +- packages/next/error.js | 2 +- packages/next/lib/app.js | 116 ---------------- packages/next/lib/error.js | 79 ----------- packages/next/pages/_app.js | 117 +++++++++++++++- packages/next/pages/_document.js | 219 +++++++++++++++++++++++++++++- packages/next/pages/_error.js | 80 ++++++++++- packages/next/server/document.js | 218 ----------------------------- packages/next/taskfile.js | 10 +- 12 files changed, 431 insertions(+), 426 deletions(-) delete mode 100644 packages/next/lib/app.js delete mode 100644 packages/next/lib/error.js delete mode 100644 packages/next/server/document.js diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 62dc836c..081f527e 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -24,10 +24,12 @@ ] }, "dependencies": { + "@babel/runtime-corejs2": "^7.1.2", "ansi-html": "0.0.7", "etag": "1.8.1", "find-up": "3.0.0", "fresh": "0.5.2", + "hoist-non-react-statics": "^3.0.1", "htmlescape": "1.1.1", "http-errors": "1.6.2", "path-to-regexp": "2.1.0", diff --git a/packages/next/app.js b/packages/next/app.js index 0bcca764..5437bb67 100644 --- a/packages/next/app.js +++ b/packages/next/app.js @@ -1 +1 @@ -module.exports = require('./dist/lib/app') +module.exports = require('./dist/pages/_app') diff --git a/packages/next/build/webpack.js b/packages/next/build/webpack.js index fb871e55..1881e942 100644 --- a/packages/next/build/webpack.js +++ b/packages/next/build/webpack.js @@ -32,14 +32,20 @@ function externalsConfig (dir, isServer) { return externals } + const notExternalModules = ['next/app', 'next/document', 'next/error'] + externals.push((context, request, callback) => { - resolve(request, { basedir: dir, preserveSymlinks: true }, (err, res) => { + if (notExternalModules.indexOf(request) !== -1) { + return callback() + } + + resolve(request, { basedir: context, preserveSymlinks: true }, (err, res) => { if (err) { return callback() } // Default pages have to be transpiled - if (res.match(/node_modules[/\\]next[/\\]dist[/\\]pages/)) { + if (res.match(/next[/\\]dist[/\\]pages/)) { return callback() } diff --git a/packages/next/document.js b/packages/next/document.js index 18bc2528..5741035f 100644 --- a/packages/next/document.js +++ b/packages/next/document.js @@ -1 +1 @@ -module.exports = require('./dist/server/document') +module.exports = require('./dist/pages/_document') diff --git a/packages/next/error.js b/packages/next/error.js index 1dd94bb4..899cd046 100644 --- a/packages/next/error.js +++ b/packages/next/error.js @@ -1 +1 @@ -module.exports = require('./dist/lib/error') +module.exports = require('./dist/pages/_error') diff --git a/packages/next/lib/app.js b/packages/next/lib/app.js deleted file mode 100644 index d0e558bd..00000000 --- a/packages/next/lib/app.js +++ /dev/null @@ -1,116 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { execOnce, loadGetInitialProps } from 'next-server/dist/lib/utils' -import { makePublicRouterInstance } from 'next-server/router' - -export default class App extends Component { - static childContextTypes = { - headManager: PropTypes.object, - router: PropTypes.object - } - - static async getInitialProps ({ Component, router, ctx }) { - const pageProps = await loadGetInitialProps(Component, ctx) - return {pageProps} - } - - getChildContext () { - const { headManager } = this.props - return { - headManager, - router: makePublicRouterInstance(this.props.router) - } - } - - // Kept here for backwards compatibility. - // When someone ended App they could call `super.componentDidCatch`. This is now deprecated. - componentDidCatch (err) { - throw err - } - - render () { - const {router, Component, pageProps} = this.props - const url = createUrl(router) - return - - - } -} - -export class Container extends Component { - componentDidMount () { - this.scrollToHash() - } - - componentDidUpdate () { - this.scrollToHash() - } - - scrollToHash () { - let { hash } = window.location - hash = hash ? hash.substring(1) : false - if (!hash) return - - const el = document.getElementById(hash) - if (!el) return - - // If we call scrollIntoView() in here without a setTimeout - // it won't scroll properly. - setTimeout(() => el.scrollIntoView(), 0) - } - - render () { - return this.props.children - } -} - -const warnUrl = execOnce(() => { - if (process.env.NODE_ENV !== 'production') { - console.error(`Warning: the 'url' property is deprecated. https://err.sh/zeit/next.js/url-deprecated`) - } -}) - -export function createUrl (router) { - // This is to make sure we don't references the router object at call time - const {pathname, asPath, query} = router - return { - get query () { - warnUrl() - return query - }, - get pathname () { - warnUrl() - return pathname - }, - get asPath () { - warnUrl() - return asPath - }, - back: () => { - warnUrl() - router.back() - }, - push: (url, as) => { - warnUrl() - return router.push(url, as) - }, - pushTo: (href, as) => { - warnUrl() - const pushRoute = as ? href : null - const pushUrl = as || href - - return router.push(pushRoute, pushUrl) - }, - replace: (url, as) => { - warnUrl() - return router.replace(url, as) - }, - replaceTo: (href, as) => { - warnUrl() - const replaceRoute = as ? href : null - const replaceUrl = as || href - - return router.replace(replaceRoute, replaceUrl) - } - } -} diff --git a/packages/next/lib/error.js b/packages/next/lib/error.js deleted file mode 100644 index cef92cf7..00000000 --- a/packages/next/lib/error.js +++ /dev/null @@ -1,79 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import HTTPStatus from 'http-status' -import Head from 'next-server/head' - -export default class Error extends React.Component { - static getInitialProps ({ res, err }) { - const statusCode = res ? res.statusCode : (err ? err.statusCode : null) - return { statusCode } - } - - render () { - const { statusCode } = this.props - const title = statusCode === 404 - ? 'This page could not be found' - : HTTPStatus[statusCode] || 'An unexpected error has occurred' - - return
- - - {statusCode}: {title} - -
- + + + +
+ + + + ) + } +} diff --git a/examples/with-style-sheet/pages/index.js b/examples/with-style-sheet/pages/index.js new file mode 100644 index 00000000..70e2faab --- /dev/null +++ b/examples/with-style-sheet/pages/index.js @@ -0,0 +1,29 @@ +import React from 'react' +import { StyleSheet, StyleResolver } from 'style-sheet' +const cls = StyleResolver.resolve + +export default () => ( +
+
Hello from Next.js
+
+) + +const styles = StyleSheet.create({ + root: { + fontSize: 30, + fontFamily: 'sans-serif', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + minHeight: '100vh', + backgroundImage: 'radial-gradient(circle, #D7D7D7, #D7D7D7 1px, #FFF 1px, #FFF)', + backgroundSize: '1em 1em' + }, + color: { + // showcasing dynamic styles + color: Math.random() > 0.5 ? '#111' : '#222' + }, + brand: { + fontWeight: 'bold' + } +}) diff --git a/packages/next/pages/_document.js b/packages/next/pages/_document.js index 822656bf..ed9ba8b1 100644 --- a/packages/next/pages/_document.js +++ b/packages/next/pages/_document.js @@ -48,7 +48,7 @@ export class Head extends Component { if(!files || files.length === 0) { return null } - + return files.map((file) => { // Only render .css files here if(!/\.css$/.exec(file)) { @@ -82,7 +82,7 @@ export class Head extends Component { if(!files || files.length === 0) { return null } - + return files.map((file) => { // Only render .js files here if(!/\.js$/.exec(file)) { @@ -168,7 +168,7 @@ export class NextScript extends Component { if(!files || files.length === 0) { return null } - + return files.map((file) => { // Only render .js files here if(!/\.js$/.exec(file)) { From ad84d23a02550663a10502cdec148e126935f795 Mon Sep 17 00:00:00 2001 From: Homer Chen Date: Fri, 2 Nov 2018 22:21:34 +1100 Subject: [PATCH 097/448] Add a space on README (#5574) Hi Just add a space on README. That line should be same as [here](https://github.com/zeit/next.js/blob/canary/examples/using-with-router/components/ActiveLink.js#L10) --- packages/next/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/README.md b/packages/next/README.md index 2b639371..ac29b925 100644 --- a/packages/next/README.md +++ b/packages/next/README.md @@ -676,7 +676,7 @@ import { withRouter } from 'next/router' const ActiveLink = ({ children, router, href }) => { const style = { marginRight: 10, - color: router.pathname === href? 'red' : 'black' + color: router.pathname === href ? 'red' : 'black' } const handleClick = (e) => { From bf157015fb80a3a5d44a5399e398a59bd031ef58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radovan=20=C5=A0mitala?= Date: Fri, 2 Nov 2018 19:47:56 +0100 Subject: [PATCH 098/448] Remove WriteFilePlugin (#5541) It is native by webpack-dev-middleware 3.1.0 up --- packages/next/build/webpack.js | 7 ---- .../npm/write-file-webpack-plugin_vx.x.x.js | 32 ------------------- packages/next/package.json | 3 +- packages/next/server/hot-reloader.js | 3 +- 4 files changed, 3 insertions(+), 42 deletions(-) delete mode 100644 packages/next/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js diff --git a/packages/next/build/webpack.js b/packages/next/build/webpack.js index 56ef6ace..0263cd25 100644 --- a/packages/next/build/webpack.js +++ b/packages/next/build/webpack.js @@ -4,7 +4,6 @@ import path from 'path' import webpack from 'webpack' import resolve from 'resolve' import CaseSensitivePathPlugin from 'case-sensitive-paths-webpack-plugin' -import WriteFilePlugin from 'write-file-webpack-plugin' import FriendlyErrorsWebpackPlugin from 'friendly-errors-webpack-plugin' import WebpackBar from 'webpackbar' import {getPages} from './webpack/utils' @@ -264,12 +263,6 @@ export default async function getBaseWebpackConfig (dir: string, {dev = false, i dev && new webpack.NoEmitOnErrorsPlugin(), dev && new UnlinkFilePlugin(), dev && new CaseSensitivePathPlugin(), // Since on macOS the filesystem is case-insensitive this will make sure your path are case-sensitive - dev && new WriteFilePlugin({ - exitOnErrors: false, - log: false, - // required not to cache removed files - useHashIndex: false - }), // Removes server/client code by minifier new webpack.DefinePlugin({ 'process.browser': JSON.stringify(!isServer) diff --git a/packages/next/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js b/packages/next/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js deleted file mode 100644 index 41e64c94..00000000 --- a/packages/next/flow-typed/npm/write-file-webpack-plugin_vx.x.x.js +++ /dev/null @@ -1,32 +0,0 @@ -// flow-typed signature: 4a61661df41490b27db4f4aa0c03929e -// flow-typed version: <>/write-file-webpack-plugin_v4.2.0/flow_v0.73.0 - -/** - * This is an autogenerated libdef stub for: - * - * 'write-file-webpack-plugin' - * - * Fill this stub out by replacing all the `any` types. - * - * Once filled out, we encourage you to share your work with the - * community by sending a pull request to: - * https://github.com/flowtype/flow-typed - */ - -declare module 'write-file-webpack-plugin' { - declare module.exports: any; -} - -/** - * We include stubs for each file inside this npm package in case you need to - * require those files directly. Feel free to delete any files that aren't - * needed. - */ -declare module 'write-file-webpack-plugin/dist/index' { - declare module.exports: any; -} - -// Filename aliases -declare module 'write-file-webpack-plugin/dist/index.js' { - declare module.exports: $Exports<'write-file-webpack-plugin/dist/index'>; -} diff --git a/packages/next/package.json b/packages/next/package.json index d33f99e0..7b00cd61 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -89,8 +89,7 @@ "webpack-dev-middleware": "3.4.0", "webpack-hot-middleware": "2.22.3", "webpack-sources": "1.2.0", - "webpackbar": "2.6.3", - "write-file-webpack-plugin": "4.3.2" + "webpackbar": "2.6.3" }, "peerDependencies": { "react": "^16.0.0", diff --git a/packages/next/server/hot-reloader.js b/packages/next/server/hot-reloader.js index 1689187e..1f5f8340 100644 --- a/packages/next/server/hot-reloader.js +++ b/packages/next/server/hot-reloader.js @@ -320,7 +320,8 @@ export default class HotReloader { publicPath: `/_next/static/webpack`, noInfo: true, logLevel: 'silent', - watchOptions: { ignored } + watchOptions: { ignored }, + writeToDisk: true } if (this.config.webpackDevMiddleware) { From b33f5e8ad2fe4f9573a819f99dada6ee8d667932 Mon Sep 17 00:00:00 2001 From: Henrik Wenz Date: Fri, 2 Nov 2018 19:49:00 +0100 Subject: [PATCH 099/448] Add Azure build status badge (#5399) --- packages/next/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/next/README.md b/packages/next/README.md index ac29b925..ade85ad3 100644 --- a/packages/next/README.md +++ b/packages/next/README.md @@ -2,6 +2,7 @@ [![NPM version](https://img.shields.io/npm/v/next.svg)](https://www.npmjs.com/package/next) [![Build Status](https://travis-ci.org/zeit/next.js.svg?branch=master)](https://travis-ci.org/zeit/next.js) +[![Build Status](https://dev.azure.com/nextjs/next.js/_apis/build/status/zeit.next.js)](https://dev.azure.com/nextjs/next.js/_build/latest?definitionId=3) [![Coverage Status](https://coveralls.io/repos/zeit/next.js/badge.svg?branch=master)](https://coveralls.io/r/zeit/next.js?branch=master) [![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/next-js) From dccbc1ea3553437fd907aed936e3892dea91c17c Mon Sep 17 00:00:00 2001 From: Henrik Wenz Date: Fri, 2 Nov 2018 19:50:30 +0100 Subject: [PATCH 100/448] Update examples/with-antd-mobile (#5495) * Update examples/with-antd-mobile - Reduced noise - Simplify setup * Create more more complex example --- examples/with-antd-mobile/.babelrc | 18 ++-- .../with-antd-mobile/components/Layout.js | 47 +++++--- .../with-antd-mobile/components/MenuBar.js | 50 --------- examples/with-antd-mobile/next.config.js | 60 ++--------- examples/with-antd-mobile/package.json | 7 +- examples/with-antd-mobile/pages/_app.js | 24 +++++ examples/with-antd-mobile/pages/_document.js | 18 ---- examples/with-antd-mobile/pages/about.js | 11 ++ examples/with-antd-mobile/pages/home.js | 54 ---------- examples/with-antd-mobile/pages/icon.js | 81 -------------- examples/with-antd-mobile/pages/index.js | 18 ++-- examples/with-antd-mobile/pages/trick.js | 100 ------------------ examples/with-antd-mobile/static/hd.min.js | 2 - examples/with-antd-mobile/static/reload.svg | 1 - 14 files changed, 93 insertions(+), 398 deletions(-) delete mode 100644 examples/with-antd-mobile/components/MenuBar.js create mode 100644 examples/with-antd-mobile/pages/_app.js delete mode 100644 examples/with-antd-mobile/pages/_document.js create mode 100644 examples/with-antd-mobile/pages/about.js delete mode 100644 examples/with-antd-mobile/pages/home.js delete mode 100644 examples/with-antd-mobile/pages/icon.js delete mode 100644 examples/with-antd-mobile/pages/trick.js delete mode 100644 examples/with-antd-mobile/static/hd.min.js delete mode 100644 examples/with-antd-mobile/static/reload.svg diff --git a/examples/with-antd-mobile/.babelrc b/examples/with-antd-mobile/.babelrc index 3a6db05f..7ec4804a 100644 --- a/examples/with-antd-mobile/.babelrc +++ b/examples/with-antd-mobile/.babelrc @@ -1,13 +1,9 @@ { - "presets": [ - "next/babel" - ], - "plugins": [ - [ - "import", - { - "libraryName": "antd-mobile" - } - ] - ] + "presets": ["next/babel"], + "plugins": [ + ["import", { + "libraryName": "antd-mobile", + "style": "css" + }] + ] } diff --git a/examples/with-antd-mobile/components/Layout.js b/examples/with-antd-mobile/components/Layout.js index b1777f62..9c1d8d26 100644 --- a/examples/with-antd-mobile/components/Layout.js +++ b/examples/with-antd-mobile/components/Layout.js @@ -1,16 +1,33 @@ -import React, { Component } from 'react' -import { LocaleProvider } from 'antd-mobile' -import enUS from 'antd-mobile/lib/locale-provider/en_US' +import { NavBar, Icon, WingBlank } from 'antd-mobile' +import { withRouter } from 'next/router' +import Head from 'next/head' -export default class Layout extends Component { - render () { - const { language, children } = this.props - const locale = language.substr(0, 2) === 'en' ? enUS : undefined - - return ( - - {children} - - ) - } -} +export default withRouter(({ router, children, title }) => ( +
+ + {title} + + } + onLeftClick={() => router.back()} + > + Ant Design Mobile example + +

{title}

+ + + {children} + +
+)) diff --git a/examples/with-antd-mobile/components/MenuBar.js b/examples/with-antd-mobile/components/MenuBar.js deleted file mode 100644 index 7f65b3a0..00000000 --- a/examples/with-antd-mobile/components/MenuBar.js +++ /dev/null @@ -1,50 +0,0 @@ -import React, { Component } from 'react' -import Router from 'next/router' -import { TabBar, Icon } from 'antd-mobile' - -export default class MenuBar extends Component { - render () { - const { - pathname, - children - } = this.props - - return ( - - {tabBarData.map(({ title, icon, selectedIcon, link, dot, component: Component }) => ( - } - selectedIcon={} - selected={pathname === link} - onPress={() => Router.push(link)} - > - {children} - - ))} - - ) - } -} - -const tabBarData = [ - { - title: 'Home', - icon: 'koubei-o', - selectedIcon: 'koubei', - link: '/home' - }, - { - title: 'Icon', - icon: 'check-circle-o', - selectedIcon: 'check-circle', - link: '/icon' - }, - { - title: 'Trick', - icon: 'cross-circle-o', - selectedIcon: 'cross-circle', - link: '/trick' - } -] diff --git a/examples/with-antd-mobile/next.config.js b/examples/with-antd-mobile/next.config.js index 73e586bf..960569c8 100644 --- a/examples/with-antd-mobile/next.config.js +++ b/examples/with-antd-mobile/next.config.js @@ -1,57 +1,9 @@ -const path = require('path') -const fs = require('fs') -const requireHacker = require('require-hacker') +const withCSS = require('@zeit/next-css') -function setupRequireHacker () { - const webjs = '.web.js' - const webModules = ['antd-mobile', 'rmc-picker'].map(m => path.join('node_modules', m)) - - requireHacker.hook('js', filename => { - if (filename.endsWith(webjs) || webModules.every(p => !filename.includes(p))) return - - const webFilename = filename.replace(/\.js$/, webjs) - if (!fs.existsSync(webFilename)) return - - return fs.readFileSync(webFilename, { encoding: 'utf8' }) - }) - - requireHacker.hook('svg', filename => { - return requireHacker.to_javascript_module_source(`#${path.parse(filename).name}`) - }) +// fix: prevents error when .css files are required by node +if (typeof require !== 'undefined') { + // eslint-disable-next-line + require.extensions['.css'] = (file) => {} } -setupRequireHacker() - -function moduleDir (m) { - return path.dirname(require.resolve(`${m}/package.json`)) -} - -module.exports = { - webpack: (config, { dev }) => { - config.resolve.extensions = ['.web.js', '.js', '.json'] - - config.module.rules.push( - { - test: /\.(svg)$/i, - loader: 'emit-file-loader', - options: { - name: 'dist/[path][name].[ext]' - }, - include: [ - moduleDir('antd-mobile'), - __dirname - ] - }, - { - test: /\.(svg)$/i, - loader: 'svg-sprite-loader', - include: [ - moduleDir('antd-mobile'), - __dirname - ] - } - ) - - return config - } -} +module.exports = withCSS() diff --git a/examples/with-antd-mobile/package.json b/examples/with-antd-mobile/package.json index 572e9c71..88ae8d77 100644 --- a/examples/with-antd-mobile/package.json +++ b/examples/with-antd-mobile/package.json @@ -2,13 +2,12 @@ "name": "with-antd-mobile", "version": "1.1.0", "dependencies": { - "antd-mobile": "1.4.0", + "@zeit/next-css": "1.0.1", + "antd-mobile": "2.2.5", "babel-plugin-import": "^1.2.1", "next": "latest", "react": "^16.0.0", - "react-dom": "^16.0.0", - "require-hacker": "^3.0.0", - "svg-sprite-loader": "0.3.1" + "react-dom": "^16.0.0" }, "scripts": { "dev": "next", diff --git a/examples/with-antd-mobile/pages/_app.js b/examples/with-antd-mobile/pages/_app.js new file mode 100644 index 00000000..73befab6 --- /dev/null +++ b/examples/with-antd-mobile/pages/_app.js @@ -0,0 +1,24 @@ +import React from 'react' +import App, { Container } from 'next/app' +import Head from 'next/head' + +export default class CustomApp extends App { + render () { + const { Component, pageProps } = this.props + return ( + + + + + + + + ) + } +} diff --git a/examples/with-antd-mobile/pages/_document.js b/examples/with-antd-mobile/pages/_document.js deleted file mode 100644 index 2c4e9b36..00000000 --- a/examples/with-antd-mobile/pages/_document.js +++ /dev/null @@ -1,18 +0,0 @@ -import Document, { Head, Main, NextScript } from 'next/document' - -export default class extends Document { - render () { - return ( - - - '} + expect(htmlEscapeJsonString(JSON.stringify(evilObj))).toBe('{"evil":"\\u003cscript\\u003e\\u003c/script\\u003e"}') + }) + + test('with angle brackets should parse back', () => { + const evilObj = {evil: ''} + expect(JSON.parse(htmlEscapeJsonString(JSON.stringify(evilObj)))).toMatchObject(evilObj) + }) + + test('with ampersands should escape', () => { + const evilObj = {evil: '&'} + expect(htmlEscapeJsonString(JSON.stringify(evilObj))).toBe('{"evil":"\\u0026"}') + }) + + test('with ampersands should parse back', () => { + const evilObj = {evil: '&'} + expect(JSON.parse(htmlEscapeJsonString(JSON.stringify(evilObj)))).toMatchObject(evilObj) + }) + + test('with "LINE SEPARATOR" and "PARAGRAPH SEPARATOR" should escape', () => { + const evilObj = {evil: '\u2028\u2029'} + expect(htmlEscapeJsonString(JSON.stringify(evilObj))).toBe('{"evil":"\\u2028\\u2029"}') + }) + + test('with "LINE SEPARATOR" and "PARAGRAPH SEPARATOR" should parse back', () => { + const evilObj = {evil: '\u2028\u2029'} + expect(JSON.parse(htmlEscapeJsonString(JSON.stringify(evilObj)))).toMatchObject(evilObj) + }) + + test('escaped line terminators should work', () => { + expect(() => { + vm.runInNewContext('(' + htmlEscapeJsonString(JSON.stringify({evil: '\u2028\u2029'})) + ')') + }).not.toThrow() + }) +}) diff --git a/yarn.lock b/yarn.lock index 7d8f4df7..24ca82ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5898,11 +5898,6 @@ html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= -htmlescape@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" - integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= - htmlparser2@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" From 136c37eca9c09dcfa2b551f1d64e0ab78fba35a0 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 27 Jan 2019 17:20:24 +0100 Subject: [PATCH 414/448] v8.0.0-canary.16 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index 7e274528..4af92b81 100644 --- a/lerna.json +++ b/lerna.json @@ -14,5 +14,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "8.0.0-canary.15" + "version": "8.0.0-canary.16" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 4837fc95..88da06d2 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "8.0.0-canary.15", + "version": "8.0.0-canary.16", "main": "./index.js", "license": "MIT", "files": [ diff --git a/packages/next/package.json b/packages/next/package.json index 95e5902b..e2864ca3 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "8.0.0-canary.15", + "version": "8.0.0-canary.16", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -71,7 +71,7 @@ "loader-utils": "1.1.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "8.0.0-canary.15", + "next-server": "8.0.0-canary.16", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", "react-error-overlay": "4.0.0", From 59280f7747b807fa9d1f5810e1d762d4f147124c Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 27 Jan 2019 21:56:02 +0100 Subject: [PATCH 415/448] Compile all next module files (#6155) --- packages/next/build/webpack-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/build/webpack-config.js b/packages/next/build/webpack-config.js index 49aebd2f..7fe18c9b 100644 --- a/packages/next/build/webpack-config.js +++ b/packages/next/build/webpack-config.js @@ -43,7 +43,7 @@ function externalsConfig (isServer, target) { } // Default pages have to be transpiled - if (res.match(/next[/\\]dist[/\\]pages/) || res.match(/next[/\\]dist[/\\]client/) || res.match(/node_modules[/\\]@babel[/\\]runtime[/\\]/) || res.match(/node_modules[/\\]@babel[/\\]runtime-corejs2[/\\]/)) { + if (res.match(/next[/\\]dist[/\\]/) || res.match(/node_modules[/\\]@babel[/\\]runtime[/\\]/) || res.match(/node_modules[/\\]@babel[/\\]runtime-corejs2[/\\]/)) { return callback() } From 0e21615245af222e04be23c46c486c6c1d93eb9a Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 27 Jan 2019 22:03:13 +0100 Subject: [PATCH 416/448] v8.0.0-canary.17 --- lerna.json | 2 +- packages/next-server/package.json | 2 +- packages/next/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lerna.json b/lerna.json index 4af92b81..9fb595c4 100644 --- a/lerna.json +++ b/lerna.json @@ -14,5 +14,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "8.0.0-canary.16" + "version": "8.0.0-canary.17" } diff --git a/packages/next-server/package.json b/packages/next-server/package.json index 88da06d2..aeadadde 100644 --- a/packages/next-server/package.json +++ b/packages/next-server/package.json @@ -1,6 +1,6 @@ { "name": "next-server", - "version": "8.0.0-canary.16", + "version": "8.0.0-canary.17", "main": "./index.js", "license": "MIT", "files": [ diff --git a/packages/next/package.json b/packages/next/package.json index e2864ca3..90c6be9a 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "8.0.0-canary.16", + "version": "8.0.0-canary.17", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -71,7 +71,7 @@ "loader-utils": "1.1.0", "mkdirp-then": "1.2.0", "nanoid": "1.2.1", - "next-server": "8.0.0-canary.16", + "next-server": "8.0.0-canary.17", "prop-types": "15.6.2", "prop-types-exact": "1.2.0", "react-error-overlay": "4.0.0", From 1475491568abeda96bd48b6759621f8847c5d9de Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 28 Jan 2019 08:37:24 +0100 Subject: [PATCH 417/448] Updates with-semantic-ui example (#6158) I tried to make the example a bit more descriptive. I changed `publicPath` in `now.config.js` to be `/_next/static/`, in place of `./`, and `outputPath` to `static/` in place of `static/css/`. The reason is that the webpack config will still fallback to `file-loader` for any content that is imported by the user and which is bigger that `8192` bytes. I think this content should not land in the css folder, which should probably stay css specific. Moreover, for user content, like regular images, the former settings will fail. If you have this: ```javascript import LargeFile from './LargeFile.png' ``` it would be placed in `static/css/` but its url would resolve to `/LargeFile.png`, which will fail. It works for semantic-ui alone, because `@zeit/next-css` will put the styles in `static/css/` and so `publicPath` of `./` would work just fine. Putting assets in `static/` and setting `publicPath` to '/_next/static/' will resolve correctly for both semantic-ui related assets as well as for regular user assets. I hope I am not mixing something up. I tested it locally and in serverless deployment, and this looks pretty consistent. --- examples/with-semantic-ui/.nowignore | 5 ++ examples/with-semantic-ui/next.config.js | 12 +-- examples/with-semantic-ui/now.json | 5 ++ examples/with-semantic-ui/package.json | 17 +++-- .../with-semantic-ui/pages/LargeImage.png | Bin 0 -> 201990 bytes .../with-semantic-ui/pages/SmallImage.png | Bin 0 -> 7395 bytes examples/with-semantic-ui/pages/_document.js | 15 ---- examples/with-semantic-ui/pages/index.js | 70 +++++++++++------- examples/with-semantic-ui/pages/styles.css | 37 +++++++++ 9 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 examples/with-semantic-ui/.nowignore create mode 100644 examples/with-semantic-ui/now.json create mode 100644 examples/with-semantic-ui/pages/LargeImage.png create mode 100644 examples/with-semantic-ui/pages/SmallImage.png delete mode 100644 examples/with-semantic-ui/pages/_document.js create mode 100644 examples/with-semantic-ui/pages/styles.css diff --git a/examples/with-semantic-ui/.nowignore b/examples/with-semantic-ui/.nowignore new file mode 100644 index 00000000..5a4be6a0 --- /dev/null +++ b/examples/with-semantic-ui/.nowignore @@ -0,0 +1,5 @@ +node_modules +.next +/*.* +!package.json +!next.config.js diff --git a/examples/with-semantic-ui/next.config.js b/examples/with-semantic-ui/next.config.js index 1dade337..03a5d211 100644 --- a/examples/with-semantic-ui/next.config.js +++ b/examples/with-semantic-ui/next.config.js @@ -1,20 +1,20 @@ -const withCss = require('@zeit/next-css') +const withCSS = require('@zeit/next-css') -module.exports = withCss({ +module.exports = withCSS({ + target: 'serverless', webpack (config) { config.module.rules.push({ - test: /\.(png|svg|eot|otf|ttf|woff|woff2)$/i, + test: /\.(png|svg|eot|otf|ttf|woff|woff2)$/, use: { loader: 'url-loader', options: { limit: 8192, - publicPath: './', - outputPath: 'static/css/', + publicPath: '/_next/static/', + outputPath: 'static/', name: '[name].[ext]' } } }) - return config } }) diff --git a/examples/with-semantic-ui/now.json b/examples/with-semantic-ui/now.json new file mode 100644 index 00000000..65dfadc7 --- /dev/null +++ b/examples/with-semantic-ui/now.json @@ -0,0 +1,5 @@ +{ + "version": 2, + "name": "with-semantic-ui", + "builds": [{ "src": "package.json", "use": "@now/next" }] +} diff --git a/examples/with-semantic-ui/package.json b/examples/with-semantic-ui/package.json index 2ed2d4a2..340a3a32 100644 --- a/examples/with-semantic-ui/package.json +++ b/examples/with-semantic-ui/package.json @@ -3,18 +3,21 @@ "version": "1.0.0", "scripts": { "dev": "next", - "build": "next build", + "now-build": "next build", "start": "next start" }, "dependencies": { - "@zeit/next-css": "^1.0.1", - "file-loader": "^1.1.11", - "next": "latest", + "next": "canary", "react": "^16.7.0", "react-dom": "^16.7.0", - "semantic-ui-css": "^2.3.3", - "semantic-ui-react": "^0.82.0", - "url-loader": "^1.0.1" + "semantic-ui-css": "^2.4.1", + "semantic-ui-react": "^0.84.0" + }, + "devDependencies": { + "@zeit/next-css": "^1.0.1", + "file-loader": "^3.0.1", + "url-loader": "^1.1.2", + "webpack": "^4.29.0" }, "license": "ISC" } diff --git a/examples/with-semantic-ui/pages/LargeImage.png b/examples/with-semantic-ui/pages/LargeImage.png new file mode 100644 index 0000000000000000000000000000000000000000..19de6c4384019643c7e09bb196df4a14e7cc50cd GIT binary patch literal 201990 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 *`k*s3`&OJ?zH^P2nlGRDxbf&3*DwU4 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 literal 0 HcmV?d00001 diff --git a/examples/with-semantic-ui/pages/_document.js b/examples/with-semantic-ui/pages/_document.js deleted file mode 100644 index 58fa5204..00000000 --- a/examples/with-semantic-ui/pages/_document.js +++ /dev/null @@ -1,15 +0,0 @@ -import Document, { Head, Main, NextScript } from 'next/document' - -export default class MyDocument extends Document { - render () { - return ( - - - -
- - - - ) - } -} diff --git a/examples/with-semantic-ui/pages/index.js b/examples/with-semantic-ui/pages/index.js index 46af6e7b..f8d6de13 100644 --- a/examples/with-semantic-ui/pages/index.js +++ b/examples/with-semantic-ui/pages/index.js @@ -1,38 +1,52 @@ import 'semantic-ui-css/semantic.min.css' -import { Modal, Header, Button, List, Icon } from 'semantic-ui-react' +import { Modal, + Button, + Icon +} from 'semantic-ui-react' + +import SmallImage from './SmallImage.png' +import LargeImage from './LargeImage.png' +import './styles.css' export default () => ( -
+
+ +
Show Modal}> - Select a Photo - + publicPath should be set to /_next/static/ + -
Default Profile Image
-

- We have found the following gravatar image associated with your - e-mail address. -

-

Is it okay to use this photo?

+
+
+

+ Larger content should be still availble as a fallback + to fileLoader but + it should not polute /.next/static/css folder. + You should see two images below. + One, smaller, loaded as data url, and one, bigger, loaded + via url. +

+
+
+ +

+ A small image should be loaded as data url: {SmallImage.substr(0, 100)}... +

+
+ +
+ +

+ A large image should be loaded as a url: {LargeImage} +

+
+

+ You should also still be able to load regular css. + This text should have border. +

+
- - - - Next.js - - - - - React - - - - - Vue.js - - - - Hello
) diff --git a/examples/with-semantic-ui/pages/styles.css b/examples/with-semantic-ui/pages/styles.css new file mode 100644 index 00000000..d0ee8936 --- /dev/null +++ b/examples/with-semantic-ui/pages/styles.css @@ -0,0 +1,37 @@ +.centered { + display: flex; + flex-flow: column nowrap; + align-items: center; + justify-content: center; + height: 100vh; +} + +.separator { + width: 100%; + height: 10px; +} + +.border { + border: 1px solid black; + padding: 5px; +} + +.wrapper { + display: flex; + flex-flow: column nowrap; + align-items: flex-start; +} + +.row { + display: flex; + width: 100%; + margin: 5px 0 5px 0; +} + +.row > p { + word-break: break-word; +} + +.row > img { + margin-right: 15px; +} From 8b24103d7f8f6ecb92f6af728668f835e318b78c Mon Sep 17 00:00:00 2001 From: Connor Davis Date: Tue, 29 Jan 2019 06:42:07 -0600 Subject: [PATCH 418/448] Throw Error When Running `next start` on Serverless Build (#6166) Fixes #6144 --- errors/next-start-serverless.md | 9 +++++++++ packages/next-server/server/next-server.ts | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 errors/next-start-serverless.md diff --git a/errors/next-start-serverless.md b/errors/next-start-serverless.md new file mode 100644 index 00000000..483f024d --- /dev/null +++ b/errors/next-start-serverless.md @@ -0,0 +1,9 @@ +# Using `next start` with `target` not set to `server` + +#### Why This Error Occurred + +Next.js can only handle running a server when the `target` is set to `server` (this is the default value). A serverless build, for instance, has no handler for requests–this is usually implemented by a hosting provider. + +#### Possible Ways to Fix It + +Use a different handler than `next start` when testing a serverless **production** build, otherwise just use `next dev`. diff --git a/packages/next-server/server/next-server.ts b/packages/next-server/server/next-server.ts index 2953ff32..54b15b49 100644 --- a/packages/next-server/server/next-server.ts +++ b/packages/next-server/server/next-server.ts @@ -47,7 +47,9 @@ export default class Server { // Only serverRuntimeConfig needs the default // publicRuntimeConfig gets it's default in client/index.js - const {serverRuntimeConfig = {}, publicRuntimeConfig, assetPrefix, generateEtags} = this.nextConfig + const {serverRuntimeConfig = {}, publicRuntimeConfig, assetPrefix, generateEtags, target} = this.nextConfig + + if (process.env.NODE_ENV === 'production' && target !== 'server') throw new Error('Cannot start server when target is not server. https://err.sh/zeit/next.js/next-start-serverless') this.buildId = this.readBuildId() this.renderOpts = { From dbdd66392158d3890fd89818fdd52b32bd399b73 Mon Sep 17 00:00:00 2001 From: Benjamin Hanes Date: Tue, 29 Jan 2019 07:42:44 -0500 Subject: [PATCH 419/448] Update with-react-native-web example to use babel (#6170) Fixes https://github.com/zeit/next.js/issues/6138 Tested with both latest and 8.0.0-canary.17 --- examples/with-react-native-web/.babelrc | 16 ++++++++++++++++ examples/with-react-native-web/next.config.js | 8 +++----- examples/with-react-native-web/package.json | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 examples/with-react-native-web/.babelrc diff --git a/examples/with-react-native-web/.babelrc b/examples/with-react-native-web/.babelrc new file mode 100644 index 00000000..17b0e38c --- /dev/null +++ b/examples/with-react-native-web/.babelrc @@ -0,0 +1,16 @@ +{ + "presets": [ + "next/babel" + ], + "plugins": [ + [ + "module-resolver", + { + "root": ["./"], + "alias": { + "^react-native$": "react-native-web" + } + } + ] + ] +} diff --git a/examples/with-react-native-web/next.config.js b/examples/with-react-native-web/next.config.js index 5a814040..71384c08 100644 --- a/examples/with-react-native-web/next.config.js +++ b/examples/with-react-native-web/next.config.js @@ -1,13 +1,11 @@ -const withTM = require('next-plugin-transpile-modules') - -module.exports = withTM({ - transpileModules: ['react-native-web'], +module.exports = { webpack: config => { // Alias all `react-native` imports to `react-native-web` config.resolve.alias = { + ...(config.resolve.alias || {}), 'react-native$': 'react-native-web' } return config } -}) +} diff --git a/examples/with-react-native-web/package.json b/examples/with-react-native-web/package.json index 6f1b2c0c..1a7233cb 100644 --- a/examples/with-react-native-web/package.json +++ b/examples/with-react-native-web/package.json @@ -6,8 +6,8 @@ "start": "next start" }, "dependencies": { + "babel-plugin-module-resolver": "^3.1.2", "next": "latest", - "next-plugin-transpile-modules": "^0.1.3", "react": "^16.7.0", "react-art": "^16.5.2", "react-dom": "^16.7.0", From b8057edd6e691db4549bbedf11a526e02f0d8f4e Mon Sep 17 00:00:00 2001 From: Jan Bejvl Date: Tue, 29 Jan 2019 13:42:58 +0100 Subject: [PATCH 420/448] Updated README.md with proper link (#6172) Updated README.md with proper link to 'root-static-files' example. --- examples/root-static-files/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/root-static-files/README.md b/examples/root-static-files/README.md index 5cc00d58..ad880492 100644 --- a/examples/root-static-files/README.md +++ b/examples/root-static-files/README.md @@ -19,8 +19,8 @@ yarn create next-app --example root-static-files root-static-files-app Download the example: ```bash -curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/custom-server -cd custom-server +curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/root-static-files +cd root-static-files ``` Install it and run: From f4f3649de33830d6758172a8d9df8b9a3e7142e9 Mon Sep 17 00:00:00 2001 From: Dovydas Navickas Date: Tue, 29 Jan 2019 16:50:02 +0200 Subject: [PATCH 421/448] Update README.md (#6106) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md I know I'm a moron for not understanding what's written in black on white, but... Maybe this will save someone an hour or two 😄 * Apply proposed changed --- packages/next/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/README.md b/packages/next/README.md index e3290d82..f00efe26 100644 --- a/packages/next/README.md +++ b/packages/next/README.md @@ -1164,7 +1164,7 @@ export default class MyDocument extends Document { 404 or 500 errors are handled both client and server side by a default component `error.js`. If you wish to override it, define a `_error.js` in the pages folder: -⚠️ The default `error.js` component is only used in production ⚠️ +⚠️ The `pages/_error.js` component is only used in production. In development you get an error with call stack to know where the error originated from. ⚠️ ```jsx import React from 'react' From cf31021e25f8d90f91ef3f7cb4f36a46d52fc56d Mon Sep 17 00:00:00 2001 From: Timon Borter Date: Wed, 30 Jan 2019 15:34:18 +0100 Subject: [PATCH 422/448] Bugfix/redux saga 1 0 0 not ready (#6176) This reverts the changes made in [this pr](https://github.com/zeit/next.js/pull/6109). `redux-saga: "1.0.0"` changed the way it handles it's queues. Because of that we're still having trouble to implement the synchronous side-effects flow in `next-redux-saga`. See [this discussion](https://github.com/bbortt/next-redux-saga/pull/1) for more information. Therefore I would feel more comfortable not to mislead users by giving them a non-working example in the main branch. --- examples/with-redux-saga/package.json | 18 +++++++++--------- examples/with-redux-saga/saga.js | 5 +++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/with-redux-saga/package.json b/examples/with-redux-saga/package.json index 033007cb..2481c012 100644 --- a/examples/with-redux-saga/package.json +++ b/examples/with-redux-saga/package.json @@ -8,18 +8,18 @@ "start": "next start" }, "dependencies": { - "es6-promise": "4.2.5", - "isomorphic-unfetch": "3.0.0", + "es6-promise": "4.1.1", + "isomorphic-unfetch": "2.0.0", "next": "latest", "next-redux-saga": "3.0.0", - "next-redux-wrapper": "2.1.0", - "react": "^16.7.0", - "react-dom": "^16.7.0", - "react-redux": "6.0.0", - "redux": "4.0.1", - "redux-saga": "1.0.0" + "next-redux-wrapper": "2.0.0", + "react": "^16.0.0", + "react-dom": "^16.0.0", + "react-redux": "5.0.7", + "redux": "4.0.0", + "redux-saga": "0.16.0" }, "devDependencies": { - "redux-devtools-extension": "2.13.7" + "redux-devtools-extension": "2.13.2" } } diff --git a/examples/with-redux-saga/saga.js b/examples/with-redux-saga/saga.js index 7d99739a..cd492cea 100644 --- a/examples/with-redux-saga/saga.js +++ b/examples/with-redux-saga/saga.js @@ -1,6 +1,7 @@ /* global fetch */ -import { all, call, delay, put, take, takeLatest } from 'redux-saga/effects' +import { delay } from 'redux-saga' +import { all, call, put, take, takeLatest } from 'redux-saga/effects' import es6promise from 'es6-promise' import 'isomorphic-unfetch' @@ -12,7 +13,7 @@ function * runClockSaga () { yield take(actionTypes.START_CLOCK) while (true) { yield put(tickClock(false)) - yield delay(1000) + yield call(delay, 1000) } } From 968475fb95a8dd4e1ae65103bafd134174c7e7a7 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Thu, 31 Jan 2019 10:38:20 +0100 Subject: [PATCH 423/448] Update with-relay-modern and with-relay-modern-server-express (#6182) Update examples with-relay-modern and with-relay-modern-server-express to react-relay 2.0.0 - react-relay has started to use new Context API instead of Legacy Context API - add `parseInt` because graphql 14.0.0 introduced stricter scalar value coercion Closes #6157 --- .../lib/RelayProvider.js | 31 ------------------- .../lib/withData.js | 7 ++--- .../package.json | 14 ++++----- .../pages/index.js | 7 ++++- .../with-relay-modern/lib/RelayProvider.js | 31 ------------------- examples/with-relay-modern/lib/withData.js | 7 ++--- examples/with-relay-modern/package.json | 10 +++--- 7 files changed, 24 insertions(+), 83 deletions(-) delete mode 100644 examples/with-relay-modern-server-express/lib/RelayProvider.js delete mode 100644 examples/with-relay-modern/lib/RelayProvider.js diff --git a/examples/with-relay-modern-server-express/lib/RelayProvider.js b/examples/with-relay-modern-server-express/lib/RelayProvider.js deleted file mode 100644 index 5d02fb50..00000000 --- a/examples/with-relay-modern-server-express/lib/RelayProvider.js +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' - -// Thank you https://github.com/robrichard -// https://github.com/robrichard/relay-context-provider - -class RelayProvider extends React.Component { - getChildContext () { - return { - relay: { - environment: this.props.environment, - variables: this.props.variables - } - } - } - render () { - return this.props.children - } -} - -RelayProvider.childContextTypes = { - relay: PropTypes.object.isRequired -} - -RelayProvider.propTypes = { - environment: PropTypes.object.isRequired, - variables: PropTypes.object.isRequired, - children: PropTypes.node -} - -export default RelayProvider diff --git a/examples/with-relay-modern-server-express/lib/withData.js b/examples/with-relay-modern-server-express/lib/withData.js index 2cba4931..8a241d01 100644 --- a/examples/with-relay-modern-server-express/lib/withData.js +++ b/examples/with-relay-modern-server-express/lib/withData.js @@ -1,7 +1,6 @@ import React from 'react' import initEnvironment from './createRelayEnvironment' -import { fetchQuery } from 'react-relay' -import RelayProvider from './RelayProvider' +import { fetchQuery, ReactRelayContext } from 'react-relay' export default (ComposedComponent, options = {}) => { return class WithData extends React.Component { @@ -45,9 +44,9 @@ export default (ComposedComponent, options = {}) => { render () { return ( - + - + ) } } diff --git a/examples/with-relay-modern-server-express/package.json b/examples/with-relay-modern-server-express/package.json index f133ed65..f5c3368f 100644 --- a/examples/with-relay-modern-server-express/package.json +++ b/examples/with-relay-modern-server-express/package.json @@ -15,18 +15,18 @@ "dependencies": { "dotenv": "^4.0.0", "dotenv-webpack": "^1.5.4", - "express-graphql": "^0.6.12", - "graphql": "^0.13.2", - "graphql-relay": "^0.5.5", - "isomorphic-unfetch": "^2.0.0", + "express-graphql": "^0.7.1", + "graphql": "^14.1.1", + "graphql-relay": "^0.6.0", + "isomorphic-unfetch": "^3.0.0", "next": "latest", "react": "^16.7.0", "react-dom": "^16.7.0", - "react-relay": "^1.5.0" + "react-relay": "^2.0.0" }, "devDependencies": { - "babel-plugin-relay": "^1.4.1", + "babel-plugin-relay": "^2.0.0", "graphql-cli": "^1.0.0-beta.4", - "relay-compiler": "^1.5.0" + "relay-compiler": "^2.0.0" } } diff --git a/examples/with-relay-modern-server-express/pages/index.js b/examples/with-relay-modern-server-express/pages/index.js index aa94734e..899fb8e6 100644 --- a/examples/with-relay-modern-server-express/pages/index.js +++ b/examples/with-relay-modern-server-express/pages/index.js @@ -14,7 +14,12 @@ class Index extends Component { } return { - relayVariables: { after, before, first, last } + relayVariables: { + after, + before, + first: parseInt(first, 10), + last: parseInt(last, 10) + } } } diff --git a/examples/with-relay-modern/lib/RelayProvider.js b/examples/with-relay-modern/lib/RelayProvider.js deleted file mode 100644 index 5d02fb50..00000000 --- a/examples/with-relay-modern/lib/RelayProvider.js +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' - -// Thank you https://github.com/robrichard -// https://github.com/robrichard/relay-context-provider - -class RelayProvider extends React.Component { - getChildContext () { - return { - relay: { - environment: this.props.environment, - variables: this.props.variables - } - } - } - render () { - return this.props.children - } -} - -RelayProvider.childContextTypes = { - relay: PropTypes.object.isRequired -} - -RelayProvider.propTypes = { - environment: PropTypes.object.isRequired, - variables: PropTypes.object.isRequired, - children: PropTypes.node -} - -export default RelayProvider diff --git a/examples/with-relay-modern/lib/withData.js b/examples/with-relay-modern/lib/withData.js index fa030e24..8691076f 100644 --- a/examples/with-relay-modern/lib/withData.js +++ b/examples/with-relay-modern/lib/withData.js @@ -1,7 +1,6 @@ import React from 'react' import initEnvironment from './createRelayEnvironment' -import { fetchQuery } from 'react-relay' -import RelayProvider from './RelayProvider' +import { fetchQuery, ReactRelayContext } from 'react-relay' export default (ComposedComponent, options = {}) => { return class WithData extends React.Component { @@ -47,9 +46,9 @@ export default (ComposedComponent, options = {}) => { render () { return ( - + - + ) } } diff --git a/examples/with-relay-modern/package.json b/examples/with-relay-modern/package.json index e334ca13..8a29aaef 100644 --- a/examples/with-relay-modern/package.json +++ b/examples/with-relay-modern/package.json @@ -15,17 +15,17 @@ "dependencies": { "dotenv": "^4.0.0", "dotenv-webpack": "^1.5.4", - "graphql": "^0.13.2", - "isomorphic-unfetch": "^2.0.0", + "graphql": "^14.1.1", + "isomorphic-unfetch": "^3.0.0", "next": "latest", "react": "^16.7.0", "react-dom": "^16.7.0", - "react-relay": "^1.5.0" + "react-relay": "^2.0.0" }, "devDependencies": { - "babel-plugin-relay": "^1.4.1", + "babel-plugin-relay": "^2.0.0", "graphcool": "^1.2.1", "graphql-cli": "^1.0.0-beta.4", - "relay-compiler": "^1.5.0" + "relay-compiler": "^2.0.0" } } From 8fdb1339037da331a23c66e748d083e46f3ee3f3 Mon Sep 17 00:00:00 2001 From: Resi Respati Date: Fri, 1 Feb 2019 00:36:02 +0700 Subject: [PATCH 424/448] [with-typescript] Improved intial props examples, added example detail (#6165) I've just thought of a way to improve the initial props page by adding an example for a list/detail page structure. To do that, I've created a separate `/detail` page, and a mock API which calls data from the array we made on the previous PR. A ListDetail component is created as an example for displaying detail. Page structure is also cleaned up. Should I go ahead and add an example on how to style with styled-jsx + its TS declarations? I might decide to do it within this week anyway. --- .../with-typescript/components/Layout.tsx | 4 +- .../with-typescript/components/ListDetail.tsx | 16 +++++++ .../with-typescript/components/ListItem.tsx | 6 ++- .../interfaces/{index.tsx => index.ts} | 0 examples/with-typescript/pages/about.tsx | 1 + examples/with-typescript/pages/detail.tsx | 46 +++++++++++++++++++ examples/with-typescript/pages/list-class.tsx | 20 ++++---- examples/with-typescript/pages/list-fc.tsx | 20 ++++---- examples/with-typescript/utils/sample-api.ts | 34 ++++++++++++++ 9 files changed, 126 insertions(+), 21 deletions(-) create mode 100644 examples/with-typescript/components/ListDetail.tsx rename examples/with-typescript/interfaces/{index.tsx => index.ts} (100%) create mode 100644 examples/with-typescript/pages/detail.tsx create mode 100644 examples/with-typescript/utils/sample-api.ts diff --git a/examples/with-typescript/components/Layout.tsx b/examples/with-typescript/components/Layout.tsx index a69522ac..572f1045 100644 --- a/examples/with-typescript/components/Layout.tsx +++ b/examples/with-typescript/components/Layout.tsx @@ -16,8 +16,8 @@ const Layout: React.FunctionComponent = ({ children, title = 'This is the
diff --git a/examples/with-typescript/components/ListDetail.tsx b/examples/with-typescript/components/ListDetail.tsx new file mode 100644 index 00000000..668e1722 --- /dev/null +++ b/examples/with-typescript/components/ListDetail.tsx @@ -0,0 +1,16 @@ +import * as React from 'react' + +import IDataObject from '../interfaces'; + +type ListDetailProps = { + item: IDataObject; +} + +const ListDetail: React.FC = ({ item: user }) => ( +
+

Detail for {user.name}

+

ID: {user.id}

+
+) + +export default ListDetail; diff --git a/examples/with-typescript/components/ListItem.tsx b/examples/with-typescript/components/ListItem.tsx index 90d19f46..14478cd2 100644 --- a/examples/with-typescript/components/ListItem.tsx +++ b/examples/with-typescript/components/ListItem.tsx @@ -1,4 +1,6 @@ import * as React from 'react' +import Link from 'next/link'; + import IDataObject from '../interfaces' type Props = { @@ -6,7 +8,9 @@ type Props = { } const ListItem: React.FunctionComponent = ({ data }) => ( - {data.id}:{data.name} + + {data.id}: {data.name} + ); export default ListItem diff --git a/examples/with-typescript/interfaces/index.tsx b/examples/with-typescript/interfaces/index.ts similarity index 100% rename from examples/with-typescript/interfaces/index.tsx rename to examples/with-typescript/interfaces/index.ts diff --git a/examples/with-typescript/pages/about.tsx b/examples/with-typescript/pages/about.tsx index 0e01004b..ed0f797b 100644 --- a/examples/with-typescript/pages/about.tsx +++ b/examples/with-typescript/pages/about.tsx @@ -4,6 +4,7 @@ import Layout from '../components/Layout' const AboutPage: React.FunctionComponent = () => ( +

About

This is the about page

Go home

diff --git a/examples/with-typescript/pages/detail.tsx b/examples/with-typescript/pages/detail.tsx new file mode 100644 index 00000000..f1919d02 --- /dev/null +++ b/examples/with-typescript/pages/detail.tsx @@ -0,0 +1,46 @@ +import * as React from 'react' +import { NextContext } from 'next' +import Layout from '../components/Layout' +import IDataObject from '../interfaces' +import { findData } from '../utils/sample-api' +import ListDetail from '../components/ListDetail'; + +type RequestQuery = { + id: number, +} + +type Props = { + item?: IDataObject, + errors?: string, +} + +class ListDetailPage extends React.Component { + static getInitialProps = async ({ query }: NextContext) => { + try { + const item = await findData(query.id); + return { item } + } catch (err) { + return { errors: err.message } + } + } + + render() { + const { item, errors } = this.props; + + if (errors) { + return ( + +

Error: {errors}

+
+ ) + } + + return ( + + {item && } + + ) + } +} + +export default ListDetailPage diff --git a/examples/with-typescript/pages/list-class.tsx b/examples/with-typescript/pages/list-class.tsx index 3e290146..20395ae2 100644 --- a/examples/with-typescript/pages/list-class.tsx +++ b/examples/with-typescript/pages/list-class.tsx @@ -1,12 +1,15 @@ -import React from 'react' +import * as React from 'react' import { NextContext } from 'next' +import Link from 'next/link'; import Layout from '../components/Layout' import List from '../components/List' import IDataObject from '../interfaces' +import { findAll } from '../utils/sample-api'; type Props = { items: IDataObject[], + pathname: string, } class ListClass extends React.Component { @@ -14,20 +17,19 @@ class ListClass extends React.Component { // Example for including initial props in a Next.js page. // Don't forget to include the respective types for any // props passed into the component - const dataArray: IDataObject[] = [ - { id: 101, name: 'larry' }, - { id: 102, name: 'sam' }, - { id: 103, name: 'jill' }, - { id: 104, name: pathname }, - ] + const items: IDataObject[] = await findAll() - return { items: dataArray } + return { items, pathname } } render() { + const { items, pathname } = this.props return ( - +

List Example

+

You are currently on: {pathname}

+ +

Go home

) } diff --git a/examples/with-typescript/pages/list-fc.tsx b/examples/with-typescript/pages/list-fc.tsx index 3fd6fe65..3070da66 100644 --- a/examples/with-typescript/pages/list-fc.tsx +++ b/examples/with-typescript/pages/list-fc.tsx @@ -1,15 +1,22 @@ import { NextFunctionComponent, NextContext } from 'next' +import Link from 'next/link'; + import Layout from '../components/Layout' import List from '../components/List' import IDataObject from '../interfaces' +import { findAll } from '../utils/sample-api'; type Props = { items: IDataObject[], + pathname: string, } -const ListFunction: NextFunctionComponent = ({ items }) => ( - +const ListFunction: NextFunctionComponent = ({ items, pathname }) => ( + +

List Example (as Function Component)

+

You are currently on: {pathname}

+

Go home

) @@ -17,14 +24,9 @@ ListFunction.getInitialProps = async ({ pathname }: NextContext) => { // Example for including initial props in a Next.js function compnent page. // Don't forget to include the respective types for any props passed into // the component. - const dataArray: IDataObject[] = [ - { id: 101, name: 'larry' }, - { id: 102, name: 'sam' }, - { id: 103, name: 'jill' }, - { id: 104, name: pathname }, - ] + const items: IDataObject[] = await findAll() - return { items: dataArray } + return { items, pathname } } export default ListFunction diff --git a/examples/with-typescript/utils/sample-api.ts b/examples/with-typescript/utils/sample-api.ts new file mode 100644 index 00000000..0c9d21dc --- /dev/null +++ b/examples/with-typescript/utils/sample-api.ts @@ -0,0 +1,34 @@ +import IDataObject from "../interfaces"; + +/** Dummy user data. */ +export const dataArray: IDataObject[] = [ + { id: 101, name: 'Alice' }, + { id: 102, name: 'Bob' }, + { id: 103, name: 'Caroline' }, + { id: 104, name: 'Dave' }, +]; + +/** + * Calls a mock API which finds a user by ID from the list above. + * + * Throws an error if not found. + */ +export async function findData(id: number | string) { + const selected = dataArray.find((data) => data.id === Number(id)) + + if (!selected) { + throw new Error('Cannot find user') + } + + return selected +} + +/** Calls a mock API which returns the above array to simulate "get all". */ +export async function findAll() { + // Throw an error, just for example. + if (!Array.isArray(dataArray)) { + throw new Error('Cannot find users') + } + + return dataArray +} From 1a416b688ec90fe657512af059aedae16b71b2e4 Mon Sep 17 00:00:00 2001 From: Sultan Tarimo Date: Thu, 31 Jan 2019 23:45:36 +0300 Subject: [PATCH 425/448] Load ErrorComponent dynamically (#6171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #6152. - Only dynamically load /_error.js when an exception occurs. - Fix websocket “/_error.js” ping oddity. --- packages/next-server/lib/router/router.js | 7 +++---- packages/next/client/index.js | 4 ++-- packages/next/pages/_document.js | 2 -- test/integration/production/test/index.test.js | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/next-server/lib/router/router.js b/packages/next-server/lib/router/router.js index 54d06d01..9d625470 100644 --- a/packages/next-server/lib/router/router.js +++ b/packages/next-server/lib/router/router.js @@ -8,7 +8,7 @@ import { loadGetInitialProps, getURL } from '../utils' export default class Router { static events = mitt() - constructor (pathname, query, as, { initialProps, pageLoader, App, Component, ErrorComponent, err } = {}) { + constructor (pathname, query, as, { initialProps, pageLoader, App, Component, err } = {}) { // represents the current component key this.route = toRoute(pathname) @@ -17,7 +17,7 @@ export default class Router { // We should not keep the cache, if there's an error // Otherwise, this cause issues when when going back and // come again to the errored page. - if (Component !== ErrorComponent) { + if (pathname !== '/_error') { this.components[this.route] = { Component, props: initialProps, err } } @@ -28,7 +28,6 @@ export default class Router { this.events = Router.events this.pageLoader = pageLoader - this.ErrorComponent = ErrorComponent this.pathname = pathname this.query = query this.asPath = as @@ -291,7 +290,7 @@ export default class Router { return { error: err } } - const Component = this.ErrorComponent + const Component = await this.fetchComponent('/_error') routeInfo = { Component, err } const ctx = { err, pathname, query } try { diff --git a/packages/next/client/index.js b/packages/next/client/index.js index c6ed446f..4b013fc9 100644 --- a/packages/next/client/index.js +++ b/packages/next/client/index.js @@ -73,7 +73,6 @@ export default async ({ if (process.env.NODE_ENV === 'development') { webpackHMR = passedWebpackHMR } - ErrorComponent = await pageLoader.loadPage('/_error') App = await pageLoader.loadPage('/_app') let initialErr = err @@ -99,7 +98,6 @@ export default async ({ pageLoader, App, Component, - ErrorComponent, err: initialErr }) @@ -138,6 +136,8 @@ export async function renderError (props) { // Make sure we log the error to the console, otherwise users can't track down issues. console.error(err) + ErrorComponent = await pageLoader.loadPage('/_error') + // In production we do a normal render with the `ErrorComponent` as component. // If we've gotten here upon initial render, we can use the props from the server. // Otherwise, we need to call `getInitialProps` on `App` before mounting. diff --git a/packages/next/pages/_document.js b/packages/next/pages/_document.js index 5d653d5d..e3fa8ea6 100644 --- a/packages/next/pages/_document.js +++ b/packages/next/pages/_document.js @@ -125,7 +125,6 @@ export class Head extends Component { {head} {page !== '/_error' && } - {this.getPreloadDynamicChunks()} {this.getPreloadMainLinks()} {this.getCssLinks()} @@ -221,7 +220,6 @@ export class NextScript extends Component { }} />} {page !== '/_error' &&