| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | 'use strict';const isFullwidthCodePoint = require('is-fullwidth-code-point');const astralRegex = require('astral-regex');const ansiStyles = require('ansi-styles');const ESCAPES = [	'\u001B',	'\u009B'];const wrapAnsi = code => `${ESCAPES[0]}[${code}m`;const checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => {	let output = [];	ansiCodes = [...ansiCodes];	for (let ansiCode of ansiCodes) {		const ansiCodeOrigin = ansiCode;		if (ansiCode.includes(';')) {			ansiCode = ansiCode.split(';')[0][0] + '0';		}		const item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10));		if (item) {			const indexEscape = ansiCodes.indexOf(item.toString());			if (indexEscape === -1) {				output.push(wrapAnsi(isEscapes ? item : ansiCodeOrigin));			} else {				ansiCodes.splice(indexEscape, 1);			}		} else if (isEscapes) {			output.push(wrapAnsi(0));			break;		} else {			output.push(wrapAnsi(ansiCodeOrigin));		}	}	if (isEscapes) {		output = output.filter((element, index) => output.indexOf(element) === index);		if (endAnsiCode !== undefined) {			const fistEscapeCode = wrapAnsi(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10)));			output = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []);		}	}	return output.join('');};module.exports = (string, begin, end) => {	const characters = [...string];	const ansiCodes = [];	let stringEnd = typeof end === 'number' ? end : characters.length;	let isInsideEscape = false;	let ansiCode;	let visible = 0;	let output = '';	for (const [index, character] of characters.entries()) {		let leftEscape = false;		if (ESCAPES.includes(character)) {			const code = /\d[^m]*/.exec(string.slice(index, index + 18));			ansiCode = code && code.length > 0 ? code[0] : undefined;			if (visible < stringEnd) {				isInsideEscape = true;				if (ansiCode !== undefined) {					ansiCodes.push(ansiCode);				}			}		} else if (isInsideEscape && character === 'm') {			isInsideEscape = false;			leftEscape = true;		}		if (!isInsideEscape && !leftEscape) {			visible++;		}		if (!astralRegex({exact: true}).test(character) && isFullwidthCodePoint(character.codePointAt())) {			visible++;			if (typeof end !== 'number') {				stringEnd++;			}		}		if (visible > begin && visible <= stringEnd) {			output += character;		} else if (visible === begin && !isInsideEscape && ansiCode !== undefined) {			output = checkAnsi(ansiCodes);		} else if (visible >= stringEnd) {			output += checkAnsi(ansiCodes, true, ansiCode);			break;		}	}	return output;};
 |