UNPKG

newline-async-iterator

Version:

Line-by-line async iterator for the browser and node

111 lines (106 loc) 5.14 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.newlineAsyncIterator = factory()); })(this, (function () { 'use strict'; // https://developer.mozilla.org/en-US/docs/Glossary/Base64#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64 /* c8 ignore start */ var decodeUTF8 = function decode(uint8Array) { var sView = ''; for(var nPart, nLen = uint8Array.length, nIdx = 0; nIdx < nLen; nIdx++){ nPart = uint8Array[nIdx]; sView += String.fromCharCode(nPart > 251 && nPart < 254 && nIdx + 5 < nLen /* six bytes */ ? /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */ (nPart - 252) * 1073741824 + (uint8Array[++nIdx] - 128 << 24) + (uint8Array[++nIdx] - 128 << 18) + (uint8Array[++nIdx] - 128 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 247 && nPart < 252 && nIdx + 4 < nLen /* five bytes */ ? (nPart - 248 << 24) + (uint8Array[++nIdx] - 128 << 18) + (uint8Array[++nIdx] - 128 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 239 && nPart < 248 && nIdx + 3 < nLen /* four bytes */ ? (nPart - 240 << 18) + (uint8Array[++nIdx] - 128 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 223 && nPart < 240 && nIdx + 2 < nLen /* three bytes */ ? (nPart - 224 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 191 && nPart < 224 && nIdx + 1 < nLen /* two bytes */ ? (nPart - 192 << 6) + uint8Array[++nIdx] - 128 : /* nPart < 127 ? */ /* one byte */ nPart); } return sView; }; /* c8 ignore stop */ if (typeof TextDecoder !== 'undefined') { var decoder = new TextDecoder('utf8'); decodeUTF8 = function decodeTextDecoder(uint8Array) { return decoder.decode(uint8Array); }; } var decodeUTF8$1 = decodeUTF8; function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var REGEX_NEW_LINE = /\r?\n|\r/g; var root = typeof window === 'undefined' ? global : window; // biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy var Symbol = typeof root.Symbol === 'undefined' ? { asyncIterator: undefined } : root.Symbol; /** * Create a newline iterator recognizing CR, LF, and CRLF using the Symbol.asyncIterator interface * * @param source The string to iterate through * * ```typescript * import newlineIterator from "newline-async-iterator"; * * const iterator = newlineIterator("some\r\nstring\ncombination\r"); * const results = []; * for (const line of iterator) results.push(line); * console.log(results); // ["some", "string", "combination"]; * ``` */ function newlineIterator(source) { var lines = []; var last = ''; var done = false; var sourceIterator = Symbol.asyncIterator ? source[Symbol.asyncIterator]() : source; function generateNext() { return new Promise(function(resolve, reject) { sourceIterator.next().then(function(next) { if (next.done) done = true; else last += decodeUTF8$1(next.value); var end = last.length > 0 ? last[last.length - 1] : ''; if (done || end !== '\r' && end !== '\n') { var moreLines = last.split(REGEX_NEW_LINE); last = moreLines.pop(); moreLines.forEach(function(line) { return lines.unshift(line); }); if (done && last.length > 0) { lines.unshift(last); last = ''; } } if (lines.length > 0) { var value = lines.pop(); if (done && lines.length === 0 && value.length === 0) return resolve({ value: null, done: true }); return resolve({ value: value, done: false }); } if (done) return resolve({ value: null, done: true }); generateNext().then(resolve).catch(reject); // get more }); }); } var iterator = _define_property({ next: function next() { return generateNext(); } }, Symbol.asyncIterator, function() { return this; }); return iterator; } return newlineIterator; })); //# sourceMappingURL=newline-async-iterator.cjs.map