18 小时以前 35722562e9e13f0504acc15b740d042ecb810199
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
 * 质量组件注册表
 * <p>
 * 全平台唯一的组件来源:设计器左侧面板、属性面板、渲染引擎、校验都从这里取定义。
 * 新增组件只需要在 index.ts 里多注册一个 definition,不改动 GrapesJS 集成代码。
 */
import type {
  QualityCategory,
  QualityComponentDefinition,
} from './types';
 
import { QUALITY_CATEGORY_ORDER } from './types';
 
const definitions = new Map<string, QualityComponentDefinition>();
 
/** 注册单个组件;同 type 重复注册按覆盖处理,便于开发期热更新 */
export function registerQualityComponent(definition: QualityComponentDefinition): void {
  if (!definition.type) {
    throw new Error('质量组件定义缺少 type');
  }
  definitions.set(definition.type, definition);
}
 
/** 批量注册 */
export function registerQualityComponents(list: QualityComponentDefinition[]): void {
  list.forEach(registerQualityComponent);
}
 
/** 按类型取定义,未注册返回 undefined */
export function getQualityComponent(type?: string): QualityComponentDefinition | undefined {
  return type ? definitions.get(type) : undefined;
}
 
/** 全部组件,按分类顺序排列(同分类内按注册顺序) */
export function listQualityComponents(): QualityComponentDefinition[] {
  return [...definitions.values()].sort(
    (a, b) => categoryIndex(a.category) - categoryIndex(b.category),
  );
}
 
/** 按分类分组,空分类不返回 */
export function listQualityComponentsByCategory(): {
  category: QualityCategory;
  components: QualityComponentDefinition[];
}[] {
  const grouped = new Map<QualityCategory, QualityComponentDefinition[]>();
  listQualityComponents().forEach((definition) => {
    const list = grouped.get(definition.category) ?? [];
    list.push(definition);
    grouped.set(definition.category, list);
  });
  return QUALITY_CATEGORY_ORDER.filter((category) => grouped.has(category)).map(
    (category) => ({ category, components: grouped.get(category)! }),
  );
}
 
function categoryIndex(category: QualityCategory): number {
  const index = QUALITY_CATEGORY_ORDER.indexOf(category);
  return index === -1 ? QUALITY_CATEGORY_ORDER.length : index;
}