@mintlify/scraping
Version:
Scrape documentation frameworks to Mintlify docs
128 lines (114 loc) • 3.13 kB
text/typescript
export const colors = {
red: '\x1b[31m',
green: '\x1b[32m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
magenta: '\x1b[35m',
cyan: '\x1b[36m',
grey: '\x1b[90m',
default: '\x1b[0m',
bold: '\x1b[1m',
dim: '\x1b[2m',
italic: '\x1b[3m',
} as const;
const noColors = {
red: '',
green: '',
yellow: '',
blue: '',
magenta: '',
cyan: '',
grey: '',
default: '',
bold: '',
dim: '',
italic: '',
} as const;
const statuses = ['success', 'failure', 'error', 'warn', 'warning', 'info'] as const;
export const activeColors =
'stdout' in process && 'hasColors' in process.stdout && process.stdout.hasColors()
? colors
: noColors;
export type Status = (typeof statuses)[number];
export type Color = keyof typeof colors;
export const checkIcon = '✔ ' as const;
export const xIcon = '✘ ' as const;
export const infoIcon = 'ⓘ ' as const;
export const warningIcon = '⚠ ' as const;
export function log(
message: string | unknown,
statusOrColor: Status | undefined = undefined,
opts: {
trailingNewLine?: boolean;
leadingNewLine?: boolean;
omitStatusMessage?: boolean;
omitIcon?: boolean;
} = {}
): void {
let color: (typeof activeColors)[Color] = activeColors.blue;
let statusMsg: string = 'INFO';
let icon: string = infoIcon;
const msg = typeof message === 'string' ? message.toLowerCase() : '';
if (!statusOrColor) {
statusOrColor =
msg.includes('fail') ||
msg.includes('error') ||
msg.includes('could not') ||
msg.includes("couldn't") ||
msg.includes('did not') ||
msg.includes('invalid') ||
msg.includes("didn't")
? 'error'
: msg.includes('success') ||
msg.includes('downloaded') ||
msg.includes('written') ||
msg.includes('added')
? 'success'
: msg.includes('warn')
? 'warn'
: undefined;
}
switch (statusOrColor) {
case undefined:
case 'info':
break;
case 'success':
color = activeColors.green;
statusMsg = 'SUCCESS';
icon = checkIcon;
break;
case 'warn':
case 'warning':
color = activeColors.yellow;
statusMsg = 'WARNING';
icon = warningIcon;
break;
case 'failure':
case 'error':
color = activeColors.red;
statusMsg = 'ERROR';
icon = xIcon;
break;
}
if (opts.omitIcon) icon = '';
if (opts.omitStatusMessage) statusMsg = '';
const separator = opts.omitStatusMessage ? '' : !opts.omitIcon ? ' - ' : '';
if (opts.leadingNewLine) console.log();
console[
statusOrColor === 'error' || statusOrColor === 'failure'
? 'error'
: statusOrColor === 'warn' || statusOrColor === 'warning'
? 'warn'
: 'log'
](
`${color}${icon}${icon ? ' ' : ''}${statusMsg}${activeColors.default}${separator}${
typeof message === 'string' ||
typeof message === 'bigint' ||
typeof message === 'number' ||
typeof message === 'boolean'
? message
: JSON.stringify(message, undefined, 2)
}`
);
if (opts.trailingNewLine) console.log();
}