{"id":13455783,"url":"https://github.com/bevry/caterpillar","last_synced_at":"2025-07-20T11:02:06.352Z","repository":{"id":466496,"uuid":"2332686","full_name":"bevry/caterpillar","owner":"bevry","description":"Caterpillar is the ultimate logging system for Deno, Node.js, and Web Browsers. Log levels are implemented to the RFC standard. Log entries can be filtered and piped to various streams, including coloured output to the terminal, the browser's console, and debug files. You can even write your own transforms.","archived":false,"fork":false,"pushed_at":"2024-10-12T23:36:30.000Z","size":2845,"stargazers_count":401,"open_issues_count":6,"forks_count":14,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-07-09T03:28:55.706Z","etag":null,"topics":["caterpillar","client-side","deno","logger","logging","nodejs","pipe","transform-streams"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bevry.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["balupton"],"patreon":"bevry","open_collective":"bevry","ko_fi":"balupton","liberapay":"bevry","tidelift":"npm/caterpillar","custom":["https://bevry.me/fund"]}},"created_at":"2011-09-06T05:42:16.000Z","updated_at":"2025-07-03T13:03:59.000Z","dependencies_parsed_at":"2024-11-06T09:39:55.373Z","dependency_job_id":null,"html_url":"https://github.com/bevry/caterpillar","commit_stats":{"total_commits":196,"total_committers":5,"mean_commits":39.2,"dds":0.3877551020408163,"last_synced_commit":"566df0fbf11c883e9ea82c03d0cae1946fe50802"},"previous_names":[],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/bevry/caterpillar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bevry%2Fcaterpillar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bevry%2Fcaterpillar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bevry%2Fcaterpillar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bevry%2Fcaterpillar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bevry","download_url":"https://codeload.github.com/bevry/caterpillar/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bevry%2Fcaterpillar/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265154790,"owners_count":23719419,"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":["caterpillar","client-side","deno","logger","logging","nodejs","pipe","transform-streams"],"created_at":"2024-07-31T08:01:11.026Z","updated_at":"2025-07-20T11:02:06.261Z","avatar_url":"https://github.com/bevry.png","language":"TypeScript","readme":"\u003c!-- TITLE/ --\u003e\n\n# Caterpillar\n\n\u003c!-- /TITLE --\u003e\n\n\u003c!-- BADGES/ --\u003e\n\n\u003cspan class=\"badge-githubworkflow\"\u003e\u003ca href=\"https://github.com/bevry/caterpillar/actions?query=workflow%3Abevry\" title=\"View the status of this project's GitHub Workflow: bevry\"\u003e\u003cimg src=\"https://github.com/bevry/caterpillar/workflows/bevry/badge.svg\" alt=\"Status of the GitHub Workflow: bevry\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-npmversion\"\u003e\u003ca href=\"https://npmjs.org/package/caterpillar\" title=\"View this project on NPM\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/caterpillar.svg\" alt=\"NPM version\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-npmdownloads\"\u003e\u003ca href=\"https://npmjs.org/package/caterpillar\" title=\"View this project on NPM\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/caterpillar.svg\" alt=\"NPM downloads\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cbr class=\"badge-separator\" /\u003e\n\u003cspan class=\"badge-githubsponsors\"\u003e\u003ca href=\"https://github.com/sponsors/balupton\" title=\"Donate to this project using GitHub Sponsors\"\u003e\u003cimg src=\"https://img.shields.io/badge/github-donate-yellow.svg\" alt=\"GitHub Sponsors donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-thanksdev\"\u003e\u003ca href=\"https://thanks.dev/u/gh/bevry\" title=\"Donate to this project using ThanksDev\"\u003e\u003cimg src=\"https://img.shields.io/badge/thanksdev-donate-yellow.svg\" alt=\"ThanksDev donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-patreon\"\u003e\u003ca href=\"https://patreon.com/bevry\" title=\"Donate to this project using Patreon\"\u003e\u003cimg src=\"https://img.shields.io/badge/patreon-donate-yellow.svg\" alt=\"Patreon donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-liberapay\"\u003e\u003ca href=\"https://liberapay.com/bevry\" title=\"Donate to this project using Liberapay\"\u003e\u003cimg src=\"https://img.shields.io/badge/liberapay-donate-yellow.svg\" alt=\"Liberapay donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-buymeacoffee\"\u003e\u003ca href=\"https://buymeacoffee.com/balupton\" title=\"Donate to this project using Buy Me A Coffee\"\u003e\u003cimg src=\"https://img.shields.io/badge/buy%20me%20a%20coffee-donate-yellow.svg\" alt=\"Buy Me A Coffee donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-opencollective\"\u003e\u003ca href=\"https://opencollective.com/bevry\" title=\"Donate to this project using Open Collective\"\u003e\u003cimg src=\"https://img.shields.io/badge/open%20collective-donate-yellow.svg\" alt=\"Open Collective donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-crypto\"\u003e\u003ca href=\"https://bevry.me/crypto\" title=\"Donate to this project using Cryptocurrency\"\u003e\u003cimg src=\"https://img.shields.io/badge/crypto-donate-yellow.svg\" alt=\"crypto donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-paypal\"\u003e\u003ca href=\"https://bevry.me/paypal\" title=\"Donate to this project using Paypal\"\u003e\u003cimg src=\"https://img.shields.io/badge/paypal-donate-yellow.svg\" alt=\"PayPal donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cbr class=\"badge-separator\" /\u003e\n\u003cspan class=\"badge-discord\"\u003e\u003ca href=\"https://discord.gg/nQuXddV7VP\" title=\"Join this project's community on Discord\"\u003e\u003cimg src=\"https://img.shields.io/discord/1147436445783560193?logo=discord\u0026amp;label=discord\" alt=\"Discord server badge\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-twitch\"\u003e\u003ca href=\"https://www.twitch.tv/balupton\" title=\"Join this project's community on Twitch\"\u003e\u003cimg src=\"https://img.shields.io/twitch/status/balupton?logo=twitch\" alt=\"Twitch community badge\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\n\u003c!-- /BADGES --\u003e\n\n\u003c!-- DESCRIPTION/ --\u003e\n\nCaterpillar is the ultimate logging system for Deno, Node.js, and Web Browsers. Log levels are implemented to the RFC standard. Log entries can be filtered and piped to various streams, including coloured output to the terminal, the browser's console, and debug files. You can even write your own transforms.\n\n\u003c!-- /DESCRIPTION --\u003e\n\n\n## Usage\n\n[Complete API Documentation.](http://master.caterpillar.bevry.surge.sh/docs/)\n\n### Examples\n\n-   [Deno Example](https://repl.it/@balupton/caterpillar-deno)\n-   [Node.js Example](https://repl.it/@balupton/caterpillar-node)\n-   [Web Browser Example](https://repl.it/@balupton/caterpillar-browser)\n-   [Writing a Custom Transform](https://repl.it/@balupton/caterpillar-custom-transform)\n\n### Overview\n\nThe RFC Log Levels are provided by the [`rfc-log-levels` package](https://github.com/bevry/rfc-log-levels) which follows [RFC 3164 - The BSD Syslog Protocol](http://www.faqs.org/rfcs/rfc3164.html).\n\n[Log Entries](http://master.caterpillar.bevry.surge.sh/docs/interfaces/logentry.html) that are within the [lineLevel](http://master.caterpillar.bevry.surge.sh/docs/classes/logger.html#linelevel) range, will have their line information fetched using the [`get-current-line` package](https://github.com/bevry/get-current-line).\n\nThe [`Logger`](http://master.caterpillar.bevry.surge.sh/docs/classes/logger.html) is what you write your log messages to, which you then pipe to destinations and transforms.\n\nThe [`Filter` transport](http://master.caterpillar.bevry.surge.sh/docs/classes/filter.html) is used to filter out log levels that we do not want to pass onto the next destination.\n\nThe [`Human` transport](http://master.caterpillar.bevry.surge.sh/docs/classes/human.html) is used to convert the Log Entries into a human readable and colourful output.\n\nThe [`Browser` transport](https://github.com/bevry/caterpillar/blob/master/source/transforms/browser.ts) is used to send the human output, including colours, to the Web Browser console.\n\nThe [`Transform`](http://master.caterpillar.bevry.surge.sh/docs/classes/transform.html) is used to write your own transforms, and is what all the others are based from.\n\n### Node.js Guide\n\nTo get started for Node.js, setup a new Node.js project for this guide and install Caterpillar.\n\n```bash\nmkdir caterpillar-guide\ncd caterpillar-guide\nnpm init\nnpm install --save caterpillar\ntouch index.js\n```\n\nThen edit our `index.js` file with the following, that will output all the log messages in JSON format to stdout, and can be run via `node index.js`:\n\n```javascript\nconst { Logger } = require('caterpillar')\nconst logger = new Logger()\n\nlogger.pipe(process.stdout)\n\nlogger.log('warn', 'this is a warning, which is level', 4)\nlogger.warn('this is a warning, which is level', 4)\nlogger.log('debug', 'this is a debug message, which is level', 7)\nlogger.warn('this is a debug message, which is level', 7)\n```\n\nOutputting in JSON format is not a nice experience, instead we can do better by using the [`Human` transport](http://master.caterpillar.bevry.surge.sh/docs/classes/human.html) such that it is human readable.\n\n```javascript\nconst { Logger, Human } = require('caterpillar')\nconst logger = new Logger()\n\nlogger.pipe(new Human()).pipe(process.stdout)\n\nlogger.log('warn', 'this is a warning, which is level', 4)\nlogger.warn('this is a warning, which is level', 4)\nlogger.log('debug', 'this is a debug message, which is level', 7)\nlogger.warn('this is a debug message, which is level', 7)\n```\n\nHowever, perhaps we want to still store the JSON format for querying later. We can pipe the human format to stdout as before, but we can pipe the raw output to a debug file.\n\n```javascript\nconst { Logger, Human } = require('caterpillar')\nconst logger = new Logger()\n\nconst { createWriteStream } = require('fs')\nlogger.pipe(createWriteStream('./debug.log'))\n\nlogger.pipe(new Human()).pipe(process.stdout)\n\nlogger.log('warn', 'this is a warning, which is level', 4)\nlogger.warn('this is a warning, which is level', 4)\nlogger.log('debug', 'this is a debug message, which is level', 7)\nlogger.warn('this is a debug message, which is level', 7)\n```\n\nNow let's stay for some reason, we want to capitalise all the log messages that are warning levels and higher, we can do this by making our own transport by extending the [`Transform`](http://master.caterpillar.bevry.surge.sh/docs/classes/transform.html).\n\n```javascript\nconst { Logger, Transform, Human } = require('caterpillar')\nconst logger = new Logger()\n\nconst { createWriteStream } = require('fs')\nlogger.pipe(createWriteStream('./debug.log'))\n\nclass Uppercase extends Transform {\n    format(entry) {\n        if (entry.levelNumber \u003c= 4) {\n            entry.args.forEach(function (value, index) {\n                if (typeof value === 'string') {\n                    entry.args[index] = value.toUpperCase()\n                }\n            })\n        }\n        return entry\n    }\n}\n\nlogger.pipe(new Uppercase()).pipe(new Human()).pipe(process.stdout)\n\nlogger.log('warn', 'this is a warning, which is level', 4)\nlogger.warn('this is a warning, which is level', 4)\nlogger.log('debug', 'this is a debug message, which is level', 7)\nlogger.warn('this is a debug message, which is level', 7)\n```\n\nFuthermore, the user probably doesn't need to see debug messages, even though they are useful for debugging. We can filter out the debug messages for the user, but maintain them for the `debug.log` file by applying the [`Filter` transport](http://master.caterpillar.bevry.surge.sh/docs/classes/filter.html) to the pipe that goes to stdout.\n\n```javascript\nconst { Logger, Transform, Filter, Human } = require('caterpillar')\nconst logger = new Logger()\n\nconst { createWriteStream } = require('fs')\nlogger.pipe(createWriteStream('./debug.log'))\n\nclass Uppercase extends Transform {\n    format(entry) {\n        if (entry.levelNumber \u003c= 4) {\n            entry.args.forEach(function (value, index) {\n                if (typeof value === 'string') {\n                    entry.args[index] = value.toUpperCase()\n                }\n            })\n        }\n        return entry\n    }\n}\n\nlogger\n    .pipe(new Filter({ filterLevel: 5 }))\n    .pipe(new Uppercase())\n    .pipe(new Human())\n    .pipe(process.stdout)\n\nlogger.log('warn', 'this is a warning, which is level', 4)\nlogger.warn('this is a warning, which is level', 4)\nlogger.log('debug', 'this is a debug message, which is level', 7)\nlogger.warn('this is a debug message, which is level', 7)\n```\n\nAs fetching line information is computationally expensive process, for large applications for performance we probably only want to fetch the line information for messages that we actually show to the user. As such, we should make the [`filterLevel`](http://master.caterpillar.bevry.surge.sh/docs/classes/filter.html#filterlevel) and the [`lineLevel`](http://master.caterpillar.bevry.surge.sh/docs/classes/logger.html#linelevel) the same.\n\n```javascript\nconst { Logger, Transform, Filter, Human } = require('caterpillar')\nconst level = 5\nconst logger = new Logger({ lineLevel: level })\n\nconst { createWriteStream } = require('fs')\nlogger.pipe(createWriteStream('./debug.log'))\n\nclass Uppercase extends Transform {\n    format(entry) {\n        if (entry.levelNumber \u003c= 4) {\n            entry.args.forEach(function (value, index) {\n                if (typeof value === 'string') {\n                    entry.args[index] = value.toUpperCase()\n                }\n            })\n        }\n        return entry\n    }\n}\n\nlogger\n    .pipe(new Filter({ filterLevel: 5 }))\n    .pipe(new Uppercase())\n    .pipe(new Human())\n    .pipe(process.stdout)\n\nlogger.log('warn', 'this is a warning, which is level', 4)\nlogger.warn('this is a warning, which is level', 4)\nlogger.log('debug', 'this is a debug message, which is level', 7)\nlogger.warn('this is a debug message, which is level', 7)\n```\n\nFinally, if we are using Caterpillar in web browser environments, instead of Node.js, instead of doing:\n\n```javascript\nconst { Logger, Transform, Filter, Human } = require('caterpillar')\n// ...\nlogger.pipe(new Human()).pipe(process.stdout)\n// ...\n```\n\nWe would pipe to the Browser transform instead of to stdout.\n\n```javascript\nconst { Logger, Transform, Filter, Human, Browser } = require('caterpillar')\n// ...\nlogger.pipe(new Human()).pipe(new Browser())\n// ...\n```\n\nWith this, you now have enough information to leverage the cross-platform power of Caterpillar for most purposes, and the power to write your own custom transforms which can be published as their own packages and shared.\n\n\u003c!-- INSTALL/ --\u003e\n\n## Install\n\n### [npm](https://npmjs.com \"npm is a package manager for javascript\")\n\n-   Install: `npm install --save caterpillar`\n-   Import: `import * as pkg from ('caterpillar')`\n-   Require: `const pkg = require('caterpillar')`\n\n### [Deno](https://deno.land \"Deno is a secure runtime for JavaScript and TypeScript, it is an alternative for Node.js\")\n\n``` typescript\nimport * as pkg from 'https://unpkg.com/caterpillar@^8.2.0/edition-deno/index.ts'\n```\n### [Skypack](https://www.skypack.dev \"Skypack is a JavaScript Delivery Network for modern web apps\")\n\n``` html\n\u003cscript type=\"module\"\u003e\n    import * as pkg from '//cdn.skypack.dev/caterpillar@^8.2.0'\n\u003c/script\u003e\n```\n### [unpkg](https://unpkg.com \"unpkg is a fast, global content delivery network for everything on npm\")\n\n``` html\n\u003cscript type=\"module\"\u003e\n    import * as pkg from '//unpkg.com/caterpillar@^8.2.0'\n\u003c/script\u003e\n```\n### [jspm](https://jspm.io \"Native ES Modules CDN\")\n\n``` html\n\u003cscript type=\"module\"\u003e\n    import * as pkg from '//dev.jspm.io/caterpillar@8.2.0'\n\u003c/script\u003e\n```\n### [Editions](https://editions.bevry.me \"Editions are the best way to produce and consume packages you care about.\")\n\nThis package is published with the following editions:\n-   `caterpillar` aliases `caterpillar/index.cjs` which uses the [Editions Autoloader](https://github.com/bevry/editions \"You can use the Editions Autoloader to autoload the appropriate edition for your consumers environment\") to automatically select the correct edition for the consumer's environment\n-   `caterpillar/source/index.ts` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") source code with [Import](https://babeljs.io/docs/learn-es2015/#modules \"ECMAScript Modules\") for modules\n-   `caterpillar/edition-browsers/index.js` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled against [ES2022](https://en.wikipedia.org/wiki/ES2022 \"ECMAScript 2022\") for web browsers with [Import](https://babeljs.io/docs/learn-es2015/#modules \"ECMAScript Modules\") for modules\n-   `caterpillar/edition-es2022/index.js` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled against [ES2022](https://en.wikipedia.org/wiki/ES2022 \"ECMAScript 2022\") for [Node.js](https://nodejs.org \"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine\") 14 || 16 || 18 || 20 || 21 with [Require](https://nodejs.org/dist/latest-v5.x/docs/api/modules.html \"Node/CJS Modules\") for modules\n-   `caterpillar/edition-es2017/index.js` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled against [ES2017](https://en.wikipedia.org/wiki/ES2017 \"ECMAScript 2017\") for [Node.js](https://nodejs.org \"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine\") 8 || 10 || 12 || 14 || 16 || 18 || 20 || 21 with [Require](https://nodejs.org/dist/latest-v5.x/docs/api/modules.html \"Node/CJS Modules\") for modules\n-   `caterpillar/edition-es2015/index.js` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled against [ES2015](https://babeljs.io/docs/en/learn#ecmascript-2015-features \"ECMAScript 2015\") for [Node.js](https://nodejs.org \"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine\") 6 || 8 || 10 || 12 || 14 || 16 || 18 || 20 || 21 with [Require](https://nodejs.org/dist/latest-v5.x/docs/api/modules.html \"Node/CJS Modules\") for modules\n-   `caterpillar/edition-es5/index.js` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled against ES5 for [Node.js](https://nodejs.org \"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine\") 4 || 6 || 8 || 10 || 12 || 14 || 16 with [Require](https://nodejs.org/dist/latest-v5.x/docs/api/modules.html \"Node/CJS Modules\") for modules\n-   `caterpillar/edition-es2017-esm/index.js` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled against [ES2017](https://en.wikipedia.org/wiki/ES2017 \"ECMAScript 2017\") for [Node.js](https://nodejs.org \"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine\") 12 || 14 || 16 || 18 || 20 || 21 with [Import](https://babeljs.io/docs/learn-es2015/#modules \"ECMAScript Modules\") for modules\n-   `caterpillar/edition-types/index.d.ts` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") compiled Types with [Import](https://babeljs.io/docs/learn-es2015/#modules \"ECMAScript Modules\") for modules\n-   `caterpillar/edition-deno/index.ts` is [TypeScript](https://www.typescriptlang.org/ \"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.\") source code made to be compatible with [Deno](https://deno.land \"Deno is a secure runtime for JavaScript and TypeScript, it is an alternative to Node.js\")\n\n\u003c!-- /INSTALL --\u003e\n\n\u003c!-- HISTORY/ --\u003e\n\n## History\n\n[Discover the release history by heading on over to the `HISTORY.md` file.](https://github.com/bevry/caterpillar/blob/HEAD/HISTORY.md#files)\n\n\u003c!-- /HISTORY --\u003e\n\n\u003c!-- BACKERS/ --\u003e\n\n## Backers\n\n### Code\n\n[Discover how to contribute via the `CONTRIBUTING.md` file.](https://github.com/bevry/caterpillar/blob/HEAD/CONTRIBUTING.md#files)\n\n#### Authors\n\n-   [Benjamin Lupton](https://balupton.com) — Accelerating collaborative wisdom.\n\n#### Maintainers\n\n-   [Benjamin Lupton](https://balupton.com) — Accelerating collaborative wisdom.\n\n#### Contributors\n\n-   [Benjamin Lupton](https://github.com/balupton) — [view contributions](https://github.com/bevry/caterpillar/commits?author=balupton \"View the GitHub contributions of Benjamin Lupton on repository bevry/caterpillar\")\n-   [t-visualappeal](https://github.com/t-visualappeal) — [view contributions](https://github.com/bevry/caterpillar/commits?author=t-visualappeal \"View the GitHub contributions of t-visualappeal on repository bevry/caterpillar\")\n-   [Tim Helfensdörfer](https://github.com/thelfensdrfer) — [view contributions](https://github.com/bevry/caterpillar/commits?author=thelfensdrfer \"View the GitHub contributions of Tim Helfensdörfer on repository bevry/caterpillar\")\n\n### Finances\n\n\u003cspan class=\"badge-githubsponsors\"\u003e\u003ca href=\"https://github.com/sponsors/balupton\" title=\"Donate to this project using GitHub Sponsors\"\u003e\u003cimg src=\"https://img.shields.io/badge/github-donate-yellow.svg\" alt=\"GitHub Sponsors donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-thanksdev\"\u003e\u003ca href=\"https://thanks.dev/u/gh/bevry\" title=\"Donate to this project using ThanksDev\"\u003e\u003cimg src=\"https://img.shields.io/badge/thanksdev-donate-yellow.svg\" alt=\"ThanksDev donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-patreon\"\u003e\u003ca href=\"https://patreon.com/bevry\" title=\"Donate to this project using Patreon\"\u003e\u003cimg src=\"https://img.shields.io/badge/patreon-donate-yellow.svg\" alt=\"Patreon donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-liberapay\"\u003e\u003ca href=\"https://liberapay.com/bevry\" title=\"Donate to this project using Liberapay\"\u003e\u003cimg src=\"https://img.shields.io/badge/liberapay-donate-yellow.svg\" alt=\"Liberapay donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-buymeacoffee\"\u003e\u003ca href=\"https://buymeacoffee.com/balupton\" title=\"Donate to this project using Buy Me A Coffee\"\u003e\u003cimg src=\"https://img.shields.io/badge/buy%20me%20a%20coffee-donate-yellow.svg\" alt=\"Buy Me A Coffee donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-opencollective\"\u003e\u003ca href=\"https://opencollective.com/bevry\" title=\"Donate to this project using Open Collective\"\u003e\u003cimg src=\"https://img.shields.io/badge/open%20collective-donate-yellow.svg\" alt=\"Open Collective donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-crypto\"\u003e\u003ca href=\"https://bevry.me/crypto\" title=\"Donate to this project using Cryptocurrency\"\u003e\u003cimg src=\"https://img.shields.io/badge/crypto-donate-yellow.svg\" alt=\"crypto donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"badge-paypal\"\u003e\u003ca href=\"https://bevry.me/paypal\" title=\"Donate to this project using Paypal\"\u003e\u003cimg src=\"https://img.shields.io/badge/paypal-donate-yellow.svg\" alt=\"PayPal donate button\" /\u003e\u003c/a\u003e\u003c/span\u003e\n\n#### Sponsors\n\n-   [Andrew Nesbitt](https://nesbitt.io) — Software engineer and researcher\n-   [Balsa](https://balsa.com) — We're Balsa, and we're building tools for builders.\n-   [Codecov](https://codecov.io) — Empower developers with tools to improve code quality and testing.\n-   [Poonacha Medappa](https://poonachamedappa.com)\n-   [Rob Morris](https://github.com/Rob-Morris)\n-   [Sentry](https://sentry.io) — Real-time crash reporting for your web apps, mobile apps, and games.\n-   [Syntax](https://syntax.fm) — Syntax Podcast\n\n#### Donors\n\n-   [Andrew Nesbitt](https://nesbitt.io)\n-   [Armen Mkrtchian](https://mogoni.dev)\n-   [Balsa](https://balsa.com)\n-   [Chad](https://opencollective.com/chad8)\n-   [Codecov](https://codecov.io)\n-   [dr.dimitru](https://veliovgroup.com)\n-   [Elliott Ditman](https://elliottditman.com)\n-   [entroniq](https://gitlab.com/entroniq)\n-   [GitHub](https://github.com/about)\n-   [Hunter Beast](https://cryptoquick.com)\n-   [Jean-Luc Geering](https://github.com/jlgeering)\n-   [Michael Duane Mooring](https://mdm.cc)\n-   [Michael Harry Scepaniak](https://michaelscepaniak.com)\n-   [Mohammed Shah](https://github.com/smashah)\n-   [Mr. Henry](https://mrhenry.be)\n-   [Nermal](https://arjunaditya.vercel.app)\n-   [Pleo](https://pleo.io)\n-   [Poonacha Medappa](https://poonachamedappa.com)\n-   [Rob Morris](https://github.com/Rob-Morris)\n-   [Robert de Forest](https://github.com/rdeforest)\n-   [Sentry](https://sentry.io)\n-   [ServieJS](https://github.com/serviejs)\n-   [Skunk Team](https://skunk.team)\n-   [Syntax](https://syntax.fm)\n-   [WriterJohnBuck](https://github.com/WriterJohnBuck)\n\n\u003c!-- /BACKERS --\u003e\n\n\u003c!-- LICENSE/ --\u003e\n\n## License\n\nUnless stated otherwise all works are:\n\n-   Copyright \u0026copy; [Benjamin Lupton](https://balupton.com)\n\nand licensed under:\n\n-   [Artistic License 2.0](http://spdx.org/licenses/Artistic-2.0.html)\n\n\u003c!-- /LICENSE --\u003e\n","funding_links":["https://github.com/sponsors/balupton","https://patreon.com/bevry","https://opencollective.com/bevry","https://ko-fi.com/balupton","https://liberapay.com/bevry","https://tidelift.com/funding/github/npm/caterpillar","https://bevry.me/fund","https://thanks.dev/u/gh/bevry","https://buymeacoffee.com/balupton","https://opencollective.com/chad8"],"categories":["Repository","Framework agnostic packages","TypeScript"],"sub_categories":["Logging","Node"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbevry%2Fcaterpillar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbevry%2Fcaterpillar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbevry%2Fcaterpillar/lists"}