Skip to content

Commit

Permalink
fix(next): dev server starting when importing a file using get-projec… (
Browse files Browse the repository at this point in the history
#38274)

Fixes: #38232 
Fixes: #36893

Version [12.1.1-canary.5](https://github.com/vercel/next.js/releases/tag/v12.1.1-canary.5) introduced a bug, more specifically this PR: #34836

The issue described in #38232 is that the following code starts both the dev and prod servers:
```js
const start = require('next/dist/cli/next-start')
start.nextStart()
```

I searched a bit and found that `lib/get-project-dir.ts#getProjectDir()` now imports `bin/next.ts`

https://github.com/vercel/next.js/blob/6b8e499c7bf13914cca92f9da1737d358133ee20/packages/next/lib/get-project-dir.ts#L3

and it calls a CLI command via

https://github.com/vercel/next.js/blob/6b8e499c7bf13914cca92f9da1737d358133ee20/packages/next/bin/next.ts#L137

This `command` should not be defined, but it fallbacks to `defaultCommand`, which is `dev` (that explains why the dev server is also started)

This PR moves the `cliCommand` types and `commands` variable to a new separate file instead of `bin/next.ts`, to avoid running a CLI command when we import any file that also imports `lib/get-project-dir.ts`

Not sure how integration tests can be added for this issue, but feel free to tell me.

Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
  • Loading branch information
QuiiBz and ijjk committed Aug 7, 2022
1 parent 5910458 commit a720dbd
Show file tree
Hide file tree
Showing 11 changed files with 26 additions and 20 deletions.
13 changes: 1 addition & 12 deletions packages/next/bin/next.ts
Expand Up @@ -2,6 +2,7 @@
import * as log from '../build/output/log'
import arg from 'next/dist/compiled/arg/index.js'
import { NON_STANDARD_NODE_ENV } from '../lib/constants'
import { commands } from '../lib/commands'
;['react', 'react-dom'].forEach((dependency) => {
try {
// When 'npm link' is used it checks the clone location. Not the project.
Expand All @@ -14,18 +15,6 @@ import { NON_STANDARD_NODE_ENV } from '../lib/constants'
})

const defaultCommand = 'dev'
export type cliCommand = (argv?: string[]) => void
export const commands: { [command: string]: () => Promise<cliCommand> } = {
build: () => Promise.resolve(require('../cli/next-build').nextBuild),
start: () => Promise.resolve(require('../cli/next-start').nextStart),
export: () => Promise.resolve(require('../cli/next-export').nextExport),
dev: () => Promise.resolve(require('../cli/next-dev').nextDev),
lint: () => Promise.resolve(require('../cli/next-lint').nextLint),
telemetry: () =>
Promise.resolve(require('../cli/next-telemetry').nextTelemetry),
info: () => Promise.resolve(require('../cli/next-info').nextInfo),
}

const args = arg(
{
// Types
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-build.ts
Expand Up @@ -2,7 +2,7 @@
import { existsSync } from 'fs'
import arg from 'next/dist/compiled/arg/index.js'
import * as Log from '../build/output/log'
import { cliCommand } from '../bin/next'
import { cliCommand } from '../lib/commands'
import build from '../build'
import { printAndExit } from '../server/lib/utils'
import isError from '../lib/is-error'
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-dev.ts
Expand Up @@ -5,7 +5,7 @@ import { startServer } from '../server/lib/start-server'
import { printAndExit } from '../server/lib/utils'
import * as Log from '../build/output/log'
import { startedDevelopmentServer } from '../build/output'
import { cliCommand } from '../bin/next'
import { cliCommand } from '../lib/commands'
import isError from '../lib/is-error'
import { getProjectDir } from '../lib/get-project-dir'
import { CONFIG_FILES } from '../shared/lib/constants'
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-export.ts
Expand Up @@ -4,7 +4,7 @@ import { existsSync } from 'fs'
import arg from 'next/dist/compiled/arg/index.js'
import exportApp from '../export'
import { printAndExit } from '../server/lib/utils'
import { cliCommand } from '../bin/next'
import { cliCommand } from '../lib/commands'
import { trace } from '../trace'
import isError from '../lib/is-error'
import { getProjectDir } from '../lib/get-project-dir'
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-info.ts
Expand Up @@ -6,7 +6,7 @@ import chalk from 'next/dist/compiled/chalk'
import arg from 'next/dist/compiled/arg/index.js'
import fetch from 'next/dist/compiled/node-fetch'
import { printAndExit } from '../server/lib/utils'
import { cliCommand } from '../bin/next'
import { cliCommand } from '../lib/commands'
import isError from '../lib/is-error'

const nextInfo: cliCommand = async (argv) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-lint.ts
Expand Up @@ -4,7 +4,7 @@ import arg from 'next/dist/compiled/arg/index.js'
import { join } from 'path'
import chalk from 'next/dist/compiled/chalk'

import { cliCommand } from '../bin/next'
import { cliCommand } from '../lib/commands'
import { ESLINT_DEFAULT_DIRS } from '../lib/constants'
import { runLintCheck } from '../lib/eslint/runLintCheck'
import { printAndExit } from '../server/lib/utils'
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-start.ts
Expand Up @@ -3,10 +3,10 @@
import arg from 'next/dist/compiled/arg/index.js'
import { startServer } from '../server/lib/start-server'
import { printAndExit } from '../server/lib/utils'
import { cliCommand } from '../bin/next'
import * as Log from '../build/output/log'
import isError from '../lib/is-error'
import { getProjectDir } from '../lib/get-project-dir'
import { cliCommand } from '../lib/commands'

const nextStart: cliCommand = (argv) => {
const validArgs: arg.Spec = {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/cli/next-telemetry.ts
Expand Up @@ -2,7 +2,7 @@
import chalk from 'next/dist/compiled/chalk'
import arg from 'next/dist/compiled/arg/index.js'
import { printAndExit } from '../server/lib/utils'
import { cliCommand } from '../bin/next'
import { cliCommand } from '../lib/commands'
import { Telemetry } from '../telemetry/storage'
import isError from '../lib/is-error'

Expand Down
12 changes: 12 additions & 0 deletions packages/next/lib/commands.ts
@@ -0,0 +1,12 @@
export type cliCommand = (argv?: string[]) => void

export const commands: { [command: string]: () => Promise<cliCommand> } = {
build: () => Promise.resolve(require('../cli/next-build').nextBuild),
start: () => Promise.resolve(require('../cli/next-start').nextStart),
export: () => Promise.resolve(require('../cli/next-export').nextExport),
dev: () => Promise.resolve(require('../cli/next-dev').nextDev),
lint: () => Promise.resolve(require('../cli/next-lint').nextLint),
telemetry: () =>
Promise.resolve(require('../cli/next-telemetry').nextTelemetry),
info: () => Promise.resolve(require('../cli/next-info').nextInfo),
}
2 changes: 1 addition & 1 deletion packages/next/lib/get-project-dir.ts
@@ -1,6 +1,6 @@
import fs from 'fs'
import path from 'path'
import { commands } from '../bin/next'
import { commands } from './commands'
import * as Log from '../build/output/log'
import { detectTypo } from './detect-typo'

Expand Down
5 changes: 5 additions & 0 deletions test/unit/get-project-dir.test.ts
@@ -0,0 +1,5 @@
describe('get-project-dir', () => {
it('should not start dev server on require', async () => {
require('next/dist/lib/get-project-dir')
})
})

0 comments on commit a720dbd

Please sign in to comment.