@lark-project/cli
Version:
飞书项目插件开发工具
86 lines (85 loc) • 4.77 kB
JavaScript
;
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;