47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
import webpack from 'webpack';
|
|
import formatWebpackMessages from 'react-dev-utils/formatWebpackMessages';
|
|
import config from './webpack.config';
|
|
import { info, success } from './utils/chalk';
|
|
import { getManifest } from './manifest.config';
|
|
import { version } from '../package.json';
|
|
import { convertSemver } from './utils/convertSemver';
|
|
import printError from './utils/printError';
|
|
import { zipProductionBuild } from './utils/zipProductionBuild';
|
|
|
|
const MODE: Environment = 'production';
|
|
|
|
// generate the manifest.json file
|
|
const semanticVersion = process.env.SEMANTIC_VERSION || version;
|
|
const manifestVersion = convertSemver(semanticVersion);
|
|
const manifest = getManifest(MODE, manifestVersion);
|
|
|
|
console.log(info(`${manifest.short_name} v${manifest.version} ${MODE} build starting...`));
|
|
|
|
// kick off the webpack build
|
|
webpack(config(MODE, manifest), async error => {
|
|
if (!error) {
|
|
await onBuildSuccess();
|
|
process.exit(0);
|
|
}
|
|
await onBuildFailure(error);
|
|
process.exit(1);
|
|
});
|
|
|
|
async function onBuildSuccess(): Promise<void> {
|
|
// zip the output directory and put it in the artifacts directory
|
|
const fileName = `${manifest.short_name} v${manifestVersion}`;
|
|
await zipProductionBuild(fileName);
|
|
console.log(success(`${fileName} built and zipped into build/artifacts/${fileName}.zip!`));
|
|
}
|
|
|
|
function onBuildFailure(error: Error): void {
|
|
if (!error.message) {
|
|
return printError(error);
|
|
}
|
|
const messages = formatWebpackMessages({ errors: [error.message], warnings: [] });
|
|
if (messages.errors.length > 1) {
|
|
messages.errors.length = 1;
|
|
}
|
|
return printError(new Error(messages.errors.join('\n\n')));
|
|
}
|