/** * @typedef {import('../types.js').CreateTracker} CreateTracker * @typedef {import('../types.js').TrackCurrent} TrackCurrent * @typedef {import('../types.js').TrackMove} TrackMove * @typedef {import('../types.js').TrackShift} TrackShift */ /** * Track positional info in the output. * * @type {CreateTracker} */ export function track(config) { // Defaults are used to prevent crashes when older utilities somehow activate // this code. /* c8 ignore next 5 */ const options = config || {} const now = options.now || {} let lineShift = options.lineShift || 0 let line = now.line || 1 let column = now.column || 1 return {move, current, shift} /** * Get the current tracked info. * * @type {TrackCurrent} */ function current() { return {now: {line, column}, lineShift} } /** * Define an increased line shift (the typical indent for lines). * * @type {TrackShift} */ function shift(value) { lineShift += value } /** * Move past some generated markdown. * * @type {TrackMove} */ function move(input) { // eslint-disable-next-line unicorn/prefer-default-parameters const value = input || '' const chunks = value.split(/\r?\n|\r/g) const tail = chunks[chunks.length - 1] line += chunks.length - 1 column = chunks.length === 1 ? column + tail.length : 1 + tail.length + lineShift return value } }