From 3a60b5c6ae81bb324f374201bf50f1195433fb60 Mon Sep 17 00:00:00 2001 From: "S.Gromov" Date: Wed, 20 May 2026 14:02:28 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20entry-point=20=D0=B4=D0=BB=D1=8F=20React-=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлена генерация index.ts рядом с React-компонентом - добавлен тест генерации directory import - обновлена документация ожидаемого output --- README.md | 2 +- package.json | 1 + src/codegen-react.ts | 20 +++++++++++++++++-- test/react-entry.test.mjs | 40 +++++++++++++++++++++++++++++++++++++ test/ui/svg-sprite/index.ts | 9 +++++++++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 test/react-entry.test.mjs create mode 100644 test/ui/svg-sprite/index.ts diff --git a/README.md b/README.md index 4d62677..d925018 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ publicPath: '/sprites' ```ts react: 'src/shared/ui/svg-sprite' -// → svg-sprite.tsx + svg-sprite.module.css +// → index.ts + svg-sprite.tsx + svg-sprite.module.css ``` Если не задан — компонент и типы не генерируются. diff --git a/package.json b/package.json index 9867ef1..1c7ad61 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "build": "tsup && npm run build:preview", "build:preview": "cd preview && npx vite build", "dev": "tsup --watch", + "test": "tsup && node --test test/*.test.mjs", "typecheck": "tsc --noEmit", "sprite": "node dist/cli.js", "prepublishOnly": "npm run build" diff --git a/src/codegen-react.ts b/src/codegen-react.ts index b28ab51..b2366a0 100644 --- a/src/codegen-react.ts +++ b/src/codegen-react.ts @@ -17,10 +17,10 @@ function getIconNames(folder: SpriteFolder): string[] { } /** - * Генерирует [name].tsx и [name].module.css — React-компонент с типами. + * Генерирует index.ts, [name].tsx и [name].module.css — React-компонент с типами. * * Имена файлов берутся из basename папки outputDir. - * Например: outputDir = 'src/ui/svg-sprite' → svg-sprite.tsx + svg-sprite.module.css. + * Например: outputDir = 'src/ui/svg-sprite' → index.ts + svg-sprite.tsx + svg-sprite.module.css. * * Содержит: * - union-типы имён иконок для каждого спрайта (IconsIconName, LogosIconName, ...) @@ -175,5 +175,21 @@ export function generateReactModule( const cssPath = path.join(outputDir, `${baseName}.module.css`) fs.writeFileSync(cssPath, css) + const index = [ + '/** @generated — this file is auto-generated, do not edit manually. */', + `export { SvgSprite } from './${baseName}'`, + 'export type {', + ' SvgSpriteProps,', + ' SpriteName,', + ' SpriteMap,', + ' IconName,', + ' DefaultSprite,', + `} from './${baseName}'`, + '', + ].join('\n') + + const indexPath = path.join(outputDir, 'index.ts') + fs.writeFileSync(indexPath, index) + return outputPath } diff --git a/test/react-entry.test.mjs b/test/react-entry.test.mjs new file mode 100644 index 0000000..251cd89 --- /dev/null +++ b/test/react-entry.test.mjs @@ -0,0 +1,40 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import test from 'node:test' + +import { generate } from '../dist/index.js' + +test('generates a React directory entry-point', async () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'svg-sprites-react-entry-')) + const inputDir = path.join(root, 'icons') + const outputDir = path.join(root, 'public', 'sprites') + const reactDir = path.join(root, 'src', 'shared', 'ui', 'svg-sprite') + + fs.mkdirSync(inputDir, { recursive: true }) + fs.writeFileSync( + path.join(inputDir, 'check.svg'), + '', + ) + + await generate({ + output: outputDir, + publicPath: '/sprites', + preview: false, + react: reactDir, + sprites: [ + { + name: 'icons', + input: inputDir, + }, + ], + }) + + const indexPath = path.join(reactDir, 'index.ts') + const index = fs.readFileSync(indexPath, 'utf-8') + + assert.ok(fs.existsSync(indexPath)) + assert.match(index, /export \{ SvgSprite \} from '\.\/svg-sprite'/) + assert.match(index, /SvgSpriteProps/) +}) diff --git a/test/ui/svg-sprite/index.ts b/test/ui/svg-sprite/index.ts new file mode 100644 index 0000000..950ca86 --- /dev/null +++ b/test/ui/svg-sprite/index.ts @@ -0,0 +1,9 @@ +/** @generated — this file is auto-generated, do not edit manually. */ +export { SvgSprite } from './svg-sprite' +export type { + SvgSpriteProps, + SpriteName, + SpriteMap, + IconName, + DefaultSprite, +} from './svg-sprite'