Skip to content

Commit 97cc69a

Browse files
authored
Merge pull request #45 from netlify/feat/next-peer-dependency
Make `next` a peer dependency
2 parents 84c6f7f + 4acffcf commit 97cc69a

File tree

4 files changed

+918
-246
lines changed

4 files changed

+918
-246
lines changed

helpers/validateNextUsage.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Ensure Next.js is available.
2+
// We use `peerDependencies` instead of `dependencies` so that users can choose
3+
// the Next.js version. However, this requires them to install "next" in their
4+
// site.
5+
const validateNextUsage = function (failBuild) {
6+
if (!hasPackage('next')) {
7+
return failBuild(
8+
'This site does not seem to be using Next.js. Please run "npm install next" or "yarn next" in the repository.',
9+
)
10+
}
11+
}
12+
13+
const hasPackage = function (packageName) {
14+
try {
15+
require(packageName)
16+
return true
17+
} catch (error) {
18+
return false
19+
}
20+
}
21+
22+
module.exports = validateNextUsage

index.js

+13-3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ const fs = require('fs')
22
const path = require('path')
33
const util = require('util')
44

5-
const nextOnNetlify = require('next-on-netlify')
6-
const { PHASE_PRODUCTION_BUILD } = require('next/constants')
7-
const { default: loadConfig } = require('next/dist/next-server/server/config')
85
const findUp = require('find-up')
96
const makeDir = require('make-dir')
107
const { copy } = require('cpx')
118

129
const isStaticExportProject = require('./helpers/isStaticExportProject')
10+
const validateNextUsage = require('./helpers/validateNextUsage')
1311

1412
const pWriteFile = util.promisify(fs.writeFile)
1513
const pCopy = util.promisify(copy)
@@ -22,6 +20,8 @@ module.exports = {
2220
async onPreBuild({ netlifyConfig, packageJson, utils }) {
2321
const { failBuild } = utils.build
2422

23+
validateNextUsage(failBuild)
24+
2525
if (Object.keys(packageJson).length === 0) {
2626
return failBuild(`Could not find a package.json for this project`)
2727
}
@@ -46,6 +46,11 @@ module.exports = {
4646

4747
const nextConfigPath = await findUp('next.config.js')
4848
if (nextConfigPath !== undefined) {
49+
// We cannot load `next` at the top-level because we validate whether the
50+
// site is using `next` inside `onPreBuild`.
51+
const { PHASE_PRODUCTION_BUILD } = require('next/constants')
52+
const { default: loadConfig } = require('next/dist/next-server/server/config')
53+
4954
// If the next config exists, fail build if target isnt in acceptableTargets
5055
const acceptableTargets = ['serverless', 'experimental-serverless-trace']
5156
const nextConfig = loadConfig(PHASE_PRODUCTION_BUILD, path.resolve('.'))
@@ -66,6 +71,11 @@ module.exports = {
6671
},
6772
async onBuild({ constants: { PUBLISH_DIR, FUNCTIONS_SRC = DEFAULT_FUNCTIONS_SRC } }) {
6873
console.log(`** Running Next on Netlify package **`)
74+
75+
// We cannot load `next-on-netlify` (which depends on `next`) at the
76+
// top-level because we validate whether the site is using `next`
77+
// inside `onPreBuild`.
78+
const nextOnNetlify = require('next-on-netlify')
6979
nextOnNetlify()
7080

7181
// Next-on-netlify puts its files into out_functions and out_publish

0 commit comments

Comments
 (0)