Skip to content

Commit 546ecf6

Browse files
committed
Make next a peer dependency
1 parent 84c6f7f commit 546ecf6

File tree

4 files changed

+1567
-676
lines changed

4 files changed

+1567
-676
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

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

55
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')
86
const findUp = require('find-up')
97
const makeDir = require('make-dir')
108
const { copy } = require('cpx')
119

1210
const isStaticExportProject = require('./helpers/isStaticExportProject')
11+
const { validateNextUsage } = require('./helpers/validateNextUsage')
1312

1413
const pWriteFile = util.promisify(fs.writeFile)
1514
const pCopy = util.promisify(copy)
@@ -22,6 +21,8 @@ module.exports = {
2221
async onPreBuild({ netlifyConfig, packageJson, utils }) {
2322
const { failBuild } = utils.build
2423

24+
validateNextUsage(failBuild)
25+
2526
if (Object.keys(packageJson).length === 0) {
2627
return failBuild(`Could not find a package.json for this project`)
2728
}
@@ -46,6 +47,11 @@ module.exports = {
4647

4748
const nextConfigPath = await findUp('next.config.js')
4849
if (nextConfigPath !== undefined) {
50+
// We cannot load `next` at the top-level because we validate whether the
51+
// site is using `next` inside `onPreBuild`.
52+
const { PHASE_PRODUCTION_BUILD } = require('next/constants')
53+
const { default: loadConfig } = require('next/dist/next-server/server/config')
54+
4955
// If the next config exists, fail build if target isnt in acceptableTargets
5056
const acceptableTargets = ['serverless', 'experimental-serverless-trace']
5157
const nextConfig = loadConfig(PHASE_PRODUCTION_BUILD, path.resolve('.'))
@@ -66,6 +72,7 @@ module.exports = {
6672
},
6773
async onBuild({ constants: { PUBLISH_DIR, FUNCTIONS_SRC = DEFAULT_FUNCTIONS_SRC } }) {
6874
console.log(`** Running Next on Netlify package **`)
75+
6976
nextOnNetlify()
7077

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

0 commit comments

Comments
 (0)