UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

86 lines (85 loc) 4.77 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.releaseProject = void 0; const form_data_1 = __importDefault(require("form-data")); const upload_zip_file_1 = require("../../../api/upload-zip-file"); const apply_local_point_config_1 = require("../../../api/tools/apply-local-point-config"); const get_plugin_profile_for_v2_1 = require("../../../get-plugin-profile-for-v2"); const local_plugin_config_1 = require("../../../local-plugin-config"); const logger_1 = require("../../../utils/logger"); const write_local_point_config_1 = require("../../../utils/write-local-point-config"); const utils_1 = require("../../../v1/utils"); const Compressor_1 = __importDefault(require("../../../v1/utils/Compressor")); const paths_1 = require("../../webpack/paths"); const build_1 = require("../build"); async function zipAndUpload() { const pluginProfile = await (0, get_plugin_profile_for_v2_1.getPluginProfileForV2)(); const buffer = await Compressor_1.default.zipBuffer(paths_1.paths.appBuild); // writeFile(path.join(paths.appBuild, 'bundle.zip'), buffer); const form = new form_data_1.default(); form.append('file', buffer, 'bundle.zip'); const payload = { pluginId: pluginProfile.id, domain: pluginProfile.siteDomain, token: pluginProfile.secret, formData: form, }; return (0, upload_zip_file_1.uploadZipFile)(payload); } async function syncLocalConfigIfRequested(payload) { if ((payload === null || payload === void 0 ? void 0 : payload.source_type) !== 'local') return; logger_1.logger.info('Syncing local configuration to remote...'); try { const localPluginConfig = (0, local_plugin_config_1.getLocalPluginConfig)(); const localFeatures = await (0, write_local_point_config_1.getLocalPointConfig)(); if (localPluginConfig) { await (0, apply_local_point_config_1.applyLocalPointConfig)({ pluginId: localPluginConfig.pluginId, siteDomain: localPluginConfig.siteDomain, pointInfoMap: localFeatures, }); logger_1.logger.success('Local configuration synced successfully.'); } else { logger_1.logger.warn('Local plugin config not found, skipping sync.'); } } catch (error) { logger_1.logger.error('Failed to sync local configuration:', error.message); process.exit(1); } } async function releaseProject(payload) { var _a, _b; try { const localPluginConfig = (0, local_plugin_config_1.getLocalPluginConfig)(); // release 不需要登录态:仅做本地 build + zip + uploadZipFile(X-MEEGO-TOKEN 插件 secret 鉴权), // 不得请求任何依赖用户登录态(getToolAuthHeaders / Bearer)的接口。后端元信息完整性闸门 // (name/short/icon/category)由 publishProject 负责——那条链路本就要求登录态,校验放那里才合理。 const resourceCount = (_b = (_a = localPluginConfig === null || localPluginConfig === void 0 ? void 0 : localPluginConfig.resources) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0; // 无前端产物(plugin.config.json 的 resources 为空——没有任何前端渲染点位: // webhook 形态的 intercept / listen_event / ai_field / 无卡片 ai_node 等)时 // 跳过 build / zip / upload,避免对着空工程白跑 webpack + 推一份没意义的 zip。 // 同步本地配置(--source-type local)这步仍然保留,只是不构产物。 if (resourceCount === 0) { logger_1.logger.info('Skipping build / upload — this plugin has no frontend artifact (resources=0).'); await syncLocalConfigIfRequested(payload); logger_1.logger.success('🍻🍻🍻 Release done (no frontend artifact).', 'Artifact version: 0', '(Use --artifact-version 0 when running lpm publish, or just omit --artifact-version.)'); return; } await (0, build_1.buildProject)(payload); logger_1.logger.success('Build successfully!'); await syncLocalConfigIfRequested(payload); const result = await (0, utils_1.wrapOraLoading)(zipAndUpload, 'Uploading bundles...'); logger_1.logger.success('🍻🍻🍻 Upload successfully!', `Artifact version: ${result.package_version}`, '(Use this as --artifact-version when running publish)'); } catch (e) { logger_1.logger.error(e.message); process.exit(1); } } exports.releaseProject = releaseProject;