-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
69 lines (63 loc) · 2.22 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// -------------------------------------------
// Adds support for data resources
// -------------------------------------------
module.exports = function data(ripple){
log('creating')
ripple
.on('change.data')
.filter(([name, change]) => header('content-type', 'application/data')(ripple.resources[name]))
.filter(([name, change]) => change && change.key)
.map(([name, change]) => ripple
.resources[name]
.body
.emit('change', (change || null), not(is.in(['bubble']))))
ripple.types['application/data'] = {
header: 'application/data'
, ext: '*.data.js'
, selector: res => `[data~="${res.name}"]`
, extract: el => (attr(`data`)(el) || '').split(' ')
, check: res => is.obj(res.body)
, load(res) {
let exported = require(res.headers.path)
exported = exported.default || exported
exported = is.fn(exported) ? exported(ripple) : exported
res.headers['content-type'] = this.header
ripple(merge(res)(exported))
return ripple.resources[res.name]
}
, parse(res){
const existing = ripple.resources[res.name] || {}
extend(res.headers)(existing.headers)
res.body = set()(
res.body || []
, existing.body && existing.body.log
, is.num(res.headers.log) ? res.headers.log : -1
)
overwrite(res.body.on)(listeners(existing))
res.body.on('change.bubble', change => {
ripple.emit('change', ripple.change = [res.name, change], not(is.in(['data'])))
delete ripple.change
})
if (res.headers.loaded && !res.headers.loading)
res.headers.loading = Promise.resolve(res.headers.loaded(ripple, res))
.then(() => {
delete res.headers.loading
return res
})
return res
}
}
return ripple
}
const overwrite = require('utilise/overwrite')
, header = require('utilise/header')
, extend = require('utilise/extend')
, merge = require('utilise/merge')
, attr = require('utilise/attr')
, not = require('utilise/not')
, key = require('utilise/key')
, set = require('utilise/set')
, fn = require('utilise/fn')
, is = require('utilise/is')
, log = require('utilise/log')('[ri/types/data]')
, listeners = key('body.on')