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.

Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +9 -0
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +4 -1
  5. data/app/assets/javascripts/vue/fluent_log.js +4 -4
  6. data/app/assets/javascripts/vue/in_tail_format.js +43 -49
  7. data/app/assets/javascripts/{alert.js → vue/notification.js} +21 -7
  8. data/app/assets/javascripts/vue/settings.js +121 -0
  9. data/app/assets/javascripts/vue/treeview.js +3 -3
  10. data/app/assets/stylesheets/common.css.scss +7 -1
  11. data/app/controllers/api/settings_controller.rb +55 -0
  12. data/app/controllers/api_controller.rb +6 -2
  13. data/app/controllers/concerns/setting_concern.rb +2 -2
  14. data/app/controllers/fluentd/settings_controller.rb +17 -2
  15. data/app/models/fluentd/setting/config.rb +39 -0
  16. data/app/views/api/settings/_element.json.jbuilder +6 -0
  17. data/app/views/api/settings/index.json.jbuilder +3 -0
  18. data/app/views/api/settings/show.json.jbuilder +1 -0
  19. data/app/views/fluentd/settings/edit.html.haml +3 -0
  20. data/app/views/fluentd/settings/source_and_output.html.haml +19 -2
  21. data/app/views/layouts/application.html.erb +1 -30
  22. data/app/views/shared/vue/_in_tail_format.html.erb +11 -36
  23. data/app/views/shared/vue/_notification.html.erb +31 -0
  24. data/app/views/shared/vue/_setting.html.erb +23 -0
  25. data/app/views/shared/vue/_treeview.html.erb +2 -2
  26. data/bower.json +1 -1
  27. data/config/application.rb +1 -0
  28. data/config/locales/translation_en.yml +11 -7
  29. data/config/locales/translation_ja.yml +4 -0
  30. data/config/routes.rb +2 -0
  31. data/lib/fluentd-ui/version.rb +1 -1
  32. data/spec/features/fluentd/setting/source_and_output_spec.rb +157 -0
  33. data/spec/spec_helper.rb +1 -0
  34. data/spec/support/javascript_macro.rb +21 -0
  35. data/vendor/assets/javascripts/bower/vue/.bower.json +7 -7
  36. data/vendor/assets/javascripts/bower/vue/LICENSE +1 -1
  37. data/vendor/assets/javascripts/bower/vue/dist/vue.js +7822 -4768
  38. data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -7
  39. data/vendor/assets/javascripts/bower/vue/src/api/child.js +53 -0
  40. data/vendor/assets/javascripts/bower/vue/src/api/data.js +161 -0
  41. data/vendor/assets/javascripts/bower/vue/src/api/dom.js +211 -0
  42. data/vendor/assets/javascripts/bower/vue/src/api/events.js +176 -0
  43. data/vendor/assets/javascripts/bower/vue/src/api/global.js +146 -0
  44. data/vendor/assets/javascripts/bower/vue/src/api/lifecycle.js +144 -0
  45. data/vendor/assets/javascripts/bower/vue/src/batcher.js +52 -32
  46. data/vendor/assets/javascripts/bower/vue/src/cache.js +112 -0
  47. data/vendor/assets/javascripts/bower/vue/src/compiler/compile.js +549 -0
  48. data/vendor/assets/javascripts/bower/vue/src/compiler/transclude.js +163 -0
  49. data/vendor/assets/javascripts/bower/vue/src/config.js +74 -14
  50. data/vendor/assets/javascripts/bower/vue/src/directive.js +179 -219
  51. data/vendor/assets/javascripts/bower/vue/src/directives/attr.js +32 -0
  52. data/vendor/assets/javascripts/bower/vue/src/directives/class.js +18 -0
  53. data/vendor/assets/javascripts/bower/vue/src/directives/cloak.js +12 -0
  54. data/vendor/assets/javascripts/bower/vue/src/directives/component.js +214 -0
  55. data/vendor/assets/javascripts/bower/vue/src/directives/el.js +13 -0
  56. data/vendor/assets/javascripts/bower/vue/src/directives/html.js +30 -34
  57. data/vendor/assets/javascripts/bower/vue/src/directives/if.js +77 -46
  58. data/vendor/assets/javascripts/bower/vue/src/directives/index.js +22 -129
  59. data/vendor/assets/javascripts/bower/vue/src/directives/model/checkbox.js +25 -0
  60. data/vendor/assets/javascripts/bower/vue/src/directives/model/default.js +123 -0
  61. data/vendor/assets/javascripts/bower/vue/src/directives/model/index.js +56 -0
  62. data/vendor/assets/javascripts/bower/vue/src/directives/model/radio.js +26 -0
  63. data/vendor/assets/javascripts/bower/vue/src/directives/model/select.js +166 -0
  64. data/vendor/assets/javascripts/bower/vue/src/directives/on.js +51 -50
  65. data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +36 -42
  66. data/vendor/assets/javascripts/bower/vue/src/directives/ref.js +24 -0
  67. data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +477 -226
  68. data/vendor/assets/javascripts/bower/vue/src/directives/show.js +8 -0
  69. data/vendor/assets/javascripts/bower/vue/src/directives/style.js +49 -37
  70. data/vendor/assets/javascripts/bower/vue/src/directives/text.js +15 -0
  71. data/vendor/assets/javascripts/bower/vue/src/directives/transition.js +12 -0
  72. data/vendor/assets/javascripts/bower/vue/src/directives/with.js +38 -41
  73. data/vendor/assets/javascripts/bower/vue/src/filters/array-filters.js +87 -0
  74. data/vendor/assets/javascripts/bower/vue/src/filters/index.js +135 -0
  75. data/vendor/assets/javascripts/bower/vue/src/instance/compile.js +71 -0
  76. data/vendor/assets/javascripts/bower/vue/src/instance/events.js +122 -0
  77. data/vendor/assets/javascripts/bower/vue/src/instance/init.js +76 -0
  78. data/vendor/assets/javascripts/bower/vue/src/instance/scope.js +217 -0
  79. data/vendor/assets/javascripts/bower/vue/src/observer/array.js +90 -0
  80. data/vendor/assets/javascripts/bower/vue/src/observer/dep.js +50 -0
  81. data/vendor/assets/javascripts/bower/vue/src/observer/index.js +235 -0
  82. data/vendor/assets/javascripts/bower/vue/src/observer/object.js +75 -0
  83. data/vendor/assets/javascripts/bower/vue/src/parsers/directive.js +159 -0
  84. data/vendor/assets/javascripts/bower/vue/src/parsers/expression.js +226 -0
  85. data/vendor/assets/javascripts/bower/vue/src/parsers/path.js +300 -0
  86. data/vendor/assets/javascripts/bower/vue/src/parsers/template.js +246 -0
  87. data/vendor/assets/javascripts/bower/vue/src/parsers/text.js +178 -0
  88. data/vendor/assets/javascripts/bower/vue/src/transition/css.js +189 -0
  89. data/vendor/assets/javascripts/bower/vue/src/transition/index.js +151 -0
  90. data/vendor/assets/javascripts/bower/vue/src/transition/js.js +43 -0
  91. data/vendor/assets/javascripts/bower/vue/src/util/debug.js +50 -0
  92. data/vendor/assets/javascripts/bower/vue/src/util/dom.js +176 -0
  93. data/vendor/assets/javascripts/bower/vue/src/util/env.js +74 -0
  94. data/vendor/assets/javascripts/bower/vue/src/util/filter.js +72 -0
  95. data/vendor/assets/javascripts/bower/vue/src/util/index.js +8 -0
  96. data/vendor/assets/javascripts/bower/vue/src/util/lang.js +175 -0
  97. data/vendor/assets/javascripts/bower/vue/src/util/merge-option.js +258 -0
  98. data/vendor/assets/javascripts/bower/vue/src/vue.js +84 -0
  99. data/vendor/assets/javascripts/bower/vue/src/watcher.js +240 -0
  100. metadata +65 -20
  101. data/app/assets/javascripts/setting_format.js +0 -15
  102. data/vendor/assets/javascripts/bower/vue/src/binding.js +0 -103
  103. data/vendor/assets/javascripts/bower/vue/src/compiler.js +0 -1037
  104. data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +0 -65
  105. data/vendor/assets/javascripts/bower/vue/src/directives/model.js +0 -174
  106. data/vendor/assets/javascripts/bower/vue/src/directives/view.js +0 -56
  107. data/vendor/assets/javascripts/bower/vue/src/emitter.js +0 -97
  108. data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +0 -190
  109. data/vendor/assets/javascripts/bower/vue/src/filters.js +0 -191
  110. data/vendor/assets/javascripts/bower/vue/src/fragment.js +0 -67
  111. data/vendor/assets/javascripts/bower/vue/src/main.js +0 -188
  112. data/vendor/assets/javascripts/bower/vue/src/observer.js +0 -446
  113. data/vendor/assets/javascripts/bower/vue/src/template-parser.js +0 -46
  114. data/vendor/assets/javascripts/bower/vue/src/text-parser.js +0 -96
  115. data/vendor/assets/javascripts/bower/vue/src/transition.js +0 -228
  116. data/vendor/assets/javascripts/bower/vue/src/utils.js +0 -326
  117. 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
- }