ANSI Fragments for CLI Styling
ansi-fragments is a compact JavaScript library designed for constructing aesthetically pleasing command-line interface (CLI) outputs using ANSI escape codes. Currently at version 0.2.1, it adopts a unique builder-pattern approach, allowing developers to compose styled text fragments programmatically. The library provides functions like `color`, `modifier`, `container`, `pad`, `fixed`, `ifElse`, and `provide` to encapsulate styling logic. Its core differentiator is the explicit fragment building and the `.build()` method, which converts the fragment tree into a single ANSI-encoded string. While a relatively new project, its focus is on providing a 'nice DX' for structured CLI logging rather than offering an exhaustive list of all possible ANSI features. Release cadence is infrequent, typical for a micro-utility library in its early stages.
Common errors
-
TypeError: (0, _ansi_fragments.color) is not a function
cause This typically occurs when attempting to use named ESM imports in a CommonJS context or due to incorrect bundler configuration.fixEnsure your project is configured for ESM. For Node.js, set `"type": "module"` in your `package.json`. For bundlers, verify your configuration supports ESM output/resolution. -
TypeError: fragment.build is not a function
cause This error indicates that the `.build()` method was not called on a fragment or container object, leading to it being treated as a generic object.fixAlways call `.build()` at the end of your fragment chain or container to obtain the final ANSI-formatted string. For example, `container(...).build()`. -
Module not found: Error: Can't resolve 'ansi-fragments'
cause The package is either not installed in your project, or there is a typo in the import path.fixRun `npm install ansi-fragments` or `yarn add ansi-fragments` to install the package. Double-check your `import` statement for any typos in the module name.
Warnings
- gotcha As a pre-1.0 library (version 0.2.1), `ansi-fragments` may introduce breaking changes in minor versions. Review changelogs carefully when upgrading to avoid unexpected issues.
- gotcha All fragment trees must explicitly call the `.build()` method to render the final ANSI string. Forgetting this will result in an object being serialized to string (e.g., `[object Object]`) instead of the intended styled output.
- gotcha The library primarily supports standard 8-color ANSI colors and common text modifiers. It does not provide built-in support for 256-color, true-color (RGB), or custom background/foreground color codes beyond the basic ANSI set.
- breaking `ansi-fragments` is published as an ESM (ECMAScript Module) and expects to be imported using `import` statements. Attempting to `require()` it in CommonJS environments will lead to import errors.
Install
-
npm install ansi-fragments -
yarn add ansi-fragments -
pnpm add ansi-fragments
Imports
- color
const { color } = require('ansi-fragments');import { color } from 'ansi-fragments'; - modifier
const { modifier } = require('ansi-fragments');import { modifier } from 'ansi-fragments'; - container
const container = require('ansi-fragments').container;import { container } from 'ansi-fragments';
Quickstart
import { color, modifier, pad, container, fixed, ifElse } from 'ansi-fragments';
const generateLogMessage = (level, message, timestamp, hasError) => {
const levelFragment = ifElse(
() => hasError,
color('red', modifier('bold', level.toUpperCase())),
color('green', modifier('italic', level))
);
const timeFragment = color('gray', `[${timestamp}]`);
const paddedMessage = container(
fixed(8, 'start', levelFragment),
pad(1),
timeFragment,
pad(1),
message
);
return paddedMessage.build();
};
const now = new Date().toISOString().slice(11, 19);
console.log(generateLogMessage('success', 'Operation completed successfully!', now, false));
console.log(generateLogMessage('warning', 'Cache might be stale.', now, false));
console.log(generateLogMessage('error', 'Failed to connect to database.', now, true));
console.log(generateLogMessage('info', 'Processing batch job...', now, false));
// Simulate a long message being truncated by fixed()
console.log(generateLogMessage('debug', 'This is a very long debug message that should be truncated.', now, false));
// Example without fixed, just showing container and colors
const header = container(
color('cyan', '📦 Package Installer'),
pad(1, '-'),
color('magenta', 'v1.2.3')
).build();
console.log(header);