fluentd-ui 0.3.8 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of fluentd-ui might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ChangeLog +9 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -1
- data/app/assets/javascripts/vue/fluent_log.js +4 -4
- data/app/assets/javascripts/vue/in_tail_format.js +43 -49
- data/app/assets/javascripts/{alert.js → vue/notification.js} +21 -7
- data/app/assets/javascripts/vue/settings.js +121 -0
- data/app/assets/javascripts/vue/treeview.js +3 -3
- data/app/assets/stylesheets/common.css.scss +7 -1
- data/app/controllers/api/settings_controller.rb +55 -0
- data/app/controllers/api_controller.rb +6 -2
- data/app/controllers/concerns/setting_concern.rb +2 -2
- data/app/controllers/fluentd/settings_controller.rb +17 -2
- data/app/models/fluentd/setting/config.rb +39 -0
- data/app/views/api/settings/_element.json.jbuilder +6 -0
- data/app/views/api/settings/index.json.jbuilder +3 -0
- data/app/views/api/settings/show.json.jbuilder +1 -0
- data/app/views/fluentd/settings/edit.html.haml +3 -0
- data/app/views/fluentd/settings/source_and_output.html.haml +19 -2
- data/app/views/layouts/application.html.erb +1 -30
- data/app/views/shared/vue/_in_tail_format.html.erb +11 -36
- data/app/views/shared/vue/_notification.html.erb +31 -0
- data/app/views/shared/vue/_setting.html.erb +23 -0
- data/app/views/shared/vue/_treeview.html.erb +2 -2
- data/bower.json +1 -1
- data/config/application.rb +1 -0
- data/config/locales/translation_en.yml +11 -7
- data/config/locales/translation_ja.yml +4 -0
- data/config/routes.rb +2 -0
- data/lib/fluentd-ui/version.rb +1 -1
- data/spec/features/fluentd/setting/source_and_output_spec.rb +157 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/javascript_macro.rb +21 -0
- data/vendor/assets/javascripts/bower/vue/.bower.json +7 -7
- data/vendor/assets/javascripts/bower/vue/LICENSE +1 -1
- data/vendor/assets/javascripts/bower/vue/dist/vue.js +7822 -4768
- data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -7
- data/vendor/assets/javascripts/bower/vue/src/api/child.js +53 -0
- data/vendor/assets/javascripts/bower/vue/src/api/data.js +161 -0
- data/vendor/assets/javascripts/bower/vue/src/api/dom.js +211 -0
- data/vendor/assets/javascripts/bower/vue/src/api/events.js +176 -0
- data/vendor/assets/javascripts/bower/vue/src/api/global.js +146 -0
- data/vendor/assets/javascripts/bower/vue/src/api/lifecycle.js +144 -0
- data/vendor/assets/javascripts/bower/vue/src/batcher.js +52 -32
- data/vendor/assets/javascripts/bower/vue/src/cache.js +112 -0
- data/vendor/assets/javascripts/bower/vue/src/compiler/compile.js +549 -0
- data/vendor/assets/javascripts/bower/vue/src/compiler/transclude.js +163 -0
- data/vendor/assets/javascripts/bower/vue/src/config.js +74 -14
- data/vendor/assets/javascripts/bower/vue/src/directive.js +179 -219
- data/vendor/assets/javascripts/bower/vue/src/directives/attr.js +32 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/class.js +18 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/cloak.js +12 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/component.js +214 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/el.js +13 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/html.js +30 -34
- data/vendor/assets/javascripts/bower/vue/src/directives/if.js +77 -46
- data/vendor/assets/javascripts/bower/vue/src/directives/index.js +22 -129
- data/vendor/assets/javascripts/bower/vue/src/directives/model/checkbox.js +25 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/default.js +123 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/index.js +56 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/radio.js +26 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/select.js +166 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/on.js +51 -50
- data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +36 -42
- data/vendor/assets/javascripts/bower/vue/src/directives/ref.js +24 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +477 -226
- data/vendor/assets/javascripts/bower/vue/src/directives/show.js +8 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/style.js +49 -37
- data/vendor/assets/javascripts/bower/vue/src/directives/text.js +15 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/transition.js +12 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/with.js +38 -41
- data/vendor/assets/javascripts/bower/vue/src/filters/array-filters.js +87 -0
- data/vendor/assets/javascripts/bower/vue/src/filters/index.js +135 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/compile.js +71 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/events.js +122 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/init.js +76 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/scope.js +217 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/array.js +90 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/dep.js +50 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/index.js +235 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/object.js +75 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/directive.js +159 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/expression.js +226 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/path.js +300 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/template.js +246 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/text.js +178 -0
- data/vendor/assets/javascripts/bower/vue/src/transition/css.js +189 -0
- data/vendor/assets/javascripts/bower/vue/src/transition/index.js +151 -0
- data/vendor/assets/javascripts/bower/vue/src/transition/js.js +43 -0
- data/vendor/assets/javascripts/bower/vue/src/util/debug.js +50 -0
- data/vendor/assets/javascripts/bower/vue/src/util/dom.js +176 -0
- data/vendor/assets/javascripts/bower/vue/src/util/env.js +74 -0
- data/vendor/assets/javascripts/bower/vue/src/util/filter.js +72 -0
- data/vendor/assets/javascripts/bower/vue/src/util/index.js +8 -0
- data/vendor/assets/javascripts/bower/vue/src/util/lang.js +175 -0
- data/vendor/assets/javascripts/bower/vue/src/util/merge-option.js +258 -0
- data/vendor/assets/javascripts/bower/vue/src/vue.js +84 -0
- data/vendor/assets/javascripts/bower/vue/src/watcher.js +240 -0
- metadata +65 -20
- data/app/assets/javascripts/setting_format.js +0 -15
- data/vendor/assets/javascripts/bower/vue/src/binding.js +0 -103
- data/vendor/assets/javascripts/bower/vue/src/compiler.js +0 -1037
- data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +0 -65
- data/vendor/assets/javascripts/bower/vue/src/directives/model.js +0 -174
- data/vendor/assets/javascripts/bower/vue/src/directives/view.js +0 -56
- data/vendor/assets/javascripts/bower/vue/src/emitter.js +0 -97
- data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +0 -190
- data/vendor/assets/javascripts/bower/vue/src/filters.js +0 -191
- data/vendor/assets/javascripts/bower/vue/src/fragment.js +0 -67
- data/vendor/assets/javascripts/bower/vue/src/main.js +0 -188
- data/vendor/assets/javascripts/bower/vue/src/observer.js +0 -446
- data/vendor/assets/javascripts/bower/vue/src/template-parser.js +0 -46
- data/vendor/assets/javascripts/bower/vue/src/text-parser.js +0 -96
- data/vendor/assets/javascripts/bower/vue/src/transition.js +0 -228
- data/vendor/assets/javascripts/bower/vue/src/utils.js +0 -326
- data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +0 -190
@@ -1,46 +0,0 @@
|
|
1
|
-
var toFragment = require('./fragment');
|
2
|
-
|
3
|
-
/**
|
4
|
-
* Parses a template string or node and normalizes it into a
|
5
|
-
* a node that can be used as a partial of a template option
|
6
|
-
*
|
7
|
-
* Possible values include
|
8
|
-
* id selector: '#some-template-id'
|
9
|
-
* template string: '<div><span>my template</span></div>'
|
10
|
-
* DocumentFragment object
|
11
|
-
* Node object of type Template
|
12
|
-
*/
|
13
|
-
module.exports = function(template) {
|
14
|
-
var templateNode;
|
15
|
-
|
16
|
-
if (template instanceof window.DocumentFragment) {
|
17
|
-
// if the template is already a document fragment -- do nothing
|
18
|
-
return template
|
19
|
-
}
|
20
|
-
|
21
|
-
if (typeof template === 'string') {
|
22
|
-
// template by ID
|
23
|
-
if (template.charAt(0) === '#') {
|
24
|
-
templateNode = document.getElementById(template.slice(1))
|
25
|
-
if (!templateNode) return
|
26
|
-
} else {
|
27
|
-
return toFragment(template)
|
28
|
-
}
|
29
|
-
} else if (template.nodeType) {
|
30
|
-
templateNode = template
|
31
|
-
} else {
|
32
|
-
return
|
33
|
-
}
|
34
|
-
|
35
|
-
// if its a template tag and the browser supports it,
|
36
|
-
// its content is already a document fragment!
|
37
|
-
if (templateNode.tagName === 'TEMPLATE' && templateNode.content) {
|
38
|
-
return templateNode.content
|
39
|
-
}
|
40
|
-
|
41
|
-
if (templateNode.tagName === 'SCRIPT') {
|
42
|
-
return toFragment(templateNode.innerHTML)
|
43
|
-
}
|
44
|
-
|
45
|
-
return toFragment(templateNode.outerHTML);
|
46
|
-
}
|
@@ -1,96 +0,0 @@
|
|
1
|
-
var openChar = '{',
|
2
|
-
endChar = '}',
|
3
|
-
ESCAPE_RE = /[-.*+?^${}()|[\]\/\\]/g,
|
4
|
-
// lazy require
|
5
|
-
Directive
|
6
|
-
|
7
|
-
exports.Regex = buildInterpolationRegex()
|
8
|
-
|
9
|
-
function buildInterpolationRegex () {
|
10
|
-
var open = escapeRegex(openChar),
|
11
|
-
end = escapeRegex(endChar)
|
12
|
-
return new RegExp(open + open + open + '?(.+?)' + end + '?' + end + end)
|
13
|
-
}
|
14
|
-
|
15
|
-
function escapeRegex (str) {
|
16
|
-
return str.replace(ESCAPE_RE, '\\$&')
|
17
|
-
}
|
18
|
-
|
19
|
-
function setDelimiters (delimiters) {
|
20
|
-
openChar = delimiters[0]
|
21
|
-
endChar = delimiters[1]
|
22
|
-
exports.delimiters = delimiters
|
23
|
-
exports.Regex = buildInterpolationRegex()
|
24
|
-
}
|
25
|
-
|
26
|
-
/**
|
27
|
-
* Parse a piece of text, return an array of tokens
|
28
|
-
* token types:
|
29
|
-
* 1. plain string
|
30
|
-
* 2. object with key = binding key
|
31
|
-
* 3. object with key & html = true
|
32
|
-
*/
|
33
|
-
function parse (text) {
|
34
|
-
if (!exports.Regex.test(text)) return null
|
35
|
-
var m, i, token, match, tokens = []
|
36
|
-
/* jshint boss: true */
|
37
|
-
while (m = text.match(exports.Regex)) {
|
38
|
-
i = m.index
|
39
|
-
if (i > 0) tokens.push(text.slice(0, i))
|
40
|
-
token = { key: m[1].trim() }
|
41
|
-
match = m[0]
|
42
|
-
token.html =
|
43
|
-
match.charAt(2) === openChar &&
|
44
|
-
match.charAt(match.length - 3) === endChar
|
45
|
-
tokens.push(token)
|
46
|
-
text = text.slice(i + m[0].length)
|
47
|
-
}
|
48
|
-
if (text.length) tokens.push(text)
|
49
|
-
return tokens
|
50
|
-
}
|
51
|
-
|
52
|
-
/**
|
53
|
-
* Parse an attribute value with possible interpolation tags
|
54
|
-
* return a Directive-friendly expression
|
55
|
-
*
|
56
|
-
* e.g. a {{b}} c => "a " + b + " c"
|
57
|
-
*/
|
58
|
-
function parseAttr (attr) {
|
59
|
-
Directive = Directive || require('./directive')
|
60
|
-
var tokens = parse(attr)
|
61
|
-
if (!tokens) return null
|
62
|
-
if (tokens.length === 1) return tokens[0].key
|
63
|
-
var res = [], token
|
64
|
-
for (var i = 0, l = tokens.length; i < l; i++) {
|
65
|
-
token = tokens[i]
|
66
|
-
res.push(
|
67
|
-
token.key
|
68
|
-
? inlineFilters(token.key)
|
69
|
-
: ('"' + token + '"')
|
70
|
-
)
|
71
|
-
}
|
72
|
-
return res.join('+')
|
73
|
-
}
|
74
|
-
|
75
|
-
/**
|
76
|
-
* Inlines any possible filters in a binding
|
77
|
-
* so that we can combine everything into a huge expression
|
78
|
-
*/
|
79
|
-
function inlineFilters (key) {
|
80
|
-
if (key.indexOf('|') > -1) {
|
81
|
-
var dirs = Directive.parse(key),
|
82
|
-
dir = dirs && dirs[0]
|
83
|
-
if (dir && dir.filters) {
|
84
|
-
key = Directive.inlineFilters(
|
85
|
-
dir.key,
|
86
|
-
dir.filters
|
87
|
-
)
|
88
|
-
}
|
89
|
-
}
|
90
|
-
return '(' + key + ')'
|
91
|
-
}
|
92
|
-
|
93
|
-
exports.parse = parse
|
94
|
-
exports.parseAttr = parseAttr
|
95
|
-
exports.setDelimiters = setDelimiters
|
96
|
-
exports.delimiters = [openChar, endChar]
|
@@ -1,228 +0,0 @@
|
|
1
|
-
var endEvents = sniffEndEvents(),
|
2
|
-
config = require('./config'),
|
3
|
-
// batch enter animations so we only force the layout once
|
4
|
-
Batcher = require('./batcher'),
|
5
|
-
batcher = new Batcher(),
|
6
|
-
// cache timer functions
|
7
|
-
setTO = window.setTimeout,
|
8
|
-
clearTO = window.clearTimeout,
|
9
|
-
// exit codes for testing
|
10
|
-
codes = {
|
11
|
-
CSS_E : 1,
|
12
|
-
CSS_L : 2,
|
13
|
-
JS_E : 3,
|
14
|
-
JS_L : 4,
|
15
|
-
CSS_SKIP : -1,
|
16
|
-
JS_SKIP : -2,
|
17
|
-
JS_SKIP_E : -3,
|
18
|
-
JS_SKIP_L : -4,
|
19
|
-
INIT : -5,
|
20
|
-
SKIP : -6
|
21
|
-
}
|
22
|
-
|
23
|
-
// force layout before triggering transitions/animations
|
24
|
-
batcher._preFlush = function () {
|
25
|
-
/* jshint unused: false */
|
26
|
-
var f = document.body.offsetHeight
|
27
|
-
}
|
28
|
-
|
29
|
-
/**
|
30
|
-
* stage:
|
31
|
-
* 1 = enter
|
32
|
-
* 2 = leave
|
33
|
-
*/
|
34
|
-
var transition = module.exports = function (el, stage, cb, compiler) {
|
35
|
-
|
36
|
-
var changeState = function () {
|
37
|
-
cb()
|
38
|
-
compiler.execHook(stage > 0 ? 'attached' : 'detached')
|
39
|
-
}
|
40
|
-
|
41
|
-
if (compiler.init) {
|
42
|
-
changeState()
|
43
|
-
return codes.INIT
|
44
|
-
}
|
45
|
-
|
46
|
-
var hasTransition = el.vue_trans === '',
|
47
|
-
hasAnimation = el.vue_anim === '',
|
48
|
-
effectId = el.vue_effect
|
49
|
-
|
50
|
-
if (effectId) {
|
51
|
-
return applyTransitionFunctions(
|
52
|
-
el,
|
53
|
-
stage,
|
54
|
-
changeState,
|
55
|
-
effectId,
|
56
|
-
compiler
|
57
|
-
)
|
58
|
-
} else if (hasTransition || hasAnimation) {
|
59
|
-
return applyTransitionClass(
|
60
|
-
el,
|
61
|
-
stage,
|
62
|
-
changeState,
|
63
|
-
hasAnimation
|
64
|
-
)
|
65
|
-
} else {
|
66
|
-
changeState()
|
67
|
-
return codes.SKIP
|
68
|
-
}
|
69
|
-
|
70
|
-
}
|
71
|
-
|
72
|
-
/**
|
73
|
-
* Togggle a CSS class to trigger transition
|
74
|
-
*/
|
75
|
-
function applyTransitionClass (el, stage, changeState, hasAnimation) {
|
76
|
-
|
77
|
-
if (!endEvents.trans) {
|
78
|
-
changeState()
|
79
|
-
return codes.CSS_SKIP
|
80
|
-
}
|
81
|
-
|
82
|
-
// if the browser supports transition,
|
83
|
-
// it must have classList...
|
84
|
-
var onEnd,
|
85
|
-
classList = el.classList,
|
86
|
-
existingCallback = el.vue_trans_cb,
|
87
|
-
enterClass = config.enterClass,
|
88
|
-
leaveClass = config.leaveClass,
|
89
|
-
endEvent = hasAnimation ? endEvents.anim : endEvents.trans
|
90
|
-
|
91
|
-
// cancel unfinished callbacks and jobs
|
92
|
-
if (existingCallback) {
|
93
|
-
el.removeEventListener(endEvent, existingCallback)
|
94
|
-
classList.remove(enterClass)
|
95
|
-
classList.remove(leaveClass)
|
96
|
-
el.vue_trans_cb = null
|
97
|
-
}
|
98
|
-
|
99
|
-
if (stage > 0) { // enter
|
100
|
-
|
101
|
-
// set to enter state before appending
|
102
|
-
classList.add(enterClass)
|
103
|
-
// append
|
104
|
-
changeState()
|
105
|
-
// trigger transition
|
106
|
-
if (!hasAnimation) {
|
107
|
-
batcher.push({
|
108
|
-
execute: function () {
|
109
|
-
classList.remove(enterClass)
|
110
|
-
}
|
111
|
-
})
|
112
|
-
} else {
|
113
|
-
onEnd = function (e) {
|
114
|
-
if (e.target === el) {
|
115
|
-
el.removeEventListener(endEvent, onEnd)
|
116
|
-
el.vue_trans_cb = null
|
117
|
-
classList.remove(enterClass)
|
118
|
-
}
|
119
|
-
}
|
120
|
-
el.addEventListener(endEvent, onEnd)
|
121
|
-
el.vue_trans_cb = onEnd
|
122
|
-
}
|
123
|
-
return codes.CSS_E
|
124
|
-
|
125
|
-
} else { // leave
|
126
|
-
|
127
|
-
if (el.offsetWidth || el.offsetHeight) {
|
128
|
-
// trigger hide transition
|
129
|
-
classList.add(leaveClass)
|
130
|
-
onEnd = function (e) {
|
131
|
-
if (e.target === el) {
|
132
|
-
el.removeEventListener(endEvent, onEnd)
|
133
|
-
el.vue_trans_cb = null
|
134
|
-
// actually remove node here
|
135
|
-
changeState()
|
136
|
-
classList.remove(leaveClass)
|
137
|
-
}
|
138
|
-
}
|
139
|
-
// attach transition end listener
|
140
|
-
el.addEventListener(endEvent, onEnd)
|
141
|
-
el.vue_trans_cb = onEnd
|
142
|
-
} else {
|
143
|
-
// directly remove invisible elements
|
144
|
-
changeState()
|
145
|
-
}
|
146
|
-
return codes.CSS_L
|
147
|
-
|
148
|
-
}
|
149
|
-
|
150
|
-
}
|
151
|
-
|
152
|
-
function applyTransitionFunctions (el, stage, changeState, effectId, compiler) {
|
153
|
-
|
154
|
-
var funcs = compiler.getOption('effects', effectId)
|
155
|
-
if (!funcs) {
|
156
|
-
changeState()
|
157
|
-
return codes.JS_SKIP
|
158
|
-
}
|
159
|
-
|
160
|
-
var enter = funcs.enter,
|
161
|
-
leave = funcs.leave,
|
162
|
-
timeouts = el.vue_timeouts
|
163
|
-
|
164
|
-
// clear previous timeouts
|
165
|
-
if (timeouts) {
|
166
|
-
var i = timeouts.length
|
167
|
-
while (i--) {
|
168
|
-
clearTO(timeouts[i])
|
169
|
-
}
|
170
|
-
}
|
171
|
-
|
172
|
-
timeouts = el.vue_timeouts = []
|
173
|
-
function timeout (cb, delay) {
|
174
|
-
var id = setTO(function () {
|
175
|
-
cb()
|
176
|
-
timeouts.splice(timeouts.indexOf(id), 1)
|
177
|
-
if (!timeouts.length) {
|
178
|
-
el.vue_timeouts = null
|
179
|
-
}
|
180
|
-
}, delay)
|
181
|
-
timeouts.push(id)
|
182
|
-
}
|
183
|
-
|
184
|
-
if (stage > 0) { // enter
|
185
|
-
if (typeof enter !== 'function') {
|
186
|
-
changeState()
|
187
|
-
return codes.JS_SKIP_E
|
188
|
-
}
|
189
|
-
enter(el, changeState, timeout)
|
190
|
-
return codes.JS_E
|
191
|
-
} else { // leave
|
192
|
-
if (typeof leave !== 'function') {
|
193
|
-
changeState()
|
194
|
-
return codes.JS_SKIP_L
|
195
|
-
}
|
196
|
-
leave(el, changeState, timeout)
|
197
|
-
return codes.JS_L
|
198
|
-
}
|
199
|
-
|
200
|
-
}
|
201
|
-
|
202
|
-
/**
|
203
|
-
* Sniff proper transition end event name
|
204
|
-
*/
|
205
|
-
function sniffEndEvents () {
|
206
|
-
var el = document.createElement('vue'),
|
207
|
-
defaultEvent = 'transitionend',
|
208
|
-
events = {
|
209
|
-
'webkitTransition' : 'webkitTransitionEnd',
|
210
|
-
'transition' : defaultEvent,
|
211
|
-
'mozTransition' : defaultEvent
|
212
|
-
},
|
213
|
-
ret = {}
|
214
|
-
for (var name in events) {
|
215
|
-
if (el.style[name] !== undefined) {
|
216
|
-
ret.trans = events[name]
|
217
|
-
break
|
218
|
-
}
|
219
|
-
}
|
220
|
-
ret.anim = el.style.animation === ''
|
221
|
-
? 'animationend'
|
222
|
-
: 'webkitAnimationEnd'
|
223
|
-
return ret
|
224
|
-
}
|
225
|
-
|
226
|
-
// Expose some stuff for testing purposes
|
227
|
-
transition.codes = codes
|
228
|
-
transition.sniff = sniffEndEvents
|
@@ -1,326 +0,0 @@
|
|
1
|
-
var config = require('./config'),
|
2
|
-
toString = ({}).toString,
|
3
|
-
win = window,
|
4
|
-
console = win.console,
|
5
|
-
def = Object.defineProperty,
|
6
|
-
OBJECT = 'object',
|
7
|
-
THIS_RE = /[^\w]this[^\w]/,
|
8
|
-
BRACKET_RE_S = /\['([^']+)'\]/g,
|
9
|
-
BRACKET_RE_D = /\["([^"]+)"\]/g,
|
10
|
-
hasClassList = 'classList' in document.documentElement,
|
11
|
-
ViewModel // late def
|
12
|
-
|
13
|
-
var defer =
|
14
|
-
win.requestAnimationFrame ||
|
15
|
-
win.webkitRequestAnimationFrame ||
|
16
|
-
win.setTimeout
|
17
|
-
|
18
|
-
/**
|
19
|
-
* Normalize keypath with possible brackets into dot notations
|
20
|
-
*/
|
21
|
-
function normalizeKeypath (key) {
|
22
|
-
return key.indexOf('[') < 0
|
23
|
-
? key
|
24
|
-
: key.replace(BRACKET_RE_S, '.$1')
|
25
|
-
.replace(BRACKET_RE_D, '.$1')
|
26
|
-
}
|
27
|
-
|
28
|
-
var utils = module.exports = {
|
29
|
-
|
30
|
-
/**
|
31
|
-
* Convert a string template to a dom fragment
|
32
|
-
*/
|
33
|
-
toFragment: require('./fragment'),
|
34
|
-
|
35
|
-
/**
|
36
|
-
* Parse the various types of template options
|
37
|
-
*/
|
38
|
-
parseTemplateOption: require('./template-parser.js'),
|
39
|
-
|
40
|
-
/**
|
41
|
-
* get a value from an object keypath
|
42
|
-
*/
|
43
|
-
get: function (obj, key) {
|
44
|
-
/* jshint eqeqeq: false */
|
45
|
-
key = normalizeKeypath(key)
|
46
|
-
if (key.indexOf('.') < 0) {
|
47
|
-
return obj[key]
|
48
|
-
}
|
49
|
-
var path = key.split('.'),
|
50
|
-
d = -1, l = path.length
|
51
|
-
while (++d < l && obj != null) {
|
52
|
-
obj = obj[path[d]]
|
53
|
-
}
|
54
|
-
return obj
|
55
|
-
},
|
56
|
-
|
57
|
-
/**
|
58
|
-
* set a value to an object keypath
|
59
|
-
*/
|
60
|
-
set: function (obj, key, val) {
|
61
|
-
/* jshint eqeqeq: false */
|
62
|
-
key = normalizeKeypath(key)
|
63
|
-
if (key.indexOf('.') < 0) {
|
64
|
-
obj[key] = val
|
65
|
-
return
|
66
|
-
}
|
67
|
-
var path = key.split('.'),
|
68
|
-
d = -1, l = path.length - 1
|
69
|
-
while (++d < l) {
|
70
|
-
if (obj[path[d]] == null) {
|
71
|
-
obj[path[d]] = {}
|
72
|
-
}
|
73
|
-
obj = obj[path[d]]
|
74
|
-
}
|
75
|
-
obj[path[d]] = val
|
76
|
-
},
|
77
|
-
|
78
|
-
/**
|
79
|
-
* return the base segment of a keypath
|
80
|
-
*/
|
81
|
-
baseKey: function (key) {
|
82
|
-
return key.indexOf('.') > 0
|
83
|
-
? key.split('.')[0]
|
84
|
-
: key
|
85
|
-
},
|
86
|
-
|
87
|
-
/**
|
88
|
-
* Create a prototype-less object
|
89
|
-
* which is a better hash/map
|
90
|
-
*/
|
91
|
-
hash: function () {
|
92
|
-
return Object.create(null)
|
93
|
-
},
|
94
|
-
|
95
|
-
/**
|
96
|
-
* get an attribute and remove it.
|
97
|
-
*/
|
98
|
-
attr: function (el, type) {
|
99
|
-
var attr = config.prefix + '-' + type,
|
100
|
-
val = el.getAttribute(attr)
|
101
|
-
if (val !== null) {
|
102
|
-
el.removeAttribute(attr)
|
103
|
-
}
|
104
|
-
return val
|
105
|
-
},
|
106
|
-
|
107
|
-
/**
|
108
|
-
* Define an ienumerable property
|
109
|
-
* This avoids it being included in JSON.stringify
|
110
|
-
* or for...in loops.
|
111
|
-
*/
|
112
|
-
defProtected: function (obj, key, val, enumerable, writable) {
|
113
|
-
def(obj, key, {
|
114
|
-
value : val,
|
115
|
-
enumerable : enumerable,
|
116
|
-
writable : writable,
|
117
|
-
configurable : true
|
118
|
-
})
|
119
|
-
},
|
120
|
-
|
121
|
-
/**
|
122
|
-
* A less bullet-proof but more efficient type check
|
123
|
-
* than Object.prototype.toString
|
124
|
-
*/
|
125
|
-
isObject: function (obj) {
|
126
|
-
return typeof obj === OBJECT && obj && !Array.isArray(obj)
|
127
|
-
},
|
128
|
-
|
129
|
-
/**
|
130
|
-
* A more accurate but less efficient type check
|
131
|
-
*/
|
132
|
-
isTrueObject: function (obj) {
|
133
|
-
return toString.call(obj) === '[object Object]'
|
134
|
-
},
|
135
|
-
|
136
|
-
/**
|
137
|
-
* Most simple bind
|
138
|
-
* enough for the usecase and fast than native bind()
|
139
|
-
*/
|
140
|
-
bind: function (fn, ctx) {
|
141
|
-
return function (arg) {
|
142
|
-
return fn.call(ctx, arg)
|
143
|
-
}
|
144
|
-
},
|
145
|
-
|
146
|
-
/**
|
147
|
-
* Make sure null and undefined output empty string
|
148
|
-
*/
|
149
|
-
guard: function (value) {
|
150
|
-
/* jshint eqeqeq: false, eqnull: true */
|
151
|
-
return value == null
|
152
|
-
? ''
|
153
|
-
: (typeof value == 'object')
|
154
|
-
? JSON.stringify(value)
|
155
|
-
: value
|
156
|
-
},
|
157
|
-
|
158
|
-
/**
|
159
|
-
* When setting value on the VM, parse possible numbers
|
160
|
-
*/
|
161
|
-
checkNumber: function (value) {
|
162
|
-
return (isNaN(value) || value === null || typeof value === 'boolean')
|
163
|
-
? value
|
164
|
-
: Number(value)
|
165
|
-
},
|
166
|
-
|
167
|
-
/**
|
168
|
-
* simple extend
|
169
|
-
*/
|
170
|
-
extend: function (obj, ext) {
|
171
|
-
for (var key in ext) {
|
172
|
-
if (obj[key] !== ext[key]) {
|
173
|
-
obj[key] = ext[key]
|
174
|
-
}
|
175
|
-
}
|
176
|
-
return obj
|
177
|
-
},
|
178
|
-
|
179
|
-
/**
|
180
|
-
* filter an array with duplicates into uniques
|
181
|
-
*/
|
182
|
-
unique: function (arr) {
|
183
|
-
var hash = utils.hash(),
|
184
|
-
i = arr.length,
|
185
|
-
key, res = []
|
186
|
-
while (i--) {
|
187
|
-
key = arr[i]
|
188
|
-
if (hash[key]) continue
|
189
|
-
hash[key] = 1
|
190
|
-
res.push(key)
|
191
|
-
}
|
192
|
-
return res
|
193
|
-
},
|
194
|
-
|
195
|
-
/**
|
196
|
-
* Convert the object to a ViewModel constructor
|
197
|
-
* if it is not already one
|
198
|
-
*/
|
199
|
-
toConstructor: function (obj) {
|
200
|
-
ViewModel = ViewModel || require('./viewmodel')
|
201
|
-
return utils.isObject(obj)
|
202
|
-
? ViewModel.extend(obj)
|
203
|
-
: typeof obj === 'function'
|
204
|
-
? obj
|
205
|
-
: null
|
206
|
-
},
|
207
|
-
|
208
|
-
/**
|
209
|
-
* Check if a filter function contains references to `this`
|
210
|
-
* If yes, mark it as a computed filter.
|
211
|
-
*/
|
212
|
-
checkFilter: function (filter) {
|
213
|
-
if (THIS_RE.test(filter.toString())) {
|
214
|
-
filter.computed = true
|
215
|
-
}
|
216
|
-
},
|
217
|
-
|
218
|
-
/**
|
219
|
-
* convert certain option values to the desired format.
|
220
|
-
*/
|
221
|
-
processOptions: function (options) {
|
222
|
-
var components = options.components,
|
223
|
-
partials = options.partials,
|
224
|
-
template = options.template,
|
225
|
-
filters = options.filters,
|
226
|
-
key
|
227
|
-
if (components) {
|
228
|
-
for (key in components) {
|
229
|
-
components[key] = utils.toConstructor(components[key])
|
230
|
-
}
|
231
|
-
}
|
232
|
-
if (partials) {
|
233
|
-
for (key in partials) {
|
234
|
-
partials[key] = utils.parseTemplateOption(partials[key])
|
235
|
-
}
|
236
|
-
}
|
237
|
-
if (filters) {
|
238
|
-
for (key in filters) {
|
239
|
-
utils.checkFilter(filters[key])
|
240
|
-
}
|
241
|
-
}
|
242
|
-
if (template) {
|
243
|
-
options.template = utils.parseTemplateOption(template)
|
244
|
-
}
|
245
|
-
},
|
246
|
-
|
247
|
-
/**
|
248
|
-
* used to defer batch updates
|
249
|
-
*/
|
250
|
-
nextTick: function (cb) {
|
251
|
-
defer(cb, 0)
|
252
|
-
},
|
253
|
-
|
254
|
-
/**
|
255
|
-
* add class for IE9
|
256
|
-
* uses classList if available
|
257
|
-
*/
|
258
|
-
addClass: function (el, cls) {
|
259
|
-
if (hasClassList) {
|
260
|
-
el.classList.add(cls)
|
261
|
-
} else {
|
262
|
-
var cur = ' ' + el.className + ' '
|
263
|
-
if (cur.indexOf(' ' + cls + ' ') < 0) {
|
264
|
-
el.className = (cur + cls).trim()
|
265
|
-
}
|
266
|
-
}
|
267
|
-
},
|
268
|
-
|
269
|
-
/**
|
270
|
-
* remove class for IE9
|
271
|
-
*/
|
272
|
-
removeClass: function (el, cls) {
|
273
|
-
if (hasClassList) {
|
274
|
-
el.classList.remove(cls)
|
275
|
-
} else {
|
276
|
-
var cur = ' ' + el.className + ' ',
|
277
|
-
tar = ' ' + cls + ' '
|
278
|
-
while (cur.indexOf(tar) >= 0) {
|
279
|
-
cur = cur.replace(tar, ' ')
|
280
|
-
}
|
281
|
-
el.className = cur.trim()
|
282
|
-
}
|
283
|
-
},
|
284
|
-
|
285
|
-
/**
|
286
|
-
* Convert an object to Array
|
287
|
-
* used in v-repeat and array filters
|
288
|
-
*/
|
289
|
-
objectToArray: function (obj) {
|
290
|
-
var res = [], val, data
|
291
|
-
for (var key in obj) {
|
292
|
-
val = obj[key]
|
293
|
-
data = utils.isObject(val)
|
294
|
-
? val
|
295
|
-
: { $value: val }
|
296
|
-
data.$key = key
|
297
|
-
res.push(data)
|
298
|
-
}
|
299
|
-
return res
|
300
|
-
}
|
301
|
-
}
|
302
|
-
|
303
|
-
enableDebug()
|
304
|
-
function enableDebug () {
|
305
|
-
/**
|
306
|
-
* log for debugging
|
307
|
-
*/
|
308
|
-
utils.log = function (msg) {
|
309
|
-
if (config.debug && console) {
|
310
|
-
console.log(msg)
|
311
|
-
}
|
312
|
-
}
|
313
|
-
|
314
|
-
/**
|
315
|
-
* warnings, traces by default
|
316
|
-
* can be suppressed by `silent` option.
|
317
|
-
*/
|
318
|
-
utils.warn = function (msg) {
|
319
|
-
if (!config.silent && console) {
|
320
|
-
console.warn(msg)
|
321
|
-
if (config.debug && console.trace) {
|
322
|
-
console.trace()
|
323
|
-
}
|
324
|
-
}
|
325
|
-
}
|
326
|
-
}
|