0.1.4 • Published 10 years ago

gromjs v0.1.4

Weekly downloads
2
License
ISC
Repository
github
Last release
10 years ago

#GROM.js Awesome co-powered build system.

npm package

npm install -g gromjs

Why?

The goal of grom.js is to be a plugin-less build system that will allow to use any node module to process files without pain. Gives more control

Super simple

In gromfile.js:

var processor = require('files-processor')
var R = require('ramda')

module.exports.task = function* (){
  var filesSet = yield this.read(['path/to/files'])
  var mappedFilesSet = filesSet.map(function*(file){
    var newSource = processor(yield file.source())
    return file.clone(newSource, { ext: '.processed'})
  })

  return yield this.write('path/to/dist', mappedFilesSet)
}

In terminal:

$ gromjs task

That's it. No special grom-whatever plugins, use whatever you want.

API

  • yield this.read(glob) Returns ordered Set of Files

  • yield this.watch(glob) Returns events emitter, uses npm module watch and watch.createMonitor method

  • yield this.write(glob, Set) Accepts glob, Set of Files and writes everything in right place.
  • yield this.async(tasks) Accepts array of tasks and runs in asynchronously and independent to each other.
  • yield this.seq(tasks) Runs tasks one by one from left to right, every next one get result from previous.

Set

Is a set of Files uniq by glob, have next methods:

  • elements() Returns Set's elements

  • isContains(file) Checks if file is in Set by file's glob

  • add(file) Returns new Set with all elements plus new one

  • remove(element) Returns new Set without single element

  • union(set) Returns new Set that is union of elements from both sets

  • intersection(set) Returns new Set that is intersection between sets

  • difference(set) Returns new Set that is difference between sets

  • filter(interator*) Returns new Set with filtered elements

  • sort(interator*) Returns new Set with sorted elements

  • reduce(interator*, accumulator) Returns reduced value

  • map(interator*) Returns new Set with mapped elements

  • forEach(interator*) Iterates over elements and returns current Set

File

  • path() Returns full path

  • glob() Returns glob

  • name() Returns name with extension

  • source() Generator, returns file's source code

  • clone([glob], [source]) Creates new File, glob can be presented as hash with dir, name, ext fields which will be merged with parent file's path, path also can be just a string, if glob or source isn't provided, clone takes it from parent.

Examples:

run tasks in sequence:

var filesProcessor = require('files-processor')

var read = function* (){
  return yield this.read('/some/path/to/**.ext')
}

var processSet = function* (set){
  return set.map(function* (file){
    var source = yield file.source()
    return file.clone(yield extProcessor(source), { ext: 'js' })
  })
}

var write = function* (set){
  return yield this.write('/another/path', set)
}

module.exports.default = function* three(){
  yield this.seq([read, processSet, write])
}

watch files:

module.exports.default = function* three(){
  var monitor = yield this.watch('*.js')
  monitor.on('change', function* (Set){
    yield this.async(someTask)
  })
}

compile less:

var less = require('less')

module.exports.compileLess = function* compileLess (){
  var lessFilesSet = yield this.read('./code/**.less')

  var cssFilesSet = yield lessFilesSet.map(function* (file){
    var lessContents = (yield file.source()).toString()
    var css = (yield less.render(lessContents, {})).css
    return file.clone(css, { ext: 'css' })
  })

  return yield this.write('./dist', cssFilesSet)
}

CLI

$ gromjs <task-name>

TODO

  • Tasks logger
  • Tests
  • More examples

License

MIT © Dmitriy Kharchenko

0.1.4

10 years ago

0.1.3

10 years ago

0.1.1

10 years ago

0.1.0

10 years ago

0.0.4

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago

0.0.1

10 years ago