UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

79 lines (78 loc) 4.72 kB
"use strict"; 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;