1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | 'use strict';
|
9 |
|
10 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
11 |
|
12 | const index = require('./cli-index.js');
|
13 | require('path');
|
14 | require('@nuxt/config');
|
15 | require('exit');
|
16 | require('@nuxt/utils');
|
17 | const chalk = _interopDefault(require('chalk'));
|
18 | require('std-env');
|
19 | require('wrap-ansi');
|
20 | require('boxen');
|
21 | const consola = _interopDefault(require('consola'));
|
22 | require('minimist');
|
23 | require('hable');
|
24 | require('fs');
|
25 | require('execa');
|
26 | require('pretty-bytes');
|
27 | const banner = require('./cli-banner.js');
|
28 | const opener = _interopDefault(require('opener'));
|
29 |
|
30 | const dev = {
|
31 | name: 'dev',
|
32 | description: 'Start the application in development mode (e.g. hot-code reloading, error reporting)',
|
33 | usage: 'dev <dir>',
|
34 | options: {
|
35 | ...index.common,
|
36 | ...index.server,
|
37 | open: {
|
38 | alias: 'o',
|
39 | type: 'boolean',
|
40 | description: 'Opens the server listeners url in the default browser'
|
41 | }
|
42 | },
|
43 |
|
44 | async run (cmd) {
|
45 | const { argv } = cmd;
|
46 |
|
47 | await this.startDev(cmd, argv, argv.open);
|
48 | },
|
49 |
|
50 | async startDev (cmd, argv) {
|
51 | let nuxt;
|
52 | try {
|
53 | nuxt = await this._listenDev(cmd, argv);
|
54 | } catch (error) {
|
55 | consola.fatal(error);
|
56 | return
|
57 | }
|
58 |
|
59 | try {
|
60 | await this._buildDev(cmd, argv, nuxt);
|
61 | } catch (error) {
|
62 | await nuxt.callHook('cli:buildError', error);
|
63 | consola.error(error);
|
64 | }
|
65 |
|
66 | return nuxt
|
67 | },
|
68 |
|
69 | async _listenDev (cmd, argv) {
|
70 | const config = await cmd.getNuxtConfig({ dev: true, _build: true });
|
71 | const nuxt = await cmd.getNuxt(config);
|
72 |
|
73 |
|
74 | nuxt.hook('watch:restart', payload => this.onWatchRestart(payload, { nuxt, cmd, argv }));
|
75 | nuxt.hook('bundler:change', changedFileName => this.onBundlerChange(changedFileName));
|
76 |
|
77 |
|
78 | await nuxt.ready();
|
79 |
|
80 |
|
81 | await nuxt.server.listen();
|
82 |
|
83 |
|
84 | banner.showBanner(nuxt, false);
|
85 |
|
86 |
|
87 | if (argv.open) {
|
88 | argv.open = false;
|
89 | const openerPromises = nuxt.server.listeners.map(listener => opener(listener.url));
|
90 | await Promise.all(openerPromises);
|
91 | }
|
92 |
|
93 |
|
94 | return nuxt
|
95 | },
|
96 |
|
97 | async _buildDev (cmd, argv, nuxt) {
|
98 |
|
99 | const builder = await cmd.getBuilder(nuxt);
|
100 |
|
101 |
|
102 | await builder.build();
|
103 |
|
104 |
|
105 | banner.showMemoryUsage();
|
106 |
|
107 |
|
108 | for (const listener of nuxt.server.listeners) {
|
109 | consola.info(chalk.bold('Listening on: ') + listener.url);
|
110 | }
|
111 |
|
112 |
|
113 | return nuxt
|
114 | },
|
115 |
|
116 | logChanged ({ event, path }) {
|
117 | const { icon, color, action } = index.eventsMapping[event] || index.eventsMapping.change;
|
118 |
|
119 | consola.log({
|
120 | type: event,
|
121 | icon: chalk[color].bold(icon),
|
122 | message: `${action} ${chalk.cyan(index.formatPath(path))}`
|
123 | });
|
124 | },
|
125 |
|
126 | async onWatchRestart ({ event, path }, { nuxt, cmd, argv }) {
|
127 | this.logChanged({ event, path });
|
128 |
|
129 | await nuxt.close();
|
130 |
|
131 | await this.startDev(cmd, argv);
|
132 | },
|
133 |
|
134 | onBundlerChange (path) {
|
135 | this.logChanged({ event: 'change', path });
|
136 | }
|
137 | };
|
138 |
|
139 | exports.default = dev;
|