UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

135 lines (134 loc) 6.74 kB
"use strict"; 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;