mirror of
https://github.com/gromlab-ru/svg-sprites.git
synced 2026-07-22 04:40:17 +03:00
feat: перейти на изолированный контракт генерации
- добавлены независимые adapters для шести exact modes - runtime переведён на JavaScript с отдельными декларациями - generated output перенесён в .svg-sprite - удалены legacy pipeline и встроенный preview
This commit is contained in:
65
src/generate.ts
Normal file
65
src/generate.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import path from 'node:path'
|
||||
import {
|
||||
resolveSpriteConfig,
|
||||
resolveSpriteConfigSource,
|
||||
} from './config.js'
|
||||
import type { ModeResultMetadata } from './core/mode-adapter.js'
|
||||
import { writeOutputPlan } from './core/output-writer.js'
|
||||
import { prepareSprite } from './core/prepare-sprite.js'
|
||||
import type { SpriteGenerationBaseResult } from './core/result.js'
|
||||
import { log } from './logger.js'
|
||||
import { getModeAdapter } from './mode-registry.js'
|
||||
import type { SpriteConfig } from './types.js'
|
||||
|
||||
export type SpriteGenerationResult = SpriteGenerationBaseResult & ModeResultMetadata
|
||||
|
||||
/** Генерирует один output через adapter разрешённого exact mode. */
|
||||
export async function generateSprite(
|
||||
source: string,
|
||||
overrides: SpriteConfig = {},
|
||||
): Promise<SpriteGenerationResult> {
|
||||
const resolvedSource = await resolveSpriteConfigSource(source)
|
||||
const config = resolveSpriteConfig(
|
||||
resolvedSource.rootDir,
|
||||
resolvedSource.config,
|
||||
overrides,
|
||||
)
|
||||
const adapter = getModeAdapter(config.mode)
|
||||
const prepared = prepareSprite(config)
|
||||
const plan = await adapter.generate({
|
||||
rootDir: resolvedSource.rootDir,
|
||||
config,
|
||||
prepared,
|
||||
})
|
||||
const plannedPaths = new Set(plan.files.map((file) => file.path.replaceAll('\\', '/')))
|
||||
|
||||
for (const requiredPath of [plan.paths.entry, plan.paths.sprite, plan.paths.manifest]) {
|
||||
if (!plannedPaths.has(requiredPath)) {
|
||||
throw new Error(`Mode "${config.mode}" result path is missing from its output plan: ${requiredPath}`)
|
||||
}
|
||||
}
|
||||
|
||||
writeOutputPlan(
|
||||
resolvedSource.rootDir,
|
||||
adapter.mode,
|
||||
adapter.contractVersion,
|
||||
plan.files,
|
||||
config.generatedNotice,
|
||||
)
|
||||
|
||||
const generatedDir = path.resolve(resolvedSource.rootDir, plan.paths.generatedDir)
|
||||
const iconLabel = prepared.iconNames.length === 1 ? 'icon' : 'icons'
|
||||
log.success(`✓ ${config.name} · ${prepared.iconNames.length} ${iconLabel} · ${config.mode}`)
|
||||
log.detail(` → ${path.relative(process.cwd(), generatedDir)}`)
|
||||
|
||||
return {
|
||||
name: config.name,
|
||||
rootDir: resolvedSource.rootDir,
|
||||
generatedDir,
|
||||
spritePath: path.resolve(resolvedSource.rootDir, plan.paths.sprite),
|
||||
manifestPath: path.resolve(resolvedSource.rootDir, plan.paths.manifest),
|
||||
iconCount: prepared.iconNames.length,
|
||||
mode: config.mode,
|
||||
...plan.result,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user