Skip to content

Commit bdd9bee

Browse files
committed
fix: sort out require handling
1 parent 0b3fff6 commit bdd9bee

File tree

6 files changed

+33
-33
lines changed

6 files changed

+33
-33
lines changed

helpers/getNextConfig.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ const { cwd: getCwd } = require('process')
44

55
const moize = require('moize')
66

7-
const requireNextModule = require('./requireNextModule')
7+
const resolveNextModule = require('./resolveNextModule')
88

99
// We used to cache nextConfig for any cwd. Now we pass process.cwd() to cache
1010
// (or memoize) nextConfig per cwd.
1111
const getNextConfig = async function (failBuild = defaultFailBuild, cwd = getCwd()) {
1212
// We cannot load `next` at the top-level because we validate whether the
1313
// site is using `next` inside `onPreBuild`.
14-
const { PHASE_PRODUCTION_BUILD } = requireNextModule('next/constants', cwd)
15-
const loadConfig = requireNextModule('next/dist/next-server/server/config', cwd).default
14+
/* eslint-disable import/no-dynamic-require */
15+
const { PHASE_PRODUCTION_BUILD } = require(resolveNextModule('next/constants', cwd))
16+
const loadConfig = require(resolveNextModule('next/dist/next-server/server/config', cwd)).default
17+
/* eslint-enable import/no-dynamic-require */
1618

1719
try {
1820
return await loadConfig(PHASE_PRODUCTION_BUILD, cwd)

helpers/requireNextModule.js

-13
This file was deleted.

helpers/resolveNextModule.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* We can't require() these normally, because the "next" package might not be resolvable from the root of a monorepo
3+
*/
4+
const resolveNextModule = (module, nextRoot) => {
5+
// Get the default list of require paths...
6+
const paths = require.resolve.paths(module)
7+
// ...add the root of the Next site to the beginning of that list so we try it first...
8+
paths.unshift(nextRoot)
9+
// ...then resolve the module using that list of paths.
10+
return require.resolve(module, { paths })
11+
}
12+
13+
module.exports = resolveNextModule

helpers/validateNextUsage.js

+6-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { yellowBright } = require('chalk')
22
const { lt: ltVersion, gte: gteVersion } = require('semver')
33

44
const getNextRoot = require('./getNextRoot')
5+
const resolveNextModule = require('./resolveNextModule')
56

67
// Ensure Next.js is available.
78
// We use `peerDependencies` instead of `dependencies` so that users can choose
@@ -10,20 +11,17 @@ const getNextRoot = require('./getNextRoot')
1011
const validateNextUsage = function ({ failBuild, netlifyConfig }) {
1112
const nextRoot = getNextRoot({ netlifyConfig })
1213
// Because we don't know the monorepo structure, we try to resolve next both locally and in the next root
13-
const paths = [nextRoot, process.cwd()]
14-
if (!hasPackage('next', paths)) {
14+
if (!hasPackage('next', nextRoot)) {
1515
return failBuild(
16-
'This site does not seem to be using Next.js. Please run "npm install next" or "yarn next" in the repository.',
16+
`This site does not seem to be using Next.js. Please run "npm install next" or "yarn next" in the repository. ${nextRoot} ${process.cwd()}`,
1717
)
1818
}
1919

2020
// We cannot load `next` at the top-level because we validate whether the
2121
// site is using `next` inside `onPreBuild`.
2222
// Old Next.js versions are not supported
23-
// eslint-disable-next-line node/no-unpublished-require
24-
const pkg = require.resolve(`next/package.json`, { paths })
2523
// eslint-disable-next-line import/no-dynamic-require
26-
const { version } = require(pkg)
24+
const { version } = require(resolveNextModule(`next/package.json`, nextRoot))
2725
if (ltVersion(version, MIN_VERSION)) {
2826
return failBuild(`Please upgrade to Next.js ${MIN_VERSION} or later. Found ${version}.`)
2927
}
@@ -39,9 +37,9 @@ const validateNextUsage = function ({ failBuild, netlifyConfig }) {
3937
const MIN_VERSION = '10.0.6'
4038
const MIN_EXPERIMENTAL_VERSION = '11.0.0'
4139

42-
const hasPackage = function (packageName, paths) {
40+
const hasPackage = function (packageName, nextRoot) {
4341
try {
44-
require.resolve(`${packageName}/package.json`, { paths })
42+
resolveNextModule(`${packageName}/package.json`, nextRoot)
4543
return true
4644
} catch (error) {
4745
return false

helpers/verifyBuildTarget.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const { writeFile } = require('fs-extra')
44

55
const getNextConfig = require('./getNextConfig')
66
const getNextRoot = require('./getNextRoot')
7+
const resolveNextModule = require('./resolveNextModule')
78

89
// Checks if site has the correct next.config.js
910
const verifyBuildTarget = async ({ failBuild, netlifyConfig }) => {
@@ -31,14 +32,9 @@ const verifyBuildTarget = async ({ failBuild, netlifyConfig }) => {
3132
// 🐉 We need Next to recalculate "isZeitNow" var so we can set the target, but it's
3233
// set as an import side effect so we need to clear the require cache first. 🐲
3334
// https://github.com/vercel/next.js/blob/canary/packages/next/telemetry/ci-info.ts
34-
/* eslint-disable node/no-unpublished-require */
3535

36-
const paths = [nextRoot, process.cwd()]
37-
38-
delete require.cache[require.resolve('next/dist/telemetry/ci-info', { paths })]
39-
delete require.cache[require.resolve('next/dist/next-server/server/config', { paths })]
40-
41-
/* eslint-enable node/no-unpublished-require */
36+
delete require.cache[resolveNextModule('next/dist/telemetry/ci-info', nextRoot)]
37+
delete require.cache[resolveNextModule('next/dist/next-server/server/config', nextRoot)]
4238

4339
// Clear memoized cache
4440
getNextConfig.clear()

src/lib/helpers/getSortedRedirects.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const requireNextModule = require('../../../helpers/requireNextModule')
1+
const resolveNextModule = require('../../../helpers/resolveNextModule')
22

33
const removeFileExtension = require('./removeFileExtension')
44

@@ -11,7 +11,11 @@ const getSortedRedirects = (redirects) => {
1111
const routesWithoutExtensions = redirects.map(({ route }) => removeFileExtension(route))
1212

1313
// Sort the "naked" routes
14-
const { getSortedRoutes } = requireNextModule('next/dist/next-server/lib/router/utils/sorted-routes', process.cwd())
14+
// eslint-disable-next-line import/no-dynamic-require
15+
const { getSortedRoutes } = require(resolveNextModule(
16+
'next/dist/next-server/lib/router/utils/sorted-routes',
17+
process.cwd(),
18+
))
1519
const sortedRoutes = getSortedRoutes(routesWithoutExtensions)
1620

1721
// Return original routes in the sorted order

0 commit comments

Comments
 (0)