Files
svg-sprites/src/scanner.ts

82 lines
2.1 KiB
TypeScript
Raw Normal View History

import fs from 'node:fs'
import path from 'node:path'
import type { SpriteEntry, SpriteFolder } from './types.js'
/**
* Сканирует папку и возвращает отсортированные абсолютные пути к SVG-файлам.
*/
function scanDirectory(dirPath: string): string[] {
if (!fs.existsSync(dirPath)) {
throw new Error(`Input directory does not exist: ${dirPath}`)
}
return fs
.readdirSync(dirPath)
.filter((file) => file.endsWith('.svg'))
.sort()
.map((file) => path.join(dirPath, file))
}
/**
* Резолвит массив путей к SVG-файлам в абсолютные пути.
* Проверяет существование каждого файла.
*/
function resolveFiles(files: string[]): string[] {
return files.map((filePath) => {
const resolved = path.resolve(filePath)
if (!fs.existsSync(resolved)) {
throw new Error(`SVG file does not exist: ${resolved}`)
}
if (!resolved.endsWith('.svg')) {
throw new Error(`File is not an SVG: ${resolved}`)
}
return resolved
})
}
/**
* Преобразует SpriteEntry из конфига в SpriteFolder для компиляции.
*/
export function resolveSpriteEntry(entry: SpriteEntry): SpriteFolder {
const mode = entry.mode ?? 'stack'
if (Array.isArray(entry.input)) {
const files = resolveFiles(entry.input)
if (files.length === 0) {
throw new Error(`Sprite "${entry.name}" has empty input array.`)
}
return {
name: entry.name,
mode,
path: null,
files,
}
}
const dirPath = path.resolve(entry.input)
const files = scanDirectory(dirPath)
if (files.length === 0) {
throw new Error(`Sprite "${entry.name}" has no SVG files in "${dirPath}".`)
}
return {
name: entry.name,
mode,
path: dirPath,
files,
}
}
/**
* Преобразует массив SpriteEntry из конфига в массив SpriteFolder.
*/
export function resolveSprites(entries: SpriteEntry[]): SpriteFolder[] {
return entries.map(resolveSpriteEntry)
}