@@ -2,76 +2,74 @@ import * as fs from 'fs';
2
2
import * as path from 'path' ;
3
3
import { extractClassesFromTemplate , extractClassesFromCss } from './extractors' ;
4
4
5
- interface FileInfo {
5
+ export interface FileInfo {
6
6
name : string ;
7
7
path : string ;
8
8
}
9
9
10
- interface ExtractedClasses {
11
- classes : string ;
10
+ export interface ExtractedData {
11
+ data : string [ ] | string ;
12
12
path : string ;
13
13
}
14
14
15
- interface ExtractedSelectors {
16
- selectors : string [ ] ;
17
- path : string ;
15
+ // Generic function to read file content
16
+ function readFileContent ( filePath : string ) : string {
17
+ return fs . readFileSync ( filePath , 'utf8' ) ;
18
18
}
19
19
20
- /**
21
- * Processes template files to extract CSS classes
22
- * @param templateFiles - Array of template file objects
23
- * @returns Array of objects containing extracted classes and file paths
24
- */
25
- export function processTemplateFilesToExtractClasses ( templateFiles : FileInfo [ ] ) : ExtractedClasses [ ] {
26
- return templateFiles . map ( ( file ) => {
27
- const content = fs . readFileSync ( file . path , 'utf8' ) ;
28
- const classes = extractClassesFromTemplate ( content ) ;
29
- return {
30
- classes : classes . join ( ' ' ) ,
31
- path : file . path ,
32
- } ;
33
- } ) . filter ( ( item ) => item . classes . length > 0 ) ;
20
+ // Generic function to process files
21
+ function processFiles < T extends ExtractedData > (
22
+ files : FileInfo [ ] ,
23
+ extractorFn : ( content : string ) => string [ ] ,
24
+ dataProcessor : ( data : string [ ] ) => T [ 'data' ]
25
+ ) : T [ ] {
26
+ return files
27
+ . map ( ( file ) => {
28
+ const content = readFileContent ( file . path ) ;
29
+ try {
30
+ const extractedData = extractorFn ( content ) ;
31
+ return {
32
+ data : dataProcessor ( extractedData ) ,
33
+ path : file . path ,
34
+ } as T ;
35
+ } catch ( error ) {
36
+ console . error ( `Error processing file ${ file . path } : ${ ( error as Error ) . message } ` ) ;
37
+ return null ;
38
+ }
39
+ } )
40
+ . filter ( ( item ) : item is T => item !== null && item . data . length > 0 ) ;
34
41
}
35
42
36
- /**
37
- * Processes CSS files to extract classes
38
- * @param cssFiles - Array of CSS file objects
39
- * @returns Array of objects containing extracted selectors and file paths
40
- */
41
- export function processCssFilesToExtractClasses ( cssFiles : FileInfo [ ] ) : ExtractedSelectors [ ] {
42
- return cssFiles . map ( ( file ) => {
43
- const content = fs . readFileSync ( file . path , 'utf8' ) ;
44
- try {
45
- const selectors = extractClassesFromCss ( content , { extractOnly : 'classes' } ) ;
46
- return {
47
- selectors,
48
- path : file . path ,
49
- } ;
50
- } catch ( error ) {
51
- console . error ( `Error processing file ${ file . path } : ${ ( error as Error ) . message } ` ) ;
52
- return null ;
53
- }
54
- } ) . filter ( ( item ) : item is ExtractedSelectors => item !== null && item . selectors . length > 0 ) ;
43
+ // Process template files
44
+ export function processTemplateFilesToExtractClasses ( templateFiles : FileInfo [ ] ) : ExtractedData [ ] {
45
+ return processFiles < ExtractedData > (
46
+ templateFiles ,
47
+ extractClassesFromTemplate ,
48
+ ( classes ) => classes . join ( ' ' )
49
+ ) ;
55
50
}
56
51
57
- /**
58
- * Writes extracted template classes to a file
59
- * @param templateClasses - Array of objects containing extracted classes and file paths
60
- * @param fileName - Name of the output file
61
- * @param uncssTempDir - Temporary directory for uncss
62
- */
63
- export function writeTemplateClassesToFile ( templateClasses : ExtractedClasses [ ] , fileName : string , uncssTempDir : string ) : void {
64
- const outputPath = path . join ( uncssTempDir , fileName ) ;
65
- fs . writeFileSync ( outputPath , JSON . stringify ( templateClasses , null , 2 ) ) ;
52
+ // Process CSS files
53
+ export function processCssFilesToExtractClasses ( cssFiles : FileInfo [ ] ) : ExtractedData [ ] {
54
+ return processFiles < ExtractedData > (
55
+ cssFiles ,
56
+ ( content ) => extractClassesFromCss ( content , { extractOnly : 'classes' } ) ,
57
+ ( selectors ) => selectors
58
+ ) ;
66
59
}
67
60
68
- /**
69
- * Writes extracted CSS selectors to a file
70
- * @param cssSelectors - Array of objects containing extracted selectors and file paths
71
- * @param fileName - Name of the output file
72
- * @param uncssTempDir - Temporary directory for uncss
73
- */
74
- export function writeCssSelectorsToFile ( cssSelectors : ExtractedSelectors [ ] , fileName : string , uncssTempDir : string ) : void {
61
+ // Generic function to write data to file
62
+ function writeDataToFile ( data : ExtractedData [ ] , fileName : string , uncssTempDir : string ) : void {
75
63
const outputPath = path . join ( uncssTempDir , fileName ) ;
76
- fs . writeFileSync ( outputPath , JSON . stringify ( cssSelectors , null , 2 ) ) ;
64
+ fs . writeFileSync ( outputPath , JSON . stringify ( data , null , 2 ) ) ;
65
+ }
66
+
67
+ // Write template classes to file
68
+ export function writeTemplateClassesToFile ( templateClasses : ExtractedData [ ] , fileName : string , uncssTempDir : string ) : void {
69
+ writeDataToFile ( templateClasses , fileName , uncssTempDir ) ;
70
+ }
71
+
72
+ // Write CSS selectors to file
73
+ export function writeCssSelectorsToFile ( cssSelectors : ExtractedData [ ] , fileName : string , uncssTempDir : string ) : void {
74
+ writeDataToFile ( cssSelectors , fileName , uncssTempDir ) ;
77
75
}
0 commit comments