{"id":17654046,"url":"https://github.com/tomchen/fetchline","last_synced_at":"2025-07-13T09:39:05.131Z","repository":{"id":57234758,"uuid":"336014296","full_name":"tomchen/fetchline","owner":"tomchen","description":"Read text file (remote over HTTP(S) or local) line by line as async iterator, with Node, browsers and Deno","archived":false,"fork":false,"pushed_at":"2021-02-14T15:23:36.000Z","size":1695,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-07T09:12:28.625Z","etag":null,"topics":["async-iterator","browser","deno","fetch","file","isomorphic","iterable","iterator","lerna","line","monorepo","node","nodejs","promise","readline"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomchen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-04T16:29:09.000Z","updated_at":"2022-06-12T02:15:04.000Z","dependencies_parsed_at":"2022-09-15T06:51:19.717Z","dependency_job_id":null,"html_url":"https://github.com/tomchen/fetchline","commit_stats":{"total_commits":41,"total_committers":1,"mean_commits":41.0,"dds":0.0,"last_synced_commit":"006a0736a4c16fbc02a9fff1f8e8944454e68f56"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomchen%2Ffetchline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomchen%2Ffetchline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomchen%2Ffetchline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomchen%2Ffetchline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomchen","download_url":"https://codeload.github.com/tomchen/fetchline/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252847514,"owners_count":21813457,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async-iterator","browser","deno","fetch","file","isomorphic","iterable","iterator","lerna","line","monorepo","node","nodejs","promise","readline"],"created_at":"2024-10-23T12:08:26.906Z","updated_at":"2025-05-07T09:12:39.101Z","avatar_url":"https://github.com/tomchen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fetch Line JavaScript packages: read remote or local file line by line as async iterator\n\nRead text file (remote over HTTP(S) or local) line by line as async iterator, with Node, browsers and Deno.\n\n[This GitHub monorepo](https://github.com/tomchen/fetchline/) hosts 6 npm packages and 1 Deno module. They all serve a similar, simple purpose: read text file line by line and return an asynchronous iterable iterator of strings. They all try to be efficient and fast, and are written in TypeScript. However, their environment / platforms and exact purpose, features and behavior differ.\n\n[![Actions Status](https://github.com/tomchen/fetchline/workflows/Test/badge.svg)](https://github.com/tomchen/fetchline/actions) [![Node.js](https://img.shields.io/badge/node-%3E=12.0-brightgreen.svg?logo=node.js)](https://nodejs.org/) [![Deno](https://img.shields.io/badge/deno-%3E=1.2.0-white.svg?logo=deno)](https://deno.land/) [![lerna](https://img.shields.io/badge/monorepo-lerna-cc00ff.svg)](https://lerna.js.org/) [![License](https://img.shields.io/github/license/tomchen/fetchline)](https://github.com/tomchen/fetchline/blob/main/LICENSE)\n\n**TLDR: read the [\"Purpose \u0026 environment\" table](#purpose--environment), pick the package you need, have a look at the [Usage section](#usage), know at least a little bit about JavaScript's [async / await](#async--await), and go ahead to use them.**\n\n## Comparison\n\n### Purpose \u0026 environment\n\n\u003ctable\u003e\n\u003cthead\u003e\n  \u003ctr\u003e\n    \u003cth rowspan=\"2\"\u003ePackage / Module Name\u003c/th\u003e\n    \u003cth rowspan=\"2\" title=\"Whether it is recommended\"\u003eRec?\u003c/th\u003e\n    \u003cth colspan=\"3\"\u003eFetch remote file over HTTP(S)\u003c/th\u003e\n    \u003cth colspan=\"2\"\u003eRead local file\u003c/th\u003e\n    \u003cth rowspan=\"2\"\u003eVersion\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/node.svg\" title=\"Node.js\" alt=\"Node.js\" width=\"50px\" height=\"50px\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/deno.svg\" title=\"Deno\" alt=\"Deno\" width=\"50px\" height=\"50px\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/chrome.svg\" title=\"Google Chrome\" alt=\"Google Chrome\" width=\"25px\" height=\"25px\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/firefox.svg\" title=\"Firefox\" alt=\"Firefox\" width=\"25px\" height=\"25px\"\u003e\u003cbr\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/safari.svg\" title=\"Safari\" alt=\"Safari\" width=\"25px\" height=\"25px\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/edge.svg\" title=\"Microsoft Edge\" alt=\"Microsoft Edge\" width=\"25px\" height=\"25px\"\u003e\u003cbr\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/opera.svg\" title=\"Opera\" alt=\"Opera\" width=\"25px\" height=\"25px\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/samsung_internet.svg\" title=\"Samsung Internet\" alt=\"Samsung Internet\" width=\"25px\" height=\"25px\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/node.svg\" title=\"Node.js\" alt=\"Node.js\" width=\"50px\" height=\"50px\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tomchen/fetchline/main/images/deno.svg\" title=\"Deno\" alt=\"Deno\" width=\"50px\" height=\"50px\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#fetchline-nodefetchline-isomorphic-fetchline-and-naivefetchline\"\u003efetchline\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Recommended\"\u003e👍\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.npmjs.com/package/fetchline\" title=\"fetchline's npm page\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/fetchline?color=green\u0026label=\" alt=\"version number\"\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#fetchline-nodefetchline-isomorphic-fetchline-and-naivefetchline\"\u003enodefetchline\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Recommended\"\u003e👍\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.npmjs.com/package/nodefetchline\" title=\"nodefetchline's npm page\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/nodefetchline?color=green\u0026label=\" alt=\"version number\"\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#fetchline-nodefetchline-isomorphic-fetchline-and-naivefetchline\"\u003eisomorphic-fetchline\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.npmjs.com/package/isomorphic-fetchline\" title=\"isomorphic-fetchline's npm page\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/isomorphic-fetchline?color=green\u0026label=\" alt=\"version number\"\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#fetchline-nodefetchline-isomorphic-fetchline-and-naivefetchline\"\u003enaivefetchline\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.npmjs.com/package/naivefetchline\" title=\"naivefetchline's npm page\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/naivefetchline?color=green\u0026label=\" alt=\"version number\"\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#readlineiter-readlineiter-for-deno-and-getfileline\"\u003egetfileline\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.npmjs.com/package/getfileline\" title=\"getfileline's npm page\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/getfileline?color=green\u0026label=\" alt=\"version number\"\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#readlineiter-readlineiter-for-deno-and-getfileline\"\u003ereadlineiter\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Recommended\"\u003e👍\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.npmjs.com/package/readlineiter\" title=\"readlineiter's npm page\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/readlineiter?color=green\u0026label=\" alt=\"version number\"\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"#readlineiter-readlineiter-for-deno-and-getfileline\"\u003ereadlineiter for Deno\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Recommended\"\u003e👍\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" title=\"Yes\"\u003e✅\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\nIf you are not sure, just use the recommended one that has the correct environment and purpose you need.\n\n**Tested:**\n\n* Node.js: ≥ 12\n* Deno: ≥ v1.2.0\n* Modern browsers (Google Chrome, Firefox, Safari, Microsoft Edge, Opera, Samsung Internet): all latest\n\n## Usage\n\n### fetchline, nodefetchline, isomorphic-fetchline, and naivefetchline\n\n#### Examples\n\n```bash\nnpm install fetchline\n```\n\n```js\nimport fetchline from 'fetchline'\nconst lineIterator =\n  fetchline('https://raw.githubusercontent.com/tomchen/fetchline/main/testfile/crlf_finalnewline')\n// This is the same as:\n// fetchline(\n//   'https://raw.githubusercontent.com/tomchen/fetchline/main/testfile/crlf_finalnewline',\n//   {\n//     includeLastEmptyLine: true,\n//     encoding: 'utf-8',\n//     delimiter: /\\r?\\n/g,\n//   }\n// )\n;(async () =\u003e {\n  for await (const line of lineIterator) {\n    // do something with `line`\n  }\n})()\n```\n\nChange `'fetchline'` to `nodefetchline`, `isomorphic-fetchline`, or `naivefetchline` if you use these packages instead.\n\nFor Deno: `import fetchline from 'https://github.com/tomchen/fetchline/blob/main/packages/fetchline/src/index.ts'`\n\nChange the `import` line to syntax like `const nodefetchline = require('nodefetchline')` if you use nodefetchline or isomorphic-fetchline package in Node's CommonJS.\n\nFor browsers:\n\n```html\n\u003cscript src=\"https://unpkg.com/fetchline/dist/umd\"\u003e\u003c/script\u003e\n\u003cscript\u003e\nfetchline(...) // same as above\n\u003c/script\u003e\n```\n\n#### Details\n\nThese four packages have exactly the same interface (parameters and return value):\n\n| Parameter Name                 | Required? | Type                 | Default Value | Description                                                                                                                                                                                            |\n| :----------------------------- | :-------- | :------------------- | :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `filepath`                     | Required  | *string*             | *N/A*         | URL or path of the text file                                                                                                                                                                           |\n| `options`                      | Optional  | *object*             | `{}`          | options, including the following three                                                                                                                                                                 |\n| `options.includeLastEmptyLine` | Optional  | *boolean*            | `true`        | Should it count the last empty line?                                                                                                                                                                   |\n| `options.encoding`             | Optional  | *string*             | `'utf-8'`     | File encoding                                                                                                                                                                                          |\n| `options.delimiter`            | Optional  | *string* or *RegExp* | `/\\r?\\n/g`    | Line (or other item)'s delimiter / separator.\u003cbr\u003e**NOTE:** do not set it as something like `/\\r\\n\\|\\n\\|\\r/g`, it causes trouble when one of the chunks of a CRLF (`\\r\\n`)-EOL file ends with CR (`\\r`) |\n\n**Return value:** { *AsyncIterableIterator\\\u003cstring\\\u003e* } An asynchronous iterable iterator containing each line in string from the text file\n\n### readlineiter, readlineiter for Deno, and getfileline\n\nThey have **similar** interface as the aforementioned fetchline, nodefetchline, isomorphic-fetchline, and naivefetchline, **but do not have the second parameter, `options`**, and everything `options` contains.\n\n```bash\nnpm install readlineiter\n```\n\n```js\nimport readlineiter from 'readlineiter' // For Deno: import readlineiter from 'https://raw.githubusercontent.com/tomchen/fetchline/main/packages/readlineiter-deno/mod.ts'\nconst lineIterator = readlineiter('./crlf_finalnewline')\n;(async () =\u003e {\n  for await (const line of lineIterator) {\n    // do something with `line`\n  }\n})()\n```\n\n## Further comparison\n\n### Characteristics\n\n|                       | ASAP  | 0 dependencies | TypeScript |\n| --------------------- | :---: | :----------: | :--------: |\n| fetchline             |   ✅   |      ✅       |     ✅      |\n| nodefetchline         |   ✅   |      ✅       |     ✅      |\n| isomorphic-fetchline  |   ✅   |      ✅       |  `.d.ts`   |\n| naivefetchline        |   ❌   |      ✅       |     ✅      |\n| getfileline           |   ✅   |      ✅       |     ✅      |\n| readlineiter          |   ✅   |      ✅       |     ✅      |\n| readlineiter for Deno |   ✅   |      ✅       |     ✅      |\n\n**ASAP:**\n\n* These remote file requesting libs should resolve with the line text string as soon as possible, i.e. as soon as the chunks that have arrived can form the next complete line\n  * Except for naivefetchline that is, well, naïve, I really can't blame it\n* The local file reading libs read the file with pointer, rather than get a whole string in memory then split the string\n\n**0 dependencies:** no external non-dev dependency for npm packages. Note that:\n\n* Node libraries inevitably use native Node libraries `http` and `https`, or `fs`\n* getfileline and readlineiter also use `readline` native lib directly thus are just wrappers, but other packages here use own low-level method\n* \"readlineiter for Deno\" uses Deno Standard Module [`bufio.ts`](https://deno.land/std/io/bufio.ts).\n\n**TypeScript:** the source code is in TypeScript, except for isomorphic-fetchline's source which is in JavaScript but has type definition (`.d.ts`).\n\nAs for the production / dist files, these packages are all compiled into different [module versions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) where possible: Node.js' [Common.js](https://en.wikipedia.org/wiki/CommonJS) (which uses `require()`), ES Module (native JS module with `import`), and minified [UMD](https://github.com/umdjs/umd) that is good for browser.\n\n### Parameters amd return value\n\n|                       | `filepath` parameter | `includeLastEmptyLine` option | `encoding` option |                              `delimiter` option                              | Return `AsyncIterableIterator\u003cstring\u003e` |\n| --------------------- | :------------------: | :---------------------------: | :---------------: | :--------------------------------------------------------------------------: | :------------------------------------: |\n| fetchline             |          ✅           |               ✅               |         ✅         |                                      ✅                                       |                   ✅                    |\n| nodefetchline         |          ✅           |               ✅               |         ✅         |                                      ✅                                       |                   ✅                    |\n| isomorphic-fetchline  |          ✅           |               ✅               |         ✅         |                                      ✅                                       |                   ✅                    |\n| naivefetchline        |          ✅           |               ✅               |         ✅         |                                      ✅                                       |                   ✅                    |\n| getfileline           |          ✅           |       ❌, always doesn't       |  ❌, always utf-8  | ❌, always EOL detected by [`readline`](https://nodejs.org/api/readline.html) |                   ✅                    |\n| readlineiter          |          ✅           |       ❌, always doesn't       |  ❌, always utf-8  | ❌, always EOL detected by [`readline`](https://nodejs.org/api/readline.html) |                   ✅                    |\n| readlineiter for Deno |          ✅           |        ❌, always does         |  ❌, always utf-8  |  ❌, always EOL detected by [`bufio.ts`](https://deno.land/std/io/bufio.ts)   |                   ✅                    |\n\ngetfileline and readlineiter's delimiter is EOL character detected by [`readline`](https://nodejs.org/api/readline.html) native module with its [`crlfDelay` option](https://nodejs.org/api/readline.html#readline_readline_createinterface_options) set to `Infinity`.\n\n## Tips \u0026 thoughts\n\n### `async` / `await`\n\nOf course, you should at least know a little bit about [async / await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), `await asyncIterator.next()` or [`for await of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) before using the packages here. If you don't, click the links to read the article from MDN Web Docs. Basically, you can do this:\n\n```js\n;(async () =\u003e {\n  for await (const line of lineIterator) {\n    // do something with `line`\n  }\n})()\n```\n\nOr this:\n\n```js\n;(async () =\u003e {\n  let line\n  let isDone\n  while (1) {\n    ;({ value: line, done: isDone } = await lineIterator.next())\n    // do something with `line`\n    if (isDone) {\n      break\n    }\n  }\n})()\n```\n\n### Line-delimited JSON\n\nThese packages, especially 'fetchline' (the first one) for browsers, could be helpful for [line-delimited JSON](https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON) (aka. [ndjson](http://ndjson.org/) (Newline Delimited JSON), [JSON Lines](https://jsonlines.org/)) parsing. You could write something like:\n\n```js\nimport fetchline from 'fetchline'\nconst lineIterator = fetchline(lineDelimitedJsonUrl)\n;(async () =\u003e {\n  for await (const line of lineIterator) {\n    const lineJson = JSON.parse(line)\n    // do something with `lineJson`\n  }\n})()\n```\n\n### Development\n\nThis is a [Lerna](https://lerna.js.org/) powered monorepo with mixed code (TypeScript / JavaScript), mixed module version (CommonsJS, ES Module, UMD) and cross-environment (Node.js, Deno, browsers) support, automated tests with GitHub Actions CI. Look at the root [package.json](https://github.com/tomchen/fetchline/blob/main/package.json) and individual packages' package.json for available scripts, to get started, `yarn` then `yarn bootstrap`. You could also use the repo as an example of Lerna monorepo.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomchen%2Ffetchline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomchen%2Ffetchline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomchen%2Ffetchline/lists"}