@lark-project/cli
Version:
飞书项目插件开发工具
47 lines (46 loc) • 2.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveBackendAppType = void 0;
const update_plugin_description_1 = require("../../../api/tools/update-plugin-description");
const derive_app_type_1 = require("../../../utils/derive-app-type");
const logger_1 = require("../../../utils/logger");
/**
* 确定要写进本地 plugin.config.json 的 `app_type`——**以后端为准,不以请求为准**。
*
* `lpm create --app-type X` 里的 X 只是"请求后端建成什么形态";后端可能忽略 / 改写它,
* 且 resume 路径根本不调 create 接口。所以本地的事实来源必须是 `GetAppDescriptionInfo`
* 返回的真实 `app_type` / `point_types`(与 config-only init 同一套判定,见
* dispatcher.ts 的 config-only 分支)。
*
* - 后端可达:返回 `deriveAppTypeFromBackend(descInfo)`;若与 `requested` 不一致,warn 出来
* (这正是"请求 ai_node 却建成 normal"这类需要暴露的异常信号)。
* - 后端不可达:由 `onUnreachable` 决定——
* - `'fallback'`(默认,`lpm create` 用):退回 `requested`(聊胜于无的兜底,至少不让 config
* 缺字段被当 normal)并 warn;`requested` 未传(如 `lpm init` 存量插件)则返回 undefined,
* 由调用方 no-op、保持原样。
* - `'throw'`(`lpm init --config-only` 用):直接抛出。config-only 是在"领养"一个已存在的
* 后端插件、没有 `requested` 可兜底,拿不到真实 app_type 就不能继续,必须 fail-fast。
*/
async function resolveBackendAppType({ siteDomain, appKey, requested, onUnreachable = 'fallback', }) {
try {
const descInfo = await (0, update_plugin_description_1.getPluginDescriptionInfo)({ siteDomain, appKey });
const backendAppType = (0, derive_app_type_1.deriveAppTypeFromBackend)(descInfo);
if (requested && backendAppType !== requested) {
logger_1.logger.warn(`Requested app_type "${requested}" but the backend reports "${backendAppType}"; ` +
'writing the backend value (it is the source of truth).');
}
return backendAppType;
}
catch (e) {
if (onUnreachable === 'throw') {
throw e;
}
logger_1.logger.debug(e);
if (requested) {
logger_1.logger.warn(`Could not confirm app_type from the backend for ${appKey}; ` +
`falling back to the requested "${requested}".`);
}
return requested;
}
}
exports.resolveBackendAppType = resolveBackendAppType;