npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

flour

v0.5.8

Published

Javascript build tools based on coffee-script & cake

Downloads

81

Readme

Flour

NPM version

Flour is a set of simple build tools for your Cakefiles.

Changelog

image

Usage

Add flour and your required pre-processors/compilers to your package.json:

{
  "name": "dancingrobot",
  ...
  "dependencies": {
    "flour": "",
    "uglify-js": "",
    "coffee-script": ""
  },
  ...
}

Then run npm install, and require 'flour' at the top of your Cakefile. A few methods are available in the global scope.

This is what a typical Cakefile could look like:

require 'flour'

task 'build:coffee', ->
    compile 'coffee/app.coffee', 'js/app.js'

task 'build:less', ->
    compile 'less/main.less', 'css/main.css'

task 'build:plugins', ->
    bundle [
        'vendor/underscore.js'
        'vendor/hogan.js'
        'vendor/backbone.js'
    ], 'js/plugins.js'

task 'build', ->
    invoke 'build:plugins'
    invoke 'build:coffee'
    invoke 'build:less

task 'watch', ->
    invoke 'build:less'
    invoke 'build:coffee'

    watch 'less/*.less', -> invoke 'build:less'
    watch 'coffee/app.coffee', -> invoke 'build:coffee'

task 'lint', 'Check javascript syntax', ->
    lint 'js/feature.js'

(if the global pollution hurts your feelings you can remove them with flour.noConflict(). That will bring the global object back to it's previous state)

Each of these functions accepts either a file path or a list of files. Simple wildcard paths (*.xxx) are allowed. For example:

watch [
    'less/main.less'
    'less/reset.less'
    'less/print.less'
], -> invoke 'build:less'

You can also access the resulting output by passing a callback:

compile 'coffee/app.coffee', (output) ->
    # do something with the compiled output
    mail.send subject: 'Project file', to: '[email protected]', body: output

# verify the CoffeeScript compiler output
compile 'coffee/app.coffee', 'js/app.js', -> lint 'js/app.js'

Adapters

These are the current adapters and the required modules:

Compilers

  • CoffeeScript: coffee-script
  • LESS: less
  • Stylus: stylus

Minifiers

  • Javascript: uglify-js

Linters

  • Javascript: 'jshint'

Creating new adapters is very easy, take a look at the adapters/ folder for guidance.

Reference

Compile

Compile CoffeeScript, LESS, Stylus, Handlebars templates:

compile(file, [destination], [callback])
Usage
compile 'app.coffee', 'app.js'

compile 'cold.coffee', 'app.js', (output) ->
    console.log 'Done!'

compile 'cold.coffee', (output) ->
    console.log output.transform()

Some compilers may accept options that will get proxied to their respective libraries. For example, you can disable compression for LESS or Stylus with

flour.compilers.less.compress = false
flour.compilers.styl.compress = false

Or customize the LESS include path with

flour.compilers.less.paths = ['/path/to/my/less/libs/']

Bundle

Compile, minify and join a set of files:

bundle(files, destination)
Usage
// preservers the list order
bundle [
    'lib/jquery.js'
    'lib/underscore.js'
    'lib/backbone.js'
], 'js/bundle.js'

// system-dependent order
bundle 'js/*.js', 'js/all.js'

Watch

Watch files for changes:

watch(files, action)
Usage
watch 'src/app.coffee', ->
    compile 'lib/app.js'

# best used with predefined tasks:

task 'build', ->
    bundle '*.coffee', 'app.js'

task 'watch', ->
    watch [
        'modules.coffee'
        'user.coffee'
        'main.coffee'
    ], ->
        invoke 'build'

# or simply
task 'watch', ->
    watch '*.coffee', -> invoke 'build'

Lint

Check file syntax (uses JSHint):

lint(file, [options], [globals]) # see http://www.jshint.com/options/

Usage

task 'lint', ->

    lint 'scripts/*.js'

Minify

Minify files (currently only Javascript using UglifyJS):

minify(file, [destination], [callback])

Extensibility

You can add new minifiers and compilers to flour:

flour.minifiers['dumb'] = (file, cb) ->
    file.read (code) ->
        cb code.replace(/\s*/, '')

flour.compilers['odd'] = (file, cb) ->
    odd = require 'odd-lib'
    file.read (code) ->
        cb odd.compile code

Tips

Disable the JS minifier during development

task 'watch', ->
    flour.minifiers.disable 'js'

    watch 'scripts/*.coffee', -> invoke 'build'

Pre-compile Hogan templates

flour.compilers['mustache'] = (file, cb) ->
    hogan = require 'hogan.js'
    file.read (code) ->
        cb "App.templates['#{file.base}']=${hogan.compile code, asString: true};"

task 'build:templates', ->
    bundle 'views/*.mustache', 'resources/views.js'

Why use flour?

While Grunt, brewerjs, H5BP-build-script, Yeoman and other similar projects have the same (and some more advanced) capabilities, they are increasingly complex to setup.

The goal of Flour is to provide a small and simple API that caters for the most common build tasks, without requiring you to adjust your project structure, install command-line tools or create long configuration files.

Changelog

v0.5.7
  • fixes for CoffeeScript v1.7
v0.5.4
  • enable options forwarding for minifiers
  • fix bundle behaviour when no output path given
v0.5.2
  • coffeescript sourcemap support
v0.5.1
  • pass through all options to adapters. white-listing is not mantainable.
  • add markdown compiler
v0.5
  • flour.minifiers.disable('js'), enables/disables all if no argument given
  • compile handlebars *.hbs templates
v0.4.12
  • expand paths containing patterns inside bundle() array argument (#22)
v0.4.11
  • mkdir_p on compile (#20)
v0.4.10
  • compatibility fix for CoffeeScript 1.5.0
v0.4.9
  • fix lint callback arguments
  • breaking change: call callback only once when watching multiple files. each file is a key in the results object
  • add yuicompress option for LESS compiler
v0.4.8
  • output to multiple files with flour.compile 'src/*.coffee', '*' and variations
v0.4.5 / v0.4.6
  • handle single file path as input for bundle()
  • better handling of wildcard paths using minimatch
v0.4.4
  • add back support for uglify-js < 2.0
v0.4.0
  • tests!
  • fix file buffer bug
  • accept options for adapters, enables disabling compression for LESS and Stylus
v0.3.3
  • bugfixes
v0.3.2
  • add node-hound as a dependency for file watching
  • watch whole directory trees: watch src/`, -> invoke 'build' (listens for new files and deletes too)
  • fix error handlers leak
v0.3.1
  • fix extension handling bug
v0.3.0
  • flour doesn't install it's adapter dependencies anymore, it's up to you to add them to your project's package.json