@visactor/vseed 0.4.5 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import type { AdvancedPipe, AdvancedPipeline, AdvancedVSeed, ChartType, CustomThemeConfig, Locale, Spec, SpecPipe, SpecPipeline, VSeed, VSeedBuilder } from '../../types';
2
- export declare class Builder implements VSeedBuilder {
2
+ export declare class Builder<S extends Spec = Spec> implements VSeedBuilder {
3
3
  private _vseed;
4
4
  private _advancedVSeed;
5
5
  private _spec;
@@ -7,212 +7,121 @@ export declare class Builder implements VSeedBuilder {
7
7
  private _locale;
8
8
  private _isPrepared;
9
9
  /**
10
- * @description 初始化 Builder 实例。
11
- * @param vseed VSeed 数据对象,包含图表类型、数据和映射配置。
10
+ * @description 初始化 Builder 实例
12
11
  */
13
12
  constructor(vseed: VSeed);
14
13
  /**
15
- * @description 获取当前 Builder 使用的语言环境。
16
- * @returns 语言环境代码 (如 'zh-CN', 'en-US')。
14
+ * @description 获取当前 Builder 使用的语言环境
17
15
  */
18
16
  get locale(): Locale;
19
17
  /**
20
- * @description 准备阶段 - 异步执行动态过滤器代码。
21
- *
22
- * 在 build() 之前调用,用于执行 dynamicFilter 中的 code。包含以下步骤:
23
- * 1. 检查是否存在需要执行的 dynamicFilter (有 code 字段)
24
- * 2. 如果存在,给 dataset 添加内部索引 __row_index
25
- * 3. 生成 AdvancedVSeed 中间配置
26
- * 4. 执行所有 dynamicFilter 的 code,将结果写入 filter.result
27
- * 5. 缓存 AdvancedVSeed,供后续 build() 使用
28
- *
29
- * **注意:**
30
- * - 此方法具有幂等性,多次调用不会重复执行
31
- * - 如果没有 dynamicFilter code,调用此方法无副作用
32
- * - 如果 dynamicFilter 只有静态 result 而没有 code,无需调用此方法
33
- *
34
- * @returns Promise<void>
35
- * @example
36
- * // 有 dynamicFilter code 的场景
37
- * const builder = VBI.from(data, 'table')
38
- * .dynamicFilter({ code: 'return data.filter(d => d.sales > 1000)' })
39
- *
40
- * await builder.prepare() // 异步执行 code
41
- * const spec = builder.build() // 同步构建 spec
42
- *
43
- * // 没有 dynamicFilter 的场景
44
- * const builder = VBI.from(data, 'table')
45
- * const spec = builder.build() // 直接构建,无需 prepare
18
+ * @description 异步执行动态过滤器代码。在 build() 前调用,用于执行 dynamicFilter 中的 code。幂等方法,多次调用不会重复执行
46
19
  */
47
20
  prepare: () => Promise<void>;
48
21
  /**
49
- * @description 生成最终的图表配置 (Spec)
50
- *
51
- * 这是最常用的核心方法。拿到 Spec 后,直接传给 VChart 或 VTable 即可渲染图表。
52
- *
53
- * **注意:**
54
- * - 如果配置中包含 dynamicFilter code,需要先调用 prepare() 异步执行
55
- * - 如果已调用过 prepare(),build() 会复用缓存的结果,提升性能
56
- *
57
- * @returns VChart VTable 的标准 Spec 对象。
58
- * @example
59
- * // 场景 1: 无 dynamicFilter,直接构建
60
- * const spec = builder.build();
61
- *
62
- * // 场景 2: 有 dynamicFilter code,先 prepare 再 build
63
- * await builder.prepare();
64
- * const spec = builder.build();
65
- */
66
- build: <T extends Spec>() => T;
67
- /**
68
- * @description 将中间层配置 (AdvancedVSeed) 转换为最终 Spec。
69
- * 仅当你需要深度定制中间层配置时使用。通常流程是:buildAdvanced() -> 修改配置 -> buildSpec()。
70
- * @param advanced 修改后的 AdvancedVSeed 对象。
71
- * @returns VChart 或 VTable 的标准 Spec 对象。
72
- */
73
- buildSpec: (advanced: AdvancedVSeed) => Spec;
74
- /**
75
- * @description 生成中间层配置 (AdvancedVSeed)。
76
- * 中间层配置也就是常说的 "图表模版",它比原始 VSeed 更详细,暴露了更多图表细节(如坐标轴、图例的具体配置)。
77
- * 如果默认的 build() 结果不满足需求,可以先获取这个中间配置进行修改,再调用 buildSpec 生成最终结果。
78
- * @returns AdvancedVSeed 对象 (模版配置)。
22
+ * @description 生成最终的图表配置 (Spec)。这是最常用的核心方法。如果配置中包含 dynamicFilter code,需要先调用 prepare()
23
+ */
24
+ build: <T = S>() => T;
25
+ /**
26
+ * @description 将中间层配置 (AdvancedVSeed) 转换为最终 Spec。仅当你需要深度定制中间层配置时使用
27
+ */
28
+ buildSpec: <T = S>(advanced: AdvancedVSeed) => T;
29
+ /**
30
+ * @description 生成中间层配置 (AdvancedVSeed),即图表模版。比原始 VSeed 更详细,暴露了更多图表细节
79
31
  */
80
32
  buildAdvanced: () => AdvancedVSeed | null;
81
33
  /**
82
- * @description 获取数据中涉及颜色的字段信息。
83
- * 常用于生成图表的图例或颜色筛选器 UI。
84
- * @returns 颜色字段列表 (包含 id 和别名)。
34
+ * @description 获取数据中涉及颜色的字段信息。常用于生成图表的图例或颜色筛选器 UI
85
35
  */
86
36
  getColorItems: () => {
87
37
  id: string;
88
38
  alias: string;
89
39
  }[];
90
40
  /**
91
- * @description 获取颜色字段的详细映射表。
92
- * @returns Key 为颜色 ID,Value 为详细信息的对象。
41
+ * @description 获取颜色字段的详细映射表。Key 为颜色 ID,Value 为详细信息
93
42
  */
94
43
  getColorIdMap: () => Record<string, {
95
44
  id: string;
96
45
  alias: string;
97
46
  }>;
98
47
  /**
99
- * @description 获取当前的 VSeed 输入数据。
48
+ * @description 获取当前的 VSeed 输入数据
100
49
  */
101
50
  get vseed(): VSeed;
102
51
  /**
103
- * @description 更新 VSeed 输入数据。
104
- * 更新后,后续调用 build() 将基于新数据生成。
105
- * **注意:** 更新 vseed 后会清除 prepare() 的缓存状态。
106
- * @param value 新的 VSeed 对象。
52
+ * @description 更新 VSeed 输入数据。更新后会清除 prepare() 的缓存状态
107
53
  */
108
54
  set vseed(value: VSeed);
109
55
  /**
110
56
  * @description 获取 prepare() 状态
111
- * @internal
112
57
  */
113
58
  get isPrepared(): boolean;
114
59
  /**
115
60
  * @description 设置 prepare() 状态
116
- * @internal
117
61
  */
118
62
  set isPrepared(value: boolean);
119
63
  /**
120
- * @description 获取当前的 AdvancedVSeed 中间配置对象。
121
- * @returns AdvancedVSeed 对象。
64
+ * @description 获取当前的 AdvancedVSeed 中间配置对象
122
65
  */
123
66
  get advancedVSeed(): AdvancedVSeed | null;
124
67
  /**
125
- * @description 设置 AdvancedVSeed 中间配置对象。
126
- * 通常用于缓存或复用已有的中间配置。
127
- * @param value 新的 AdvancedVSeed 对象。
68
+ * @description 设置 AdvancedVSeed 中间配置对象。通常用于缓存或复用已有的中间配置
128
69
  */
129
70
  set advancedVSeed(value: AdvancedVSeed | null);
130
71
  /**
131
- * @description 获取当前生成的最终 Spec 对象。
132
- * @returns Spec 对象。
72
+ * @description 获取当前生成的最终 Spec 对象
133
73
  */
134
74
  get spec(): Spec | null;
135
75
  /**
136
- * @description 设置 Spec 对象。
137
- * 通常用于缓存。
138
- * @param value 新的 Spec 对象。
76
+ * @description 设置 Spec 对象。通常用于缓存
139
77
  */
140
78
  set spec(value: Spec | null);
141
79
  /**
142
- * @description 获取构建过程中的性能统计信息。
143
- * @returns 包含各阶段耗时的对象 (单位: ms)。
80
+ * @description 获取构建过程中的性能统计信息。包含各阶段耗时 (单位: ms)
144
81
  */
145
82
  get performance(): Record<string, string | number>;
146
83
  /**
147
- * @description 设置性能统计信息。
148
- * @param value 新的性能统计对象。
84
+ * @description 设置性能统计信息
149
85
  */
150
86
  set performance(value: Record<string, string | number>);
151
87
  /**
152
- * @description [内部方法] 获取指定图表类型的模版构建管线。
153
- * 用于查看或调试该图表类型是如何从 VSeed 转换为 AdvancedVSeed 的。
154
- * @param chartType 图表类型 (如 'bar', 'line')。
155
- * @returns AdvancedPipeline 数组。
88
+ * @description [内部方法] 获取指定图表类型的模版构建管线,用于调试 VSeed 到 AdvancedVSeed 的转换过程
156
89
  */
157
- static getAdvancedPipeline: (chartType: ChartType) => AdvancedPipeline;
90
+ static getAdvancedPipeline: (chartType: ChartType) => import("../../types").Pipe<AdvancedVSeed, import("src/types").AdvancedPipelineContext>[];
158
91
  /**
159
- * @description [内部方法] 获取指定图表类型的 Spec 构建管线。
160
- * 用于查看或调试该图表类型是如何从 AdvancedVSeed 转换为 Spec 的。
161
- * @param chartType 图表类型。
162
- * @returns SpecPipeline 数组。
92
+ * @description [内部方法] 获取指定图表类型的 Spec 构建管线,用于调试 AdvancedVSeed 到 Spec 的转换过程
163
93
  */
164
- static getSpecPipeline: (chartType: ChartType) => SpecPipeline;
94
+ static getSpecPipeline: (chartType: ChartType) => SpecPipe[];
165
95
  /**
166
- * @description 获取指定主题的配置。
167
- * @param themeKey 主题名称 (例如 'light', 'dark')。如果不传,默认为 'light'。
168
- * @returns 主题配置对象。
96
+ * @description 获取指定主题的配置。不传 themeKey 默认返回 'light' 主题
169
97
  */
170
98
  static getTheme: (themeKey?: string) => CustomThemeConfig;
171
99
  /**
172
- * @description 获取所有已注册的主题配置。
173
- * @returns 主题配置映射表。
100
+ * @description 获取所有已注册的主题配置
174
101
  */
175
102
  static getThemeMap: () => Record<string, CustomThemeConfig>;
176
103
  /**
177
- * @description 静态工厂方法,用于便捷地创建 Builder 实例。
178
- * @param vseed VSeed 数据对象。
179
- * @returns 新的 Builder 实例。
180
- * @example
181
- * const builder = Builder.from(vseedJson);
104
+ * @description 静态工厂方法,用于便捷地创建 Builder 实例
182
105
  */
183
- static from: (vseed: VSeed) => Builder;
106
+ static from: <T extends Spec = Spec>(vseed: VSeed) => Builder<T>;
184
107
  /**
185
- * @description [扩展方法] 注册一个新的图表类型(模版构建阶段)。
186
- * 如果你要让 Builder 支持一种全新的图表,需要在这里注册它的模版构建逻辑。
187
- * @param chartType 新图表类型的名称。
188
- * @param pipeline 处理管道数组。
108
+ * @description [扩展方法] 注册新图表类型的模版构建管线
189
109
  */
190
110
  static registerAdvancedPipeline: (chartType: ChartType, pipeline: AdvancedPipeline) => void;
191
111
  /**
192
- * @description [扩展方法] 注册一个新的图表类型(Spec 构建阶段)。
193
- * 如果你要让 Builder 支持一种全新的图表,需要在这里注册它的 Spec 构建逻辑。
194
- * @param chartType 图表类型。
195
- * @param pipeline 处理管道数组。
112
+ * @description [扩展方法] 注册新图表类型的 Spec 构建管线
196
113
  */
197
114
  static registerSpecPipeline: (chartType: ChartType, pipeline: SpecPipeline) => void;
198
115
  /**
199
- * @description [扩展方法] 修改现有的图表模版构建逻辑。
200
- * 可以在现有图表的构建流程中插入自定义逻辑(Pipe),从而影响生成的 AdvancedVSeed。
201
- * @param chartType 目标图表类型。
202
- * @param pipe 自定义处理函数。
116
+ * @description [扩展方法] 修改现有图表的模版构建逻辑,插入自定义 Pipe 影响生成的 AdvancedVSeed
203
117
  */
204
118
  static updateAdvanced: (chartType: ChartType, pipe: AdvancedPipe) => void;
205
119
  /**
206
- * @description [扩展方法] 修改现有的图表 Spec 构建逻辑。
207
- * 可以在现有图表的构建流程中插入自定义逻辑(Pipe),从而影响生成的最终 Spec。
208
- * @param chartType 目标图表类型。
209
- * @param pipe 自定义处理函数。
120
+ * @description [扩展方法] 修改现有图表的 Spec 构建逻辑,插入自定义 Pipe 影响生成的最终 Spec
210
121
  */
211
122
  static updateSpec: (chartType: ChartType, pipe: SpecPipe) => void;
212
123
  /**
213
- * @description [扩展方法] 注册自定义主题。
214
- * @param key 主题名称。
215
- * @param theme 主题配置对象。
124
+ * @description [扩展方法] 注册自定义主题
216
125
  */
217
126
  static registerTheme: (key: string, theme: CustomThemeConfig) => void;
218
127
  private static _advancedPipelineMap;
@@ -57,13 +57,21 @@ class Builder {
57
57
  }
58
58
  static getAdvancedPipeline = (chartType)=>{
59
59
  const customPipe = Builder._customAdvancedPipe[chartType];
60
- const pipeline = Builder._advancedPipelineMap[chartType];
60
+ const originalPipeline = Builder._advancedPipelineMap[chartType];
61
+ if (!originalPipeline) return originalPipeline;
62
+ const pipeline = [
63
+ ...originalPipeline
64
+ ];
61
65
  if (customPipe) pipeline.push(customPipe);
62
66
  return pipeline;
63
67
  };
64
68
  static getSpecPipeline = (chartType)=>{
65
69
  const customPipe = Builder._customSpecPipe[chartType];
66
- const pipeline = Builder._specPipelineMap[chartType];
70
+ const originalPipeline = Builder._specPipelineMap[chartType];
71
+ if (!originalPipeline) return originalPipeline;
72
+ const pipeline = [
73
+ ...originalPipeline
74
+ ];
67
75
  if (customPipe) pipeline.push(customPipe);
68
76
  return pipeline;
69
77
  };
@@ -1 +1 @@
1
- {"version":3,"file":"builder/builder/builder.js","sources":["webpack://@visactor/vseed/./src/builder/builder/builder.ts"],"sourcesContent":["import type {\n AdvancedPipe,\n AdvancedPipeline,\n AdvancedVSeed,\n ChartType,\n CustomThemeConfig,\n Locale,\n Spec,\n SpecPipe,\n SpecPipeline,\n VSeed,\n VSeedBuilder,\n} from 'src/types'\nimport { buildAdvanced } from './buildAdvanced'\nimport { buildSpec } from './buildSpec'\nimport { build } from './build'\nimport { prepare } from './prepare'\nimport { intl } from 'src/i18n'\nimport { getColorIdMap, getColorItems } from './advanced'\n\nexport class Builder implements VSeedBuilder {\n private _vseed: VSeed\n private _advancedVSeed: AdvancedVSeed | null = null\n private _spec: Spec | null = null\n private _performance: Record<string, string | number> = {}\n\n private _locale: Locale\n\n // prepare() 相关状态\n private _isPrepared: boolean = false\n\n /**\n * @description 初始化 Builder 实例。\n * @param vseed VSeed 数据对象,包含图表类型、数据和映射配置。\n */\n constructor(vseed: VSeed) {\n this._vseed = vseed\n this._locale = vseed.locale || intl.getLocale()\n }\n\n /**\n * @description 获取当前 Builder 使用的语言环境。\n * @returns 语言环境代码 (如 'zh-CN', 'en-US')。\n */\n get locale() {\n return this._locale\n }\n\n /**\n * @description 准备阶段 - 异步执行动态过滤器代码。\n *\n * 在 build() 之前调用,用于执行 dynamicFilter 中的 code。包含以下步骤:\n * 1. 检查是否存在需要执行的 dynamicFilter (有 code 字段)\n * 2. 如果存在,给 dataset 添加内部索引 __row_index\n * 3. 生成 AdvancedVSeed 中间配置\n * 4. 执行所有 dynamicFilter 的 code,将结果写入 filter.result\n * 5. 缓存 AdvancedVSeed,供后续 build() 使用\n *\n * **注意:**\n * - 此方法具有幂等性,多次调用不会重复执行\n * - 如果没有 dynamicFilter code,调用此方法无副作用\n * - 如果 dynamicFilter 只有静态 result 而没有 code,无需调用此方法\n *\n * @returns Promise<void>\n * @example\n * // 有 dynamicFilter code 的场景\n * const builder = VBI.from(data, 'table')\n * .dynamicFilter({ code: 'return data.filter(d => d.sales > 1000)' })\n *\n * await builder.prepare() // 异步执行 code\n * const spec = builder.build() // 同步构建 spec\n *\n * // 没有 dynamicFilter 的场景\n * const builder = VBI.from(data, 'table')\n * const spec = builder.build() // 直接构建,无需 prepare\n */\n prepare = async (): Promise<void> => prepare(this)\n\n /**\n * @description 生成最终的图表配置 (Spec)。\n *\n * 这是最常用的核心方法。拿到 Spec 后,直接传给 VChart 或 VTable 即可渲染图表。\n *\n * **注意:**\n * - 如果配置中包含 dynamicFilter code,需要先调用 prepare() 异步执行\n * - 如果已调用过 prepare(),build() 会复用缓存的结果,提升性能\n *\n * @returns VChart 或 VTable 的标准 Spec 对象。\n * @example\n * // 场景 1: 无 dynamicFilter,直接构建\n * const spec = builder.build();\n *\n * // 场景 2: 有 dynamicFilter code,先 prepare 再 build\n * await builder.prepare();\n * const spec = builder.build();\n */\n build = <T extends Spec>(): T => build(this) as T\n\n /**\n * @description 将中间层配置 (AdvancedVSeed) 转换为最终 Spec。\n * 仅当你需要深度定制中间层配置时使用。通常流程是:buildAdvanced() -> 修改配置 -> buildSpec()。\n * @param advanced 修改后的 AdvancedVSeed 对象。\n * @returns VChart 或 VTable 的标准 Spec 对象。\n */\n buildSpec = (advanced: AdvancedVSeed): Spec => buildSpec(this, advanced)\n\n /**\n * @description 生成中间层配置 (AdvancedVSeed)。\n * 中间层配置也就是常说的 \"图表模版\",它比原始 VSeed 更详细,暴露了更多图表细节(如坐标轴、图例的具体配置)。\n * 如果默认的 build() 结果不满足需求,可以先获取这个中间配置进行修改,再调用 buildSpec 生成最终结果。\n * @returns AdvancedVSeed 对象 (模版配置)。\n */\n buildAdvanced = (): AdvancedVSeed | null => buildAdvanced(this)\n\n /**\n * @description 获取数据中涉及颜色的字段信息。\n * 常用于生成图表的图例或颜色筛选器 UI。\n * @returns 颜色字段列表 (包含 id 和别名)。\n */\n getColorItems = () => getColorItems(this)\n\n /**\n * @description 获取颜色字段的详细映射表。\n * @returns Key 为颜色 ID,Value 为详细信息的对象。\n */\n getColorIdMap = () => getColorIdMap(this)\n\n /**\n * @description 获取当前的 VSeed 输入数据。\n */\n get vseed() {\n return this._vseed\n }\n\n /**\n * @description 更新 VSeed 输入数据。\n * 更新后,后续调用 build() 将基于新数据生成。\n * **注意:** 更新 vseed 后会清除 prepare() 的缓存状态。\n * @param value 新的 VSeed 对象。\n */\n set vseed(value) {\n this._vseed = value\n // 清除 prepare 缓存\n this._isPrepared = false\n }\n\n /**\n * @description 获取 prepare() 状态\n * @internal\n */\n get isPrepared() {\n return this._isPrepared\n }\n\n /**\n * @description 设置 prepare() 状态\n * @internal\n */\n set isPrepared(value: boolean) {\n this._isPrepared = value\n }\n\n /**\n * @description 获取当前的 AdvancedVSeed 中间配置对象。\n * @returns AdvancedVSeed 对象。\n */\n get advancedVSeed() {\n return this._advancedVSeed\n }\n\n /**\n * @description 设置 AdvancedVSeed 中间配置对象。\n * 通常用于缓存或复用已有的中间配置。\n * @param value 新的 AdvancedVSeed 对象。\n */\n set advancedVSeed(value) {\n this._advancedVSeed = value\n }\n\n /**\n * @description 获取当前生成的最终 Spec 对象。\n * @returns Spec 对象。\n */\n get spec() {\n return this._spec\n }\n\n /**\n * @description 设置 Spec 对象。\n * 通常用于缓存。\n * @param value 新的 Spec 对象。\n */\n set spec(value) {\n this._spec = value\n }\n\n /**\n * @description 获取构建过程中的性能统计信息。\n * @returns 包含各阶段耗时的对象 (单位: ms)。\n */\n get performance() {\n return this._performance\n }\n\n /**\n * @description 设置性能统计信息。\n * @param value 新的性能统计对象。\n */\n set performance(value) {\n this._performance = value\n }\n\n /**\n * @description [内部方法] 获取指定图表类型的模版构建管线。\n * 用于查看或调试该图表类型是如何从 VSeed 转换为 AdvancedVSeed 的。\n * @param chartType 图表类型 (如 'bar', 'line')。\n * @returns AdvancedPipeline 数组。\n */\n static getAdvancedPipeline = (chartType: ChartType) => {\n const customPipe = Builder._customAdvancedPipe[chartType] as AdvancedPipe\n const pipeline = Builder._advancedPipelineMap[chartType] as AdvancedPipeline\n if (customPipe) {\n pipeline.push(customPipe)\n }\n return pipeline\n }\n\n /**\n * @description [内部方法] 获取指定图表类型的 Spec 构建管线。\n * 用于查看或调试该图表类型是如何从 AdvancedVSeed 转换为 Spec 的。\n * @param chartType 图表类型。\n * @returns SpecPipeline 数组。\n */\n static getSpecPipeline = (chartType: ChartType) => {\n const customPipe = Builder._customSpecPipe[chartType] as SpecPipe\n const pipeline = Builder._specPipelineMap[chartType] as SpecPipeline\n if (customPipe) {\n pipeline.push(customPipe)\n }\n return pipeline\n }\n\n /**\n * @description 获取指定主题的配置。\n * @param themeKey 主题名称 (例如 'light', 'dark')。如果不传,默认为 'light'。\n * @returns 主题配置对象。\n */\n static getTheme = (themeKey?: string): CustomThemeConfig => Builder._themeMap[themeKey || 'light']\n\n /**\n * @description 获取所有已注册的主题配置。\n * @returns 主题配置映射表。\n */\n static getThemeMap = (): Record<string, CustomThemeConfig> => Builder._themeMap\n\n /**\n * @description 静态工厂方法,用于便捷地创建 Builder 实例。\n * @param vseed VSeed 数据对象。\n * @returns 新的 Builder 实例。\n * @example\n * const builder = Builder.from(vseedJson);\n */\n static from = (vseed: VSeed) => new Builder(vseed)\n\n /**\n * @description [扩展方法] 注册一个新的图表类型(模版构建阶段)。\n * 如果你要让 Builder 支持一种全新的图表,需要在这里注册它的模版构建逻辑。\n * @param chartType 新图表类型的名称。\n * @param pipeline 处理管道数组。\n */\n static registerAdvancedPipeline = (chartType: ChartType, pipeline: AdvancedPipeline) => {\n Builder._advancedPipelineMap[chartType] = pipeline\n }\n\n /**\n * @description [扩展方法] 注册一个新的图表类型(Spec 构建阶段)。\n * 如果你要让 Builder 支持一种全新的图表,需要在这里注册它的 Spec 构建逻辑。\n * @param chartType 图表类型。\n * @param pipeline 处理管道数组。\n */\n static registerSpecPipeline = (chartType: ChartType, pipeline: SpecPipeline) => {\n Builder._specPipelineMap[chartType] = pipeline\n }\n\n /**\n * @description [扩展方法] 修改现有的图表模版构建逻辑。\n * 可以在现有图表的构建流程中插入自定义逻辑(Pipe),从而影响生成的 AdvancedVSeed。\n * @param chartType 目标图表类型。\n * @param pipe 自定义处理函数。\n */\n static updateAdvanced = (chartType: ChartType, pipe: AdvancedPipe) => {\n Builder._customAdvancedPipe[chartType] = pipe\n }\n\n /**\n * @description [扩展方法] 修改现有的图表 Spec 构建逻辑。\n * 可以在现有图表的构建流程中插入自定义逻辑(Pipe),从而影响生成的最终 Spec。\n * @param chartType 目标图表类型。\n * @param pipe 自定义处理函数。\n */\n static updateSpec = (chartType: ChartType, pipe: SpecPipe) => {\n Builder._customSpecPipe[chartType] = pipe\n }\n\n /**\n * @description [扩展方法] 注册自定义主题。\n * @param key 主题名称。\n * @param theme 主题配置对象。\n */\n static registerTheme = (key: string, theme: CustomThemeConfig) => {\n Builder._themeMap[key] = theme\n }\n\n private static _advancedPipelineMap: Partial<Record<ChartType, AdvancedPipeline>> = {}\n private static _specPipelineMap: Partial<Record<ChartType, SpecPipeline>> = {}\n private static _customAdvancedPipe: Partial<Record<ChartType, AdvancedPipe>> = {}\n private static _customSpecPipe: Partial<Record<ChartType, SpecPipe>> = {}\n private static _themeMap: Record<string, CustomThemeConfig> = {}\n}\n"],"names":["Builder","vseed","intl","prepare","build","advanced","buildSpec","buildAdvanced","getColorItems","getColorIdMap","value","chartType","customPipe","pipeline","themeKey","pipe","key","theme"],"mappings":"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"}
1
+ {"version":3,"file":"builder/builder/builder.js","sources":["webpack://@visactor/vseed/./src/builder/builder/builder.ts"],"sourcesContent":["import type {\n AdvancedPipe,\n AdvancedPipeline,\n AdvancedVSeed,\n ChartType,\n CustomThemeConfig,\n Locale,\n Spec,\n SpecPipe,\n SpecPipeline,\n VSeed,\n VSeedBuilder,\n} from 'src/types'\nimport { buildAdvanced } from './buildAdvanced'\nimport { buildSpec } from './buildSpec'\nimport { build } from './build'\nimport { prepare } from './prepare'\nimport { intl } from 'src/i18n'\nimport { getColorIdMap, getColorItems } from './advanced'\n\nexport class Builder<S extends Spec = Spec> implements VSeedBuilder {\n private _vseed: VSeed\n private _advancedVSeed: AdvancedVSeed | null = null\n private _spec: Spec | null = null\n private _performance: Record<string, string | number> = {}\n\n private _locale: Locale\n\n private _isPrepared: boolean = false\n\n /**\n * @description 初始化 Builder 实例\n */\n constructor(vseed: VSeed) {\n this._vseed = vseed\n this._locale = vseed.locale || intl.getLocale()\n }\n\n /**\n * @description 获取当前 Builder 使用的语言环境\n */\n get locale() {\n return this._locale\n }\n\n /**\n * @description 异步执行动态过滤器代码。在 build() 前调用,用于执行 dynamicFilter 中的 code。幂等方法,多次调用不会重复执行\n */\n prepare = async (): Promise<void> => prepare(this)\n\n /**\n * @description 生成最终的图表配置 (Spec)。这是最常用的核心方法。如果配置中包含 dynamicFilter code,需要先调用 prepare()\n */\n build = <T = S>(): T => build(this) as T\n\n /**\n * @description 将中间层配置 (AdvancedVSeed) 转换为最终 Spec。仅当你需要深度定制中间层配置时使用\n */\n buildSpec = <T = S>(advanced: AdvancedVSeed): T => buildSpec(this, advanced) as T\n\n /**\n * @description 生成中间层配置 (AdvancedVSeed),即图表模版。比原始 VSeed 更详细,暴露了更多图表细节\n */\n buildAdvanced = (): AdvancedVSeed | null => buildAdvanced(this)\n\n /**\n * @description 获取数据中涉及颜色的字段信息。常用于生成图表的图例或颜色筛选器 UI\n */\n getColorItems = () => getColorItems(this)\n\n /**\n * @description 获取颜色字段的详细映射表。Key 为颜色 ID,Value 为详细信息\n */\n getColorIdMap = () => getColorIdMap(this)\n\n /**\n * @description 获取当前的 VSeed 输入数据\n */\n get vseed() {\n return this._vseed\n }\n\n /**\n * @description 更新 VSeed 输入数据。更新后会清除 prepare() 的缓存状态\n */\n set vseed(value) {\n this._vseed = value\n this._isPrepared = false\n }\n\n /**\n * @description 获取 prepare() 状态\n */\n get isPrepared() {\n return this._isPrepared\n }\n\n /**\n * @description 设置 prepare() 状态\n */\n set isPrepared(value: boolean) {\n this._isPrepared = value\n }\n\n /**\n * @description 获取当前的 AdvancedVSeed 中间配置对象\n */\n get advancedVSeed() {\n return this._advancedVSeed\n }\n\n /**\n * @description 设置 AdvancedVSeed 中间配置对象。通常用于缓存或复用已有的中间配置\n */\n set advancedVSeed(value) {\n this._advancedVSeed = value\n }\n\n /**\n * @description 获取当前生成的最终 Spec 对象\n */\n get spec() {\n return this._spec\n }\n\n /**\n * @description 设置 Spec 对象。通常用于缓存\n */\n set spec(value) {\n this._spec = value\n }\n\n /**\n * @description 获取构建过程中的性能统计信息。包含各阶段耗时 (单位: ms)\n */\n get performance() {\n return this._performance\n }\n\n /**\n * @description 设置性能统计信息\n */\n set performance(value) {\n this._performance = value\n }\n\n /**\n * @description [内部方法] 获取指定图表类型的模版构建管线,用于调试 VSeed 到 AdvancedVSeed 的转换过程\n */\n static getAdvancedPipeline = (chartType: ChartType) => {\n const customPipe = Builder._customAdvancedPipe[chartType] as AdvancedPipe\n const originalPipeline = Builder._advancedPipelineMap[chartType] as AdvancedPipeline\n if (!originalPipeline) return originalPipeline\n\n const pipeline = [...originalPipeline]\n if (customPipe) {\n pipeline.push(customPipe)\n }\n return pipeline\n }\n\n /**\n * @description [内部方法] 获取指定图表类型的 Spec 构建管线,用于调试 AdvancedVSeed 到 Spec 的转换过程\n */\n static getSpecPipeline = (chartType: ChartType) => {\n const customPipe = Builder._customSpecPipe[chartType] as SpecPipe\n const originalPipeline = Builder._specPipelineMap[chartType] as SpecPipeline\n if (!originalPipeline) return originalPipeline\n\n const pipeline = [...originalPipeline]\n if (customPipe) {\n pipeline.push(customPipe)\n }\n return pipeline\n }\n\n /**\n * @description 获取指定主题的配置。不传 themeKey 默认返回 'light' 主题\n */\n static getTheme = (themeKey?: string): CustomThemeConfig => Builder._themeMap[themeKey || 'light']\n\n /**\n * @description 获取所有已注册的主题配置\n */\n static getThemeMap = (): Record<string, CustomThemeConfig> => Builder._themeMap\n\n /**\n * @description 静态工厂方法,用于便捷地创建 Builder 实例\n */\n static from = <T extends Spec = Spec>(vseed: VSeed) => new Builder<T>(vseed)\n\n /**\n * @description [扩展方法] 注册新图表类型的模版构建管线\n */\n static registerAdvancedPipeline = (chartType: ChartType, pipeline: AdvancedPipeline) => {\n Builder._advancedPipelineMap[chartType] = pipeline\n }\n\n /**\n * @description [扩展方法] 注册新图表类型的 Spec 构建管线\n */\n static registerSpecPipeline = (chartType: ChartType, pipeline: SpecPipeline) => {\n Builder._specPipelineMap[chartType] = pipeline\n }\n\n /**\n * @description [扩展方法] 修改现有图表的模版构建逻辑,插入自定义 Pipe 影响生成的 AdvancedVSeed\n */\n static updateAdvanced = (chartType: ChartType, pipe: AdvancedPipe) => {\n Builder._customAdvancedPipe[chartType] = pipe\n }\n\n /**\n * @description [扩展方法] 修改现有图表的 Spec 构建逻辑,插入自定义 Pipe 影响生成的最终 Spec\n */\n static updateSpec = (chartType: ChartType, pipe: SpecPipe) => {\n Builder._customSpecPipe[chartType] = pipe\n }\n\n /**\n * @description [扩展方法] 注册自定义主题\n */\n static registerTheme = (key: string, theme: CustomThemeConfig) => {\n Builder._themeMap[key] = theme\n }\n\n private static _advancedPipelineMap: Partial<Record<ChartType, AdvancedPipeline>> = {}\n private static _specPipelineMap: Partial<Record<ChartType, SpecPipeline>> = {}\n private static _customAdvancedPipe: Partial<Record<ChartType, AdvancedPipe>> = {}\n private static _customSpecPipe: Partial<Record<ChartType, SpecPipe>> = {}\n private static _themeMap: Record<string, CustomThemeConfig> = {}\n}\n"],"names":["Builder","vseed","intl","prepare","build","advanced","buildSpec","buildAdvanced","getColorItems","getColorIdMap","value","chartType","customPipe","originalPipeline","pipeline","themeKey","pipe","key","theme"],"mappings":"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"}
package/dist/umd/index.js CHANGED
@@ -2390,13 +2390,21 @@ self.R = R;
2390
2390
  }
2391
2391
  static getAdvancedPipeline = (chartType)=>{
2392
2392
  const customPipe = Builder._customAdvancedPipe[chartType];
2393
- const pipeline = Builder._advancedPipelineMap[chartType];
2393
+ const originalPipeline = Builder._advancedPipelineMap[chartType];
2394
+ if (!originalPipeline) return originalPipeline;
2395
+ const pipeline = [
2396
+ ...originalPipeline
2397
+ ];
2394
2398
  if (customPipe) pipeline.push(customPipe);
2395
2399
  return pipeline;
2396
2400
  };
2397
2401
  static getSpecPipeline = (chartType)=>{
2398
2402
  const customPipe = Builder._customSpecPipe[chartType];
2399
- const pipeline = Builder._specPipelineMap[chartType];
2403
+ const originalPipeline = Builder._specPipelineMap[chartType];
2404
+ if (!originalPipeline) return originalPipeline;
2405
+ const pipeline = [
2406
+ ...originalPipeline
2407
+ ];
2400
2408
  if (customPipe) pipeline.push(customPipe);
2401
2409
  return pipeline;
2402
2410
  };