-
Notifications
You must be signed in to change notification settings - Fork 149
/
build.js
138 lines (126 loc) Β· 4.52 KB
/
build.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
'use strict';
// Do this as the first thing so that any code reading it knows the right env.
process.env.NODE_ENV = process.env.NODE_ENV || 'production';
process.env.BABEL_ENV = process.env.BABEL_ENV || process.env.NODE_ENV;
// Makes the script crash on unhandled rejections instead of silently
// ignoring them. In the future, promise rejections that are not handled will
// terminate the Node.js process with a non-zero exit code.
process.on('unhandledRejection', err => {
throw err;
});
// Ensure environment variables are read.
require('../config/env');
const fs = require('fs-extra');
const chalk = require('chalk');
const webpack = require('webpack');
const config = require('../config/webpack.config.prod');
const paths = require('../config/paths');
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
const FileSizeReporter = require('react-dev-utils/FileSizeReporter');
const formatElmCompilerErrors = require('./utils/formatElmCompilerErrors');
const warn = require('./utils/warn');
const measureFileSizesBeforeBuild =
FileSizeReporter.measureFileSizesBeforeBuild;
const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild;
if (fs.existsSync('elm.json') === false) {
console.log('Please, run the build script from project root directory');
process.exit(1);
}
// Warn and crash if required files are missing
if (!checkRequiredFiles([paths.appIndexJs, paths.appHtml])) {
process.exit(1);
}
// TODO: Remove this in the next major release.
if (typeof process.env.DEAD_CODE_ELIMINATION !== 'undefined') {
console.log(chalk.bold.green('Hello friend!'));
console.log();
console.log(
`It seems like you are still using "DEAD_CODE_ELIMINATION" variable`
);
console.log();
console.log('The good news is that it is no longer necessary.');
console.log('Create Elm App optimizes the assets by default.');
console.log();
}
// First, read the current file sizes in build directory.
// This lets us display how much they changed later.
measureFileSizesBeforeBuild(paths.appBuild)
.then(previousFileSizes => {
// Remove all content but keep the directory so that
// if you're in it, you don't end up in Trash
fs.emptyDirSync(paths.appBuild);
// Start the webpack build
return build(previousFileSizes);
})
.then(
({ stats, previousFileSizes, warnings }) => {
if (warnings.length) {
console.log(chalk.yellow('Compiled with warnings.\n'));
console.log(warnings.join('\n\n'));
console.log(
'\nSearch for the ' +
chalk.underline(chalk.yellow('keywords')) +
' to learn more about each warning.'
);
console.log(
'To ignore, add ' +
chalk.cyan('// eslint-disable-next-line') +
' to the line before.\n'
);
} else {
console.log(chalk.green('Compiled successfully.\n'));
}
console.log('File sizes after gzip:\n');
printFileSizesAfterBuild(stats, previousFileSizes, paths.appBuild);
console.log();
warn(paths.elmJson);
},
err => {
console.error(chalk.red('Failed to compile.\n'));
console.error((err.message || err) + '\n');
process.exit(1);
}
);
// Create the production build and print the deployment instructions.
function build(previousFileSizes) {
const withDebugger = process.env.ELM_DEBUGGER === 'true' ? true : false;
console.log();
if (withDebugger) {
console.log(
`Creating a ${process.env.NODE_ENV} build with debugger enabled...`
);
} else {
console.log(`Creating an optimized ${process.env.NODE_ENV} build...`);
}
const compiler = webpack(
paths.configureWebpack(config, process.env.NODE_ENV)
);
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err) {
return reject(err);
}
const messages = formatElmCompilerErrors(
formatWebpackMessages(stats.toJson({}, true))
);
if (messages.errors.length) {
return reject(new Error(messages.errors.join('\n\n')));
}
if (process.env.CI && messages.warnings.length) {
console.log(
chalk.yellow(
'\nTreating warnings as errors because process.env.CI = true.\n' +
'Most CI servers set it automatically.\n'
)
);
return reject(new Error(messages.warnings.join('\n\n')));
}
return resolve({
stats,
previousFileSizes,
warnings: messages.warnings
});
});
});
}