diff --git a/src/index.js b/src/index.js index 7aaca50..ffff820 100644 --- a/src/index.js +++ b/src/index.js @@ -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' @@ -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) \ No newline at end of file diff --git a/test.js b/test.js index 1f0340a..6f7746b 100644 --- a/test.js +++ b/test.js @@ -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 @@ -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 @@ -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() + }) }) }) \ No newline at end of file