/*! * @nuxt/cli v2.15.8 (c) 2016-2021 * Released under the MIT License * Repository: https://github.com/nuxt/nuxt.js * Website: https://nuxtjs.org */ 'use strict'; const utils = require('@nuxt/utils'); const config = require('@nuxt/config'); const path = require('path'); const exit = require('exit'); const chalk = require('chalk'); const env = require('std-env'); const wrapAnsi = require('wrap-ansi'); const boxen = require('boxen'); const consola = require('consola'); const minimist = require('minimist'); const Hookable = require('hable'); const defu = require('defu'); const semver = require('semver'); const fs = require('fs'); const execa = require('execa'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } const path__default = /*#__PURE__*/_interopDefaultLegacy(path); const exit__default = /*#__PURE__*/_interopDefaultLegacy(exit); const chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk); const env__default = /*#__PURE__*/_interopDefaultLegacy(env); const wrapAnsi__default = /*#__PURE__*/_interopDefaultLegacy(wrapAnsi); const boxen__default = /*#__PURE__*/_interopDefaultLegacy(boxen); const consola__default = /*#__PURE__*/_interopDefaultLegacy(consola); const minimist__default = /*#__PURE__*/_interopDefaultLegacy(minimist); const Hookable__default = /*#__PURE__*/_interopDefaultLegacy(Hookable); const defu__default = /*#__PURE__*/_interopDefaultLegacy(defu); const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); const execa__default = /*#__PURE__*/_interopDefaultLegacy(execa); const commands = { start: () => Promise.resolve().then(function () { return require('./cli-start.js'); }), serve: () => Promise.resolve().then(function () { return require('./cli-serve.js'); }), dev: () => Promise.resolve().then(function () { return require('./cli-dev.js'); }), build: () => Promise.resolve().then(function () { return require('./cli-build.js'); }), generate: () => Promise.resolve().then(function () { return require('./cli-generate.js'); }), export: () => Promise.resolve().then(function () { return require('./cli-export.js'); }), webpack: () => Promise.resolve().then(function () { return require('./cli-webpack.js'); }), help: () => Promise.resolve().then(function () { return require('./cli-help.js'); }) }; function getCommand (name) { if (!commands[name]) { return Promise.resolve(null) } return commands[name]().then(m => m.default) } const index$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': getCommand }); const importModule = (id) => { try { return Promise.resolve(utils.requireModule(id)) } catch (err) { if (err.code === 'MODULE_NOT_FOUND') { err.message = `Cannot import module '${id}'`; } return Promise.reject(err) } }; const builder = () => importModule('@nuxt/builder'); const webpack = () => importModule('@nuxt/webpack'); const generator = () => importModule('@nuxt/generator'); const core = () => importModule('@nuxt/core'); const server$1 = () => importModule('@nuxt/server'); const imports = /*#__PURE__*/Object.freeze({ __proto__: null, importModule: importModule, builder: builder, webpack: webpack, generator: generator, core: core, server: server$1 }); const forceExitTimeout = 5; const startSpaces = 2; const optionSpaces = 2; // 80% of terminal column width // this is a fn because console width can have changed since startup const maxCharsPerLine = () => (process.stdout.columns || 100) * 80 / 100; function indent (count, chr = ' ') { return chr.repeat(count) } function indentLines (string, spaces, firstLineSpaces) { const lines = Array.isArray(string) ? string : string.split('\n'); let s = ''; if (lines.length) { const i0 = indent(firstLineSpaces === undefined ? spaces : firstLineSpaces); s = i0 + lines.shift(); } if (lines.length) { const i = indent(spaces); s += '\n' + lines.map(l => i + l).join('\n'); } return s } function foldLines (string, spaces, firstLineSpaces, charsPerLine = maxCharsPerLine()) { return indentLines(wrapAnsi__default['default'](string, charsPerLine), spaces, firstLineSpaces) } function colorize (text) { return text .replace(/\[[^ ]+]/g, m => chalk__default['default'].grey(m)) .replace(/<[^ ]+>/g, m => chalk__default['default'].green(m)) .replace(/ (-[-\w,]+)/g, m => chalk__default['default'].bold(m)) .replace(/`([^`]+)`/g, (_, m) => chalk__default['default'].bold.cyan(m)) } function box (message, title, options) { return boxen__default['default']([ title || chalk__default['default'].white('Nuxt Message'), '', chalk__default['default'].white(foldLines(message, 0, 0, maxCharsPerLine())) ].join('\n'), Object.assign({ borderColor: 'white', borderStyle: 'round', padding: 1, margin: 1 }, options)) + '\n' } function successBox (message, title) { return box(message, title || chalk__default['default'].green('✔ Nuxt Success'), { borderColor: 'green' }) } function warningBox (message, title) { return box(message, title || chalk__default['default'].yellow('⚠ Nuxt Warning'), { borderColor: 'yellow' }) } function errorBox (message, title) { return box(message, title || chalk__default['default'].red('✖ Nuxt Error'), { borderColor: 'red' }) } function fatalBox (message, title) { return errorBox(message, title || chalk__default['default'].red('✖ Nuxt Fatal Error')) } const eventsMapping = { add: { icon: '+', color: 'green', action: 'Created' }, change: { icon: env__default['default'].windows ? '»' : '↻', color: 'blue', action: 'Updated' }, unlink: { icon: '-', color: 'red', action: 'Removed' } }; function formatPath (filePath) { if (!filePath) { return } return filePath.replace(process.cwd() + path__default['default'].sep, '') } /** * Normalize string argument in command * * @export * @param {String} argument * @param {*} defaultValue * @returns formatted argument */ function normalizeArg (arg, defaultValue) { switch (arg) { case 'true': arg = true; break case '': arg = true; break case 'false': arg = false; break case undefined: arg = defaultValue; break } return arg } function forceExit (cmdName, timeout) { if (timeout !== false) { const exitTimeout = setTimeout(() => { const msg = `The command 'nuxt ${cmdName}' finished but did not exit after ${timeout}s This is most likely not caused by a bug in Nuxt Make sure to cleanup all timers and listeners you or your plugins/modules start. Nuxt will now force exit ${chalk__default['default'].bold('DeprecationWarning: Starting with Nuxt version 3 this will be a fatal error')}`; // TODO: Change this to a fatal error in v3 process.stderr.write(warningBox(msg)); exit__default['default'](0); }, timeout * 1000); exitTimeout.unref(); } else { exit__default['default'](0); } } // An immediate export throws an error when mocking with jest // TypeError: Cannot set property createLock of # which has only a getter function createLock (...args) { return utils.lock(...args) } const common = { spa: { alias: 's', type: 'boolean', description: 'Launch in SPA mode' }, universal: { alias: 'u', type: 'boolean', description: 'Launch in Universal mode (default)' }, 'config-file': { alias: 'c', type: 'string', default: config.defaultNuxtConfigFile, description: `Path to Nuxt config file (default: \`${config.defaultNuxtConfigFile}\`)` }, modern: { alias: 'm', type: 'string', description: 'Build/Start app for modern browsers, e.g. server, client and false', prepare (cmd, options, argv) { if (argv.modern !== undefined) { options.modern = normalizeArg(argv.modern); } } }, target: { alias: 't', type: 'string', description: 'Build/start app for a different target, e.g. server, serverless and static', prepare (cmd, options, argv) { if (argv.target) { options.target = argv.target; } } }, 'force-exit': { type: 'boolean', default (cmd) { return ['build', 'generate', 'export'].includes(cmd.name) }, description: 'Whether Nuxt should force exit after the command has finished' }, version: { alias: 'v', type: 'boolean', description: 'Display the Nuxt version' }, help: { alias: 'h', type: 'boolean', description: 'Display this message' }, processenv: { type: 'boolean', default: true, description: 'Disable reading from `process.env` and updating it with dotenv' }, dotenv: { type: 'string', default: '.env', description: 'Specify path to dotenv file (default: `.env`). Use `false` to disable' } }; const server = { port: { alias: 'p', type: 'string', description: 'Port number on which to start the application', prepare (cmd, options, argv) { if (argv.port) { options.server.port = +argv.port; } } }, hostname: { alias: 'H', type: 'string', description: 'Hostname on which to start the application', prepare (cmd, options, argv) { if (argv.hostname === '') { consola__default['default'].fatal('Provided hostname argument has no value'); } } }, 'unix-socket': { alias: 'n', type: 'string', description: 'Path to a UNIX socket' } }; const locking = { lock: { type: 'boolean', default: true, description: 'Do not set a lock on the project when building' } }; const index = /*#__PURE__*/Object.freeze({ __proto__: null, common: common, server: server, locking: locking }); var name = "@nuxt/cli"; var version = "2.15.8"; async function loadNuxtConfig (argv, configContext) { const rootDir = path__default['default'].resolve(argv._[0] || '.'); const configFile = argv['config-file']; // Load config const options = await config.loadNuxtConfig({ rootDir, configFile, configContext, envConfig: { dotenv: argv.dotenv === 'false' ? false : argv.dotenv, env: argv.processenv ? process.env : {} } }); if (argv.spa === true) { options.ssr = false; } else if (argv.universal === true) { options.ssr = true; } // Server options options.server = defu__default['default']({ port: argv.port || null, host: argv.hostname || null, socket: argv['unix-socket'] || null }, options.server || {}, config.getDefaultNuxtConfig().server); return options } class NuxtCommand extends Hookable__default['default'] { constructor (cmd = { name: '', usage: '', description: '' }, argv = process.argv.slice(2), hooks = {}) { super(consola__default['default']); this.addHooks(hooks); if (!cmd.options) { cmd.options = {}; } this.cmd = cmd; this._argv = Array.from(argv); this._parsedArgv = null; // Lazy evaluate } static run (cmd, argv, hooks) { return NuxtCommand.from(cmd, argv, hooks).run() } static from (cmd, argv, hooks) { if (cmd instanceof NuxtCommand) { return cmd } return new NuxtCommand(cmd, argv, hooks) } async run () { await this.callHook('run:before', { argv: this._argv, cmd: this.cmd, rootDir: path__default['default'].resolve(this.argv._[0] || '.') }); if (this.argv.help) { this.showHelp(); return } if (this.argv.version) { this.showVersion(); return } if (typeof this.cmd.run !== 'function') { throw new TypeError('Invalid command! Commands should at least implement run() function.') } let cmdError; try { await this.cmd.run(this); } catch (e) { cmdError = e; } if (this.argv.lock) { await this.releaseLock(); } if (this.argv['force-exit']) { const forceExitByUser = this.isUserSuppliedArg('force-exit'); if (cmdError) { consola__default['default'].fatal(cmdError); } forceExit(this.cmd.name, forceExitByUser ? false : forceExitTimeout); if (forceExitByUser) { return } } if (cmdError) { throw cmdError } } showVersion () { process.stdout.write(`${name} v${version}\n`); } showHelp () { process.stdout.write(this._getHelp()); } get argv () { if (!this._parsedArgv) { const minimistOptions = this._getMinimistOptions(); this._parsedArgv = minimist__default['default'](this._argv, minimistOptions); } return this._parsedArgv } async getNuxtConfig (extraOptions = {}) { // Flag to indicate nuxt is running with CLI (not programmatic) extraOptions._cli = true; const context = { command: this.cmd.name, dev: !!extraOptions.dev }; const config = await loadNuxtConfig(this.argv, context); const options = Object.assign(config, extraOptions); for (const name of Object.keys(this.cmd.options)) { this.cmd.options[name].prepare && this.cmd.options[name].prepare(this, options, this.argv); } await this.callHook('config', options); return options } async getNuxt (options) { const { Nuxt } = await core(); const nuxt = new Nuxt(options); await nuxt.ready(); return nuxt } async getBuilder (nuxt) { const { Builder } = await builder(); const { BundleBuilder } = await webpack(); return new Builder(nuxt, BundleBuilder) } async getGenerator (nuxt) { const { Generator } = await generator(); const builder = await this.getBuilder(nuxt); return new Generator(nuxt, builder) } async setLock (lockRelease) { if (lockRelease) { if (this._lockRelease) { consola__default['default'].warn(`A previous unreleased lock was found, this shouldn't happen and is probably an error in 'nuxt ${this.cmd.name}' command. The lock will be removed but be aware of potential strange results`); await this.releaseLock(); this._lockRelease = lockRelease; } else { this._lockRelease = lockRelease; } } } async releaseLock () { if (this._lockRelease) { await this._lockRelease(); this._lockRelease = undefined; } } isUserSuppliedArg (option) { return this._argv.includes(`--${option}`) || this._argv.includes(`--no-${option}`) } _getDefaultOptionValue (option) { return typeof option.default === 'function' ? option.default(this.cmd) : option.default } _getMinimistOptions () { const minimistOptions = { alias: {}, boolean: [], string: [], default: {} }; for (const name of Object.keys(this.cmd.options)) { const option = this.cmd.options[name]; if (option.alias) { minimistOptions.alias[option.alias] = name; } if (option.type) { minimistOptions[option.type].push(option.alias || name); } if (option.default) { minimistOptions.default[option.alias || name] = this._getDefaultOptionValue(option); } } return minimistOptions } _getHelp () { const options = []; let maxOptionLength = 0; for (const name in this.cmd.options) { const option = this.cmd.options[name]; let optionHelp = '--'; optionHelp += option.type === 'boolean' && this._getDefaultOptionValue(option) ? 'no-' : ''; optionHelp += name; if (option.alias) { optionHelp += `, -${option.alias}`; } maxOptionLength = Math.max(maxOptionLength, optionHelp.length); options.push([optionHelp, option.description]); } const _opts = options.map(([option, description]) => { const i = indent(maxOptionLength + optionSpaces - option.length); return foldLines( option + i + description, startSpaces + maxOptionLength + optionSpaces * 2, startSpaces + optionSpaces ) }).join('\n'); const usage = foldLines(`Usage: nuxt ${this.cmd.usage} [options]`, startSpaces); const description = foldLines(this.cmd.description, startSpaces); const opts = foldLines('Options:', startSpaces) + '\n\n' + _opts; let helpText = colorize(`${usage}\n\n`); if (this.cmd.description) { helpText += colorize(`${description}\n\n`); } if (options.length) { helpText += colorize(`${opts}\n\n`); } return helpText } } const dependencies = { webpack: '^4.46.0', 'css-loader': '>=4.2.0', 'sass-loader': '^10.1.1' }; const nodeVersion = '>=12.0.0'; function getInstalledVersion (name) { try { return utils.getPKG(name).version } catch { } } function checkDependencies () { for (const name in dependencies) { const installedVersion = getInstalledVersion(name); if (!installedVersion) { continue // Ignore to avoid false-positive warnings } const expectedRange = dependencies[name]; if (!semver.satisfies(installedVersion, expectedRange)) { consola__default['default'].warn(`${name}@${installedVersion} is installed but ${expectedRange} is expected`); } } // Check Node versions if (!semver.satisfies(process.version, nodeVersion)) { consola__default['default'].warn(`You are using an unsupported version of Node.js (${process.version}). It is recommended to use the latest LTS version (https://nodejs.org/en/about/releases)`); } } let _setup = false; function setup ({ dev }) { // Apply default NODE_ENV if not provided if (!process.env.NODE_ENV) { process.env.NODE_ENV = dev ? 'development' : 'production'; } if (_setup) { return } _setup = true; checkDependencies(); // Global error handler /* istanbul ignore next */ process.on('unhandledRejection', (err) => { consola__default['default'].error(err); }); // Exit process on fatal errors /* istanbul ignore next */ consola__default['default'].addReporter({ log (logObj) { if (logObj.type === 'fatal') { const errorMessage = String(logObj.args[0]); process.stderr.write(fatalBox(errorMessage)); exit__default['default'](1); } } }); // Wrap all console logs with consola for better DX consola__default['default'].wrapConsole(); } function isNuxtDir (rootDir) { if (fs__default['default'].existsSync(path__default['default'].join(rootDir, 'nuxt.config.js')) || fs__default['default'].existsSync(path__default['default'].join(rootDir, 'pages')) || fs__default['default'].existsSync(path__default['default'].join(rootDir, 'nuxt.config.ts'))) { return true } return false } async function run (_argv, hooks = {}) { // Check for not installing both nuxt and nuxt-edge const dupPkg = 'cli-edge'; const dupPkgJSON = path.resolve(__dirname, '../..' /* dist/../.. */, dupPkg, 'package.json'); if (fs.existsSync(dupPkgJSON) && utils.requireModule(dupPkgJSON).name !== '@nuxt/' + dupPkg) { consola__default['default'].warn('Both `nuxt` and `nuxt-edge` dependencies are installed! Please choose one and remove the other one from dependencies.'); } // Read from process.argv const argv = _argv ? Array.from(_argv) : process.argv.slice(2); // Check for internal command let cmd = await getCommand(argv[0]); // Matching `nuxt` or `nuxt [dir]` or `nuxt -*` for `nuxt dev` shortcut if (!cmd && (!argv[0] || argv[0][0] === '-' || isNuxtDir(argv[0]))) { argv.unshift('dev'); cmd = await getCommand('dev'); } // Check for dev const dev = argv[0] === 'dev'; // Setup env setup({ dev }); // Try internal command if (cmd) { return NuxtCommand.run(cmd, argv.slice(1), hooks) } // Try external command try { await execa__default['default'](`nuxt-${argv[0]}`, argv.slice(1), { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin }); } catch (error) { if (error.exitCode === 2) { throw String(`Command not found: nuxt-${argv[0]}`) } throw String(`Failed to run command \`nuxt-${argv[0]}\`:\n${error}`) } } async function getWebpackConfig (name = 'client', loadOptions = {}) { const { loadNuxt } = await core(); const { getBuilder } = await builder(); const nuxt = await loadNuxt(loadOptions); const builder$1 = await getBuilder(nuxt); const { bundleBuilder } = builder$1; return bundleBuilder.getWebpackConfig(name) } exports.NuxtCommand = NuxtCommand; exports.colorize = colorize; exports.common = common; exports.core = core; exports.createLock = createLock; exports.eventsMapping = eventsMapping; exports.foldLines = foldLines; exports.formatPath = formatPath; exports.getCommand = getCommand; exports.getWebpackConfig = getWebpackConfig; exports.imports = imports; exports.indent = indent; exports.index = index$1; exports.index$1 = index; exports.isNuxtDir = isNuxtDir; exports.loadNuxtConfig = loadNuxtConfig; exports.locking = locking; exports.normalizeArg = normalizeArg; exports.optionSpaces = optionSpaces; exports.run = run; exports.server = server$1; exports.server$1 = server; exports.setup = setup; exports.startSpaces = startSpaces; exports.successBox = successBox;