Skip to content

Commit

Permalink
feat: watch new files too
Browse files Browse the repository at this point in the history
  • Loading branch information
pemrouz committed Dec 19, 2016
1 parent 97e1f83 commit 4667b8e
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 99 deletions.
53 changes: 24 additions & 29 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,28 @@
// -------------------------------------------
export default function resdir(ripple, { dir = '.' } = {}){
log('creating')

var argv = require('minimist')(process.argv.slice(2))

;(argv.r || argv.resdirs || '')
.split(',')
.concat(dir)
.filter(Boolean)
.map(path => resolve(path))
.map(dir => {
glob(dir + '/resources/**/!(test).{js,css}')
.filter(not(includes('/_')))
.map(path => resolve(dir, path))
.map(path => {
var absolute = resolve(dir, path)
register(ripple)(absolute)
if (process.env.NODE_ENV != 'production')
watch(ripple)(absolute)
})
const argv = require('minimist')(process.argv.slice(2))
, folders = (argv.r || argv.resdirs || '')
.split(',')
.concat(dir)
.filter(Boolean)
.map(d => resolve(d))
.map(append('/resources/**/!(test).{js,css}'))

chokidar.watch(folders, { ignored: /\b_/ })
.on('error', err)
.on('add', register(ripple))
.on('change', register(ripple))
.on('ready', () => {
def(ripple, 'ready', true)
values(ripple.resources)
.map(loaded(ripple))
ripple.emit('ready')
})

values(ripple.resources)
.map(loaded(ripple))

return ripple
}

const watch = ripple => path =>
chokidar.watch(path)
.on('change', () => loaded(ripple)(register(ripple)(path)))

const register = ripple => path => {
var last = basename(path)
, isJS = extname(path) == '.js'
Expand All @@ -44,17 +36,20 @@ const register = ripple => path => {
: css ? { name, body, headers: { needs: '[css]' } }
: { name, body }

return ripple(res), ripple.resources[name]
ripple(res)

if (ripple.ready)
loaded(res)
}

import { resolve, basename, extname } from 'path'
import { existsSync as exists } from 'fs'
import { sync as glob } from 'glob'
import chokidar from 'chokidar'
import includes from 'utilise/includes'
import append from 'utilise/append'
import values from 'utilise/values'
import file from 'utilise/file'
import not from 'utilise/not'
import def from 'utilise/def'
import is from 'utilise/is'
const log = require('utilise/log')('[ri/resdir]')
, err = require('utilise/err')('[ri/resdir]')
, loaded = ripple => res => is.fn(res.headers.loaded) && res.headers.loaded(ripple, res)
151 changes: 81 additions & 70 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,98 +10,103 @@ var expect = require('chai').expect

describe('Resources Folder', function(){

it('should auto load resources folder', function(){
it('should auto load resources folder', function(done){
var ripple = resdir(fn(css(core())))
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
ripple.on('ready', d => {
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
done()
})
})

it('should auto load from specific dir', function(){
it('should auto load from specific dir', function(done){
var ripple = resdir(fn(css(core())), path.resolve())
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
ripple.on('ready', d => {
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
done()
})
})

it('should auto load from specific dir with opts', function(){
it('should auto load from specific dir with opts', function(done){
var ripple = resdir(fn(css(core())), { dir: path.resolve() })
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
ripple.on('ready', d => {
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
done()
})
})

it('should auto load resources folder when no dir prop on opts', function(){
it('should auto load resources folder when no dir prop on opts', function(done){
var ripple = resdir(fn(css(core())), { })
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
})

it('should watch for changes', function(done){
var ripple = resdir(fn(css(core())), path.resolve())

expect(ripple('foo').name).to.be.eql('foo')
fs.writeFileSync('./resources/foo.js', 'module.exports = function baz(){ }')

time(50, function(){
expect(ripple('foo').name).to.be.eql('baz')
fs.writeFileSync('./resources/foo.js', 'module.exports = function foo(){ }')
ripple.on('ready', d => {
expect(ripple('foo')).to.be.a('function')
expect(ripple('foo').name).to.eql('foo')
expect(ripple('bar.css')).to.equal('.bar {}')
expect(ripple('sth')).to.be.a('function')
expect(ripple('data')).to.be.eql(String)
expect(ripple.resources.test).to.not.be.ok
done()
})

})

it('should not watch for changes in prod', function(done){
var original = process.env.NODE_ENV
process.env.NODE_ENV = 'production'
it('should watch for changes', function(done){
var ripple = resdir(fn(css(core())), path.resolve())

expect(ripple('foo').name).to.be.eql('foo')
fs.writeFileSync('./resources/foo.js', 'module.exports = function baz(){ }')

time(500, function(){
ripple.on('ready', d => {
expect(ripple('foo').name).to.be.eql('foo')
fs.writeFileSync('./resources/foo.js', 'module.exports = function foo(){ }')
done()
})
fs.writeFileSync('./resources/foo.js', 'module.exports = function baz(){ }')

process.env.NODE_ENV = original
ripple.once('change', function(){
expect(ripple('foo').name).to.be.eql('baz')
fs.writeFileSync('./resources/foo.js', 'module.exports = function foo(){ }')
done()
})
})
})

it('should not auto-add needs header for default styles', function(){
it('should not auto-add needs header for default styles', function(done){
var ripple = resdir(fn(css(core())))
expect(ripple('component')).to.be.a('function')
expect(ripple('component.css')).to.be.eql(':host {}')
expect(ripple.resources.component.headers.needs).to.be.eql('[css]')
expect(ripple.resources.foo.headers.needs).to.be.not.ok
ripple.on('ready', d => {
expect(ripple('component')).to.be.a('function')
expect(ripple('component.css')).to.be.eql(':host {}')
expect(ripple.resources.component.headers.needs).to.be.eql('[css]')
expect(ripple.resources.foo.headers.needs).to.be.not.ok
done()
})
})

it('should ignore resources prefixed with _', function(){
it('should ignore resources prefixed with _', function(done){
var ripple = resdir(fn(css(core())))
expect(ripple('ignore')).to.not.be.ok
ripple.on('ready', d => {
expect(ripple.resources.ignore).to.not.be.ok
done()
})
})

it('should invoke loaded function', function(){
it('should invoke loaded function', function(done){
var ripple = resdir(fn(css(core())))
expect(loadedResdir[0]).to.eql(ripple)
expect(loadedResdir[1].name).to.eql('data')
expect(loadedResdir[1].body).to.eql(String)
ripple.on('ready', d => {
expect(loadedResdir[0]).to.eql(ripple)
expect(loadedResdir[1].name).to.eql('data')
expect(loadedResdir[1].body).to.eql(String)
done()
})
})

it('should load from additional resdirs from command line', function(){
it('should load from additional resdirs from command line', function(done){
process.argv = [
0
, 0
Expand All @@ -110,12 +115,15 @@ describe('Resources Folder', function(){
]

var ripple = resdir(fn(core()))
expect('data' in ripple.resources).to.be.ok
expect('secondary' in ripple.resources).to.be.ok
expect('tertiary' in ripple.resources).to.be.ok
ripple.on('ready', d => {
expect('data' in ripple.resources).to.be.ok
expect('secondary' in ripple.resources).to.be.ok
expect('tertiary' in ripple.resources).to.be.ok
done()
})
})

it('should load from additional resdirs from command line - shortcut', function(){
it('should load from additional resdirs from command line - shortcut', function(done){
process.argv = [
0
, 0
Expand All @@ -124,8 +132,11 @@ describe('Resources Folder', function(){
]

var ripple = resdir(fn(core()))
expect('data' in ripple.resources).to.be.ok
expect('secondary' in ripple.resources).to.be.ok
expect('tertiary' in ripple.resources).to.be.ok
ripple.on('ready', d => {
expect('data' in ripple.resources).to.be.ok
expect('secondary' in ripple.resources).to.be.ok
expect('tertiary' in ripple.resources).to.be.ok
done()
})
})
})

0 comments on commit 4667b8e

Please sign in to comment.