@lark-project/cli
Version:
飞书项目插件开发工具
108 lines (107 loc) • 5.11 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPluginInfo = exports.getPluginPointInfo = void 0;
const fs_1 = require("fs");
const local_plugin_config_1 = require("../local-plugin-config");
const types_1 = require("../types");
const logger_1 = require("../utils/logger");
const write_local_point_config_1 = require("../utils/write-local-point-config");
const validate_point_schema_1 = require("../utils/validate-point-schema");
const localToBackend_1 = require("../utils/transform/localToBackend");
const request_1 = require("./request");
async function getPluginPointInfo(pluginId, pluginSecret, siteDomain) {
try {
const remotePluginInfo = await (0, request_1.request)(`${siteDomain}/goapi/v5/app/runtime/point_draft`, {
method: 'POST',
data: {
plugin_key: pluginId,
plugin_secret: pluginSecret,
},
});
return remotePluginInfo.point_info_map;
}
catch (error) {
// 不在底层 helper 里 process.exit —— 会绕过 updateProject 对 advisory diff 的 try/catch,
// 让网络抖动直接让整个更新命令提前退出。由调用方决定此次失败是否致命。
logger_1.logger.error('Failed to get plugin point info:', error);
throw error;
}
}
exports.getPluginPointInfo = getPluginPointInfo;
async function getPluginInfo(pluginId, pluginSecret, siteDomain) {
const localConfig = await (0, local_plugin_config_1.getLocalPluginConfig)();
const remotePluginInfo = await (0, request_1.request)(`${siteDomain}/goapi/v5/app/runtime/point_draft`, {
method: 'POST',
data: {
plugin_key: pluginId,
plugin_secret: pluginSecret,
},
});
let pointInfoMap = remotePluginInfo.point_info_map;
if ((localConfig === null || localConfig === void 0 ? void 0 : localConfig.source_type) === 'local') {
logger_1.logger.info('Using local plugin config.');
const localConfigPath = (0, write_local_point_config_1.getLocalConfigPath)();
const hasLocalConfig = (0, fs_1.existsSync)(localConfigPath);
try {
if (!hasLocalConfig) {
throw new Error('Local config file not found');
}
const localFeatures = await (0, write_local_point_config_1.getLocalPointConfig)();
const validationResult = await (0, validate_point_schema_1.validatePointConfig)(localFeatures);
if (!validationResult.valid) {
const { lines } = (0, validate_point_schema_1.formatValidationErrors)(validationResult, 'text');
throw new Error(`current local point config is invalid:\n${lines.join('\n')}`);
}
// 前端定义了一份配置供ai/开发者修改,会存在一层到后端的转换,这里转回后端的返回格式
pointInfoMap = (0, localToBackend_1.transformQueryLocalConfig)(localFeatures, {
fallbackIconUrl: remotePluginInfo.plugin_info.icon,
});
}
catch (error) {
logger_1.logger.error('Failed to get local plugin config:', error);
process.exit(1);
}
}
const features = Object.keys(pointInfoMap)
// 过滤掉 platform 为空的点位,e.g. automation
.filter(pointKey => pointInfoMap[pointKey].platform)
.map(pointKey => {
var _a, _b, _c, _d;
const point = pointInfoMap[pointKey];
return {
key: point.key,
component_type: point.component_type,
type: point.type,
icon: point.icon,
name: point.name,
description: point.description,
i18n_info: point.i18n_info,
workItemTypeKeys: point.work_item_type,
customWorkItemTypeKeys: point.custom_work_item_type,
web: {
scenes: (_a = point.platform[types_1.EFeaturePlatform.web]) === null || _a === void 0 ? void 0 : _a.scene,
resourceId: {
resource: (_b = point.platform[types_1.EFeaturePlatform.web]) === null || _b === void 0 ? void 0 : _b.resource,
},
},
mobile: {
scenes: (_c = point.platform[types_1.EFeaturePlatform.mobile]) === null || _c === void 0 ? void 0 : _c.scene,
resourceId: {
resource: (_d = point.platform[types_1.EFeaturePlatform.mobile]) === null || _d === void 0 ? void 0 : _d.resource,
},
},
extension: point === null || point === void 0 ? void 0 : point.extension,
};
});
return {
frameworkVersion: remotePluginInfo.plugin_extension.runtime_version === '2.0.0'
? types_1.EPluginFrameworkVersion.v2
: types_1.EPluginFrameworkVersion.v1,
id: pluginId,
name: remotePluginInfo.plugin_info.name,
icon: remotePluginInfo.plugin_info.icon,
short: remotePluginInfo.plugin_info.short,
features,
};
}
exports.getPluginInfo = getPluginInfo;