mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
17e410a1d0
Fixes #4686 Adds tests for @zeit/next-typescript so that we don't regress on this again. I've fixed an issue in the `next` CLI too which caused lingering processes when the process gets force killed, which is what we do in the test suite, so it kept running if there was no manual quit.
112 lines
2.6 KiB
JavaScript
Executable file
112 lines
2.6 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
import { join } from 'path'
|
|
import { spawn } from 'cross-spawn'
|
|
import pkg from '../../package.json'
|
|
import {CONFIG_FILE} from '../lib/constants'
|
|
|
|
if (pkg.peerDependencies) {
|
|
Object.keys(pkg.peerDependencies).forEach(dependency => {
|
|
try {
|
|
// When 'npm link' is used it checks the clone location. Not the project.
|
|
require.resolve(dependency)
|
|
} catch (err) {
|
|
console.warn(`The module '${dependency}' was not found. Next.js requires that you include it in 'dependencies' of your 'package.json'. To add it, run 'npm install --save ${dependency}'`)
|
|
}
|
|
})
|
|
}
|
|
|
|
const defaultCommand = 'dev'
|
|
const commands = new Set([
|
|
'init',
|
|
'build',
|
|
'start',
|
|
'export',
|
|
defaultCommand
|
|
])
|
|
|
|
let cmd = process.argv[2]
|
|
let args = []
|
|
let nodeArgs = []
|
|
|
|
if (new Set(['--version', '-v']).has(cmd)) {
|
|
console.log(`next.js v${pkg.version}`)
|
|
process.exit(0)
|
|
}
|
|
|
|
const inspectArg = process.argv.find(arg => arg.includes('--inspect'))
|
|
if (inspectArg) {
|
|
nodeArgs.push(inspectArg)
|
|
}
|
|
|
|
if (new Set(['--help', '-h']).has(cmd)) {
|
|
console.log(`
|
|
Usage
|
|
$ next <command>
|
|
|
|
Available commands
|
|
${Array.from(commands).join(', ')}
|
|
|
|
For more information run a command with the --help flag
|
|
$ next init --help
|
|
`)
|
|
process.exit(0)
|
|
}
|
|
|
|
if (commands.has(cmd)) {
|
|
args = process.argv.slice(3)
|
|
} else {
|
|
cmd = defaultCommand
|
|
args = process.argv.slice(2)
|
|
}
|
|
|
|
const defaultEnv = cmd === 'dev' ? 'development' : 'production'
|
|
process.env.NODE_ENV = process.env.NODE_ENV || defaultEnv
|
|
|
|
const bin = join(__dirname, 'next-' + cmd)
|
|
|
|
const startProcess = () => {
|
|
const proc = spawn('node', [...nodeArgs, ...[bin], ...args], { stdio: 'inherit', customFds: [0, 1, 2] })
|
|
proc.on('close', (code, signal) => {
|
|
if (code !== null) {
|
|
process.exit(code)
|
|
}
|
|
if (signal) {
|
|
if (signal === 'SIGKILL') {
|
|
process.exit(137)
|
|
}
|
|
console.log(`got signal ${signal}, exiting`)
|
|
process.exit(1)
|
|
}
|
|
process.exit(0)
|
|
})
|
|
proc.on('error', (err) => {
|
|
console.error(err)
|
|
process.exit(1)
|
|
})
|
|
return proc
|
|
}
|
|
|
|
let proc = startProcess()
|
|
|
|
const wrapper = () => {
|
|
if (proc) {
|
|
proc.kill()
|
|
}
|
|
}
|
|
process.on('SIGINT', wrapper)
|
|
process.on('SIGTERM', wrapper)
|
|
process.on('exit', wrapper)
|
|
|
|
if (cmd === 'dev') {
|
|
const {watchFile} = require('fs')
|
|
watchFile(`${process.cwd()}/${CONFIG_FILE}`, (cur, prev) => {
|
|
if (cur.size > 0 || prev.size > 0) {
|
|
console.log(`\n> Found a change in ${CONFIG_FILE}, restarting the server...`)
|
|
// Don't listen to 'close' now since otherwise parent gets killed by listener
|
|
proc.removeAllListeners('close')
|
|
proc.kill()
|
|
proc = startProcess()
|
|
}
|
|
})
|
|
}
|