@lark-project/cli
Version:
飞书项目插件开发工具
79 lines (78 loc) • 4.72 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.setLocalPluginConfig = exports.getLocalPluginConfig = exports.isValidPluginConfig = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = require("fs-extra");
const logger_1 = require("./utils/logger");
const get_project_directory_1 = require("./utils/get-project-directory");
const validate_tools_1 = require("./utils/validate-tools");
const types_1 = require("./types");
const utils_1 = require("./v1/utils");
const plugin_registry_1 = require("./v2/utils/plugin-registry");
const PLUGIN_CONFIG_FILE = 'plugin.config.json';
function isValidPluginConfig(config) {
const errMsgs = [];
if (!(0, validate_tools_1.isValidPluginId)(config.pluginId)) {
errMsgs.push(`The pluginId "${config.pluginId}" in plugin.config.json is not valid (expected format: MII_ + 16 uppercase alphanumeric chars, e.g. MII_69F2F73D121E0BCC). A pluginId is issued by the Meego developer site via \`lpm create\` and must not be generated locally.`);
}
if (!config.pluginSecret) {
errMsgs.push('The pluginSecret in plugin.config.json is missing or empty. The pluginSecret is issued together with the pluginId by `lpm create` and stored encrypted; do not generate locally.');
}
if (!(0, validate_tools_1.isValidURL)(config.siteDomain)) {
errMsgs.push(`The siteDomain "${config.siteDomain}" in plugin.config.json is not a valid URL (expected an absolute URL like https://project.feishu.cn (the developer-site origin)).`);
}
if (!Array.isArray(config.resources) ||
config.resources.some(resource => !(0, validate_tools_1.isValidPluginResource)(resource))) {
errMsgs.push('The resources in plugin.config.json must be an array of { id, entry } objects (e.g. [{ "id": "my_point_id", "entry": "./src/features/my_point_id/index.tsx" }]).');
}
// app_type 缺省按 'normal' 解释(兼容存量工程),但若声明了非法取值仍要拦
if (config.app_type !== undefined && !types_1.APP_TYPES.includes(config.app_type)) {
errMsgs.push(`The app_type "${config.app_type}" is not valid, expected one of: ${types_1.APP_TYPES.join(', ')}.`);
}
return [errMsgs.length === 0, errMsgs];
}
exports.isValidPluginConfig = isValidPluginConfig;
function getLocalPluginConfig() {
const pluginConfigPath = path_1.default.resolve((0, get_project_directory_1.getProjectDirectory)(), PLUGIN_CONFIG_FILE);
if (!(0, fs_extra_1.existsSync)(pluginConfigPath)) {
logger_1.logger.debug(`Not found the plugin config file, ${pluginConfigPath}`);
return undefined;
}
logger_1.logger.debug(`Read the plugin config file, ${pluginConfigPath}`);
const pluginConfig = (0, fs_extra_1.readJSONSync)(pluginConfigPath);
let originPluginSecret = pluginConfig.pluginSecret;
try {
originPluginSecret = (0, utils_1.decrypt)(pluginConfig.pluginSecret);
}
catch (e) {
// 如果尝试进行解密失败,说明是未加密的
logger_1.logger.warn('The pluginSecret is original and will be automatically encrypted into "plugin.config.json": ', pluginConfig.pluginSecret);
setLocalPluginConfig({ pluginSecret: (0, utils_1.encrypt)(pluginConfig.pluginSecret) });
}
const [isValid, errMsgs] = isValidPluginConfig(pluginConfig);
if (!isValid) {
throw new Error(errMsgs.join(' /n'));
}
// 累积记入全局只读注册表(无 secret),供工程目录外的只读命令(perm list)定位本插件。
// recordPlugin 内部 best-effort、无变化免写,失败不影响读取。
(0, plugin_registry_1.recordPlugin)(pluginConfig.siteDomain, {
pluginId: pluginConfig.pluginId,
app_type: pluginConfig.app_type,
});
return Object.assign(Object.assign({}, pluginConfig), { pluginSecret: originPluginSecret });
}
exports.getLocalPluginConfig = getLocalPluginConfig;
function setLocalPluginConfig(config) {
const pluginConfigPath = path_1.default.resolve((0, get_project_directory_1.getProjectDirectory)(), PLUGIN_CONFIG_FILE);
if (!(0, fs_extra_1.existsSync)(pluginConfigPath)) {
logger_1.logger.debug(`Not found the plugin config file, ${pluginConfigPath}`);
return undefined;
}
const pluginConfig = (0, fs_extra_1.readJSONSync)(pluginConfigPath);
const nextPluginConfig = Object.assign(Object.assign({}, pluginConfig), config);
(0, fs_extra_1.writeJSONSync)(pluginConfigPath, nextPluginConfig, { spaces: 2 });
}
exports.setLocalPluginConfig = setLocalPluginConfig;