{"_id":"@braebo/ansi","_rev":"2-ef40199d34e8b87c8368baf42e3e085c","name":"@braebo/ansi","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@braebo/ansi","version":"0.1.0","keywords":["ansi","color","console","logger","terminal","typescript"],"author":{"name":"braebo","email":"brady@braebo.dev"},"license":"MIT","_id":"@braebo/ansi@0.1.0","maintainers":[{"name":"bradenwiggins","email":"braden@fractal-hq.com"},{"name":"ghostsos","email":"ghostdevbusiness@gmail.com"}],"dist":{"shasum":"cf4dccb7cdd0022e6b68f10557c0881e2bf967ec","tarball":"https://registry.npmjs.org/@braebo/ansi/-/ansi-0.1.0.tgz","fileCount":11,"integrity":"sha512-2yZjwmpDrbjwo5FJLTP/+2bwHw3t+ZZeJKGQavUsPUMHAAnmWbzApPaPNO7axMpJVGFyZbJ94j8ZbwBznOQo2A==","signatures":[{"sig":"MEUCIQCJXfnApAYrR7KLeoKwHgfdyjWi669hINagNUHwzkxR6wIgLVmn1KNuHxgtdcHbWlkjwcCyVKfKZvcKbB7i1pSleuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43793},"type":"module","_from":"file:braebo-ansi-0.1.0.tgz","types":"./build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","import":"./build/index.js"}},"scripts":{"dev":"bun run --watch demo.ts","build":"rolldown src/index.ts --config rolldown.config.ts","check":"pnpm run --parallel \"/^check:(?!watch)[^:]*/\"","format":"prettier --write src","check:jsr":"jsr publish --dry-run ${CI:+--allow-dirty}","check:tsc":"pnpm tsc --noEmit","build:watch":"rolldown src/index.ts --config rolldown.config.ts --watch","check:watch":"pnpm run --parallel \"/^check:watch:.*/\"","check:publint":"publint","check:watch:jsr":"chokidar \"src/**/*.{ts,js,json}\" -c \"pnpm check:jsr\"","check:watch:tsc":"pnpm tsc --noEmit --watch","check:watch:publint":"chokidar \"src/**/*.{ts,js,json}\" -c \"pnpm check:publint\""},"_npmUser":{"name":"bradenwiggins","email":"braden@fractal-hq.com"},"_resolved":"/tmp/0c3614e52d117ce36444eddb5cbea17f/braebo-ansi-0.1.0.tgz","_integrity":"sha512-2yZjwmpDrbjwo5FJLTP/+2bwHw3t+ZZeJKGQavUsPUMHAAnmWbzApPaPNO7axMpJVGFyZbJ94j8ZbwBznOQo2A==","_npmVersion":"10.8.2","description":"ANSI code helpers for node.js and chrome.","directories":{},"_nodeVersion":"20.18.3","_hasShrinkwrap":false,"devDependencies":{"jsr":"0.13.4","vitest":"3.0.8","publint":"0.3.8","rolldown":"1.0.0-beta.3","changeset":"0.2.6","typescript":"5.8.2","@types/node":"22.13.9","@changesets/cli":"2.28.1","unplugin-isolated-decl":"0.13.1","@svitejs/changesets-changelog-github-compact":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ansi_0.1.0_1741330551335_0.1550250716606676","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@braebo/ansi","version":"0.2.0","description":"ANSI code helpers for colorful logging in node.js and chrome.","keywords":["ansi","color","console","logger","terminal","typescript"],"license":"MIT","author":{"name":"braebo","email":"brady@braebo.dev"},"sideEffects":false,"type":"module","exports":{".":{"types":"./build/index.d.ts","typescript":"./src/index.ts","import":"./build/index.js"}},"types":"./build/index.d.ts","devDependencies":{"@arethetypeswrong/cli":"^0.17.4","@types/node":"22.13.9","jsr":"0.13.4","publint":"0.3.8","rolldown":"1.0.0-beta.3","typescript":"5.8.2","unplugin-isolated-decl":"0.13.1","vitest":"3.0.8"},"scripts":{"build":"rolldown src/index.ts --config rolldown.config.ts","build:watch":"rolldown src/index.ts --config rolldown.config.ts --watch","check":"pnpm run --parallel \"/^check:(?!watch)[^:]*/\"","check:jsr":"jsr publish --dry-run ${CI:+--allow-dirty}","check:publint":"publint","check:tsc":"pnpm tsc --noEmit","check:types":"attw --profile esm-only $(npm pack)","check:watch":"pnpm run --parallel \"/^check:watch:.*/\"","check:watch:jsr":"chokidar \"src/**/*.{ts,js,json}\" -c \"pnpm check:jsr\"","check:watch:publint":"chokidar \"src/**/*.{ts,js,json}\" -c \"pnpm check:publint\"","check:watch:tsc":"pnpm tsc --noEmit --watch","dev":"bun run --watch demo.ts","format":"prettier --write src","test":"pnpm run --parallel \"/^test:(?!watch).*/\"","test:bun":"bun run test/bun/index.ts","test:deno":"deno run --unstable-sloppy-imports test/deno/main.ts","test:node":"node --experimental-strip-types test/test.ts","test:watch":"pnpm run --parallel \"/^test:watch:.*/\"","test:watch:bun":"bun run --watch test/bun/index.ts","test:watch:deno":"deno run --unstable-sloppy-imports --watch test/deno/main.ts","test:watch:node":"node --watch --experimental-strip-types test/test.ts"},"_id":"@braebo/ansi@0.2.0","_integrity":"sha512-3MTHip16XWIJT/Eg2wnPkdNWrdTQFiIVnKmT5tmuAHLpyZzJ8W5IbKP1BmxQ5AXY/SHFo+Q46TKPi1TmVIhqaw==","_resolved":"/private/var/folders/r8/tw2g_fsx57j9fdkr5hwppd0m0000gn/T/ec4b2d357b1c58a96168b0386ac870af/braebo-ansi-0.2.0.tgz","_from":"file:braebo-ansi-0.2.0.tgz","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-3MTHip16XWIJT/Eg2wnPkdNWrdTQFiIVnKmT5tmuAHLpyZzJ8W5IbKP1BmxQ5AXY/SHFo+Q46TKPi1TmVIhqaw==","shasum":"4b2300f29e224c0c19b317048fb345c566367189","tarball":"https://registry.npmjs.org/@braebo/ansi/-/ansi-0.2.0.tgz","fileCount":19,"unpackedSize":88596,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICbZdA1j6rB61Uc99ZBSg7F9zHr0oDtPwlfPBzA0u3sWAiAcJ8j9XhN8TOEEV1PKu4fIpb4ELtU/OmmQc45YUFBuxQ=="}]},"_npmUser":{"name":"bradenwiggins","email":"braden@fractal-hq.com"},"directories":{},"maintainers":[{"name":"bradenwiggins","email":"braden@fractal-hq.com"},{"name":"ghostsos","email":"ghostdevbusiness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ansi_0.2.0_1744593073558_0.9126275369663666"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-07T06:55:51.245Z","modified":"2025-04-14T01:11:13.941Z","0.1.0":"2025-03-07T06:55:51.505Z","0.2.0":"2025-04-14T01:11:13.734Z"},"author":{"name":"braebo","email":"brady@braebo.dev"},"license":"MIT","keywords":["ansi","color","console","logger","terminal","typescript"],"description":"ANSI code helpers for colorful logging in node.js and chrome.","maintainers":[{"name":"bradenwiggins","email":"braden@fractal-hq.com"},{"name":"ghostsos","email":"ghostdevbusiness@gmail.com"}],"readme":"# @braebo/ansi\n\nANSI code helpers for <span style=\"background: linear-gradient(90deg, #38b2db, #5959b5, #e84067); -webkit-background-clip: text; -webkit-text-fill-color: transparent;\">colorful logging</span> in node.js and chrome.\n\n<br>\n\n-   Hex -> True Color\n-   Dynamic colorization\n-   Gradients\n-   TypeScript / ESM\n-   Dependency-free\n-   Lightweight\n-   Tree shakable\n\n<br>\n\n## Install\n\n```zsh\n# npm\npnpm i -D @braebo/ansi\n\n# jsr\npnpm dlx jsr add @braebo/ansi\n```\n\n<br>\n\n## Usage\n\n### Hex\n\nCreate colors from hex values:\n\n```typescript\nimport { ansiHex } from '@braebo/ansi'\n\nconst coral = ansiHex('#FF7F50')\nconsole.log(coral('This text will be coral colored'))\n```\n\n<br>\n\n### Style\n\nCreate styles from the `ansiStyle` function:\n\n```typescript\nimport { ansiStyle } from '@braebo/ansi'\n\nconst bold = ansiStyle('bold')\nconsole.log(bold('This text will be bold'))\n```\n\n<br>\n\n### Gradient\n\nInterpolate gradients with any number of colors:\n\n```ts\nimport { ansiGradient } from '@braebo/ansi'\n\n// Create a gradient function.\nconst g = ansiGradient('#38b2db', '#5959b5', '#e84067')\n```\n\nNow that we have a gradient function, we can pass it a string:\n\n```ts\nconsole.log(g('Simple gradient text.'))\n```\n\n<img src=\"./assets/gradient-string.png\" alt=\"Gradient string\" height=\"150\" width=\"auto\" />\n\nOr pass it a number to get a color stop:\n\n```ts\nconst fade = `\n${g(0.5)}■■■■■■■■■■■■\n${g(0.0)}■■■■■■■■■■■■\n${g(0.9)}■■■■■■■■■■■■\n${CLEAR}`\n\nconsole.log(fade)\n```\n\n<img src=\"./assets/gradient-stops.png\" alt=\"Gradient color stops\" height=\"200\" width=\"auto\" />\n\n### Mini Methods\n\nColored logging can quickly become unweildy, so I like to use the mini methods for common colors and styles:\n\n```typescript\nimport { l } from '@braebo/ansi' // console.log\n\nimport { r, g, b } from '@braebo/ansi' // Colors\nimport { d, bd, em } from '@braebo/ansi' // Styles\n\n// Colors\nl(r('red'))\nl(g('green'))\nl(b('blue'))\n\n// Styles\nl(d('dimmed'))\nl(bd('bold'))\nl(em('italic'))\n```\n\n<img src=\"./assets/minis.png\" alt=\"Mini\" height=\"250\" width=\"auto\" />\n\nIf no arguments are provided, the mini methods will return the ANSI code:\n\n```ts\nconsole.log(r() + 'red', y() + 'yellow', g() + 'green')\n```\n\n<img src=\"./assets/minis2.png\" alt=\"Mini no args\" height=\"150\" width=\"auto\" />\n\n> [!NOTE]\n> When no string is provided to a mini method, it won't be wrapped in a corresponding reset code.\n> Use the clear method (`clr()`) to reset the styles yourself.\n\n<br>\n\n### `logger`\n\nThe `logger` function used by the mini methods is somewhat involved, so I decided to expose / document it. It can be used to create your own custom logging functions that colorize input dynamically.\n\n```ts\nconst err = logger({\n\tprefix: r('| '),\n\tprintWidth: 20,\n\tfn: (...args: any[]) => {\n\t\tconsole.log(r('>'), r(bd('ERROR')))\n\t\tconsole.log(...args)\n\t},\n})\n\nerr('Something went wrong:', { ok: false, cause: '¯\\\\_(ツ)_/¯' })\n```\n\n<img src=\"./assets/logger-custom.png\" alt=\"Logger custom screenshot\" height=\"230\" width=\"auto\" />\n\n<br>\n\n### `LogOptions`\n\nThe `logger` function accepts the following options:\n\n<br>\n\n#### `printWidth`\n\nControls the expansion of objects and arrays into multiline output.\n\n> @default `60`\n\n```ts\nconst l = logger({ printWidth: 50 })\nl({ foo: true, bar: [1, 'two', { three: () => 3 }] })\n```\n\n<img src=\"./assets/logger-printWidth.png\" alt=\"Logger printWidth screenshot\" height=\"210\" width=\"auto\" />\n\n> [!NOTE]\n> Internally, `printWidth` is calculated somewhat roughly, so this option is generally a ballpark estimate.\n\n<br>\n\n#### `inline`\n\nForces inputs into either inline or multiline output.\n\n> @default `undefined`\n\n```ts\nconst l = logger({ inline: true })\nl({ foo: true, bar: [1, 'two', { three: () => 3 }] })\n```\n\n<img src=\"./assets/logger-inline.png\" alt=\"Logger inline screenshot\" height=\"150\" width=\"auto\" />\n\nAdd `__inline__` to an object for a granular overrides.\n\n```ts\nl({\n\tone: 1,\n\ttwo: 2,\n\tnested: { __inline__: true, one: 1, two: 2, three: 3 },\n})\n```\n\n<img src=\"./assets/logger-overrides-obj.png\" alt=\"Logger object overrides screenshot\" height=\"200\" width=\"auto\" />\n\nFor array overrides, use the strings `__inline__` and `__multiline__` to force inline or multiline output.\n\n```ts\nl([true, 1, 'two', () => 3, '__multiline__'])\n```\n\n<img src=\"./assets/logger-overrides-array.png\" alt=\"Logger array overrides screenshot\" height=\"250\" width=\"auto\" />\n\n<br>\n\n#### `delimiter`\n\nThe delimiter used between rest args.\n\n> @default `' '`\n\n```ts\nconst l = logger({ delimiter: c(' · ') })\nl(true, 1, 'two', () => 3)\n```\n\n<img src=\"./assets/logger-delimiter.png\" alt=\"Logger delimiter screenshot\" height=\"150\" width=\"auto\" />\n\n<br>\n\n#### `prefix`\n\nA prefix to prepend to each line (works with multiline output).\n\n> @default `''`\n\n```ts\nconst l = logger({ prefix: c('⌇ '), delimiter: '' })\nl('# ', bd('Header'))\nl()\nl(d('<p>'), em('Hello, world!'), d('</p>'))\n```\n\n<img src=\"./assets/logger-prefix.png\" alt=\"Logger prefix screenshot\" height=\"190\" width=\"auto\" />\n\n<br>\n\n#### `fn`\n\nA custom logger function.\n\n> @default `console.log`\n\n```ts\nconst l = logger({ fn: console.warn })\nl('E-gad!')\n```\n\n<img src=\"./assets/logger-warn.png\" alt=\"Logger warn screenshot\" height=\"42\" width=\"auto\" />\n\n<br>\n\n### `paint()`\n\nThe `paint` function used by `logger` can be used directly to colorize arbitrary input:\n\n```ts\nconsole.log(\n\tpaint(\n\t\t{\n\t\t\tnum: 123,\n\t\t\tbool: true,\n\t\t\tstr: 'foo',\n\t\t\tfn: () => 'bar',\n\t\t},\n\t\t{ inline: false },\n\t),\n)\n```\n\n<img src=\"./assets/paint.png\" alt=\"Paint screenshot\" height=\"250\" width=\"auto\" />\n\n### Why\n\nNIH syndrome / copy-paste fatigue.\n\n<br>\n\n### License\n\nMIT © [braebo](https://github.com/braebo)\n","readmeFilename":"README.md"}