Skip to content

Commit e6a82c7

Browse files
committed
Update fileProcessors functions for smaller ones
1 parent 1ce7317 commit e6a82c7

File tree

2 files changed

+63
-67
lines changed

2 files changed

+63
-67
lines changed

src/fileProcessors.ts

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,74 @@ import * as fs from 'fs';
22
import * as path from 'path';
33
import { extractClassesFromTemplate, extractClassesFromCss } from './extractors';
44

5-
interface FileInfo {
5+
export interface FileInfo {
66
name: string;
77
path: string;
88
}
99

10-
interface ExtractedClasses {
11-
classes: string;
10+
export interface ExtractedData {
11+
data: string[] | string;
1212
path: string;
1313
}
1414

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');
1818
}
1919

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);
3441
}
3542

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+
);
5550
}
5651

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+
);
6659
}
6760

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 {
7563
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);
7775
}

src/index.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
processCssFilesToExtractClasses,
77
writeTemplateClassesToFile,
88
writeCssSelectorsToFile,
9+
ExtractedData // Add this import
910
} from './fileProcessors';
1011

1112
/**
@@ -38,17 +39,14 @@ function createFlattenedClasses(
3839
): void {
3940
const inputPath = path.join(uncssTempDir, inputFileName);
4041
const outputPath = path.join(uncssTempDir, outputFileName);
41-
const items = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
42+
const items: ExtractedData[] = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
4243
const flattenedItems = new Set<string>();
4344

44-
items.forEach((item: { classes?: string | string[], selectors?: string[] }) => {
45-
if (Array.isArray(item.classes)) {
46-
item.classes.forEach((cls) => flattenedItems.add(cls));
47-
} else if (typeof item.classes === 'string') {
48-
item.classes.split(' ').forEach((cls) => flattenedItems.add(cls));
49-
}
50-
if (Array.isArray(item.selectors)) {
51-
item.selectors.forEach((selector) => flattenedItems.add(selector));
45+
items.forEach((item) => {
46+
if (typeof item.data === 'string') {
47+
item.data.split(' ').forEach((cls: string) => flattenedItems.add(cls));
48+
} else if (Array.isArray(item.data)) {
49+
item.data.forEach((cls: string) => flattenedItems.add(cls));
5250
}
5351
});
5452

@@ -143,13 +141,13 @@ function init(options: TwigUnusedCssFinderOptions = {}): void {
143141
];
144142

145143
log('[TASK] Processing template files and extracting CSS classes', isDebug);
146-
const templateClasses = processTemplateFilesToExtractClasses(templateFiles);
144+
const templateClasses: ExtractedData[] = processTemplateFilesToExtractClasses(templateFiles);
147145

148146
log('[TASK] Reading CSS files', isDebug);
149147
const cssFiles = findFiles(cssDir, cssPattern);
150148

151149
log('[TASK] Processing CSS files', isDebug);
152-
const cssSelectors = processCssFilesToExtractClasses(cssFiles);
150+
const cssSelectors: ExtractedData[] = processCssFilesToExtractClasses(cssFiles);
153151

154152
log('[TASK] Writing extracted CSS classes to file', isDebug);
155153
writeTemplateClassesToFile(templateClasses, classesFromTemplatesFileName, uncssTempDir);

0 commit comments

Comments
 (0)