@luban-cli/cli-plugin-service
Version:
A development runtime environment dependency
139 lines • 6.1 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const cli_shared_utils_1 = require("@luban-cli/cli-shared-utils");
const webpack = require("webpack");
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const formatStats_1 = require("../utils/formatStats");
const serverRender_1 = require("../utils/serverRender");
const cleanDest_1 = require("../utils/cleanDest");
const buildServerSideDeployFile_1 = require("../utils/buildServerSideDeployFile");
class Build {
constructor(api, projectConfig, args) {
this.api = api;
this.projectConfig = projectConfig;
let output = projectConfig.outputDir;
if (args.dest) {
output = args.dest;
}
this.outputDir = api.resolve(output);
}
buildClient() {
return __awaiter(this, void 0, void 0, function* () {
const webpackConfig = this.api.resolveWebpackConfig("client");
return new Promise((resolve, reject) => {
if (!webpackConfig) {
reject("client side webpack config unable resolved; command [build]");
return;
}
webpack(webpackConfig, (err, stats) => {
// Fatal webpack errors (wrong configuration, etc)
if (err) {
reject(err);
return;
}
formatStats_1.logStatsErrorsAndWarnings(stats);
// Compilation errors (missing modules, syntax errors, eslint-errors. etc)
if (stats.hasErrors()) {
reject("Build failed with some Compilation errors occurred.");
return;
}
const targetDirShort = path_1.default.relative(this.api.getContext(), this.outputDir);
cli_shared_utils_1.log(formatStats_1.formatStats(stats, targetDirShort, this.api));
console.log();
cli_shared_utils_1.done(`Client Build complete. The ${chalk_1.default.cyan(targetDirShort)} directory is ready to be deployed.`);
resolve();
});
});
});
}
buildServer() {
return __awaiter(this, void 0, void 0, function* () {
const webpackConfig = this.api.resolveWebpackConfig("server");
return new Promise((resolve, reject) => {
if (!webpackConfig) {
reject("server side webpack config unable resolved; command [build]");
return;
}
webpack(webpackConfig, (err, stats) => {
if (err) {
reject(err);
return;
}
formatStats_1.logStatsErrorsAndWarnings(stats);
if (stats.hasErrors()) {
reject("Build failed with some Compilation errors occurred.");
return;
}
console.log();
cli_shared_utils_1.done("Server side Build complete");
console.log();
resolve();
});
});
});
}
start() {
return __awaiter(this, void 0, void 0, function* () {
const ctx = this.api.getContext();
yield cleanDest_1.cleanDest(ctx, this.outputDir);
yield serverRender_1.delay(1000);
console.log();
const queue = [this.buildClient];
if (this.projectConfig.ssr) {
queue.push(this.buildServer);
}
yield Promise.all(queue.map((q) => q.call(this)));
console.log();
if (this.projectConfig.ssr) {
yield buildServerSideDeployFile_1.buildServerSideDeployFIle(this.outputDir);
}
console.log();
cli_shared_utils_1.done("Build Done 🎉");
["SIGINT", "SIGTERM"].forEach((signal) => {
process.on(signal, () => {
process.exit();
});
});
});
}
}
class BuildWrapper {
apply(params) {
const { api, projectConfig, args } = params;
api.registerCommand("build", {
description: "build for production",
usage: "luban-cli-service build [options]",
options: {
"--mode": "specify env mode (default: production)",
"--dest": `specify output directory (default: ${projectConfig.outputDir})`,
"--report": "generate report.html to help analyze bundle content",
},
}, () => __awaiter(this, void 0, void 0, function* () {
cli_shared_utils_1.info("Building... \n");
const build = new Build(api, projectConfig, args);
yield build.start();
}));
}
addWebpackConfig(params) {
const { api, projectConfig } = params;
api.addWebpackConfig("server");
if (projectConfig.ssr) {
api.addWebpackConfig("server");
}
}
}
exports.default = BuildWrapper;
//# sourceMappingURL=build.js.map