### Install and Run Project Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.md
Standard commands to install dependencies, navigate to the project directory, and run development or build processes.
```bash
pnpm install
cd ./packages/playground/basic
pnpm run dev
pnpm run build
```
--------------------------------
### React Setup Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
A complete example for integrating vite-plugin-svg-icons into a React project. It shows the essential setup steps for React applications.
```typescript
import { ViteSvgIconsPlugin } from "vite-plugin-svg-icons";
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
react(),
ViteSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), "src/icons")],
}),
],
});
```
--------------------------------
### Vue 3 Setup Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
A complete example demonstrating how to set up vite-plugin-svg-icons in a Vue 3 project. This includes necessary imports and basic configuration.
```typescript
import { ViteSvgIconsPlugin } from "vite-plugin-svg-icons";
import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
vue(),
ViteSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), "src/icons")],
// default:
// symbolId: "icon-[dir]-[name]",
}),
],
});
```
--------------------------------
### Install Dependencies
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/usage-examples.md
Install the plugin and necessary Vite dependencies.
```bash
npm install vite-plugin-svg-icons -D
npm install vite @vitejs/plugin-vue -D
```
--------------------------------
### Complete Configuration Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/configuration.md
A comprehensive example demonstrating all major configuration options, including icon directories, symbol ID format, SVG optimization, and DOM injection.
```typescript
import {
createSvgIconsPlugin
} from 'vite-plugin-svg-icons'
import path from 'path'
export default {
plugins: [
createSvgIconsPlugin({
// Required: specify icon directories
iconDirs: [
path.resolve(process.cwd(), 'src/icons'),
path.resolve(process.cwd(), 'src/assets/icons'),
],
// Optional: customize symbol ID format
symbolId: 'icon-[dir]-[name]',
// Optional: control SVG optimization
svgoOptions: {
removeViewBox: false,
removeHiddenElems: true,
removeUselessStrokeAndFill: true,
},
// Optional: control DOM injection position
inject: 'body-last',
// Optional: customize DOM element ID
customDomId: '__svg__icons__dom__',
}),
],
}
```
--------------------------------
### Basic SVG Icons Plugin Setup
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Demonstrates the basic setup for the `createSvgIconsPlugin` by specifying the directory where SVG icons are located. Ensure the `path` module is imported.
```typescript
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
})
```
--------------------------------
### Colored Icons Implementation Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Provides an example of how to implement colored SVG icons, allowing for dynamic color changes or using icons with multiple colors.
```vue
```
--------------------------------
### Install vite-plugin-svg-icons
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.md
Install the plugin using yarn, npm, or pnpm. Ensure your Node.js and Vite versions meet the requirements.
```bash
yarn add vite-plugin-svg-icons -D
# or
npm i vite-plugin-svg-icons -D
# or
pnpm install vite-plugin-svg-icons -D
```
--------------------------------
### TypeScript Usage Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Demonstrates how to use the plugin with TypeScript, including type definitions for configuration options and generated modules.
```typescript
import { ViteSvgIconsPlugin, ViteSvgIconsPluginOptions } from "vite-plugin-svg-icons";
import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";
const options: ViteSvgIconsPluginOptions = {
iconDirs: [path.resolve(process.cwd(), "src/icons")],
symbolId: "custom-icon-[name]",
};
export default defineConfig({
plugins: [
vue(),
ViteSvgIconsPlugin(options),
],
});
```
--------------------------------
### Example: Development Tools for SVG Icons
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Utilize the iconsNames array for debugging, filtering, and generating documentation during development.
```typescript
import iconsNames from 'virtual:svg-icons-names'
// Log all available icons for debugging
console.log('Available icons:', iconsNames.length)
console.log(iconsNames.sort())
// Find icons by pattern
const buttonIcons = iconsNames.filter(name => name.includes('button'))
console.log('Button icons:', buttonIcons)
// Generate documentation
const iconDocs = iconsNames.map(name => ({
id: name,
usage: ``,
}))
```
--------------------------------
### Example: Icon Gallery Component
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Display a gallery of all available SVG icons with their names using React.
```typescript
import iconsNames from 'virtual:svg-icons-names'
export default function IconGallery() {
return (
{iconsNames.map(iconId => (
{iconId}
))}
)
}
```
--------------------------------
### Basic Vite Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/configuration.md
Configure the plugin to specify the directory where your SVG icons are located. This is the minimum required setup.
```typescript
import {
createSvgIconsPlugin
} from 'vite-plugin-svg-icons'
import path from 'path'
export default {
plugins: [
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
}),
],
}
```
--------------------------------
### React Usage Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Shows how to import the virtual module in a React application's entry point and includes a basic SvgIcon component for usage.
```jsx
// src/main.jsx
import 'virtual:svg-icons-register'
import { createRoot } from 'react-dom/client'
import App from './App'
createRoot(document.getElementById('root')).render()
```
```jsx
// src/components/SvgIcon.jsx
export default function SvgIcon({ name, color = '#333' }) {
return (
)
}
// Usage in components
```
--------------------------------
### Usage Example in main.ts/main.js
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Demonstrates the basic import of the virtual module in a JavaScript or TypeScript entry file to make SVG icons available.
```typescript
// main.ts or main.js
import 'virtual:svg-icons-register'
// Now SVG icons are available for use
// will work
```
--------------------------------
### Performance Benchmark Test Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Includes examples of performance benchmarks to measure the efficiency of SVG icon processing and rendering.
```typescript
import { compilerIcons } from "@/core";
import path from "path";
describe("Performance Benchmarks", () => {
it("should compile icons efficiently", async () => {
const startTime = performance.now();
await compilerIcons([path.resolve(__dirname, "./__fixtures__/icons")], "dist");
const endTime = performance.now();
const duration = endTime - startTime;
console.log(`Icon compilation took ${duration}ms`);
// Assert that duration is within acceptable limits (e.g., < 1000ms)
expect(duration).toBeLessThan(1000);
});
});
```
--------------------------------
### Example: Basic Usage of SVG Icons Names
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Log the array of all compiled SVG symbol IDs to the console.
```typescript
import iconsNames from 'virtual:svg-icons-names'
console.log(iconsNames)
// Output: ['icon-icon1', 'icon-icon2', 'icon-button-primary', ...]
```
--------------------------------
### Vue Usage Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Illustrates importing the virtual module in a Vue application's entry point and provides a reusable SvgIcon component.
```typescript
// src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import 'virtual:svg-icons-register'
const app = createApp(App)
app.mount('#app')
```
```vue
```
--------------------------------
### Custom SVGO Configuration Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Demonstrates how to apply custom SVGO configurations to optimize SVG icons when using the plugin. This allows fine-grained control over SVG optimization.
```typescript
import { ViteSvgIconsPlugin } from "vite-plugin-svg-icons";
import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
vue(),
ViteSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), "src/icons")],
svgoOptions: {
// plugins: [
// {
// name: "removeViewBox",
// active: false,
// },
// ],
},
}),
],
});
```
--------------------------------
### Example: Vue Template for Icon Picker
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Create a select dropdown in a Vue template, populated with available SVG icon names.
```vue
```
--------------------------------
### Dynamic Icon Selection Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Illustrates how to dynamically select and render SVG icons based on changing conditions or user input within your application.
```vue
```
--------------------------------
### Vite Plugin Svg Icons File Organization
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/README.md
This structure outlines the organization of the documentation files for the Vite plugin. It helps users navigate to specific topics like API references, configuration guides, and usage examples.
```text
/workspace/home/output/
├── INDEX.md (Main navigation hub)
├── README.md (This file)
├── api-reference.md (Function documentation)
├── types.md (Type definitions)
├── configuration.md (Configuration guide)
├── virtual-modules.md (Virtual module docs)
├── module-exports.md (Export listing)
├── architecture.md (Internal design)
├── internal-functions.md (Advanced utilities)
├── usage-examples.md (Working examples)
└── testing-api.md (Testing guide)
```
--------------------------------
### Create ViteSvgIconsPlugin with Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/types.md
Example of how to configure and create an instance of the ViteSvgIconsPlugin. This snippet demonstrates setting icon directories, symbol ID format, DOM injection, custom DOM ID, and SVG optimization options.
```typescript
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
const config: ViteSvgIconsPlugin = {
iconDirs: [
path.resolve(__dirname, 'src/icons'),
path.resolve(__dirname, 'src/components/icons')
],
symbolId: 'icon-[dir]-[name]',
inject: 'body-last',
customDomId: 'my-svg-icons',
svgoOptions: {
removeViewBox: false,
removeHiddenElems: true,
},
}
const plugin = createSvgIconsPlugin(config)
```
--------------------------------
### Usage Examples for SVG Icon Names
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Demonstrates how to use the imported icon names array for validation, populating options, and creating type-safe selections.
```typescript
// Validate icon existence
if (iconsNames.includes('icon-home')) { /* ok */ }
// Build icon picker
iconsNames.forEach(id => options.push({ value: id }))
// Type-safe icon selection
type IconName = typeof iconsNames[number]
```
--------------------------------
### Error Handling Test Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Demonstrates how to test error handling scenarios, ensuring the plugin behaves correctly when encountering unexpected issues.
```typescript
import { compilerIcon } from "@/core";
import path from "path";
describe("Error Handling Tests", () => {
it("should throw an error for invalid icon path", async () => {
await expect(compilerIcon(path.resolve(__dirname, "./__fixtures__/non-existent.svg"), "dist")).rejects.toThrow();
});
it("should handle invalid SVG content gracefully", async () => {
// Assuming a test file with malformed SVG content exists
await expect(compilerIcon(path.resolve(__dirname, "./__fixtures__/malformed.svg"), "dist")).rejects.toThrow();
});
});
```
--------------------------------
### Example: React Component for Icon Picker
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Render a select dropdown populated with available SVG icon names using React.
```typescript
import iconsNames from 'virtual:svg-icons-names'
export default function IconPicker() {
return (
)
}
```
--------------------------------
### Configure SVG Icon Injection
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/types.md
Example configuration for ViteSvgIconsPlugin, specifying icon directories and the injection position for SVG sprites.
```typescript
const config: ViteSvgIconsPlugin = {
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
inject: 'body-first', // Inject at start of body
}
```
--------------------------------
### Vue App Usage with SvgIcon
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.md
Example of how to use the SvgIcon component in a Vue application. It demonstrates rendering multiple icons, including one from a subdirectory.
```vue
```
--------------------------------
### Cache Management Performance Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/internal-functions.md
Illustrates the performance benefits of the plugin's caching mechanism. On the first build, all SVGs are compiled. Subsequent requests for unchanged files are nearly instantaneous, with only modified or new files triggering recompilation.
```typescript
// First build: Scans and compiles all SVGs
const { insertHtml, idSet } = await compilerIcons(cache, svgoOptions, options)
// Cache now contains all compiled icons
// Subsequent requests (unchanged files):
// Reading from cache is nearly instantaneous
// Only modified/new files trigger recompilation
```
--------------------------------
### Type-Safe Icon Usage Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Shows how to use SVG icons in a type-safe manner, leveraging TypeScript to ensure that only valid icon names are used.
```vue
```
--------------------------------
### Unit Test Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
A unit test demonstrating the testing of internal functions or components related to SVG icon handling.
```typescript
import { createSymbolId } from "@/core";
describe("createSymbolId", () => {
it("should create a symbol id correctly", () => {
expect(createSymbolId("icon", "logo", "vue")).toBe("icon-logo-vue");
});
});
```
--------------------------------
### Import Virtual Modules
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Import virtual modules to register SVG icons or get a list of icon names.
```typescript
// Virtual modules
import 'virtual:svg-icons-register'
import iconsNames from 'virtual:svg-icons-names'
```
--------------------------------
### Configure Custom SVGO Optimization Settings
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/usage-examples.md
Customize the SVGO optimization process within your Vite configuration to fine-tune how SVG files are processed. This example keeps the viewBox and optimizes path data.
```typescript
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default {
plugins: [
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
symbolId: 'icon-[dir]-[name]',
// Custom SVGO optimization
svgoOptions: {
// Keep viewBox for responsive scaling
removeViewBox: false,
// Remove unused definitions
removeUnknownsAndDefaults: true,
// Optimize paths
convertPathData: {
noSpaceAfterFlags: false,
},
// Remove metadata
removeMetadata: true,
removeComments: true,
removeDesc: true,
removeTitle: true,
// Optimize transforms
convertTransform: true,
removeEmptyAttrs: true,
removeEmptyContainers: true,
},
}),
],
}
```
--------------------------------
### React App Usage with SvgIcon
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.md
Example of how to use the SvgIcon component in a React application. It renders several icons, including one from a nested directory.
```jsx
import SvgIcon from './components/SvgIcon'
export default function App() {
return (
<>
>
)
}
```
--------------------------------
### Custom SVGO Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Applies custom SVGO optimization options to the SVG icons processed by the plugin. This example disables `removeViewBox` and enables `removeHiddenElems`.
```typescript
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
svgoOptions: {
removeViewBox: false,
removeHiddenElems: true,
},
})
```
--------------------------------
### Configure Development Server Middleware
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/internal-functions.md
The configureServer hook installs middleware to handle requests for virtual SVG icon modules. It sets CORS, Cache-Control, and Etag headers for efficient serving and caching.
```typescript
configureServer: ({ middlewares }) => {
middlewares.use(cors({ origin: '*' }))
middlewares.use(async (req, res, next) => {
const url = normalizePath(req.url!)
const registerId = `/@id/${SVG_ICONS_REGISTER_NAME}`
const clientId = `/@id/${SVG_ICONS_CLIENT}`
if ([clientId, registerId].some((item) => url.endsWith(item))) {
// Handle virtual module request
res.setHeader('Content-Type', 'application/javascript')
res.setHeader('Cache-Control', 'no-cache')
const { code, idSet } = await createModuleCode(...)
const content = url.endsWith(registerId) ? code : idSet
// Use Etag for cache busting on changes
res.setHeader('Etag', getEtag(content, { weak: true }))
res.statusCode = 200
res.end(content)
} else {
next()
}
})
}
```
--------------------------------
### Type-Safe Usage of TypedSvgIcon
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/usage-examples.md
This example demonstrates how to use the `TypedSvgIcon` component with valid and invalid icon names. TypeScript will flag attempts to use non-existent icon names. No specific imports are required beyond the component itself.
```typescript
// src/App.tsx
{/* OK */}
{/* OK */}
{/* TypeScript error */}
```
--------------------------------
### Vue Icon Gallery Component
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/usage-examples.md
Implement an icon gallery component in Vue using the `virtual:svg-icons-names` module. This example groups icons by their directory prefix and displays them in a grid layout. It utilizes Vue's template syntax and script setup for reactivity.
```vue
Icon Gallery ({{ allIcons.length }} icons)
{{ group }} ({{ icons.length }})
{{ iconId }}
```
--------------------------------
### Initialization and Lifecycle
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/architecture.md
Describes the plugin's initialization steps and its interaction with the Vite build process, including configuration resolution, ID resolution, and module loading.
```markdown
1. createSvgIconsPlugin(options) called
├─ Validate options (symbolId contains [name])
├─ Merge with defaults
├─ Initialize empty cache
└─ Return Vite Plugin object
2. Vite loads plugin
├─ Call configResolved()
│ └─ Set isBuild flag
├─ Call resolveId() when modules needed
└─ Call load() to generate code
```
--------------------------------
### Get Available SVG Icon Symbol IDs
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/api-reference.md
Import this virtual module to get an array of all available icon symbol IDs. This is useful for iterating or referencing icons by their generated IDs.
```typescript
import ids from 'virtual:svg-icons-names'
// Example: ['icon-icon1', 'icon-icon2', 'icon-dir-icon1']
```
--------------------------------
### Get all SymbolIds
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.md
Import and use the `virtual:svg-icons-names` module to retrieve an array of all generated symbol IDs.
```typescript
import ids from 'virtual:svg-icons-names'
// => ['icon-icon1','icon-icon2','icon-icon3']
```
--------------------------------
### TypeScript Usage with Type Hints
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Demonstrates how TypeScript recognizes 'iconsNames' as a string array after correct configuration.
```typescript
import iconsNames from 'virtual:svg-icons-names'
// TypeScript knows iconsNames is string[]
iconsNames.forEach(name => console.log(name))
```
--------------------------------
### Example: Validating Icon Names
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Check if a given icon name exists in the compiled SVG symbol IDs before using it.
```typescript
import iconsNames from 'virtual:svg-icons-names'
const iconName = 'button-primary'
const symbolId = `icon-${iconName}`
if (iconsNames.includes(symbolId)) {
// Safe to use this icon
} else {
// Icon not available, use fallback
console.warn(`Icon ${symbolId} not found`)
}
```
--------------------------------
### Import createSvgIconsPlugin with Configuration Type
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/module-exports.md
Imports the createSvgIconsPlugin and its configuration type ViteSvgIconsPlugin. Use ViteSvgIconsPlugin to define configuration options like icon directories.
```typescript
import { createSvgIconsPlugin, type ViteSvgIconsPlugin } from 'vite-plugin-svg-icons'
const config: ViteSvgIconsPlugin = {
iconDirs: ['src/icons'],
}
```
--------------------------------
### Discrete Directory
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/README.md
Determines the file name and directory name for a given icon name.
```typescript
discreteDir(name): {fileName, dirName}
```
--------------------------------
### compilerIcons()
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Compiles multiple SVG icons in batch.
```APIDOC
## compilerIcons(filePaths, options)
### Description
Compiles multiple SVG icon files in a batch process.
### Method
Internal function, not directly called by users.
### Endpoint
N/A
### Parameters
#### Path Parameters
None
#### Query Parameters
None
#### Request Body
None
### Parameters
- **filePaths** (string[]) - Required - An array of paths to the SVG icon files.
- **options** (OptimizeOptions) - Optional - SVGO configuration options.
### Request Example
```javascript
// This function is typically called internally by the plugin.
// Example of parameters it might receive:
const filePaths = ['/path/to/icon1.svg', '/path/to/icon2.svg'];
const options = {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false,
},
},
},
],
};
// compilerIcons(filePaths, options);
```
### Response
#### Success Response (200)
Returns an array of compiled SVG content.
#### Response Example
```javascript
// Returns an array of strings, where each string is the compiled SVG content.
// e.g., ['', '']
```
```
--------------------------------
### Import createSvgIconsPlugin
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/module-exports.md
Basic import statement for the createSvgIconsPlugin function from the vite-plugin-svg-icons package.
```typescript
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
```
--------------------------------
### React Virtual Module Usage
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Example of how to import and use the virtual module `virtual:svg-icons-names` within a React application to access icon names.
```typescript
import React from 'react';
import svgIcons from 'virtual:svg-icons-names';
const IconList: React.FC = () => {
return (
Available Icons:
{svgIcons.map((iconName) => (
{iconName}
))}
);
};
export default IconList;
```
--------------------------------
### Package JSON Exports Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/module-exports.md
Defines the entry points for the package, specifying CommonJS, ESModule, and TypeScript definitions.
```json
{
"exports": {
".": {
"require": "./dist/index.cjs",
"import": "./dist/index.mjs",
"types": "./dist/index.d.ts"
}
}
}
```
--------------------------------
### Development Workflow for vite-plugin-svg-icons
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/README.md
Illustrates the process of SVG file scanning, caching, compilation, and module code generation during development. This flow ensures efficient handling of SVG assets.
```mermaid
graph TD
A[SVG Files] --> B(Scanner fast-glob)
B --> C{Cache Check}
C -- Hit --> D[Reuse Code]
C -- Miss --> E[Compile]
E --> F[Store in Cache]
E --> G[Generate Module Code]
G --> H[Return to Browser]
```
--------------------------------
### Import Utility Functions
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Import utility functions like symbol ID generation and path discretization.
```typescript
// Utility functions
import { createSymbolId, discreteDir } from 'vite-plugin-svg-icons'
```
--------------------------------
### Configure TypeScript for SVG Icons
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.md
Add this configuration to your tsconfig.json to enable TypeScript support for SVG icons. Ensure the path matches your project setup.
```json
// tsconfig.json
{
"compilerOptions": {
"types": ["vite-plugin-svg-icons/client"]
}
}
```
--------------------------------
### Symbol ID Validation Test Example
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Tests specifically designed to validate the correct generation of Symbol IDs, ensuring consistency and adherence to the defined pattern.
```typescript
import { createSymbolId } from "@/core";
describe("Symbol ID validation", () => {
it("should generate correct symbol IDs for various inputs", () => {
expect(createSymbolId("icon", "logo", "vue")).toBe("icon-logo-vue");
expect(createSymbolId("custom", "my-icon", "test")).toBe("custom-my-icon-test");
expect(createSymbolId("prefix", "another", "icon")).toBe("prefix-another-icon");
});
});
```
--------------------------------
### Multiple Icon Directories Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Sets up the `createSvgIconsPlugin` to scan for SVG icons in multiple directories. This is useful when icons are distributed across different parts of the project.
```typescript
createSvgIconsPlugin({
iconDirs: [
path.resolve(process.cwd(), 'src/icons'),
path.resolve(process.cwd(), 'src/components/icons'),
],
})
```
--------------------------------
### Import Main Export
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Import the main plugin factory function for creating the SVG icons plugin.
```typescript
// Main export
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
```
--------------------------------
### createSvgIconsPlugin()
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Plugin factory function to create the vite-plugin-svg-icons instance.
```APIDOC
## createSvgIconsPlugin(options)
### Description
Factory function to create the SVG icons plugin for Vite.
### Parameters
#### Path Parameters
None
#### Query Parameters
None
#### Request Body
None
### Parameters
- **options** (ViteSvgIconsPlugin) - Required - Plugin configuration object.
### Request Example
```javascript
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
export default {
plugins: [
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
svgoOptions: true,
}),
],
};
```
### Response
#### Success Response (200)
Returns the plugin instance.
#### Response Example
```javascript
// Plugin instance is returned and used within Vite's config.
```
```
--------------------------------
### Custom DOM Injection Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Configures how SVG icons are injected into the DOM. This example specifies injection into the 'body-first' position and sets a custom ID for the DOM element containing the icons.
```typescript
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
inject: 'body-first',
customDomId: 'my-icons',
})
```
--------------------------------
### Define SVG Sprite Injection Position (DomInject)
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/types.md
Defines the allowed positions for injecting SVG sprites into the DOM. Use 'body-first' to insert at the start of the body or 'body-last' to insert before the last child.
```typescript
type DomInject = 'body-first' | 'body-last'
```
--------------------------------
### Import with Types
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Import the main plugin factory and its associated types for enhanced type safety.
```typescript
// With types
import {
createSvgIconsPlugin,
type ViteSvgIconsPlugin
} from 'vite-plugin-svg-icons'
```
--------------------------------
### Virtual Module Resolution Flow
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/architecture.md
Illustrates the browser's import process for virtual SVG icon modules and how Vite's resolveId and load hooks handle these requests during development and build.
```markdown
Browser: import 'virtual:svg-icons-register'
│
▼
resolveId('virtual:svg-icons-register')
│
├─ ID matches?
│ └─ Yes: return id
│
▼
load('virtual:svg-icons-register')
│
├─ Is this a build? Is this SSR?
│ └─ Dev SSR: return empty export
│ └─ Dev/Build: return actual code
│
▼
Return generated module code
│
▼
Browser executes code
```
--------------------------------
### createSvgIconsPlugin
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/api-reference.md
Creates a Vite plugin that scans icon directories, optimizes SVGs, compiles them into a sprite sheet, and injects it into the HTML document. It also provides virtual modules for accessing icon names and registering the sprite.
```APIDOC
## createSvgIconsPlugin
### Description
Creates a Vite plugin that generates SVG sprite maps from a directory of SVG files.
### Signature
```typescript
function createSvgIconsPlugin(opt: ViteSvgIconsPlugin): Plugin
```
### Parameters
#### Parameters
- **opt** (ViteSvgIconsPlugin) - Required - Plugin configuration object containing icon directories and optional settings
### Returns
A Vite `Plugin` object that can be used in a Vite configuration file.
### Throws
- **Error**: If the `symbolId` template does not contain the `[name]` placeholder, an error is thrown: "SymbolId must contain [name] string!"
### Usage Example
```typescript
// vite.config.ts
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default {
plugins: [
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
symbolId: 'icon-[dir]-[name]',
inject: 'body-last',
customDomId: '__svg__icons__dom__',
svgoOptions: true,
}),
],
}
```
```
--------------------------------
### React Icon Gallery Component
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/usage-examples.md
Implement an icon gallery component in React using the `virtual:svg-icons-names` module. This example groups icons by their directory prefix and displays them in a grid layout. Ensure you have a `SvgIcon` component available.
```typescript
// src/components/IconGallery.tsx
import { useMemo } from 'react'
import iconsNames from 'virtual:svg-icons-names'
import { SvgIcon } from './SvgIcon'
export function IconGallery() {
// Group icons by prefix
const groupedIcons = useMemo(() => {
const groups: Record = {}
iconsNames.forEach(name => {
const [group] = name.split('-')
if (!groups[group]) {
groups[group] = []
}
groups[group].push(name)
})
return groups
}, [])
return (
)
}
```
--------------------------------
### Create SVG Icons Plugin
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/README.md
Use this function to create the Vite plugin instance. It requires configuration options for the plugin.
```typescript
createSvgIconsPlugin(opt: ViteSvgIconsPlugin): Plugin
```
--------------------------------
### Virtual Module Imports for SVG Icons
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/module-exports.md
Demonstrates how to import the virtual modules for SVG sprite injection and retrieving icon names. Use 'virtual:svg-icons-register' to inject sprites and 'virtual:svg-icons-names' to get an array of icon names.
```typescript
// Inject sprite
import 'virtual:svg-icons-register'
// Get icon names
import iconsNames from 'virtual:svg-icons-names'
```
--------------------------------
### Constants Definitions
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/architecture.md
Defines key string constants used throughout the plugin for virtual module names, IDs, and XML namespaces.
```text
constants.ts
├── SVG_ICONS_REGISTER_NAME = 'virtual:svg-icons-register'
├── SVG_ICONS_CLIENT = 'virtual:svg-icons-names'
├── SVG_DOM_ID = '__svg__icons__dom__'
├── XMLNS = 'http://www.w3.org/2000/svg'
└── XMLNS_LINK = 'http://www.w3.org/1999/xlink'
```
--------------------------------
### Module Hierarchy
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/architecture.md
Provides an overview of the main module exports and their functions within the vite-plugin-svg-icons library.
```text
vite-plugin-svg-icons (main export)
├── createSvgIconsPlugin() [Public API - Plugin factory]
├── createModuleCode() [Public export - Module generation]
├── compilerIcons() [Public export - Batch compilation]
├── compilerIcon() [Public export - Single file compilation]
├── createSymbolId() [Public export - ID generation]
├── discreteDir() [Public export - Path utilities]
├── ViteSvgIconsPlugin [Type export]
├── FileStats [Type export]
└── DomInject [Type export]
```
--------------------------------
### Import Virtual Modules for SVG Icons
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/virtual-modules.md
Import the 'virtual:svg-icons-register' module to register SVG sprites in the DOM. Optionally, import 'virtual:svg-icons-names' to get a list of available icon names. The registration module should be imported early in your application's initialization.
```typescript
// Essential: Register the sprite in the DOM
import 'virtual:svg-icons-register'
// Optional: Get list of available icons
import iconsNames from 'virtual:svg-icons-names'
```
--------------------------------
### Build Mode Data Flow
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/architecture.md
Describes the process during the build phase, showing how the plugin's load function processes virtual modules and includes the generated SVG sprite code within the final bundle.
```text
npm run build
│
▼
Vite build process
│
├─▶ Plugin.load() for virtual modules
│ │
│ ▼
│ createModuleCode() [Same as dev]
│ │
│ ▼
│ Code included in bundle
│
▼
Built JavaScript includes:
├── SVG sprite injection code
├── Icon names array
└── All compiled SVG symbols
```
--------------------------------
### ViteSvgIconsPlugin Configuration with SVGO Options
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/types.md
Demonstrates how to configure the ViteSvgIconsPlugin with SVGO optimization options. You can either disable optimization entirely by setting svgoOptions to false, or provide a custom configuration object to fine-tune the optimization process.
```typescript
const config: ViteSvgIconsPlugin = {
iconDirs: ['src/icons'],
// Disable optimization
svgoOptions: false,
// Or use custom SVGO configuration
svgoOptions: {
removeViewBox: false, // Keep viewBox for responsive scaling
removeHiddenElems: true,
convertPathData: true,
},
}
```
--------------------------------
### Configuration Object for Vite SVG Icons Plugin
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/INDEX.md
Defines the structure and types for the plugin's configuration object. Ensure 'iconDirs' is provided as it's the only required property.
```typescript
{
iconDirs: string[] // Required
svgoOptions?: boolean | OptimizeOptions // Default: true
symbolId?: string // Default: 'icon-[dir]-[name]'
inject?: 'body-first' | 'body-last' // Default: 'body-last'
customDomId?: string // Default: '__svg__icons__dom__'
}
```
--------------------------------
### compilerIcon()
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Compiles a single SVG icon file.
```APIDOC
## compilerIcon(filePath, options)
### Description
Compiles a single SVG icon file, applying optimizations.
### Method
Internal function, not directly called by users.
### Endpoint
N/A
### Parameters
#### Path Parameters
None
#### Query Parameters
None
#### Request Body
None
### Parameters
- **filePath** (string) - Required - The path to the SVG icon file.
- **options** (OptimizeOptions) - Optional - SVGO configuration options.
### Request Example
```javascript
// This function is typically called internally by the plugin.
// Example of parameters it might receive:
const filePath = '/path/to/single-icon.svg';
const options = {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false,
},
},
},
],
};
// compilerIcon(filePath, options);
```
### Response
#### Success Response (200)
Returns the compiled SVG content as a string.
#### Response Example
```javascript
// Returns a string like: ''
```
```
--------------------------------
### Test createSvgIconsPlugin with Mock Vite
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/testing-api.md
Tests the createSvgIconsPlugin function using a mock Vite plugin system. Ensures proper error handling for missing symbol IDs and verifies default and merged options.
```typescript
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
import fs from 'fs-extra'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
describe('createSvgIconsPlugin', () => {
let testDir: string
beforeEach(async () => {
testDir = path.join(__dirname, 'test-icons')
await fs.ensureDir(testDir)
})
afterEach(async () => {
await fs.remove(testDir)
})
it('should throw error if symbolId missing [name]', () => {
expect(() => {
createSvgIconsPlugin({
iconDirs: [testDir],
symbolId: 'icon-[dir]', // Missing [name]
})
}).toThrow('SymbolId must contain [name] string!')
})
it('should create plugin with default options', () => {
const plugin = createSvgIconsPlugin({
iconDirs: [testDir],
})
expect(plugin).toBeDefined()
expect(plugin.name).toBe('vite:svg-icons')
expect(plugin.resolveId).toBeDefined()
expect(plugin.load).toBeDefined()
})
it('should merge user options with defaults', () => {
const plugin = createSvgIconsPlugin({
iconDirs: [testDir],
symbolId: 'custom-[dir]-[name]',
customDomId: 'my-sprite',
})
expect(plugin).toBeDefined()
// Plugin internally merges options
})
})
```
--------------------------------
### Create SVG Icons Plugin Configuration
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/api-reference.md
Configure the vite-plugin-svg-icons by specifying icon directories, symbol ID format, injection method, custom DOM ID, and SVGO options. Ensure the symbolId template includes '[name]'.
```typescript
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default {
plugins: [
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
symbolId: 'icon-[dir]-[name]',
inject: 'body-last',
customDomId: '__svg__icons__dom__',
svgoOptions: true,
}),
],
}
```
--------------------------------
### Public Types
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/README.md
Key type definitions used for configuring and interacting with the plugin.
```APIDOC
## Public Types
### `ViteSvgIconsPlugin`
The main configuration interface for the plugin.
### `DomInject`
Defines the injection point for SVG sprites. Possible values: `'body-first'` | `'body-last'`.
### `FileStats`
Represents the structure of a cache entry for file statistics.
### `OptimizeOptions`
Configuration options for SVGO optimization (re-exported).
```
--------------------------------
### discreteDir()
Source: https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/_autodocs/COMPLETION_SUMMARY.txt
Utility function for path manipulation.
```APIDOC
## discreteDir(dirPath)
### Description
Utility function to discretize a directory path, useful for path manipulation.
### Method
Internal function, not directly called by users.
### Endpoint
N/A
### Parameters
#### Path Parameters
None
#### Query Parameters
None
#### Request Body
None
### Parameters
- **dirPath** (string) - Required - The directory path to process.
### Request Example
```javascript
// This function is typically called internally by the plugin.
// Example of parameters it might receive:
const dirPath = '/path/to/some/directory';
// discreteDir(dirPath);
```
### Response
#### Success Response (200)
Returns the processed directory path string.
#### Response Example
```javascript
// Returns a string representing the discretized path.
// e.g., '/path/to/some/directory'
```
```