Icon Pipeline
Icon Pipeline is a utility for optimizing SVG icons and generating SVG sprites, along with individual optimized SVG files and a manifest of available icons. It aims to provide a 'no-nonsense' automated pipeline for icon management in web projects. As of version 0.2.0, the package is in early development, suggesting an irregular release cadence and that its API might not yet be stable. Its key differentiator lies in its integrated approach, handling both SVG optimization and sprite generation (for both HTML `<use>` and JavaScript injection) within a single tool, outputting multiple formats ready for different consumption patterns, which simplifies the icon build process compared to using separate tools for each step. It is designed to be included as a development dependency and run as part of a project's build process.
Common errors
-
ReferenceError: iconData is not defined
cause Attempting to access the `iconData` variable synchronously after calling the `iconPipeline` function, which is asynchronous and returns a Promise.fixAccess `iconData` only within the `.then()` callback of the `iconPipeline` Promise, or by using `await iconPipeline(...)` within an `async` function. -
TypeError: require is not a function (when using 'import { iconPipeline } from "icon-pipeline"')cause The `icon-pipeline` package, in its current version, primarily uses CommonJS `module.exports`. When a project is configured for ES Modules, a `require` call might fail.fixFor the main `iconPipeline` function, use `const iconPipeline = require('icon-pipeline')`. If your project strictly uses ESM, you might need to use a CommonJS wrapper or wait for native ESM support in future versions of the package.
Warnings
- gotcha This package is currently in early development (version 0.2.0). The API is subject to change without adhering to semantic versioning for breaking changes, and overall stability for critical production environments is not guaranteed.
- gotcha The `iconPipeline` function returns a Promise. Forgetting to handle this Promise with `.then()` or `await` will result in subsequent code attempting to access the `iconData` asynchronously receiving an `undefined` value or a pending Promise object.
- gotcha The `includeSpriteInSrc: true` option places generated `sprite.js` and `sprite.svg` directly into the `srcDir`. This can lead to issues with source control (e.g., unintended commits) if not properly managed with `.gitignore`.
Install
-
npm install icon-pipeline -
yarn add icon-pipeline -
pnpm add icon-pipeline
Imports
- iconPipeline
import { iconPipeline } from 'icon-pipeline'const iconPipeline = require('icon-pipeline') - sprite
import { sprite } from 'icon-pipeline'import sprite from './build/icons/sprite.js'
Quickstart
const path = require('path');
const iconPipeline = require('icon-pipeline');
const iconSrcFolder = path.join(__dirname, 'src', 'icons');
const iconOutputFolder = path.join(__dirname, 'build', 'icons');
// Ensure output directories exist before running, or icon-pipeline handles it.
// For demonstration, let's assume 'src/icons' contains some .svg files.
// Example: fs.mkdirSync(iconSrcFolder, { recursive: true });
// Example: fs.writeFileSync(path.join(iconSrcFolder, 'profile.svg'), '<svg viewBox="0 0 24 24"><path d="M12 4a4 4 0 014 4 4 4 0 01-4 4 4 4 0 01-4-4 4 4 0 014-4z"></path></svg>');
iconPipeline({
srcDir: iconSrcFolder,
outputDir: iconOutputFolder,
includeSpriteInSrc: true,
// Optional: disable additional svg classes
// disableClasses: true,
// Optional: namespace icon IDs
// namespace: 'company'
}).then((iconData) => {
console.log('Icon pipeline completed successfully.');
console.log('Generated icon data:', iconData);
// iconData will contain details like the paths to the generated files
}).catch((error) => {
console.error('Error running icon pipeline:', error);
});