css2class 2.0.0

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.
Files changed (57) hide show
  1. package/API.md +1143 -0
  2. package/CHANGELOG.md +291 -0
  3. package/CONFIG.md +1096 -0
  4. package/CONTRIBUTING.md +571 -0
  5. package/MIGRATION.md +402 -0
  6. package/README.md +634 -0
  7. package/bin/class2css.js +380 -0
  8. package/class2css.config.js +124 -0
  9. package/common.css +3 -0
  10. package/configs/colors.config.js +62 -0
  11. package/configs/layout.config.js +110 -0
  12. package/configs/spacing.config.js +37 -0
  13. package/configs/typography.config.js +41 -0
  14. package/docs/.vitepress/config.mjs +65 -0
  15. package/docs/.vitepress/theme/custom.css +74 -0
  16. package/docs/.vitepress/theme/index.js +7 -0
  17. package/docs/guide/cli.md +97 -0
  18. package/docs/guide/concepts.md +63 -0
  19. package/docs/guide/config-template.md +365 -0
  20. package/docs/guide/config.md +275 -0
  21. package/docs/guide/faq.md +202 -0
  22. package/docs/guide/getting-started.md +83 -0
  23. package/docs/guide/important-and-static.md +67 -0
  24. package/docs/guide/incremental.md +162 -0
  25. package/docs/guide/rules-reference.md +354 -0
  26. package/docs/guide/units.md +57 -0
  27. package/docs/index.md +68 -0
  28. package/package.json +49 -0
  29. package/run.js +90 -0
  30. package/src/README.md +571 -0
  31. package/src/core/CacheManager.js +650 -0
  32. package/src/core/CompatibilityAdapter.js +264 -0
  33. package/src/core/ConfigManager.js +431 -0
  34. package/src/core/ConfigValidator.js +350 -0
  35. package/src/core/EventBus.js +77 -0
  36. package/src/core/FullScanManager.js +430 -0
  37. package/src/core/StateManager.js +631 -0
  38. package/src/docs/DocsServer.js +179 -0
  39. package/src/example.js +106 -0
  40. package/src/generators/DynamicClassGenerator.js +674 -0
  41. package/src/index.js +1046 -0
  42. package/src/parsers/ClassParser.js +572 -0
  43. package/src/parsers/ImportantParser.js +279 -0
  44. package/src/parsers/RegexCompiler.js +200 -0
  45. package/src/utils/ClassChangeTracker.js +366 -0
  46. package/src/utils/ConfigDiagnostics.js +673 -0
  47. package/src/utils/CssFormatter.js +261 -0
  48. package/src/utils/FileUtils.js +230 -0
  49. package/src/utils/Logger.js +150 -0
  50. package/src/utils/Throttle.js +172 -0
  51. package/src/utils/UnitProcessor.js +334 -0
  52. package/src/utils/WxssClassExtractor.js +137 -0
  53. package/src/watchers/ConfigWatcher.js +413 -0
  54. package/src/watchers/FileWatcher.js +133 -0
  55. package/src/writers/FileWriter.js +302 -0
  56. package/src/writers/UnifiedWriter.js +370 -0
  57. package/styles.config.js +250 -0
package/API.md ADDED
@@ -0,0 +1,1143 @@
1
+ # Class2CSS API 文档
2
+
3
+ 本文档详细说明 Class2CSS 的所有 API 接口。
4
+
5
+ ## 📋 目录
6
+
7
+ - [主类 API](#主类-api)
8
+ - [核心模块 API](#核心模块-api)
9
+ - [工具模块 API](#工具模块-api)
10
+ - [事件系统](#事件系统)
11
+ - [使用示例](#使用示例)
12
+
13
+ ## 主类 API
14
+
15
+ ### Class2CSS
16
+
17
+ 主入口类,提供完整的功能接口。
18
+
19
+ #### 构造函数
20
+
21
+ ```javascript
22
+ new Class2CSS(options)
23
+ ```
24
+
25
+ **参数**:
26
+
27
+ | 参数 | 类型 | 必需 | 默认值 | 说明 |
28
+ |------|------|------|--------|------|
29
+ | options.configPath | string | 否 | `'./class2css.config.js'` | 配置文件路径 |
30
+ | options.cacheSize | number | 否 | `1000` | 缓存大小 |
31
+ | options.logger | object | 否 | - | 日志配置 |
32
+ | options.logger.level | string | 否 | `'info'` | 日志级别 |
33
+ | options.logger.enableDebug | boolean | 否 | `false` | 是否启用调试模式 |
34
+ | options.logger.enableTimestamp | boolean | 否 | `true` | 是否显示时间戳 |
35
+
36
+ **示例**:
37
+
38
+ ```javascript
39
+ const Class2CSS = require('class2css');
40
+
41
+ const tool = new Class2CSS({
42
+ configPath: './class2css.config.js',
43
+ cacheSize: 1000,
44
+ logger: {
45
+ level: 'info',
46
+ enableDebug: true,
47
+ enableTimestamp: true
48
+ }
49
+ });
50
+ ```
51
+
52
+ #### start()
53
+
54
+ 启动 Class2CSS 工具。
55
+
56
+ ```javascript
57
+ async start(): Promise<void>
58
+ ```
59
+
60
+ **返回值**: `Promise<void>`
61
+
62
+ **示例**:
63
+
64
+ ```javascript
65
+ await tool.start();
66
+ console.log('Class2CSS started');
67
+ ```
68
+
69
+ **触发事件**:
70
+ - `class2css:started` - 启动成功
71
+
72
+ #### stop()
73
+
74
+ 停止 Class2CSS 工具。
75
+
76
+ ```javascript
77
+ async stop(): Promise<void>
78
+ ```
79
+
80
+ **返回值**: `Promise<void>`
81
+
82
+ **示例**:
83
+
84
+ ```javascript
85
+ await tool.stop();
86
+ console.log('Class2CSS stopped');
87
+ ```
88
+
89
+ **触发事件**:
90
+ - `class2css:stopped` - 停止成功
91
+
92
+ #### handleFileChange()
93
+
94
+ 处理文件变更。
95
+
96
+ ```javascript
97
+ async handleFileChange(filePath: string): Promise<void>
98
+ ```
99
+
100
+ **参数**:
101
+
102
+ | 参数 | 类型 | 必需 | 说明 |
103
+ |------|------|------|------|
104
+ | filePath | string | 是 | 变更的文件路径 |
105
+
106
+ **返回值**: `Promise<void>`
107
+
108
+ **示例**:
109
+
110
+ ```javascript
111
+ await tool.handleFileChange('./pages/index.wxml');
112
+ ```
113
+
114
+ **触发事件**:
115
+ - `file:changed` - 文件变更开始处理
116
+ - `parser:completed` - 解析完成
117
+ - `generator:dynamic:completed` - 生成完成
118
+
119
+ #### performFullScan()
120
+
121
+ 执行全量扫描。
122
+
123
+ ```javascript
124
+ async performFullScan(): Promise<void>
125
+ ```
126
+
127
+ **返回值**: `Promise<void>`
128
+
129
+ **示例**:
130
+
131
+ ```javascript
132
+ await tool.performFullScan();
133
+ console.log('Full scan completed');
134
+ ```
135
+
136
+ #### getStatus()
137
+
138
+ 获取当前状态。
139
+
140
+ ```javascript
141
+ getStatus(): object
142
+ ```
143
+
144
+ **返回值**:
145
+
146
+ ```typescript
147
+ {
148
+ isRunning: boolean;
149
+ stats: {
150
+ totalClasses: number;
151
+ dynamicClasses: number;
152
+ staticClasses: number;
153
+ };
154
+ config: object;
155
+ }
156
+ ```
157
+
158
+ **示例**:
159
+
160
+ ```javascript
161
+ const status = tool.getStatus();
162
+ console.log('Total classes:', status.stats.totalClasses);
163
+ ```
164
+
165
+ #### getEventBus()
166
+
167
+ 获取事件总线实例。
168
+
169
+ ```javascript
170
+ getEventBus(): EventBus
171
+ ```
172
+
173
+ **返回值**: `EventBus` 实例
174
+
175
+ **示例**:
176
+
177
+ ```javascript
178
+ const eventBus = tool.getEventBus();
179
+ eventBus.on('parser:completed', (stats) => {
180
+ console.log('Parsed:', stats.totalCount);
181
+ });
182
+ ```
183
+
184
+ #### getModules()
185
+
186
+ 获取所有内部模块。
187
+
188
+ ```javascript
189
+ getModules(): object
190
+ ```
191
+
192
+ **返回值**:
193
+
194
+ ```typescript
195
+ {
196
+ eventBus: EventBus;
197
+ logger: Logger;
198
+ configManager: ConfigManager;
199
+ stateManager: StateManager;
200
+ cacheManager: CacheManager;
201
+ regexCompiler: RegexCompiler;
202
+ importantParser: ImportantParser;
203
+ classParser: ClassParser;
204
+ dynamicClassGenerator: DynamicClassGenerator;
205
+ fileWriter: FileWriter;
206
+ fileWatcher: FileWatcher;
207
+ configWatcher: ConfigWatcher;
208
+ }
209
+ ```
210
+
211
+ **示例**:
212
+
213
+ ```javascript
214
+ const modules = tool.getModules();
215
+ const { logger, configManager } = modules;
216
+
217
+ logger.info('Current config:', configManager.getConfig());
218
+ ```
219
+
220
+ ## 核心模块 API
221
+
222
+ ### EventBus
223
+
224
+ 事件总线,提供模块间通信机制。
225
+
226
+ #### on()
227
+
228
+ 注册事件监听器。
229
+
230
+ ```javascript
231
+ on(eventName: string, handler: Function): void
232
+ ```
233
+
234
+ **参数**:
235
+
236
+ | 参数 | 类型 | 必需 | 说明 |
237
+ |------|------|------|------|
238
+ | eventName | string | 是 | 事件名称 |
239
+ | handler | Function | 是 | 事件处理函数 |
240
+
241
+ **示例**:
242
+
243
+ ```javascript
244
+ eventBus.on('parser:completed', (stats) => {
245
+ console.log('Parsing completed:', stats);
246
+ });
247
+ ```
248
+
249
+ #### once()
250
+
251
+ 注册一次性事件监听器。
252
+
253
+ ```javascript
254
+ once(eventName: string, handler: Function): void
255
+ ```
256
+
257
+ **示例**:
258
+
259
+ ```javascript
260
+ eventBus.once('class2css:started', () => {
261
+ console.log('Started for the first time');
262
+ });
263
+ ```
264
+
265
+ #### emit()
266
+
267
+ 触发事件。
268
+
269
+ ```javascript
270
+ emit(eventName: string, data?: any): void
271
+ ```
272
+
273
+ **参数**:
274
+
275
+ | 参数 | 类型 | 必需 | 说明 |
276
+ |------|------|------|------|
277
+ | eventName | string | 是 | 事件名称 |
278
+ | data | any | 否 | 事件数据 |
279
+
280
+ **示例**:
281
+
282
+ ```javascript
283
+ eventBus.emit('custom:event', { message: 'Hello' });
284
+ ```
285
+
286
+ #### off()
287
+
288
+ 移除事件监听器。
289
+
290
+ ```javascript
291
+ off(eventName: string, handler?: Function): void
292
+ ```
293
+
294
+ **示例**:
295
+
296
+ ```javascript
297
+ // 移除特定处理函数
298
+ eventBus.off('parser:completed', myHandler);
299
+
300
+ // 移除所有监听器
301
+ eventBus.off('parser:completed');
302
+ ```
303
+
304
+ #### clear()
305
+
306
+ 清除所有事件监听器。
307
+
308
+ ```javascript
309
+ clear(): void
310
+ ```
311
+
312
+ **示例**:
313
+
314
+ ```javascript
315
+ eventBus.clear();
316
+ ```
317
+
318
+ ### ConfigManager
319
+
320
+ 配置管理器,处理配置加载和验证。
321
+
322
+ #### getConfig()
323
+
324
+ 获取完整配置。
325
+
326
+ ```javascript
327
+ getConfig(): object
328
+ ```
329
+
330
+ **返回值**: 配置对象
331
+
332
+ **示例**:
333
+
334
+ ```javascript
335
+ const config = configManager.getConfig();
336
+ console.log('Base unit:', config.system.baseUnit);
337
+ ```
338
+
339
+ #### getSystemConfig()
340
+
341
+ 获取系统配置。
342
+
343
+ ```javascript
344
+ getSystemConfig(): object
345
+ ```
346
+
347
+ **返回值**: 系统配置对象
348
+
349
+ **示例**:
350
+
351
+ ```javascript
352
+ const systemConfig = configManager.getSystemConfig();
353
+ console.log('Unit conversion:', systemConfig.unitConversion);
354
+ ```
355
+
356
+ #### getOutputConfig()
357
+
358
+ 获取输出配置。
359
+
360
+ ```javascript
361
+ getOutputConfig(): object
362
+ ```
363
+
364
+ **返回值**: 输出配置对象
365
+
366
+ **示例**:
367
+
368
+ ```javascript
369
+ const outputConfig = configManager.getOutputConfig();
370
+ console.log('Output path:', outputConfig.path);
371
+ ```
372
+
373
+ #### getCssNameMap()
374
+
375
+ 获取 CSS 名称映射。
376
+
377
+ ```javascript
378
+ getCssNameMap(): Map
379
+ ```
380
+
381
+ **返回值**: CSS 名称映射 Map
382
+
383
+ **示例**:
384
+
385
+ ```javascript
386
+ const cssNameMap = configManager.getCssNameMap();
387
+ console.log('Has margin:', cssNameMap.has('m'));
388
+ ```
389
+
390
+ #### getBaseUnit()
391
+
392
+ 获取基础单位。
393
+
394
+ ```javascript
395
+ getBaseUnit(): string
396
+ ```
397
+
398
+ **返回值**: 基础单位字符串
399
+
400
+ **示例**:
401
+
402
+ ```javascript
403
+ const baseUnit = configManager.getBaseUnit();
404
+ console.log('Base unit:', baseUnit); // 'rpx'
405
+ ```
406
+
407
+ #### getUnitConversion()
408
+
409
+ 获取单位转换比例。
410
+
411
+ ```javascript
412
+ getUnitConversion(): number
413
+ ```
414
+
415
+ **返回值**: 转换比例数值
416
+
417
+ **示例**:
418
+
419
+ ```javascript
420
+ const conversion = configManager.getUnitConversion();
421
+ console.log('Conversion:', conversion); // 2
422
+ ```
423
+
424
+ #### reloadConfig()
425
+
426
+ 重新加载配置。
427
+
428
+ ```javascript
429
+ async reloadConfig(): Promise<void>
430
+ ```
431
+
432
+ **返回值**: `Promise<void>`
433
+
434
+ **示例**:
435
+
436
+ ```javascript
437
+ await configManager.reloadConfig();
438
+ console.log('Config reloaded');
439
+ ```
440
+
441
+ **触发事件**:
442
+ - `config:reloaded` - 配置重新加载完成
443
+
444
+ ### StateManager
445
+
446
+ 状态管理器,管理全局状态。
447
+
448
+ #### updateClassListSet()
449
+
450
+ 更新类列表集合。
451
+
452
+ ```javascript
453
+ updateClassListSet(classList: Set<string>): void
454
+ ```
455
+
456
+ **参数**:
457
+
458
+ | 参数 | 类型 | 必需 | 说明 |
459
+ |------|------|------|------|
460
+ | classList | Set<string> | 是 | 类名集合 |
461
+
462
+ **示例**:
463
+
464
+ ```javascript
465
+ const classList = new Set(['m-10', 'p-20', 'w-100']);
466
+ stateManager.updateClassListSet(classList);
467
+ ```
468
+
469
+ #### getClassListSet()
470
+
471
+ 获取类列表集合。
472
+
473
+ ```javascript
474
+ getClassListSet(): Set<string>
475
+ ```
476
+
477
+ **返回值**: 类名集合
478
+
479
+ **示例**:
480
+
481
+ ```javascript
482
+ const classList = stateManager.getClassListSet();
483
+ console.log('Total classes:', classList.size);
484
+ ```
485
+
486
+ #### getStats()
487
+
488
+ 获取统计信息。
489
+
490
+ ```javascript
491
+ getStats(): object
492
+ ```
493
+
494
+ **返回值**:
495
+
496
+ ```typescript
497
+ {
498
+ totalClasses: number;
499
+ dynamicClasses: number;
500
+ staticClasses: number;
501
+ }
502
+ ```
503
+
504
+ **示例**:
505
+
506
+ ```javascript
507
+ const stats = stateManager.getStats();
508
+ console.log('Statistics:', stats);
509
+ ```
510
+
511
+ #### isScanning()
512
+
513
+ 检查是否正在扫描。
514
+
515
+ ```javascript
516
+ isScanning(): boolean
517
+ ```
518
+
519
+ **返回值**: 布尔值
520
+
521
+ **示例**:
522
+
523
+ ```javascript
524
+ if (stateManager.isScanning()) {
525
+ console.log('Scanning in progress...');
526
+ }
527
+ ```
528
+
529
+ #### setScanning()
530
+
531
+ 设置扫描状态。
532
+
533
+ ```javascript
534
+ setScanning(scanning: boolean): void
535
+ ```
536
+
537
+ **参数**:
538
+
539
+ | 参数 | 类型 | 必需 | 说明 |
540
+ |------|------|------|------|
541
+ | scanning | boolean | 是 | 是否正在扫描 |
542
+
543
+ **示例**:
544
+
545
+ ```javascript
546
+ stateManager.setScanning(true);
547
+ ```
548
+
549
+ ### CacheManager
550
+
551
+ 缓存管理器,处理各种缓存。
552
+
553
+ #### getFileCache()
554
+
555
+ 获取文件缓存。
556
+
557
+ ```javascript
558
+ getFileCache(filePath: string): string | null
559
+ ```
560
+
561
+ **参数**:
562
+
563
+ | 参数 | 类型 | 必需 | 说明 |
564
+ |------|------|------|------|
565
+ | filePath | string | 是 | 文件路径 |
566
+
567
+ **返回值**: 文件内容或 null
568
+
569
+ **示例**:
570
+
571
+ ```javascript
572
+ const content = cacheManager.getFileCache('./index.wxml');
573
+ if (content) {
574
+ console.log('Cache hit');
575
+ }
576
+ ```
577
+
578
+ #### setFileCache()
579
+
580
+ 设置文件缓存。
581
+
582
+ ```javascript
583
+ setFileCache(filePath: string, content: string): void
584
+ ```
585
+
586
+ **参数**:
587
+
588
+ | 参数 | 类型 | 必需 | 说明 |
589
+ |------|------|------|------|
590
+ | filePath | string | 是 | 文件路径 |
591
+ | content | string | 是 | 文件内容 |
592
+
593
+ **示例**:
594
+
595
+ ```javascript
596
+ cacheManager.setFileCache('./index.wxml', content);
597
+ ```
598
+
599
+ #### clearFileCache()
600
+
601
+ 清除文件缓存。
602
+
603
+ ```javascript
604
+ clearFileCache(filePath?: string): void
605
+ ```
606
+
607
+ **参数**:
608
+
609
+ | 参数 | 类型 | 必需 | 说明 |
610
+ |------|------|------|------|
611
+ | filePath | string | 否 | 文件路径(不提供则清除所有) |
612
+
613
+ **示例**:
614
+
615
+ ```javascript
616
+ // 清除特定文件缓存
617
+ cacheManager.clearFileCache('./index.wxml');
618
+
619
+ // 清除所有文件缓存
620
+ cacheManager.clearFileCache();
621
+ ```
622
+
623
+ #### getCacheStats()
624
+
625
+ 获取缓存统计。
626
+
627
+ ```javascript
628
+ getCacheStats(): object
629
+ ```
630
+
631
+ **返回值**:
632
+
633
+ ```typescript
634
+ {
635
+ file: {
636
+ size: number;
637
+ hitRate: number;
638
+ };
639
+ cssGeneration: {
640
+ hits: number;
641
+ misses: number;
642
+ hitRate: number;
643
+ };
644
+ memoryUsage: {
645
+ kb: number;
646
+ mb: number;
647
+ };
648
+ }
649
+ ```
650
+
651
+ **示例**:
652
+
653
+ ```javascript
654
+ const stats = cacheManager.getCacheStats();
655
+ console.log('Cache hit rate:', stats.file.hitRate);
656
+ console.log('Memory usage:', stats.memoryUsage.mb, 'MB');
657
+ ```
658
+
659
+ ## 工具模块 API
660
+
661
+ ### Logger
662
+
663
+ 日志工具,提供统一的日志输出。
664
+
665
+ #### info()
666
+
667
+ 输出信息日志。
668
+
669
+ ```javascript
670
+ info(message: string, ...args: any[]): void
671
+ ```
672
+
673
+ **示例**:
674
+
675
+ ```javascript
676
+ logger.info('Processing file:', filePath);
677
+ ```
678
+
679
+ #### warn()
680
+
681
+ 输出警告日志。
682
+
683
+ ```javascript
684
+ warn(message: string, ...args: any[]): void
685
+ ```
686
+
687
+ **示例**:
688
+
689
+ ```javascript
690
+ logger.warn('Config not found, using default');
691
+ ```
692
+
693
+ #### error()
694
+
695
+ 输出错误日志。
696
+
697
+ ```javascript
698
+ error(message: string, ...args: any[]): void
699
+ ```
700
+
701
+ **示例**:
702
+
703
+ ```javascript
704
+ logger.error('Failed to parse file:', error);
705
+ ```
706
+
707
+ #### debug()
708
+
709
+ 输出调试日志。
710
+
711
+ ```javascript
712
+ debug(message: string, ...args: any[]): void
713
+ ```
714
+
715
+ **示例**:
716
+
717
+ ```javascript
718
+ logger.debug('Cache stats:', cacheStats);
719
+ ```
720
+
721
+ #### setLevel()
722
+
723
+ 设置日志级别。
724
+
725
+ ```javascript
726
+ setLevel(level: string): void
727
+ ```
728
+
729
+ **参数**:
730
+
731
+ | 参数 | 类型 | 可选值 | 说明 |
732
+ |------|------|--------|------|
733
+ | level | string | `'debug'` \| `'info'` \| `'warn'` \| `'error'` | 日志级别 |
734
+
735
+ **示例**:
736
+
737
+ ```javascript
738
+ logger.setLevel('debug');
739
+ ```
740
+
741
+ #### setDebugMode()
742
+
743
+ 设置调试模式。
744
+
745
+ ```javascript
746
+ setDebugMode(enabled: boolean): void
747
+ ```
748
+
749
+ **示例**:
750
+
751
+ ```javascript
752
+ logger.setDebugMode(true);
753
+ ```
754
+
755
+ ### UnitProcessor
756
+
757
+ 单位处理器,处理单位转换和检测。
758
+
759
+ #### processValue()
760
+
761
+ 处理数值和单位。
762
+
763
+ ```javascript
764
+ processValue(value: string, property: string, config: object): string
765
+ ```
766
+
767
+ **参数**:
768
+
769
+ | 参数 | 类型 | 必需 | 说明 |
770
+ |------|------|------|------|
771
+ | value | string | 是 | 原始值 |
772
+ | property | string | 是 | CSS 属性名 |
773
+ | config | object | 是 | 配置对象 |
774
+
775
+ **返回值**: 处理后的值
776
+
777
+ **示例**:
778
+
779
+ ```javascript
780
+ const result = unitProcessor.processValue('10', 'margin', config);
781
+ console.log(result); // '20rpx'
782
+ ```
783
+
784
+ #### detectUnit()
785
+
786
+ 检测值中的单位。
787
+
788
+ ```javascript
789
+ detectUnit(value: string): { value: number, unit: string }
790
+ ```
791
+
792
+ **参数**:
793
+
794
+ | 参数 | 类型 | 必需 | 说明 |
795
+ |------|------|------|------|
796
+ | value | string | 是 | 包含单位的值 |
797
+
798
+ **返回值**: 包含数值和单位的对象
799
+
800
+ **示例**:
801
+
802
+ ```javascript
803
+ const result = unitProcessor.detectUnit('10px');
804
+ console.log(result); // { value: 10, unit: 'px' }
805
+ ```
806
+
807
+ ### ConfigValidator
808
+
809
+ 配置验证器,验证配置正确性。
810
+
811
+ #### validateConfig()
812
+
813
+ 验证配置。
814
+
815
+ ```javascript
816
+ validateConfig(config: object): ValidationResult
817
+ ```
818
+
819
+ **参数**:
820
+
821
+ | 参数 | 类型 | 必需 | 说明 |
822
+ |------|------|------|------|
823
+ | config | object | 是 | 配置对象 |
824
+
825
+ **返回值**:
826
+
827
+ ```typescript
828
+ {
829
+ isValid: boolean;
830
+ errors: string[];
831
+ warnings: string[];
832
+ }
833
+ ```
834
+
835
+ **示例**:
836
+
837
+ ```javascript
838
+ const result = validator.validateConfig(config);
839
+ if (!result.isValid) {
840
+ console.error('Config errors:', result.errors);
841
+ }
842
+ ```
843
+
844
+ #### autoFix()
845
+
846
+ 自动修复配置问题。
847
+
848
+ ```javascript
849
+ autoFix(config: object): object
850
+ ```
851
+
852
+ **参数**:
853
+
854
+ | 参数 | 类型 | 必需 | 说明 |
855
+ |------|------|------|------|
856
+ | config | object | 是 | 配置对象 |
857
+
858
+ **返回值**: 修复后的配置对象
859
+
860
+ **示例**:
861
+
862
+ ```javascript
863
+ const fixedConfig = validator.autoFix(config);
864
+ ```
865
+
866
+ ## 事件系统
867
+
868
+ Class2CSS 使用事件驱动架构,以下是所有可用事件。
869
+
870
+ ### 生命周期事件
871
+
872
+ | 事件名 | 数据 | 说明 |
873
+ |--------|------|------|
874
+ | `class2css:started` | - | Class2CSS 启动完成 |
875
+ | `class2css:stopped` | - | Class2CSS 停止完成 |
876
+
877
+ ### 配置事件
878
+
879
+ | 事件名 | 数据 | 说明 |
880
+ |--------|------|------|
881
+ | `config:loaded` | `config: object` | 配置加载完成 |
882
+ | `config:reloaded` | `config: object` | 配置重新加载完成 |
883
+ | `config:error` | `error: Error` | 配置加载错误 |
884
+
885
+ ### 文件事件
886
+
887
+ | 事件名 | 数据 | 说明 |
888
+ |--------|------|------|
889
+ | `file:changed` | `filePath: string` | 文件变更 |
890
+ | `file:added` | `filePath: string` | 文件添加 |
891
+ | `file:removed` | `filePath: string` | 文件删除 |
892
+
893
+ ### 解析事件
894
+
895
+ | 事件名 | 数据 | 说明 |
896
+ |--------|------|------|
897
+ | `parser:started` | `filePath: string` | 开始解析 |
898
+ | `parser:completed` | `stats: object` | 解析完成 |
899
+ | `parser:error` | `error: Error` | 解析错误 |
900
+
901
+ ### 生成事件
902
+
903
+ | 事件名 | 数据 | 说明 |
904
+ |--------|------|------|
905
+ | `generator:dynamic:started` | - | 开始生成动态类 |
906
+ | `generator:dynamic:completed` | `stats: object` | 动态类生成完成 |
907
+ | `generator:static:completed` | `stats: object` | 静态类生成完成 |
908
+
909
+ ### 缓存事件
910
+
911
+ | 事件名 | 数据 | 说明 |
912
+ |--------|------|------|
913
+ | `cache:file:hit` | `filePath: string` | 文件缓存命中 |
914
+ | `cache:file:miss` | `filePath: string` | 文件缓存未命中 |
915
+ | `cache:file:updated` | `filePath: string` | 文件缓存更新 |
916
+ | `cache:cleared` | - | 缓存已清除 |
917
+
918
+ ### 日志事件
919
+
920
+ | 事件名 | 数据 | 说明 |
921
+ |--------|------|------|
922
+ | `log:info` | `message: string` | 信息日志 |
923
+ | `log:warn` | `message: string` | 警告日志 |
924
+ | `log:error` | `message: string` | 错误日志 |
925
+ | `log:debug` | `message: string` | 调试日志 |
926
+
927
+ ## 使用示例
928
+
929
+ ### 基本使用
930
+
931
+ ```javascript
932
+ const Class2CSS = require('class2css');
933
+
934
+ // 创建实例
935
+ const tool = new Class2CSS({
936
+ configPath: './class2css.config.js'
937
+ });
938
+
939
+ // 启动
940
+ await tool.start();
941
+
942
+ // 获取状态
943
+ const status = tool.getStatus();
944
+ console.log('Status:', status);
945
+
946
+ // 停止
947
+ await tool.stop();
948
+ ```
949
+
950
+ ### 监听事件
951
+
952
+ ```javascript
953
+ const eventBus = tool.getEventBus();
954
+
955
+ // 监听解析完成
956
+ eventBus.on('parser:completed', (stats) => {
957
+ console.log('Parsed classes:', stats.totalCount);
958
+ });
959
+
960
+ // 监听生成完成
961
+ eventBus.on('generator:dynamic:completed', (stats) => {
962
+ console.log('Generated:', stats.generatedCount);
963
+ });
964
+
965
+ // 监听错误
966
+ eventBus.on('log:error', (error) => {
967
+ console.error('Error occurred:', error);
968
+ });
969
+ ```
970
+
971
+ ### 手动处理文件
972
+
973
+ ```javascript
974
+ // 处理单个文件
975
+ await tool.handleFileChange('./pages/index.wxml');
976
+
977
+ // 执行全量扫描
978
+ await tool.performFullScan();
979
+ ```
980
+
981
+ ### 访问内部模块
982
+
983
+ ```javascript
984
+ const modules = tool.getModules();
985
+ const { configManager, cacheManager, logger } = modules;
986
+
987
+ // 获取配置
988
+ const config = configManager.getConfig();
989
+ console.log('Config:', config);
990
+
991
+ // 查看缓存统计
992
+ const cacheStats = cacheManager.getCacheStats();
993
+ console.log('Cache stats:', cacheStats);
994
+
995
+ // 设置日志级别
996
+ logger.setLevel('debug');
997
+ ```
998
+
999
+ ### 配置验证
1000
+
1001
+ ```javascript
1002
+ const { ConfigValidator } = require('class2css');
1003
+
1004
+ const validator = new ConfigValidator(eventBus);
1005
+ const result = validator.validateConfig(config);
1006
+
1007
+ if (!result.isValid) {
1008
+ console.error('Errors:', result.errors);
1009
+ console.warn('Warnings:', result.warnings);
1010
+
1011
+ // 自动修复
1012
+ const fixedConfig = validator.autoFix(config);
1013
+ console.log('Fixed config:', fixedConfig);
1014
+ }
1015
+ ```
1016
+
1017
+ ### 配置诊断
1018
+
1019
+ ```javascript
1020
+ const { ConfigDiagnostics } = require('class2css');
1021
+
1022
+ const diagnostics = new ConfigDiagnostics(eventBus, configManager);
1023
+ const results = await diagnostics.runFullDiagnostics();
1024
+
1025
+ // 生成报告
1026
+ const report = diagnostics.generateReport();
1027
+ console.log(report);
1028
+
1029
+ // 获取优化建议
1030
+ const suggestions = diagnostics.generateOptimizationSuggestions();
1031
+ console.log('Suggestions:', suggestions);
1032
+ ```
1033
+
1034
+ ### 自定义事件处理
1035
+
1036
+ ```javascript
1037
+ // 创建自定义事件处理器
1038
+ class CustomHandler {
1039
+ constructor(eventBus) {
1040
+ this.eventBus = eventBus;
1041
+ this.setupListeners();
1042
+ }
1043
+
1044
+ setupListeners() {
1045
+ this.eventBus.on('parser:completed', this.onParseComplete.bind(this));
1046
+ this.eventBus.on('generator:dynamic:completed', this.onGenerateComplete.bind(this));
1047
+ }
1048
+
1049
+ onParseComplete(stats) {
1050
+ console.log('Parse completed:', stats);
1051
+ // 自定义处理逻辑
1052
+ }
1053
+
1054
+ onGenerateComplete(stats) {
1055
+ console.log('Generate completed:', stats);
1056
+ // 自定义处理逻辑
1057
+ }
1058
+ }
1059
+
1060
+ // 使用
1061
+ const handler = new CustomHandler(tool.getEventBus());
1062
+ ```
1063
+
1064
+ ### 性能监控
1065
+
1066
+ ```javascript
1067
+ // 监控缓存性能
1068
+ setInterval(() => {
1069
+ const stats = cacheManager.getCacheStats();
1070
+ console.log('Cache hit rate:', stats.file.hitRate);
1071
+ console.log('Memory usage:', stats.memoryUsage.mb, 'MB');
1072
+ }, 10000);
1073
+
1074
+ // 监控解析性能
1075
+ let parseCount = 0;
1076
+ let parseTime = 0;
1077
+
1078
+ eventBus.on('parser:started', () => {
1079
+ parseTime = Date.now();
1080
+ });
1081
+
1082
+ eventBus.on('parser:completed', () => {
1083
+ parseCount++;
1084
+ const duration = Date.now() - parseTime;
1085
+ console.log(`Parse #${parseCount} took ${duration}ms`);
1086
+ });
1087
+ ```
1088
+
1089
+ ## TypeScript 类型定义
1090
+
1091
+ ```typescript
1092
+ // 主类
1093
+ declare class Class2CSS {
1094
+ constructor(options?: Class2CSSOptions);
1095
+ start(): Promise<void>;
1096
+ stop(): Promise<void>;
1097
+ handleFileChange(filePath: string): Promise<void>;
1098
+ performFullScan(): Promise<void>;
1099
+ getStatus(): Status;
1100
+ getEventBus(): EventBus;
1101
+ getModules(): Modules;
1102
+ }
1103
+
1104
+ // 配置选项
1105
+ interface Class2CSSOptions {
1106
+ configPath?: string;
1107
+ cacheSize?: number;
1108
+ logger?: LoggerOptions;
1109
+ }
1110
+
1111
+ interface LoggerOptions {
1112
+ level?: 'debug' | 'info' | 'warn' | 'error';
1113
+ enableDebug?: boolean;
1114
+ enableTimestamp?: boolean;
1115
+ }
1116
+
1117
+ // 状态
1118
+ interface Status {
1119
+ isRunning: boolean;
1120
+ stats: Stats;
1121
+ config: Config;
1122
+ }
1123
+
1124
+ interface Stats {
1125
+ totalClasses: number;
1126
+ dynamicClasses: number;
1127
+ staticClasses: number;
1128
+ }
1129
+
1130
+ // 事件总线
1131
+ declare class EventBus {
1132
+ on(eventName: string, handler: Function): void;
1133
+ once(eventName: string, handler: Function): void;
1134
+ emit(eventName: string, data?: any): void;
1135
+ off(eventName: string, handler?: Function): void;
1136
+ clear(): void;
1137
+ }
1138
+ ```
1139
+
1140
+ ---
1141
+
1142
+ > 💡 更多使用示例请参考项目中的 `src/example.js` 文件。
1143
+