{"id":13992075,"url":"https://github.com/chajs/cha","last_synced_at":"2025-07-22T15:31:00.648Z","repository":{"id":14415733,"uuid":"17126664","full_name":"chajs/cha","owner":"chajs","description":"Make task chaining.","archived":false,"fork":false,"pushed_at":"2014-10-31T19:04:35.000Z","size":331,"stargazers_count":202,"open_issues_count":0,"forks_count":11,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-06-17T12:04:34.606Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"chajs.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chajs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-02-24T05:46:56.000Z","updated_at":"2024-11-19T08:23:20.000Z","dependencies_parsed_at":"2022-08-27T09:40:31.732Z","dependency_job_id":null,"html_url":"https://github.com/chajs/cha","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/chajs/cha","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chajs%2Fcha","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chajs%2Fcha/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chajs%2Fcha/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chajs%2Fcha/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chajs","download_url":"https://codeload.github.com/chajs/cha/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chajs%2Fcha/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265915275,"owners_count":23848496,"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":[],"created_at":"2024-08-09T14:01:46.655Z","updated_at":"2025-07-22T15:31:00.339Z","avatar_url":"https://github.com/chajs.png","language":"JavaScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg height=\"256\" width=\"256\" src=\"https://f.cloud.github.com/assets/677114/2333826/7f36d7ea-a471-11e3-99ea-fd8567069b7d.png\"/\u003e\n\u003c/p\u003e\n\ncha [![NPM version](https://badge.fury.io/js/cha.png)](http://npm.org/cha) [![Build Status](https://travis-ci.org/chajs/cha.png?branch=master)](http://travis-ci.org/chajs/cha)\n===\n\u003e Make task chaining.\n\nCha allows tasks to be connected together into a chain that makes better readability and easier to maintain.\n\n## Getting Started\n\nInstalling cha via NPM, this will install the latest version of cha in your project folder\nand adding it to your `devDependencies` in `package.json`:\n```sh\nnpm install cha --save-dev\n```\n\nTouch a tasks file and naming whatever you love like `build.js`:\n```js\n// Load cha library.\nvar cha = require('cha')\n\n// Register tasks that should chaining.\ncha.in('glob',     require('task-glob'))\n    .in('combine', require('task-combine'))\n    .in('replace', require('task-replace'))\n    .in('writer',  require('task-writer'))\n    .in('uglifyjs',require('task-uglifyjs'))\n    .in('copy',    require('task-copy'))\n    .in('request', require('task-request'))\n\n// Define task via chaining calls.\ncha()\n    .glob({\n        patterns: './fixtures/js/*.js',\n        cwd: __dirname\n    })\n    .replace({\n        search: 'TIMESTAMP',\n        replace: +new Date\n    })\n    .replace({\n        search: /DEBUG/g,\n        replace: true\n    })\n    .request('http://underscorejs.org/underscore-min.js')\n    .combine()\n    .uglifyjs()\n    .writer('./out/foobar.js')\n    .copy('./out/foobar2.js')\n```\n\nAdd a arbitrary command to the `scripts` object:\n```json\n{\n  \"name\": \"cha-example\",\n  \"scripts\": {\n    \"build\": \"node ./build.js\"\n  },\n  \"devDependencies\": {\n    \"cha\": \"~0.1.0\"\n  }\n}\n```\n\nTo run the command we prepend our script name with run:\n```sh\n$ npm run build\n\n\u003e cha@0.0.1 build\n\u003e node ./test/build\n\nrequest http://underscorejs.org/underscore-min.js\nconcat ./test/fixtures/bar.js,./test/fixtures/foo.js,http://underscorejs.org/underscore-min.js\nwrite ./out/foobar.js\ncopy out/foobar.js \u003e ./out/foobar2.js\n```\n\n## Cha Extensions\n\n* [cha-load](https://github.com/chajs/cha-load)     - Automatically load cha and register tasks.\n* [cha-watch](https://github.com/chajs/cha-watch)   - File watcher.\n* [cha-target](https://github.com/chajs/cha-target) - Target runner.\n* [cha-gulp](https://github.com/chajs/cha-gulp)     - Gulp plugin adapter.\n\n## Cha Expressions\n\n```js\n// Load cha library.\nvar cha = require('cha')\n\n// Register tasks that should chaining.\ncha.in('glob',     require('task-glob'))\n    .in('combine', require('task-combine'))\n    .in('replace', require('task-replace'))\n    .in('writer',  require('task-writer'))\n    .in('uglifyjs',require('task-uglifyjs'))\n    .in('request', require('task-request'))\n\n// Start with cha expressions.\ncha(['glob:./fixtures/js/*.js', 'request:http://underscorejs.org/underscore-min.js'])\n    .replace({\n        search: 'TIMESTAMP',\n        replace: +new Date\n    })\n    .replace({\n        search: /DEBUG/g,\n        replace: true\n    })\n    .combine()\n    .uglifyjs()\n    .writer('./test/out/foobar.js')\n```\n\nTo run the command we prepend our script name with run:\n```sh\n$ npm run expr\n\n\u003e cha@0.0.1 expr\n\u003e node ./test/expr\n\nrequest http://underscorejs.org/underscore-min.js\nconcat http://underscorejs.org/underscore-min.js\nwrite ./out/foobar.js\n```\n\n## Task Settings\n\n```js\n// Load cha library.\nvar cha = require('cha')\n\n// Register tasks that should chaining.\ncha.in('glob',     require('task-glob'))\n    .in('writer',  require('task-writer'))\n    .in('uglifyjs',require('task-uglifyjs'))\n    .in('request', require('task-request'))\n\n// Start with cha expressions.\ncha()\n    .glob({\n        patterns: './fixtures/js/*.js'\n    })\n    .request({\n        url: 'http://underscorejs.org/underscore.js'\n    }, {\n        ignore: true, // Ignore task inputs.\n        timeout: 2000 // 2000ms timeout.\n    })\n    .uglifyjs()\n    .writer('./underscore-min.js')\n```\n\n## JavaScript Tasks\n\nAll register task should based on the [JavaScript Task](https://github.com/taskjs/spec) specification.\nYou could get available tasks from [JavaScript Task Packages] (http://taskjs.github.io/packages/) website.\n\n## Release History\n\n* 2014-05-19    0.2.1    Task accept `settings` param with general options.\n* 2014-05-18    0.2.0    Remove Internal methods.\n* 2014-03-17    0.1.2    Extensions for cha.\n* 2014-03-10    0.1.1    Custom tasks could override internal methods.\n* 2014-03-05    0.1.0    Initial release.\n","funding_links":[],"categories":["JavaScript","{{ Builder }}"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchajs%2Fcha","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchajs%2Fcha","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchajs%2Fcha/lists"}