@lark-project/cli
Version:
飞书项目插件开发工具
135 lines (134 loc) • 6.74 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildProject = void 0;
const fs_extra_1 = require("fs-extra");
const path_1 = __importDefault(require("path"));
const webpack_1 = __importStar(require("webpack"));
const get_plugin_profile_for_v2_1 = require("../../../get-plugin-profile-for-v2");
const generate_html_entry_script_1 = require("../../../utils/generate-html-entry-script");
const logger_1 = require("../../../utils/logger");
const resolve_project_path_1 = require("../../../utils/resolve-project-path");
const update_point_config_origin_1 = require("../../../utils/update-point-config-origin");
const preflight_local_config_1 = require("../../../utils/preflight-local-config");
const check_local_config_drift_1 = require("../../../utils/check-local-config-drift");
const local_plugin_config_1 = require("../../../local-plugin-config");
const Compressor_1 = __importDefault(require("../../../v1/utils/Compressor"));
const webpack_config_react_1 = require("../../webpack/custom-ui/webpack.config.react");
const paths_1 = require("../../webpack/paths");
const find_entries_1 = require("../find-entries");
const analysis_files_1 = require("./analysis-files");
async function buildProject(options) {
const { zip, source_type } = options || {};
try {
(0, fs_extra_1.removeSync)(paths_1.paths.appBuild);
logger_1.logger.info(`remove directory: ${paths_1.paths.appBuild}`);
}
catch (e) {
logger_1.logger.warn(`remove directory failed: ${paths_1.paths.appBuild}`);
logger_1.logger.debug(e);
}
await (0, update_point_config_origin_1.getConfigSource)(source_type);
await (0, preflight_local_config_1.preflightLocalConfig)();
(0, check_local_config_drift_1.checkLocalConfigDrift)();
const pluginProfile = await (0, get_plugin_profile_for_v2_1.getPluginProfileForV2)();
const localPluginConfig = (0, local_plugin_config_1.getLocalPluginConfig)();
if ((localPluginConfig === null || localPluginConfig === void 0 ? void 0 : localPluginConfig.source_type) === 'local') {
const localConfigDir = (0, resolve_project_path_1.resolveProjectPath)('local-config');
const localConfigBuildDir = path_1.default.join(paths_1.paths.appBuild, 'local-config');
if ((0, fs_extra_1.pathExistsSync)(localConfigDir)) {
(0, fs_extra_1.copySync)(localConfigDir, localConfigBuildDir);
logger_1.logger.info(`Copied local-config to ${localConfigBuildDir}`);
}
}
const [needBuildResources, missedResourceIds] = (0, find_entries_1.findEntries)(pluginProfile);
if (missedResourceIds.length) {
logger_1.logger.error(`The resource entries for these ids (${missedResourceIds.join(', ')}) are missing in plugin.config.json.`);
process.exit(1);
}
if (!needBuildResources.length) {
// resources 为空 = 没有前端渲染点位(webhook 形态)——无前端产物可构建,正常退出
if (!pluginProfile.resources.length) {
logger_1.logger.info('No frontend artifact to build — this plugin has no frontend points (webhook-only).');
process.exit(0);
}
logger_1.logger.error('No resources need to build, please check the plugin.config.json / developer platform and retry.');
process.exit(1);
}
const webpackConfigs = pluginProfile.resources.map(resource => {
const { id, entry } = resource;
return (0, webpack_config_react_1.getWebpackConfigForReact)({
key: id,
webpackEnv: 'production',
entry: (0, resolve_project_path_1.resolveProjectPath)(entry),
generateHtmlTemplate: (jsFiles, cssFiles) => `
<!DOCTYPE html>
<html>
<head>
${(0, generate_html_entry_script_1.generateHTMLEntryScript)(jsFiles, cssFiles)}
</head>
<body></body>
</html>
`,
});
});
logger_1.logger.debug(JSON.stringify(webpackConfigs, null, 0));
return new Promise((resolve, reject) => {
const multiCompiler = new webpack_1.MultiCompiler(webpackConfigs.map(c => (0, webpack_1.default)(c)), { parallelism: 3 });
multiCompiler.run(async (err, result) => {
if (err) {
console.error(err.message);
reject(err);
return;
}
console.log(result.toString());
const analysisLabel = '\nAnalyze the code chunks';
console.time(analysisLabel);
(0, analysis_files_1.analyzeDist)(paths_1.paths.appBuild);
console.timeEnd(analysisLabel);
if (zip) {
try {
const buffer = await Compressor_1.default.zipBuffer(paths_1.paths.appBuild);
const zipPath = path_1.default.join(paths_1.paths.appBuildZip, `${Date.now()}.zip`);
if (!(0, fs_extra_1.pathExistsSync)(paths_1.paths.appBuildZip)) {
(0, fs_extra_1.mkdirSync)(paths_1.paths.appBuildZip);
}
(0, fs_extra_1.writeFileSync)(zipPath, buffer);
logger_1.logger.success(`Compress the build files succeed, ${zipPath}`);
}
catch (e) {
logger_1.logger.error(`Compress the build files failed, ${e.message}`);
logger_1.logger.debug(e);
process.exit(1);
}
}
resolve(result);
});
});
}
exports.buildProject = buildProject;