const tab = 9 /* `\t` */ const space = 32 /* ` ` */ /** * Remove initial and final spaces and tabs at the line breaks in `value`. * Does not trim initial and final spaces and tabs of the value itself. * * @param {string} value * Value to trim. * @returns {string} * Trimmed value. */ export function trimLines(value) { const source = String(value) const search = /\r?\n|\r/g let match = search.exec(source) let last = 0 /** @type {Array} */ const lines = [] while (match) { lines.push( trimLine(source.slice(last, match.index), last > 0, true), match[0] ) last = match.index + match[0].length match = search.exec(source) } lines.push(trimLine(source.slice(last), last > 0, false)) return lines.join('') } /** * @param {string} value * Line to trim. * @param {boolean} start * Whether to trim the start of the line. * @param {boolean} end * Whether to trim the end of the line. * @returns {string} * Trimmed line. */ function trimLine(value, start, end) { let startIndex = 0 let endIndex = value.length if (start) { let code = value.codePointAt(startIndex) while (code === tab || code === space) { startIndex++ code = value.codePointAt(startIndex) } } if (end) { let code = value.codePointAt(endIndex - 1) while (code === tab || code === space) { endIndex-- code = value.codePointAt(endIndex - 1) } } return endIndex > startIndex ? value.slice(startIndex, endIndex) : '' }