#!/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 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(signal === 'SIGINT' ? 0 : 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() } }) }