@slidejs/core 0.0.1 → 0.1.1

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.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class d{constructor(r){this.dsl=r,this.validateDSL()}validateDSL(){const{rules:r}=this.dsl;if(!r.some(o=>o.type==="start"))throw new i('At least one "start" rule is required',"MISSING_START_RULE");if(!r.some(o=>o.type==="end"))throw new i('At least one "end" rule is required',"MISSING_END_RULE")}generate(r){if(r.sourceType!==this.dsl.sourceType)throw new i(`Context source type "${r.sourceType}" does not match DSL source type "${this.dsl.sourceType}"`,"SOURCE_TYPE_MISMATCH");const n=[],{rules:s}=this.dsl,o=s.filter(e=>e.type==="start"),a=s.filter(e=>e.type==="content"),l=s.filter(e=>e.type==="end");for(const e of o)try{const t=e.generate(r);n.push(...this.enrichSlides(t,e.name))}catch(t){throw new i(`Error in start rule "${e.name}": ${t.message}`,"RULE_GENERATION_ERROR",t)}for(const e of a)try{const t=e.generate(r);n.push(...this.enrichSlides(t,e.name))}catch(t){throw new i(`Error in content rule "${e.name}": ${t.message}`,"RULE_GENERATION_ERROR",t)}for(const e of l)try{const t=e.generate(r);n.push(...this.enrichSlides(t,e.name))}catch(t){throw new i(`Error in end rule "${e.name}": ${t.message}`,"RULE_GENERATION_ERROR",t)}return n}enrichSlides(r,n){return r.map((s,o)=>{var a,l;return{...s,id:s.id||`${n}-${o}`,behavior:{...((a=this.dsl.config)==null?void 0:a.defaultTransition)&&{transition:this.dsl.config.defaultTransition},...((l=this.dsl.config)==null?void 0:l.defaultBackground)&&{background:this.dsl.config.defaultBackground},...s.behavior}}})}}class i extends Error{constructor(r,n,s){super(r),this.code=n,this.cause=s,this.name="SlideEngineError"}}exports.SlideEngine=d;exports.SlideEngineError=i;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/engine.ts"],"sourcesContent":["/**\n * @slidejs/core - Slide DSL 规则引擎\n */\n\nimport type { SlideContext } from '@slidejs/context';\nimport type { SlideDSL, SlideDefinition } from './types';\n\n/**\n * Slide DSL 规则引擎\n * 根据规则和 Context 生成最终的 Slide 列表\n */\nexport class SlideEngine<TContext extends SlideContext = SlideContext> {\n constructor(private dsl: SlideDSL<TContext>) {\n this.validateDSL();\n }\n\n /**\n * 验证 DSL 定义\n */\n private validateDSL(): void {\n const { rules } = this.dsl;\n\n // 确保至少有一个 start 规则\n const hasStart = rules.some(r => r.type === 'start');\n if (!hasStart) {\n throw new SlideEngineError('At least one \"start\" rule is required', 'MISSING_START_RULE');\n }\n\n // 确保至少有一个 end 规则\n const hasEnd = rules.some(r => r.type === 'end');\n if (!hasEnd) {\n throw new SlideEngineError('At least one \"end\" rule is required', 'MISSING_END_RULE');\n }\n }\n\n /**\n * 生成 Slides\n */\n generate(context: TContext): SlideDefinition[] {\n // 验证 Context 与 DSL 的源类型匹配\n if (context.sourceType !== this.dsl.sourceType) {\n throw new SlideEngineError(\n `Context source type \"${context.sourceType}\" does not match DSL source type \"${this.dsl.sourceType}\"`,\n 'SOURCE_TYPE_MISMATCH'\n );\n }\n\n const slides: SlideDefinition[] = [];\n const { rules } = this.dsl;\n\n // 执行顺序:start → content → end\n const startRules = rules.filter(r => r.type === 'start');\n const contentRules = rules.filter(r => r.type === 'content');\n const endRules = rules.filter(r => r.type === 'end');\n\n // 1. 执行 start 规则\n for (const rule of startRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in start rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n // 2. 执行 content 规则\n for (const rule of contentRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in content rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n // 3. 执行 end 规则\n for (const rule of endRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in end rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n return slides;\n }\n\n /**\n * 丰富 Slides(添加默认值、生成 ID 等)\n */\n private enrichSlides(slides: SlideDefinition[], ruleName: string): SlideDefinition[] {\n return slides.map((slide, index) => ({\n ...slide,\n id: slide.id || `${ruleName}-${index}`,\n behavior: {\n ...(this.dsl.config?.defaultTransition && {\n transition: this.dsl.config.defaultTransition,\n }),\n ...(this.dsl.config?.defaultBackground && {\n background: this.dsl.config.defaultBackground,\n }),\n ...slide.behavior,\n },\n }));\n }\n}\n\n/**\n * Slide Engine 错误\n */\nexport class SlideEngineError extends Error {\n constructor(\n message: string,\n public code: string,\n public cause?: Error\n ) {\n super(message);\n this.name = 'SlideEngineError';\n }\n}\n"],"names":["SlideEngine","dsl","rules","r","SlideEngineError","context","slides","startRules","contentRules","endRules","rule","ruleSlides","error","ruleName","slide","index","_a","_b","message","code","cause"],"mappings":"gFAWO,MAAMA,CAA0D,CACrE,YAAoBC,EAAyB,CAAzB,KAAA,IAAAA,EAClB,KAAK,YAAA,CACP,CAKQ,aAAoB,CAC1B,KAAM,CAAE,MAAAC,GAAU,KAAK,IAIvB,GAAI,CADaA,EAAM,KAAKC,GAAKA,EAAE,OAAS,OAAO,EAEjD,MAAM,IAAIC,EAAiB,wCAAyC,oBAAoB,EAK1F,GAAI,CADWF,EAAM,KAAKC,GAAKA,EAAE,OAAS,KAAK,EAE7C,MAAM,IAAIC,EAAiB,sCAAuC,kBAAkB,CAExF,CAKA,SAASC,EAAsC,CAE7C,GAAIA,EAAQ,aAAe,KAAK,IAAI,WAClC,MAAM,IAAID,EACR,wBAAwBC,EAAQ,UAAU,qCAAqC,KAAK,IAAI,UAAU,IAClG,sBAAA,EAIJ,MAAMC,EAA4B,CAAA,EAC5B,CAAE,MAAAJ,GAAU,KAAK,IAGjBK,EAAaL,EAAM,OAAOC,GAAKA,EAAE,OAAS,OAAO,EACjDK,EAAeN,EAAM,OAAOC,GAAKA,EAAE,OAAS,SAAS,EACrDM,EAAWP,EAAM,OAAOC,GAAKA,EAAE,OAAS,KAAK,EAGnD,UAAWO,KAAQH,EACjB,GAAI,CACF,MAAMI,EAAaD,EAAK,SAASL,CAAO,EACxCC,EAAO,KAAK,GAAG,KAAK,aAAaK,EAAYD,EAAK,IAAI,CAAC,CACzD,OAASE,EAAO,CACd,MAAM,IAAIR,EACR,wBAAwBM,EAAK,IAAI,MAAOE,EAAgB,OAAO,GAC/D,wBACAA,CAAA,CAEJ,CAIF,UAAWF,KAAQF,EACjB,GAAI,CACF,MAAMG,EAAaD,EAAK,SAASL,CAAO,EACxCC,EAAO,KAAK,GAAG,KAAK,aAAaK,EAAYD,EAAK,IAAI,CAAC,CACzD,OAASE,EAAO,CACd,MAAM,IAAIR,EACR,0BAA0BM,EAAK,IAAI,MAAOE,EAAgB,OAAO,GACjE,wBACAA,CAAA,CAEJ,CAIF,UAAWF,KAAQD,EACjB,GAAI,CACF,MAAME,EAAaD,EAAK,SAASL,CAAO,EACxCC,EAAO,KAAK,GAAG,KAAK,aAAaK,EAAYD,EAAK,IAAI,CAAC,CACzD,OAASE,EAAO,CACd,MAAM,IAAIR,EACR,sBAAsBM,EAAK,IAAI,MAAOE,EAAgB,OAAO,GAC7D,wBACAA,CAAA,CAEJ,CAGF,OAAON,CACT,CAKQ,aAAaA,EAA2BO,EAAqC,CACnF,OAAOP,EAAO,IAAI,CAACQ,EAAOC,IAAA,SAAW,OACnC,GAAGD,EACH,GAAIA,EAAM,IAAM,GAAGD,CAAQ,IAAIE,CAAK,GACpC,SAAU,CACR,KAAIC,EAAA,KAAK,IAAI,SAAT,YAAAA,EAAiB,oBAAqB,CACxC,WAAY,KAAK,IAAI,OAAO,iBAAA,EAE9B,KAAIC,EAAA,KAAK,IAAI,SAAT,YAAAA,EAAiB,oBAAqB,CACxC,WAAY,KAAK,IAAI,OAAO,iBAAA,EAE9B,GAAGH,EAAM,QAAA,CACX,EACA,CACJ,CACF,CAKO,MAAMV,UAAyB,KAAM,CAC1C,YACEc,EACOC,EACAC,EACP,CACA,MAAMF,CAAO,EAHN,KAAA,KAAAC,EACA,KAAA,MAAAC,EAGP,KAAK,KAAO,kBACd,CACF"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,215 @@
1
- /**
2
- * @slidejs/core
3
- *
4
- * Slide DSL 核心引擎
5
- */
6
- export type { SlideDSL, SlideRule, SlideDefinition, SlideContent, DynamicContent, StaticContent, SlideBehavior, SlideTransition, SlideBackground, SlideLayout, SlideConfig, } from './types';
7
- export { SlideEngine, SlideEngineError } from './engine';
8
- //# sourceMappingURL=index.d.ts.map
1
+ import { SlideContext } from '@slidejs/context';
2
+
3
+ /**
4
+ * 动态内容(组件)
5
+ */
6
+ export declare interface DynamicContent {
7
+ type: 'dynamic';
8
+ /** 组件名称(如 'wsx-quiz-question') */
9
+ component: string;
10
+ /** 组件属性 */
11
+ props: Record<string, unknown>;
12
+ }
13
+
14
+ /**
15
+ * 背景配置
16
+ */
17
+ export declare interface SlideBackground {
18
+ /** 背景颜色 */
19
+ color?: string;
20
+ /** 背景图片 */
21
+ image?: string;
22
+ /** 背景视频 */
23
+ video?: string;
24
+ /** 背景不透明度 */
25
+ opacity?: number;
26
+ }
27
+
28
+ /**
29
+ * Slide 行为配置
30
+ */
31
+ export declare interface SlideBehavior {
32
+ /**
33
+ * 过渡动画
34
+ */
35
+ transition?: SlideTransition;
36
+ /**
37
+ * 背景配置
38
+ */
39
+ background?: SlideBackground;
40
+ /**
41
+ * 布局配置
42
+ */
43
+ layout?: SlideLayout;
44
+ /**
45
+ * Fragments(分步显示)
46
+ */
47
+ fragments?: boolean;
48
+ /**
49
+ * 自动播放(秒数)
50
+ */
51
+ autoplay?: number;
52
+ }
53
+
54
+ /**
55
+ * 全局配置
56
+ */
57
+ export declare interface SlideConfig {
58
+ /** 默认过渡 */
59
+ defaultTransition?: SlideTransition;
60
+ /** 默认背景 */
61
+ defaultBackground?: SlideBackground;
62
+ /** 主题 */
63
+ theme?: string;
64
+ /** 其他配置 */
65
+ [key: string]: unknown;
66
+ }
67
+
68
+ /**
69
+ * Slide 内容
70
+ */
71
+ export declare type SlideContent = DynamicContent | StaticContent;
72
+
73
+ /**
74
+ * Slide 定义
75
+ */
76
+ export declare interface SlideDefinition {
77
+ /**
78
+ * Slide ID(可选,自动生成如果未提供)
79
+ */
80
+ id?: string;
81
+ /**
82
+ * 内容配置
83
+ */
84
+ content: SlideContent;
85
+ /**
86
+ * 行为配置(过渡、背景、布局等)
87
+ */
88
+ behavior?: SlideBehavior;
89
+ /**
90
+ * 元数据
91
+ */
92
+ metadata?: Record<string, unknown>;
93
+ }
94
+
95
+ /**
96
+ * Slide DSL 根对象
97
+ */
98
+ export declare interface SlideDSL<TContext extends SlideContext = SlideContext> {
99
+ /**
100
+ * DSL 版本
101
+ */
102
+ version: string;
103
+ /**
104
+ * 数据源类型(必须与 Context.sourceType 匹配)
105
+ */
106
+ sourceType: string;
107
+ /**
108
+ * 数据源 ID
109
+ */
110
+ sourceId: string;
111
+ /**
112
+ * 规则列表
113
+ */
114
+ rules: SlideRule<TContext>[];
115
+ /**
116
+ * 全局配置(可选)
117
+ */
118
+ config?: SlideConfig;
119
+ }
120
+
121
+ /**
122
+ * Slide DSL 规则引擎
123
+ * 根据规则和 Context 生成最终的 Slide 列表
124
+ */
125
+ export declare class SlideEngine<TContext extends SlideContext = SlideContext> {
126
+ private dsl;
127
+ constructor(dsl: SlideDSL<TContext>);
128
+ /**
129
+ * 验证 DSL 定义
130
+ */
131
+ private validateDSL;
132
+ /**
133
+ * 生成 Slides
134
+ */
135
+ generate(context: TContext): SlideDefinition[];
136
+ /**
137
+ * 丰富 Slides(添加默认值、生成 ID 等)
138
+ */
139
+ private enrichSlides;
140
+ }
141
+
142
+ /**
143
+ * Slide Engine 错误
144
+ */
145
+ export declare class SlideEngineError extends Error {
146
+ code: string;
147
+ cause?: Error | undefined;
148
+ constructor(message: string, code: string, cause?: Error | undefined);
149
+ }
150
+
151
+ /**
152
+ * 布局配置
153
+ */
154
+ export declare interface SlideLayout {
155
+ /** 对齐方式 */
156
+ align?: 'left' | 'center' | 'right';
157
+ /** 垂直对齐 */
158
+ valign?: 'top' | 'middle' | 'bottom';
159
+ /** 内容宽度 */
160
+ width?: string | number;
161
+ }
162
+
163
+ /**
164
+ * Slide DSL 规则
165
+ */
166
+ export declare interface SlideRule<TContext extends SlideContext = SlideContext> {
167
+ /**
168
+ * 规则类型
169
+ * - start: 开始规则,在内容前执行
170
+ * - content: 内容规则,从数据动态生成
171
+ * - end: 结束规则,在内容后执行
172
+ */
173
+ type: 'start' | 'content' | 'end';
174
+ /**
175
+ * 规则名称(用于调试和日志)
176
+ */
177
+ name: string;
178
+ /**
179
+ * 幻灯片生成器函数
180
+ * 接收 Context,返回 Slide 定义数组
181
+ */
182
+ generate: (context: TContext) => SlideDefinition[];
183
+ }
184
+
185
+ /**
186
+ * 过渡动画
187
+ */
188
+ export declare interface SlideTransition {
189
+ /** 过渡类型 */
190
+ type: 'slide' | 'zoom' | 'fade' | 'cube' | 'flip' | 'none';
191
+ /** 过渡速度('slow' | 'default' | 'fast' 或毫秒数) */
192
+ speed?: 'slow' | 'default' | 'fast' | number;
193
+ /** 过渡方向(仅对某些类型有效) */
194
+ direction?: 'horizontal' | 'vertical';
195
+ /** 自定义选项 */
196
+ options?: Record<string, unknown>;
197
+ }
198
+
199
+ /**
200
+ * 静态内容(文本)
201
+ */
202
+ export declare interface StaticContent {
203
+ type: 'text';
204
+ /** 文本行数组 */
205
+ lines: string[];
206
+ /** 格式选项 */
207
+ format?: {
208
+ /** Markdown 支持 */
209
+ markdown?: boolean;
210
+ /** HTML 支持 */
211
+ html?: boolean;
212
+ };
213
+ }
214
+
215
+ export { }
@@ -88,4 +88,4 @@ export {
88
88
  d as SlideEngine,
89
89
  i as SlideEngineError
90
90
  };
91
- //# sourceMappingURL=index.js.map
91
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/engine.ts"],"sourcesContent":["/**\n * @slidejs/core - Slide DSL 规则引擎\n */\n\nimport type { SlideContext } from '@slidejs/context';\nimport type { SlideDSL, SlideDefinition } from './types';\n\n/**\n * Slide DSL 规则引擎\n * 根据规则和 Context 生成最终的 Slide 列表\n */\nexport class SlideEngine<TContext extends SlideContext = SlideContext> {\n constructor(private dsl: SlideDSL<TContext>) {\n this.validateDSL();\n }\n\n /**\n * 验证 DSL 定义\n */\n private validateDSL(): void {\n const { rules } = this.dsl;\n\n // 确保至少有一个 start 规则\n const hasStart = rules.some(r => r.type === 'start');\n if (!hasStart) {\n throw new SlideEngineError('At least one \"start\" rule is required', 'MISSING_START_RULE');\n }\n\n // 确保至少有一个 end 规则\n const hasEnd = rules.some(r => r.type === 'end');\n if (!hasEnd) {\n throw new SlideEngineError('At least one \"end\" rule is required', 'MISSING_END_RULE');\n }\n }\n\n /**\n * 生成 Slides\n */\n generate(context: TContext): SlideDefinition[] {\n // 验证 Context 与 DSL 的源类型匹配\n if (context.sourceType !== this.dsl.sourceType) {\n throw new SlideEngineError(\n `Context source type \"${context.sourceType}\" does not match DSL source type \"${this.dsl.sourceType}\"`,\n 'SOURCE_TYPE_MISMATCH'\n );\n }\n\n const slides: SlideDefinition[] = [];\n const { rules } = this.dsl;\n\n // 执行顺序:start → content → end\n const startRules = rules.filter(r => r.type === 'start');\n const contentRules = rules.filter(r => r.type === 'content');\n const endRules = rules.filter(r => r.type === 'end');\n\n // 1. 执行 start 规则\n for (const rule of startRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in start rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n // 2. 执行 content 规则\n for (const rule of contentRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in content rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n // 3. 执行 end 规则\n for (const rule of endRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in end rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n return slides;\n }\n\n /**\n * 丰富 Slides(添加默认值、生成 ID 等)\n */\n private enrichSlides(slides: SlideDefinition[], ruleName: string): SlideDefinition[] {\n return slides.map((slide, index) => ({\n ...slide,\n id: slide.id || `${ruleName}-${index}`,\n behavior: {\n ...(this.dsl.config?.defaultTransition && {\n transition: this.dsl.config.defaultTransition,\n }),\n ...(this.dsl.config?.defaultBackground && {\n background: this.dsl.config.defaultBackground,\n }),\n ...slide.behavior,\n },\n }));\n }\n}\n\n/**\n * Slide Engine 错误\n */\nexport class SlideEngineError extends Error {\n constructor(\n message: string,\n public code: string,\n public cause?: Error\n ) {\n super(message);\n this.name = 'SlideEngineError';\n }\n}\n"],"names":["SlideEngine","dsl","rules","r","SlideEngineError","context","slides","startRules","contentRules","endRules","rule","ruleSlides","error","ruleName","slide","index","_a","_b","message","code","cause"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "@slidejs/core",
3
- "version": "0.0.1",
3
+ "version": "0.1.1",
4
4
  "description": "Slide DSL 核心引擎",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.mjs",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
- "import": "./dist/index.js",
12
- "types": "./dist/index.d.ts"
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
13
14
  }
14
15
  },
15
16
  "files": [
package/dist/engine.d.ts DELETED
@@ -1,32 +0,0 @@
1
- import { SlideContext } from '@slidejs/context';
2
- import { SlideDSL, SlideDefinition } from './types';
3
-
4
- /**
5
- * Slide DSL 规则引擎
6
- * 根据规则和 Context 生成最终的 Slide 列表
7
- */
8
- export declare class SlideEngine<TContext extends SlideContext = SlideContext> {
9
- private dsl;
10
- constructor(dsl: SlideDSL<TContext>);
11
- /**
12
- * 验证 DSL 定义
13
- */
14
- private validateDSL;
15
- /**
16
- * 生成 Slides
17
- */
18
- generate(context: TContext): SlideDefinition[];
19
- /**
20
- * 丰富 Slides(添加默认值、生成 ID 等)
21
- */
22
- private enrichSlides;
23
- }
24
- /**
25
- * Slide Engine 错误
26
- */
27
- export declare class SlideEngineError extends Error {
28
- code: string;
29
- cause?: Error | undefined;
30
- constructor(message: string, code: string, cause?: Error | undefined);
31
- }
32
- //# sourceMappingURL=engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEzD;;;GAGG;AACH,qBAAa,WAAW,CAAC,QAAQ,SAAS,YAAY,GAAG,YAAY;IACvD,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAI3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,eAAe,EAAE;IA8D9C;;OAEG;IACH,OAAO,CAAC,YAAY;CAerB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAGhC,IAAI,EAAE,MAAM;IACZ,KAAK,CAAC,EAAE,KAAK;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,KAAK,YAAA;CAKvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,QAAQ,EACR,SAAS,EACT,eAAe,EACf,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/engine.ts"],"sourcesContent":["/**\n * @slidejs/core - Slide DSL 规则引擎\n */\n\nimport type { SlideContext } from '@slidejs/context';\nimport type { SlideDSL, SlideDefinition } from './types';\n\n/**\n * Slide DSL 规则引擎\n * 根据规则和 Context 生成最终的 Slide 列表\n */\nexport class SlideEngine<TContext extends SlideContext = SlideContext> {\n constructor(private dsl: SlideDSL<TContext>) {\n this.validateDSL();\n }\n\n /**\n * 验证 DSL 定义\n */\n private validateDSL(): void {\n const { rules } = this.dsl;\n\n // 确保至少有一个 start 规则\n const hasStart = rules.some(r => r.type === 'start');\n if (!hasStart) {\n throw new SlideEngineError('At least one \"start\" rule is required', 'MISSING_START_RULE');\n }\n\n // 确保至少有一个 end 规则\n const hasEnd = rules.some(r => r.type === 'end');\n if (!hasEnd) {\n throw new SlideEngineError('At least one \"end\" rule is required', 'MISSING_END_RULE');\n }\n }\n\n /**\n * 生成 Slides\n */\n generate(context: TContext): SlideDefinition[] {\n // 验证 Context 与 DSL 的源类型匹配\n if (context.sourceType !== this.dsl.sourceType) {\n throw new SlideEngineError(\n `Context source type \"${context.sourceType}\" does not match DSL source type \"${this.dsl.sourceType}\"`,\n 'SOURCE_TYPE_MISMATCH'\n );\n }\n\n const slides: SlideDefinition[] = [];\n const { rules } = this.dsl;\n\n // 执行顺序:start → content → end\n const startRules = rules.filter(r => r.type === 'start');\n const contentRules = rules.filter(r => r.type === 'content');\n const endRules = rules.filter(r => r.type === 'end');\n\n // 1. 执行 start 规则\n for (const rule of startRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in start rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n // 2. 执行 content 规则\n for (const rule of contentRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in content rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n // 3. 执行 end 规则\n for (const rule of endRules) {\n try {\n const ruleSlides = rule.generate(context);\n slides.push(...this.enrichSlides(ruleSlides, rule.name));\n } catch (error) {\n throw new SlideEngineError(\n `Error in end rule \"${rule.name}\": ${(error as Error).message}`,\n 'RULE_GENERATION_ERROR',\n error as Error\n );\n }\n }\n\n return slides;\n }\n\n /**\n * 丰富 Slides(添加默认值、生成 ID 等)\n */\n private enrichSlides(slides: SlideDefinition[], ruleName: string): SlideDefinition[] {\n return slides.map((slide, index) => ({\n ...slide,\n id: slide.id || `${ruleName}-${index}`,\n behavior: {\n ...(this.dsl.config?.defaultTransition && {\n transition: this.dsl.config.defaultTransition,\n }),\n ...(this.dsl.config?.defaultBackground && {\n background: this.dsl.config.defaultBackground,\n }),\n ...slide.behavior,\n },\n }));\n }\n}\n\n/**\n * Slide Engine 错误\n */\nexport class SlideEngineError extends Error {\n constructor(\n message: string,\n public code: string,\n public cause?: Error\n ) {\n super(message);\n this.name = 'SlideEngineError';\n }\n}\n"],"names":["SlideEngine","dsl","rules","r","SlideEngineError","context","slides","startRules","contentRules","endRules","rule","ruleSlides","error","ruleName","slide","index","_a","_b","message","code","cause"],"mappings":"AAWO,MAAMA,EAA0D;AAAA,EACrE,YAAoBC,GAAyB;AAAzB,SAAA,MAAAA,GAClB,KAAK,YAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAoB;AAC1B,UAAM,EAAE,OAAAC,MAAU,KAAK;AAIvB,QAAI,CADaA,EAAM,KAAK,CAAAC,MAAKA,EAAE,SAAS,OAAO;AAEjD,YAAM,IAAIC,EAAiB,yCAAyC,oBAAoB;AAK1F,QAAI,CADWF,EAAM,KAAK,CAAAC,MAAKA,EAAE,SAAS,KAAK;AAE7C,YAAM,IAAIC,EAAiB,uCAAuC,kBAAkB;AAAA,EAExF;AAAA;AAAA;AAAA;AAAA,EAKA,SAASC,GAAsC;AAE7C,QAAIA,EAAQ,eAAe,KAAK,IAAI;AAClC,YAAM,IAAID;AAAA,QACR,wBAAwBC,EAAQ,UAAU,qCAAqC,KAAK,IAAI,UAAU;AAAA,QAClG;AAAA,MAAA;AAIJ,UAAMC,IAA4B,CAAA,GAC5B,EAAE,OAAAJ,MAAU,KAAK,KAGjBK,IAAaL,EAAM,OAAO,CAAAC,MAAKA,EAAE,SAAS,OAAO,GACjDK,IAAeN,EAAM,OAAO,CAAAC,MAAKA,EAAE,SAAS,SAAS,GACrDM,IAAWP,EAAM,OAAO,CAAAC,MAAKA,EAAE,SAAS,KAAK;AAGnD,eAAWO,KAAQH;AACjB,UAAI;AACF,cAAMI,IAAaD,EAAK,SAASL,CAAO;AACxC,QAAAC,EAAO,KAAK,GAAG,KAAK,aAAaK,GAAYD,EAAK,IAAI,CAAC;AAAA,MACzD,SAASE,GAAO;AACd,cAAM,IAAIR;AAAA,UACR,wBAAwBM,EAAK,IAAI,MAAOE,EAAgB,OAAO;AAAA,UAC/D;AAAA,UACAA;AAAA,QAAA;AAAA,MAEJ;AAIF,eAAWF,KAAQF;AACjB,UAAI;AACF,cAAMG,IAAaD,EAAK,SAASL,CAAO;AACxC,QAAAC,EAAO,KAAK,GAAG,KAAK,aAAaK,GAAYD,EAAK,IAAI,CAAC;AAAA,MACzD,SAASE,GAAO;AACd,cAAM,IAAIR;AAAA,UACR,0BAA0BM,EAAK,IAAI,MAAOE,EAAgB,OAAO;AAAA,UACjE;AAAA,UACAA;AAAA,QAAA;AAAA,MAEJ;AAIF,eAAWF,KAAQD;AACjB,UAAI;AACF,cAAME,IAAaD,EAAK,SAASL,CAAO;AACxC,QAAAC,EAAO,KAAK,GAAG,KAAK,aAAaK,GAAYD,EAAK,IAAI,CAAC;AAAA,MACzD,SAASE,GAAO;AACd,cAAM,IAAIR;AAAA,UACR,sBAAsBM,EAAK,IAAI,MAAOE,EAAgB,OAAO;AAAA,UAC7D;AAAA,UACAA;AAAA,QAAA;AAAA,MAEJ;AAGF,WAAON;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAaA,GAA2BO,GAAqC;AACnF,WAAOP,EAAO,IAAI,CAACQ,GAAOC,MAAA;AA7FvB,UAAAC,GAAAC;AA6FkC;AAAA,QACnC,GAAGH;AAAA,QACH,IAAIA,EAAM,MAAM,GAAGD,CAAQ,IAAIE,CAAK;AAAA,QACpC,UAAU;AAAA,UACR,KAAIC,IAAA,KAAK,IAAI,WAAT,gBAAAA,EAAiB,sBAAqB;AAAA,YACxC,YAAY,KAAK,IAAI,OAAO;AAAA,UAAA;AAAA,UAE9B,KAAIC,IAAA,KAAK,IAAI,WAAT,gBAAAA,EAAiB,sBAAqB;AAAA,YACxC,YAAY,KAAK,IAAI,OAAO;AAAA,UAAA;AAAA,UAE9B,GAAGH,EAAM;AAAA,QAAA;AAAA,MACX;AAAA,KACA;AAAA,EACJ;AACF;AAKO,MAAMV,UAAyB,MAAM;AAAA,EAC1C,YACEc,GACOC,GACAC,GACP;AACA,UAAMF,CAAO,GAHN,KAAA,OAAAC,GACA,KAAA,QAAAC,GAGP,KAAK,OAAO;AAAA,EACd;AACF;"}
package/dist/types.d.ts DELETED
@@ -1,174 +0,0 @@
1
- import { SlideContext } from '@slidejs/context';
2
-
3
- /**
4
- * Slide DSL 根对象
5
- */
6
- export interface SlideDSL<TContext extends SlideContext = SlideContext> {
7
- /**
8
- * DSL 版本
9
- */
10
- version: string;
11
- /**
12
- * 数据源类型(必须与 Context.sourceType 匹配)
13
- */
14
- sourceType: string;
15
- /**
16
- * 数据源 ID
17
- */
18
- sourceId: string;
19
- /**
20
- * 规则列表
21
- */
22
- rules: SlideRule<TContext>[];
23
- /**
24
- * 全局配置(可选)
25
- */
26
- config?: SlideConfig;
27
- }
28
- /**
29
- * Slide DSL 规则
30
- */
31
- export interface SlideRule<TContext extends SlideContext = SlideContext> {
32
- /**
33
- * 规则类型
34
- * - start: 开始规则,在内容前执行
35
- * - content: 内容规则,从数据动态生成
36
- * - end: 结束规则,在内容后执行
37
- */
38
- type: 'start' | 'content' | 'end';
39
- /**
40
- * 规则名称(用于调试和日志)
41
- */
42
- name: string;
43
- /**
44
- * 幻灯片生成器函数
45
- * 接收 Context,返回 Slide 定义数组
46
- */
47
- generate: (context: TContext) => SlideDefinition[];
48
- }
49
- /**
50
- * Slide 定义
51
- */
52
- export interface SlideDefinition {
53
- /**
54
- * Slide ID(可选,自动生成如果未提供)
55
- */
56
- id?: string;
57
- /**
58
- * 内容配置
59
- */
60
- content: SlideContent;
61
- /**
62
- * 行为配置(过渡、背景、布局等)
63
- */
64
- behavior?: SlideBehavior;
65
- /**
66
- * 元数据
67
- */
68
- metadata?: Record<string, unknown>;
69
- }
70
- /**
71
- * Slide 内容
72
- */
73
- export type SlideContent = DynamicContent | StaticContent;
74
- /**
75
- * 动态内容(组件)
76
- */
77
- export interface DynamicContent {
78
- type: 'dynamic';
79
- /** 组件名称(如 'wsx-quiz-question') */
80
- component: string;
81
- /** 组件属性 */
82
- props: Record<string, unknown>;
83
- }
84
- /**
85
- * 静态内容(文本)
86
- */
87
- export interface StaticContent {
88
- type: 'text';
89
- /** 文本行数组 */
90
- lines: string[];
91
- /** 格式选项 */
92
- format?: {
93
- /** Markdown 支持 */
94
- markdown?: boolean;
95
- /** HTML 支持 */
96
- html?: boolean;
97
- };
98
- }
99
- /**
100
- * Slide 行为配置
101
- */
102
- export interface SlideBehavior {
103
- /**
104
- * 过渡动画
105
- */
106
- transition?: SlideTransition;
107
- /**
108
- * 背景配置
109
- */
110
- background?: SlideBackground;
111
- /**
112
- * 布局配置
113
- */
114
- layout?: SlideLayout;
115
- /**
116
- * Fragments(分步显示)
117
- */
118
- fragments?: boolean;
119
- /**
120
- * 自动播放(秒数)
121
- */
122
- autoplay?: number;
123
- }
124
- /**
125
- * 过渡动画
126
- */
127
- export interface SlideTransition {
128
- /** 过渡类型 */
129
- type: 'slide' | 'zoom' | 'fade' | 'cube' | 'flip' | 'none';
130
- /** 过渡速度('slow' | 'default' | 'fast' 或毫秒数) */
131
- speed?: 'slow' | 'default' | 'fast' | number;
132
- /** 过渡方向(仅对某些类型有效) */
133
- direction?: 'horizontal' | 'vertical';
134
- /** 自定义选项 */
135
- options?: Record<string, unknown>;
136
- }
137
- /**
138
- * 背景配置
139
- */
140
- export interface SlideBackground {
141
- /** 背景颜色 */
142
- color?: string;
143
- /** 背景图片 */
144
- image?: string;
145
- /** 背景视频 */
146
- video?: string;
147
- /** 背景不透明度 */
148
- opacity?: number;
149
- }
150
- /**
151
- * 布局配置
152
- */
153
- export interface SlideLayout {
154
- /** 对齐方式 */
155
- align?: 'left' | 'center' | 'right';
156
- /** 垂直对齐 */
157
- valign?: 'top' | 'middle' | 'bottom';
158
- /** 内容宽度 */
159
- width?: string | number;
160
- }
161
- /**
162
- * 全局配置
163
- */
164
- export interface SlideConfig {
165
- /** 默认过渡 */
166
- defaultTransition?: SlideTransition;
167
- /** 默认背景 */
168
- defaultBackground?: SlideBackground;
169
- /** 主题 */
170
- theme?: string;
171
- /** 其他配置 */
172
- [key: string]: unknown;
173
- }
174
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}