Description
I've started migrating some of my personal projects to native ESM (not transpiled), and suddenly started noticing that string wrapping in the command-line help became "dumb", simply injecting \n
at the column boundary. Digging into yargs and cliui, I found that the cliui index.mjs
entrypoint is using some simple implementations for stripAnsi
and wrap
from lib/string-utils.ts
, which contains a comment about being a minimal replacement for the older/existing CJS libraries.
Would it be possible to simply import those CJS libraries, even in an ESM context? I know this should work fine in Node.js, I'm not sure whether Deno adds additional restrictions. (But Deno appears to have its own entrypoint, so this may be a non-issue.)
Just for giggles, I hand-patched my local install in node_modules (for a yargs-using tool) so that cliui/index.mjs
looked like:
import { cliui } from './build/lib/index.js'
import stringWidth from 'string-width';
import stripAnsi from 'strip-ansi';
import wrap from 'wrap-ansi';
export default function ui (opts) {
return cliui(opts, {
stringWidth,
stripAnsi,
wrap
})
}
(basically, a naive merge of the existing wrapper and the TS/CJS index)... and it seemed to work perfectly (on Node.js v14.5.0), giving me pretty word-wrapping, and no weird clipping.
current
-v, --verbose Increase verbosity of console output, can be given multiple time es to increase verbosity [count]
patched
-v, --verbose Increase verbosity of console output, can be given multiple times to increase verbosity [count]
Is there any reason cliui can't simply leverage the existing width/ansi/wrap CJS libraries for ESM? I'm happy to provide this as a PR with updated ESM tests if that would help.