{"id":18901294,"url":"https://github.com/regular/ache","last_synced_at":"2026-03-04T01:30:22.276Z","repository":{"id":23451682,"uuid":"26815456","full_name":"regular/ache","owner":"regular","description":"take the pain out of the build process","archived":false,"fork":false,"pushed_at":"2014-11-21T22:02:28.000Z","size":152,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-31T10:13:15.128Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"CoffeeScript","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/regular.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-11-18T15:26:27.000Z","updated_at":"2014-11-21T22:02:28.000Z","dependencies_parsed_at":"2022-07-16T17:30:31.829Z","dependency_job_id":null,"html_url":"https://github.com/regular/ache","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regular%2Fache","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regular%2Fache/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regular%2Fache/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regular%2Fache/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/regular","download_url":"https://codeload.github.com/regular/ache/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239886986,"owners_count":19713584,"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-11-08T08:55:41.976Z","updated_at":"2026-03-04T01:30:22.208Z","avatar_url":"https://github.com/regular.png","language":"CoffeeScript","readme":"\n*this is very experimental* if you are looking for something that actually is usable, you should look somewhere else.\n\n## What's aching?\n\nAche is not a build tool. It is a node module that makes it very easy to create a project-specific program that builds your project in the most efficient way possible. We recommend calling this program `ache` :)\n\n### GOALS\n\ngrunt and gulp are popular in the JS community. Both however are more or less simple task runners with varying degrees of caching.\n\n  * The goal hiere is to reach make's level of efficiency: run the actions necessary, not more, not less. Do this as efficient as possible.\n\n  * The reciple (Makefile, Gruntfile, ...) shall be an executable file, a program, so it simply can require() whatever module it needs. The output of this program is a dependecy tree. Each node represents a *promise* for the target associated with that node.\n\n  * The actions shall be functions that take input and produce an output, because that's the most natural fitting abstraction in JavaScript.\n\n  * an output of an action can be multiple physical files (think: source maps, font files, ...)\n\n### tool/action abstraction\n- is streaming data\n- can have options\n- multiple inputs and outputs\n- adapter might use temp files to implement streaming\n- use locally installed binaries found in `node_modules`\n\nPlanned first-wave tool support via npm modules\n- ache-fontcustom\n- ache-coffee\n- ache-ejs\n- ache-jade\n- ache-stylus\n- ache-browserify\n- ache-lab\n- ache-casper\n\n    npm install ache-casper # installs all necessary binaries\n\n- Q: how can we do this without flooding the npm namespace?\n- A: there's a new npm feature, right?\n- A: several generic built-in adapter to wrap around typical tool functions, promisify()-style\n\n## it's fractal\n- a part consists of parts\n- a part is stand-alone\n- a project is a part\n\nA node provides a  promise of a part\n\n## removing typlical pain points\n\nError handling shall take temporary outtakes of external machines/services into account.\n\n\n## Example Achefile (using CoffeeScript)\n\n    fontcustom = require 'ache-fontcustom'\n    jade = require 'ache-jade'\n    coffee  = require 'ache-coffee'\n\n    iconFont = (destination) -\u003e\n        # create a custom font with two icons\n        icon1 = File 'svgs/icon1.svg'\n        icon2 = File 'svgs/icon2.svg'\n\n        {ttfFile, otfFile, cssFile} = fontcustom [icon1, icon2]\n\n        {cssFile} = component [\n            ttfFile, \n            otfFile, \n            cssFile, \n        ]\n\n        [cssFile, ttfFile, otfFile] = copy [cssFile, ttfFile, otfFile], destination\n\n        return [cssFile, ttfFile, otfFile]\n\n    signup = (destination) -\u003e\n        \n        templateJS = jade File 'templates/entry.jade', {client: true}\n        clientJS = coffee File 'main.cofee', {bare: true}\n\n        {cssFile, jsFile} = component [\n            templateJS,\n            clientJS\n        ], {main: path.basename clientJS.path()}\n\n        serverJS = coffee File 'server.coffee'\n        html = jade File 'index.jade'\n\n        return copy [html, serverJS, cssFile, jsFile], destination\n\n    webApp = (destination) -\u003e Promise.all _.flatten [iconFont(destination), singup(destination)]\n\n    buildDir = mkdirp 'build'\n    thePromiseOfanApp = webApp(buildDir)\n\n    thePromiseOfanApp.resolve()\n\n\n\t\t\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fregular%2Fache","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fregular%2Fache","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fregular%2Fache/lists"}