@lark-project/cli
Version:
飞书项目插件开发工具
34 lines (33 loc) • 1.77 kB
TypeScript
import { AppType } from "../../../types";
export interface ICreateProjectOptions {
siteDomain: string;
name: string;
description?: string;
detailDescription?: string;
appType?: AppType;
force?: boolean;
}
/**
* 纯函数:name → base slug。**不查 fs**,所有调用同 (name, appKey) 必产同样输出。
*
* 撞名处理交给 pickProjectName,避免在"算名字"这一步做悲观启发式(如"含中文必加后缀")
* 而牺牲了 readability——大多数场景同一 cwd 下不会撞,clean slug 最舒服。
*
* slug 完全为空(如纯中文名 "节点表单")走 `plugin-<appKeySuffix>` 兜底,保证非空。
*/
export declare function deriveProjectName(name: string, appKey: string): string;
/**
* 新建场景下选一个**实际不撞名**的 dir 名:
* 1. base slug(来自 deriveProjectName)——不撞就用,保留 readability
* 2. base 撞 → 追加 `-<appKeySuffix>`(pluginId 末 6 位,globally unique)
* 3. 还撞 → `-<appKeySuffix>-2` / `-3` …… 直到不撞或耗尽 999 次
*
* 算出来的结果必须由 caller 写入 sentinel.projectName,让后续 resume 不再算这一遍——
* 否则 resume 时 fs 状态变了,重算会得到不同的 dir 名,导致清理对象错位。
*
* 解决用户场景:中文名经 slugify 信息丢失("节点表单 AI 字段" → "ai"),导致同语境多个
* 插件全撞 `ai/`——查 fs 命中 → 走 `ai-xxxyyy` / `ai-aaabbb` 自然区分。纯英文名只要不撞
* 仍保留干净 slug,不被无脑加后缀污染。
*/
export declare function pickProjectName(name: string, appKey: string, cwd: string): string;
export declare function createProject(options: ICreateProjectOptions): Promise<void>;