import assert from 'node:assert/strict'
import { createHash } from 'node:crypto'
import fs from 'node:fs'
import os from 'node:os'
import path from 'node:path'
import test from 'node:test'
import { generateNextSprite, generateReactSprite } from '../dist/index.js'
const GENERATED_FILES = [
'icon-data.d.ts',
'icon-data.js',
'index.d.ts',
'index.js',
'react',
'sprite.svg',
'svg-sprite.manifest.d.ts',
'svg-sprite.manifest.js',
]
function createReactFixture(config = {}) {
const temporaryDir = fs.mkdtempSync(path.join(os.tmpdir(), 'svg-sprites-react-'))
const rootDir = path.join(temporaryDir, 'src', 'widgets', 'file-manager', 'svg-sprite')
const iconsDir = path.join(rootDir, 'icons')
const configPath = path.join(rootDir, 'svg-sprite.config.ts')
fs.mkdirSync(iconsDir, { recursive: true })
fs.writeFileSync(configPath, `export default ${JSON.stringify({
name: 'file-manager',
description: 'File manager icons',
...config,
}, null, 2)}\n`)
fs.writeFileSync(
path.join(iconsDir, 'check.svg'),
'',
)
fs.writeFileSync(
path.join(iconsDir, 'folder.svg'),
'',
)
fs.writeFileSync(
path.join(iconsDir, 'folder open.svg'),
'',
)
return { rootDir, iconsDir, configPath }
}
test('generates the current isolated React Vite contract', async () => {
const { rootDir, configPath } = createReactFixture()
const result = await generateReactSprite(configPath, 'vite')
const generatedDir = path.join(rootDir, '.svg-sprite')
assert.equal(result.name, 'file-manager')
assert.equal(result.iconCount, 3)
assert.equal(result.target, 'vite')
assert.equal(result.manifestPath, path.join(generatedDir, 'svg-sprite.manifest.js'))
assert.deepEqual(fs.readdirSync(generatedDir).sort(), GENERATED_FILES)
const gitignore = fs.readFileSync(path.join(rootDir, '.gitignore'), 'utf8')
assert.equal(gitignore, '# @generated by @gromlab/svg-sprites. Do not edit.\n/.svg-sprite/\n')
const sprite = fs.readFileSync(result.spritePath, 'utf8')
assert.match(sprite, /АВТОМАТИЧЕСКИ СГЕНЕРИРОВАННЫЙ ФАЙЛ/)
assert.match(sprite, /