vuejs-rails 0.8.1
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +2 -0
- data/LICENSE.md +21 -0
- data/Rakefile +1 -0
- data/Readme.md +15 -0
- data/lib/vuejs-rails.rb +10 -0
- data/lib/vuejs-rails/version.rb +5 -0
- data/vendor/assets/javascripts/vue.js +3378 -0
- data/vuejs-rails.gemspec +22 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4af8d9efbcaacd35a31ee5c996e8ef8bdbc758eb
|
4
|
+
data.tar.gz: e9a730e9ca384f7f9b2785829a563b7e47a95a5f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 287433c61f56e48f46261a0362f60930be41df8a3ff65ac2cd1d6f1185009d666b0d5854859a242d212d953e5fe14e70f9239a09877bddc2dd709260d7460fc0
|
7
|
+
data.tar.gz: f15f807dadbd7eef56d7ed3a5c84ad04cfdbb77723db4fbb8cd90960549b0e422f247341c54792968eba0b4b11698a2b8f53fc2ae4b423f6483c95cd7ae5e865
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Adam Butler
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/Readme.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# vuejs-rails <a href="http://badge.fury.io/rb/vuejs-rails"><img src="https://badge.fury.io/rb/vuejs-rails@2x.png" alt="Gem Version" height="18"></a>
|
2
|
+
|
3
|
+
### About
|
4
|
+
|
5
|
+
Rails 3.1+ asset-pipeline gem to provide vue.js
|
6
|
+
|
7
|
+
### Setup
|
8
|
+
|
9
|
+
Have in your Gemfile:
|
10
|
+
|
11
|
+
gem 'vuejs-rails'
|
12
|
+
|
13
|
+
And, have in your application.js manifest:
|
14
|
+
|
15
|
+
//= require vue
|
data/lib/vuejs-rails.rb
ADDED
@@ -0,0 +1,3378 @@
|
|
1
|
+
/*
|
2
|
+
VueJS v0.8.1
|
3
|
+
(c) 2014 Evan You
|
4
|
+
License: MIT
|
5
|
+
*/
|
6
|
+
;(function(){
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Require the given path.
|
10
|
+
*
|
11
|
+
* @param {String} path
|
12
|
+
* @return {Object} exports
|
13
|
+
* @api public
|
14
|
+
*/
|
15
|
+
|
16
|
+
function require(path, parent, orig) {
|
17
|
+
var resolved = require.resolve(path);
|
18
|
+
|
19
|
+
// lookup failed
|
20
|
+
if (null == resolved) {
|
21
|
+
orig = orig || path;
|
22
|
+
parent = parent || 'root';
|
23
|
+
var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
|
24
|
+
err.path = orig;
|
25
|
+
err.parent = parent;
|
26
|
+
err.require = true;
|
27
|
+
throw err;
|
28
|
+
}
|
29
|
+
|
30
|
+
var module = require.modules[resolved];
|
31
|
+
|
32
|
+
// perform real require()
|
33
|
+
// by invoking the module's
|
34
|
+
// registered function
|
35
|
+
if (!module._resolving && !module.exports) {
|
36
|
+
var mod = {};
|
37
|
+
mod.exports = {};
|
38
|
+
mod.client = mod.component = true;
|
39
|
+
module._resolving = true;
|
40
|
+
module.call(this, mod.exports, require.relative(resolved), mod);
|
41
|
+
delete module._resolving;
|
42
|
+
module.exports = mod.exports;
|
43
|
+
}
|
44
|
+
|
45
|
+
return module.exports;
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Registered modules.
|
50
|
+
*/
|
51
|
+
|
52
|
+
require.modules = {};
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Registered aliases.
|
56
|
+
*/
|
57
|
+
|
58
|
+
require.aliases = {};
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Resolve `path`.
|
62
|
+
*
|
63
|
+
* Lookup:
|
64
|
+
*
|
65
|
+
* - PATH/index.js
|
66
|
+
* - PATH.js
|
67
|
+
* - PATH
|
68
|
+
*
|
69
|
+
* @param {String} path
|
70
|
+
* @return {String} path or null
|
71
|
+
* @api private
|
72
|
+
*/
|
73
|
+
|
74
|
+
require.resolve = function(path) {
|
75
|
+
if (path.charAt(0) === '/') path = path.slice(1);
|
76
|
+
|
77
|
+
var paths = [
|
78
|
+
path,
|
79
|
+
path + '.js',
|
80
|
+
path + '.json',
|
81
|
+
path + '/index.js',
|
82
|
+
path + '/index.json'
|
83
|
+
];
|
84
|
+
|
85
|
+
for (var i = 0; i < paths.length; i++) {
|
86
|
+
var path = paths[i];
|
87
|
+
if (require.modules.hasOwnProperty(path)) return path;
|
88
|
+
if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
|
89
|
+
}
|
90
|
+
};
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Normalize `path` relative to the current path.
|
94
|
+
*
|
95
|
+
* @param {String} curr
|
96
|
+
* @param {String} path
|
97
|
+
* @return {String}
|
98
|
+
* @api private
|
99
|
+
*/
|
100
|
+
|
101
|
+
require.normalize = function(curr, path) {
|
102
|
+
var segs = [];
|
103
|
+
|
104
|
+
if ('.' != path.charAt(0)) return path;
|
105
|
+
|
106
|
+
curr = curr.split('/');
|
107
|
+
path = path.split('/');
|
108
|
+
|
109
|
+
for (var i = 0; i < path.length; ++i) {
|
110
|
+
if ('..' == path[i]) {
|
111
|
+
curr.pop();
|
112
|
+
} else if ('.' != path[i] && '' != path[i]) {
|
113
|
+
segs.push(path[i]);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
return curr.concat(segs).join('/');
|
118
|
+
};
|
119
|
+
|
120
|
+
/**
|
121
|
+
* Register module at `path` with callback `definition`.
|
122
|
+
*
|
123
|
+
* @param {String} path
|
124
|
+
* @param {Function} definition
|
125
|
+
* @api private
|
126
|
+
*/
|
127
|
+
|
128
|
+
require.register = function(path, definition) {
|
129
|
+
require.modules[path] = definition;
|
130
|
+
};
|
131
|
+
|
132
|
+
/**
|
133
|
+
* Alias a module definition.
|
134
|
+
*
|
135
|
+
* @param {String} from
|
136
|
+
* @param {String} to
|
137
|
+
* @api private
|
138
|
+
*/
|
139
|
+
|
140
|
+
require.alias = function(from, to) {
|
141
|
+
if (!require.modules.hasOwnProperty(from)) {
|
142
|
+
throw new Error('Failed to alias "' + from + '", it does not exist');
|
143
|
+
}
|
144
|
+
require.aliases[to] = from;
|
145
|
+
};
|
146
|
+
|
147
|
+
/**
|
148
|
+
* Return a require function relative to the `parent` path.
|
149
|
+
*
|
150
|
+
* @param {String} parent
|
151
|
+
* @return {Function}
|
152
|
+
* @api private
|
153
|
+
*/
|
154
|
+
|
155
|
+
require.relative = function(parent) {
|
156
|
+
var p = require.normalize(parent, '..');
|
157
|
+
|
158
|
+
/**
|
159
|
+
* lastIndexOf helper.
|
160
|
+
*/
|
161
|
+
|
162
|
+
function lastIndexOf(arr, obj) {
|
163
|
+
var i = arr.length;
|
164
|
+
while (i--) {
|
165
|
+
if (arr[i] === obj) return i;
|
166
|
+
}
|
167
|
+
return -1;
|
168
|
+
}
|
169
|
+
|
170
|
+
/**
|
171
|
+
* The relative require() itself.
|
172
|
+
*/
|
173
|
+
|
174
|
+
function localRequire(path) {
|
175
|
+
var resolved = localRequire.resolve(path);
|
176
|
+
return require(resolved, parent, path);
|
177
|
+
}
|
178
|
+
|
179
|
+
/**
|
180
|
+
* Resolve relative to the parent.
|
181
|
+
*/
|
182
|
+
|
183
|
+
localRequire.resolve = function(path) {
|
184
|
+
var c = path.charAt(0);
|
185
|
+
if ('/' == c) return path.slice(1);
|
186
|
+
if ('.' == c) return require.normalize(p, path);
|
187
|
+
|
188
|
+
// resolve deps by returning
|
189
|
+
// the dep in the nearest "deps"
|
190
|
+
// directory
|
191
|
+
var segs = parent.split('/');
|
192
|
+
var i = lastIndexOf(segs, 'deps') + 1;
|
193
|
+
if (!i) i = 0;
|
194
|
+
path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
|
195
|
+
return path;
|
196
|
+
};
|
197
|
+
|
198
|
+
/**
|
199
|
+
* Check if module is defined at `path`.
|
200
|
+
*/
|
201
|
+
|
202
|
+
localRequire.exists = function(path) {
|
203
|
+
return require.modules.hasOwnProperty(localRequire.resolve(path));
|
204
|
+
};
|
205
|
+
|
206
|
+
return localRequire;
|
207
|
+
};
|
208
|
+
require.register("component-emitter/index.js", function(exports, require, module){
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Expose `Emitter`.
|
212
|
+
*/
|
213
|
+
|
214
|
+
module.exports = Emitter;
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Initialize a new `Emitter`.
|
218
|
+
*
|
219
|
+
* @api public
|
220
|
+
*/
|
221
|
+
|
222
|
+
function Emitter(obj) {
|
223
|
+
if (obj) return mixin(obj);
|
224
|
+
};
|
225
|
+
|
226
|
+
/**
|
227
|
+
* Mixin the emitter properties.
|
228
|
+
*
|
229
|
+
* @param {Object} obj
|
230
|
+
* @return {Object}
|
231
|
+
* @api private
|
232
|
+
*/
|
233
|
+
|
234
|
+
function mixin(obj) {
|
235
|
+
for (var key in Emitter.prototype) {
|
236
|
+
obj[key] = Emitter.prototype[key];
|
237
|
+
}
|
238
|
+
return obj;
|
239
|
+
}
|
240
|
+
|
241
|
+
/**
|
242
|
+
* Listen on the given `event` with `fn`.
|
243
|
+
*
|
244
|
+
* @param {String} event
|
245
|
+
* @param {Function} fn
|
246
|
+
* @return {Emitter}
|
247
|
+
* @api public
|
248
|
+
*/
|
249
|
+
|
250
|
+
Emitter.prototype.on =
|
251
|
+
Emitter.prototype.addEventListener = function(event, fn){
|
252
|
+
this._callbacks = this._callbacks || {};
|
253
|
+
(this._callbacks[event] = this._callbacks[event] || [])
|
254
|
+
.push(fn);
|
255
|
+
return this;
|
256
|
+
};
|
257
|
+
|
258
|
+
/**
|
259
|
+
* Adds an `event` listener that will be invoked a single
|
260
|
+
* time then automatically removed.
|
261
|
+
*
|
262
|
+
* @param {String} event
|
263
|
+
* @param {Function} fn
|
264
|
+
* @return {Emitter}
|
265
|
+
* @api public
|
266
|
+
*/
|
267
|
+
|
268
|
+
Emitter.prototype.once = function(event, fn){
|
269
|
+
var self = this;
|
270
|
+
this._callbacks = this._callbacks || {};
|
271
|
+
|
272
|
+
function on() {
|
273
|
+
self.off(event, on);
|
274
|
+
fn.apply(this, arguments);
|
275
|
+
}
|
276
|
+
|
277
|
+
on.fn = fn;
|
278
|
+
this.on(event, on);
|
279
|
+
return this;
|
280
|
+
};
|
281
|
+
|
282
|
+
/**
|
283
|
+
* Remove the given callback for `event` or all
|
284
|
+
* registered callbacks.
|
285
|
+
*
|
286
|
+
* @param {String} event
|
287
|
+
* @param {Function} fn
|
288
|
+
* @return {Emitter}
|
289
|
+
* @api public
|
290
|
+
*/
|
291
|
+
|
292
|
+
Emitter.prototype.off =
|
293
|
+
Emitter.prototype.removeListener =
|
294
|
+
Emitter.prototype.removeAllListeners =
|
295
|
+
Emitter.prototype.removeEventListener = function(event, fn){
|
296
|
+
this._callbacks = this._callbacks || {};
|
297
|
+
|
298
|
+
// all
|
299
|
+
if (0 == arguments.length) {
|
300
|
+
this._callbacks = {};
|
301
|
+
return this;
|
302
|
+
}
|
303
|
+
|
304
|
+
// specific event
|
305
|
+
var callbacks = this._callbacks[event];
|
306
|
+
if (!callbacks) return this;
|
307
|
+
|
308
|
+
// remove all handlers
|
309
|
+
if (1 == arguments.length) {
|
310
|
+
delete this._callbacks[event];
|
311
|
+
return this;
|
312
|
+
}
|
313
|
+
|
314
|
+
// remove specific handler
|
315
|
+
var cb;
|
316
|
+
for (var i = 0; i < callbacks.length; i++) {
|
317
|
+
cb = callbacks[i];
|
318
|
+
if (cb === fn || cb.fn === fn) {
|
319
|
+
callbacks.splice(i, 1);
|
320
|
+
break;
|
321
|
+
}
|
322
|
+
}
|
323
|
+
return this;
|
324
|
+
};
|
325
|
+
|
326
|
+
/**
|
327
|
+
* Emit `event` with the given args.
|
328
|
+
*
|
329
|
+
* @param {String} event
|
330
|
+
* @param {Mixed} ...
|
331
|
+
* @return {Emitter}
|
332
|
+
*/
|
333
|
+
|
334
|
+
Emitter.prototype.emit = function(event){
|
335
|
+
this._callbacks = this._callbacks || {};
|
336
|
+
var args = [].slice.call(arguments, 1)
|
337
|
+
, callbacks = this._callbacks[event];
|
338
|
+
|
339
|
+
if (callbacks) {
|
340
|
+
callbacks = callbacks.slice(0);
|
341
|
+
for (var i = 0, len = callbacks.length; i < len; ++i) {
|
342
|
+
callbacks[i].apply(this, args);
|
343
|
+
}
|
344
|
+
}
|
345
|
+
|
346
|
+
return this;
|
347
|
+
};
|
348
|
+
|
349
|
+
/**
|
350
|
+
* Return array of callbacks for `event`.
|
351
|
+
*
|
352
|
+
* @param {String} event
|
353
|
+
* @return {Array}
|
354
|
+
* @api public
|
355
|
+
*/
|
356
|
+
|
357
|
+
Emitter.prototype.listeners = function(event){
|
358
|
+
this._callbacks = this._callbacks || {};
|
359
|
+
return this._callbacks[event] || [];
|
360
|
+
};
|
361
|
+
|
362
|
+
/**
|
363
|
+
* Check if this emitter has `event` handlers.
|
364
|
+
*
|
365
|
+
* @param {String} event
|
366
|
+
* @return {Boolean}
|
367
|
+
* @api public
|
368
|
+
*/
|
369
|
+
|
370
|
+
Emitter.prototype.hasListeners = function(event){
|
371
|
+
return !! this.listeners(event).length;
|
372
|
+
};
|
373
|
+
|
374
|
+
});
|
375
|
+
require.register("vue/src/main.js", function(exports, require, module){
|
376
|
+
var config = require('./config'),
|
377
|
+
ViewModel = require('./viewmodel'),
|
378
|
+
directives = require('./directives'),
|
379
|
+
filters = require('./filters'),
|
380
|
+
utils = require('./utils')
|
381
|
+
|
382
|
+
/**
|
383
|
+
* Set config options
|
384
|
+
*/
|
385
|
+
ViewModel.config = function (opts, val) {
|
386
|
+
if (typeof opts === 'string') {
|
387
|
+
if (val === undefined) {
|
388
|
+
return config[opts]
|
389
|
+
} else {
|
390
|
+
config[opts] = val
|
391
|
+
}
|
392
|
+
} else {
|
393
|
+
utils.extend(config, opts)
|
394
|
+
}
|
395
|
+
return this
|
396
|
+
}
|
397
|
+
|
398
|
+
/**
|
399
|
+
* Allows user to register/retrieve a directive definition
|
400
|
+
*/
|
401
|
+
ViewModel.directive = function (id, fn) {
|
402
|
+
if (!fn) return directives[id]
|
403
|
+
directives[id] = fn
|
404
|
+
return this
|
405
|
+
}
|
406
|
+
|
407
|
+
/**
|
408
|
+
* Allows user to register/retrieve a filter function
|
409
|
+
*/
|
410
|
+
ViewModel.filter = function (id, fn) {
|
411
|
+
if (!fn) return filters[id]
|
412
|
+
filters[id] = fn
|
413
|
+
return this
|
414
|
+
}
|
415
|
+
|
416
|
+
/**
|
417
|
+
* Allows user to register/retrieve a ViewModel constructor
|
418
|
+
*/
|
419
|
+
ViewModel.component = function (id, Ctor) {
|
420
|
+
if (!Ctor) return utils.components[id]
|
421
|
+
utils.components[id] = utils.toConstructor(Ctor)
|
422
|
+
return this
|
423
|
+
}
|
424
|
+
|
425
|
+
/**
|
426
|
+
* Allows user to register/retrieve a template partial
|
427
|
+
*/
|
428
|
+
ViewModel.partial = function (id, partial) {
|
429
|
+
if (!partial) return utils.partials[id]
|
430
|
+
utils.partials[id] = utils.toFragment(partial)
|
431
|
+
return this
|
432
|
+
}
|
433
|
+
|
434
|
+
/**
|
435
|
+
* Allows user to register/retrieve a transition definition object
|
436
|
+
*/
|
437
|
+
ViewModel.transition = function (id, transition) {
|
438
|
+
if (!transition) return utils.transitions[id]
|
439
|
+
utils.transitions[id] = transition
|
440
|
+
return this
|
441
|
+
}
|
442
|
+
|
443
|
+
ViewModel.extend = extend
|
444
|
+
ViewModel.nextTick = utils.nextTick
|
445
|
+
|
446
|
+
/**
|
447
|
+
* Expose the main ViewModel class
|
448
|
+
* and add extend method
|
449
|
+
*/
|
450
|
+
function extend (options) {
|
451
|
+
|
452
|
+
var ParentVM = this
|
453
|
+
|
454
|
+
// inherit options
|
455
|
+
options = inheritOptions(options, ParentVM.options, true)
|
456
|
+
utils.processOptions(options)
|
457
|
+
|
458
|
+
var ExtendedVM = function (opts, asParent) {
|
459
|
+
if (!asParent) {
|
460
|
+
opts = inheritOptions(opts, options, true)
|
461
|
+
}
|
462
|
+
ParentVM.call(this, opts, true)
|
463
|
+
}
|
464
|
+
|
465
|
+
// inherit prototype props
|
466
|
+
var proto = ExtendedVM.prototype = Object.create(ParentVM.prototype)
|
467
|
+
utils.defProtected(proto, 'constructor', ExtendedVM)
|
468
|
+
|
469
|
+
// copy prototype props
|
470
|
+
var methods = options.methods
|
471
|
+
if (methods) {
|
472
|
+
for (var key in methods) {
|
473
|
+
if (
|
474
|
+
!(key in ViewModel.prototype) &&
|
475
|
+
typeof methods[key] === 'function'
|
476
|
+
) {
|
477
|
+
proto[key] = methods[key]
|
478
|
+
}
|
479
|
+
}
|
480
|
+
}
|
481
|
+
|
482
|
+
// allow extended VM to be further extended
|
483
|
+
ExtendedVM.extend = extend
|
484
|
+
ExtendedVM.super = ParentVM
|
485
|
+
ExtendedVM.options = options
|
486
|
+
return ExtendedVM
|
487
|
+
}
|
488
|
+
|
489
|
+
/**
|
490
|
+
* Inherit options
|
491
|
+
*
|
492
|
+
* For options such as `data`, `vms`, `directives`, 'partials',
|
493
|
+
* they should be further extended. However extending should only
|
494
|
+
* be done at top level.
|
495
|
+
*
|
496
|
+
* `proto` is an exception because it's handled directly on the
|
497
|
+
* prototype.
|
498
|
+
*
|
499
|
+
* `el` is an exception because it's not allowed as an
|
500
|
+
* extension option, but only as an instance option.
|
501
|
+
*/
|
502
|
+
function inheritOptions (child, parent, topLevel) {
|
503
|
+
child = child || utils.hash()
|
504
|
+
if (!parent) return child
|
505
|
+
for (var key in parent) {
|
506
|
+
if (key === 'el' || key === 'methods') continue
|
507
|
+
var val = child[key],
|
508
|
+
parentVal = parent[key],
|
509
|
+
type = utils.typeOf(val)
|
510
|
+
if (topLevel && type === 'Function' && parentVal) {
|
511
|
+
// merge hook functions
|
512
|
+
child[key] = mergeHook(val, parentVal)
|
513
|
+
} else if (topLevel && type === 'Object') {
|
514
|
+
// merge toplevel object options
|
515
|
+
inheritOptions(val, parentVal)
|
516
|
+
} else if (val === undefined) {
|
517
|
+
// inherit if child doesn't override
|
518
|
+
child[key] = parentVal
|
519
|
+
}
|
520
|
+
}
|
521
|
+
return child
|
522
|
+
}
|
523
|
+
|
524
|
+
/**
|
525
|
+
* Merge hook functions
|
526
|
+
* so parent hooks also get called
|
527
|
+
*/
|
528
|
+
function mergeHook (fn, parentFn) {
|
529
|
+
return function (opts) {
|
530
|
+
parentFn.call(this, opts)
|
531
|
+
fn.call(this, opts)
|
532
|
+
}
|
533
|
+
}
|
534
|
+
|
535
|
+
module.exports = ViewModel
|
536
|
+
});
|
537
|
+
require.register("vue/src/emitter.js", function(exports, require, module){
|
538
|
+
// shiv to make this work for Component, Browserify and Node at the same time.
|
539
|
+
var Emitter,
|
540
|
+
componentEmitter = 'emitter'
|
541
|
+
|
542
|
+
try {
|
543
|
+
// Requiring without a string literal will make browserify
|
544
|
+
// unable to parse the dependency, thus preventing it from
|
545
|
+
// stopping the compilation after a failed lookup.
|
546
|
+
Emitter = require(componentEmitter)
|
547
|
+
} catch (e) {
|
548
|
+
Emitter = require('events').EventEmitter
|
549
|
+
Emitter.prototype.off = function () {
|
550
|
+
var method = arguments.length > 1
|
551
|
+
? this.removeListener
|
552
|
+
: this.removeAllListeners
|
553
|
+
return method.apply(this, arguments)
|
554
|
+
}
|
555
|
+
}
|
556
|
+
|
557
|
+
module.exports = Emitter
|
558
|
+
});
|
559
|
+
require.register("vue/src/config.js", function(exports, require, module){
|
560
|
+
var prefix = 'v',
|
561
|
+
specialAttributes = [
|
562
|
+
'pre',
|
563
|
+
'text',
|
564
|
+
'repeat',
|
565
|
+
'partial',
|
566
|
+
'with',
|
567
|
+
'component',
|
568
|
+
'component-id',
|
569
|
+
'transition'
|
570
|
+
],
|
571
|
+
config = module.exports = {
|
572
|
+
|
573
|
+
debug : false,
|
574
|
+
silent : false,
|
575
|
+
enterClass : 'v-enter',
|
576
|
+
leaveClass : 'v-leave',
|
577
|
+
attrs : {},
|
578
|
+
|
579
|
+
get prefix () {
|
580
|
+
return prefix
|
581
|
+
},
|
582
|
+
set prefix (val) {
|
583
|
+
prefix = val
|
584
|
+
updatePrefix()
|
585
|
+
}
|
586
|
+
|
587
|
+
}
|
588
|
+
|
589
|
+
function updatePrefix () {
|
590
|
+
specialAttributes.forEach(function (attr) {
|
591
|
+
config.attrs[attr] = prefix + '-' + attr
|
592
|
+
})
|
593
|
+
}
|
594
|
+
|
595
|
+
updatePrefix()
|
596
|
+
});
|
597
|
+
require.register("vue/src/utils.js", function(exports, require, module){
|
598
|
+
var config = require('./config'),
|
599
|
+
attrs = config.attrs,
|
600
|
+
toString = Object.prototype.toString,
|
601
|
+
join = Array.prototype.join,
|
602
|
+
console = window.console,
|
603
|
+
ViewModel // late def
|
604
|
+
|
605
|
+
var defer =
|
606
|
+
window.requestAnimationFrame ||
|
607
|
+
window.webkitRequestAnimationFrame ||
|
608
|
+
window.setTimeout
|
609
|
+
|
610
|
+
/**
|
611
|
+
* Create a prototype-less object
|
612
|
+
* which is a better hash/map
|
613
|
+
*/
|
614
|
+
function makeHash () {
|
615
|
+
return Object.create(null)
|
616
|
+
}
|
617
|
+
|
618
|
+
var utils = module.exports = {
|
619
|
+
|
620
|
+
hash: makeHash,
|
621
|
+
|
622
|
+
// global storage for user-registered
|
623
|
+
// vms, partials and transitions
|
624
|
+
components : makeHash(),
|
625
|
+
partials : makeHash(),
|
626
|
+
transitions : makeHash(),
|
627
|
+
|
628
|
+
/**
|
629
|
+
* get an attribute and remove it.
|
630
|
+
*/
|
631
|
+
attr: function (el, type, noRemove) {
|
632
|
+
var attr = attrs[type],
|
633
|
+
val = el.getAttribute(attr)
|
634
|
+
if (!noRemove && val !== null) el.removeAttribute(attr)
|
635
|
+
return val
|
636
|
+
},
|
637
|
+
|
638
|
+
/**
|
639
|
+
* Define an ienumerable property
|
640
|
+
* This avoids it being included in JSON.stringify
|
641
|
+
* or for...in loops.
|
642
|
+
*/
|
643
|
+
defProtected: function (obj, key, val, enumerable, configurable) {
|
644
|
+
if (obj.hasOwnProperty(key)) return
|
645
|
+
Object.defineProperty(obj, key, {
|
646
|
+
value : val,
|
647
|
+
enumerable : !!enumerable,
|
648
|
+
configurable : !!configurable
|
649
|
+
})
|
650
|
+
},
|
651
|
+
|
652
|
+
/**
|
653
|
+
* Accurate type check
|
654
|
+
* internal use only, so no need to check for NaN
|
655
|
+
*/
|
656
|
+
typeOf: function (obj) {
|
657
|
+
return toString.call(obj).slice(8, -1)
|
658
|
+
},
|
659
|
+
|
660
|
+
/**
|
661
|
+
* Most simple bind
|
662
|
+
* enough for the usecase and fast than native bind()
|
663
|
+
*/
|
664
|
+
bind: function (fn, ctx) {
|
665
|
+
return function (arg) {
|
666
|
+
return fn.call(ctx, arg)
|
667
|
+
}
|
668
|
+
},
|
669
|
+
|
670
|
+
/**
|
671
|
+
* Make sure only strings and numbers are output to html
|
672
|
+
* output empty string is value is not string or number
|
673
|
+
*/
|
674
|
+
toText: function (value) {
|
675
|
+
/* jshint eqeqeq: false */
|
676
|
+
return (typeof value === 'string' ||
|
677
|
+
typeof value === 'boolean' ||
|
678
|
+
(typeof value === 'number' && value == value)) // deal with NaN
|
679
|
+
? value
|
680
|
+
: ''
|
681
|
+
},
|
682
|
+
|
683
|
+
/**
|
684
|
+
* simple extend
|
685
|
+
*/
|
686
|
+
extend: function (obj, ext, protective) {
|
687
|
+
for (var key in ext) {
|
688
|
+
if (protective && obj[key]) continue
|
689
|
+
obj[key] = ext[key]
|
690
|
+
}
|
691
|
+
},
|
692
|
+
|
693
|
+
/**
|
694
|
+
* filter an array with duplicates into uniques
|
695
|
+
*/
|
696
|
+
unique: function (arr) {
|
697
|
+
var hash = utils.hash(),
|
698
|
+
i = arr.length,
|
699
|
+
key, res = []
|
700
|
+
while (i--) {
|
701
|
+
key = arr[i]
|
702
|
+
if (hash[key]) continue
|
703
|
+
hash[key] = 1
|
704
|
+
res.push(key)
|
705
|
+
}
|
706
|
+
return res
|
707
|
+
},
|
708
|
+
|
709
|
+
/**
|
710
|
+
* Convert a string template to a dom fragment
|
711
|
+
*/
|
712
|
+
toFragment: function (template) {
|
713
|
+
if (typeof template !== 'string') {
|
714
|
+
return template
|
715
|
+
}
|
716
|
+
if (template.charAt(0) === '#') {
|
717
|
+
var templateNode = document.getElementById(template.slice(1))
|
718
|
+
if (!templateNode) return
|
719
|
+
template = templateNode.innerHTML
|
720
|
+
}
|
721
|
+
var node = document.createElement('div'),
|
722
|
+
frag = document.createDocumentFragment(),
|
723
|
+
child
|
724
|
+
node.innerHTML = template.trim()
|
725
|
+
/* jshint boss: true */
|
726
|
+
while (child = node.firstChild) {
|
727
|
+
frag.appendChild(child)
|
728
|
+
}
|
729
|
+
return frag
|
730
|
+
},
|
731
|
+
|
732
|
+
/**
|
733
|
+
* Convert the object to a ViewModel constructor
|
734
|
+
* if it is not already one
|
735
|
+
*/
|
736
|
+
toConstructor: function (obj) {
|
737
|
+
ViewModel = ViewModel || require('./viewmodel')
|
738
|
+
return utils.typeOf(obj) === 'Object'
|
739
|
+
? ViewModel.extend(obj)
|
740
|
+
: typeof obj === 'function'
|
741
|
+
? obj
|
742
|
+
: null
|
743
|
+
},
|
744
|
+
|
745
|
+
/**
|
746
|
+
* convert certain option values to the desired format.
|
747
|
+
*/
|
748
|
+
processOptions: function (options) {
|
749
|
+
var components = options.components,
|
750
|
+
partials = options.partials,
|
751
|
+
template = options.template,
|
752
|
+
key
|
753
|
+
if (components) {
|
754
|
+
for (key in components) {
|
755
|
+
components[key] = utils.toConstructor(components[key])
|
756
|
+
}
|
757
|
+
}
|
758
|
+
if (partials) {
|
759
|
+
for (key in partials) {
|
760
|
+
partials[key] = utils.toFragment(partials[key])
|
761
|
+
}
|
762
|
+
}
|
763
|
+
if (template) {
|
764
|
+
options.template = utils.toFragment(template)
|
765
|
+
}
|
766
|
+
},
|
767
|
+
|
768
|
+
/**
|
769
|
+
* log for debugging
|
770
|
+
*/
|
771
|
+
log: function () {
|
772
|
+
if (config.debug && console) {
|
773
|
+
console.log(join.call(arguments, ' '))
|
774
|
+
}
|
775
|
+
},
|
776
|
+
|
777
|
+
/**
|
778
|
+
* warnings, traces by default
|
779
|
+
* can be suppressed by `silent` option.
|
780
|
+
*/
|
781
|
+
warn: function() {
|
782
|
+
if (!config.silent && console) {
|
783
|
+
console.warn(join.call(arguments, ' '))
|
784
|
+
if (config.debug) {
|
785
|
+
console.trace()
|
786
|
+
}
|
787
|
+
}
|
788
|
+
},
|
789
|
+
|
790
|
+
/**
|
791
|
+
* used to defer batch updates
|
792
|
+
*/
|
793
|
+
nextTick: function (cb) {
|
794
|
+
defer(cb, 0)
|
795
|
+
}
|
796
|
+
}
|
797
|
+
});
|
798
|
+
require.register("vue/src/compiler.js", function(exports, require, module){
|
799
|
+
var Emitter = require('./emitter'),
|
800
|
+
Observer = require('./observer'),
|
801
|
+
config = require('./config'),
|
802
|
+
utils = require('./utils'),
|
803
|
+
Binding = require('./binding'),
|
804
|
+
Directive = require('./directive'),
|
805
|
+
TextParser = require('./text-parser'),
|
806
|
+
DepsParser = require('./deps-parser'),
|
807
|
+
ExpParser = require('./exp-parser'),
|
808
|
+
|
809
|
+
// cache methods
|
810
|
+
slice = Array.prototype.slice,
|
811
|
+
log = utils.log,
|
812
|
+
makeHash = utils.hash,
|
813
|
+
extend = utils.extend,
|
814
|
+
def = utils.defProtected,
|
815
|
+
hasOwn = Object.prototype.hasOwnProperty
|
816
|
+
|
817
|
+
/**
|
818
|
+
* The DOM compiler
|
819
|
+
* scans a DOM node and compile bindings for a ViewModel
|
820
|
+
*/
|
821
|
+
function Compiler (vm, options) {
|
822
|
+
|
823
|
+
var compiler = this
|
824
|
+
// indicate that we are intiating this instance
|
825
|
+
// so we should not run any transitions
|
826
|
+
compiler.init = true
|
827
|
+
|
828
|
+
// process and extend options
|
829
|
+
options = compiler.options = options || makeHash()
|
830
|
+
utils.processOptions(options)
|
831
|
+
|
832
|
+
// copy data, methods & compiler options
|
833
|
+
var data = compiler.data = options.data || {}
|
834
|
+
extend(vm, data, true)
|
835
|
+
extend(vm, options.methods, true)
|
836
|
+
extend(compiler, options.compilerOptions)
|
837
|
+
|
838
|
+
// initialize element
|
839
|
+
var el = compiler.setupElement(options)
|
840
|
+
log('\nnew VM instance:', el.tagName, '\n')
|
841
|
+
|
842
|
+
// set compiler properties
|
843
|
+
compiler.vm = vm
|
844
|
+
compiler.bindings = makeHash()
|
845
|
+
compiler.dirs = []
|
846
|
+
compiler.exps = []
|
847
|
+
compiler.computed = []
|
848
|
+
compiler.childCompilers = []
|
849
|
+
compiler.emitter = new Emitter()
|
850
|
+
|
851
|
+
// set inenumerable VM properties
|
852
|
+
def(vm, '$', makeHash())
|
853
|
+
def(vm, '$el', el)
|
854
|
+
def(vm, '$compiler', compiler)
|
855
|
+
def(vm, '$root', getRoot(compiler).vm)
|
856
|
+
|
857
|
+
// set parent VM
|
858
|
+
// and register child id on parent
|
859
|
+
var parent = compiler.parentCompiler,
|
860
|
+
childId = utils.attr(el, 'component-id')
|
861
|
+
if (parent) {
|
862
|
+
parent.childCompilers.push(compiler)
|
863
|
+
def(vm, '$parent', parent.vm)
|
864
|
+
if (childId) {
|
865
|
+
compiler.childId = childId
|
866
|
+
parent.vm.$[childId] = vm
|
867
|
+
}
|
868
|
+
}
|
869
|
+
|
870
|
+
// setup observer
|
871
|
+
compiler.setupObserver()
|
872
|
+
|
873
|
+
// create bindings for computed properties
|
874
|
+
var computed = options.computed
|
875
|
+
if (computed) {
|
876
|
+
for (var key in computed) {
|
877
|
+
compiler.createBinding(key)
|
878
|
+
}
|
879
|
+
}
|
880
|
+
|
881
|
+
// beforeCompile hook
|
882
|
+
compiler.execHook('beforeCompile', 'created')
|
883
|
+
|
884
|
+
// the user might have set some props on the vm
|
885
|
+
// so copy it back to the data...
|
886
|
+
extend(data, vm)
|
887
|
+
|
888
|
+
// observe the data
|
889
|
+
Observer.observe(data, '', compiler.observer)
|
890
|
+
|
891
|
+
// for repeated items, create an index binding
|
892
|
+
// which should be inenumerable but configurable
|
893
|
+
if (compiler.repeat) {
|
894
|
+
//data.$index = compiler.repeatIndex
|
895
|
+
def(data, '$index', compiler.repeatIndex, false, true)
|
896
|
+
compiler.createBinding('$index')
|
897
|
+
}
|
898
|
+
|
899
|
+
// allow the $data object to be swapped
|
900
|
+
Object.defineProperty(vm, '$data', {
|
901
|
+
enumerable: false,
|
902
|
+
get: function () {
|
903
|
+
return compiler.data
|
904
|
+
},
|
905
|
+
set: function (newData) {
|
906
|
+
var oldData = compiler.data
|
907
|
+
Observer.unobserve(oldData, '', compiler.observer)
|
908
|
+
compiler.data = newData
|
909
|
+
Observer.copyPaths(newData, oldData)
|
910
|
+
Observer.observe(newData, '', compiler.observer)
|
911
|
+
}
|
912
|
+
})
|
913
|
+
|
914
|
+
// now parse the DOM, during which we will create necessary bindings
|
915
|
+
// and bind the parsed directives
|
916
|
+
compiler.compile(el, true)
|
917
|
+
|
918
|
+
// extract dependencies for computed properties
|
919
|
+
if (compiler.computed.length) {
|
920
|
+
DepsParser.parse(compiler.computed)
|
921
|
+
}
|
922
|
+
|
923
|
+
// done!
|
924
|
+
compiler.init = false
|
925
|
+
|
926
|
+
// post compile / ready hook
|
927
|
+
compiler.execHook('afterCompile', 'ready')
|
928
|
+
}
|
929
|
+
|
930
|
+
var CompilerProto = Compiler.prototype
|
931
|
+
|
932
|
+
/**
|
933
|
+
* Initialize the VM/Compiler's element.
|
934
|
+
* Fill it in with the template if necessary.
|
935
|
+
*/
|
936
|
+
CompilerProto.setupElement = function (options) {
|
937
|
+
// create the node first
|
938
|
+
var el = this.el = typeof options.el === 'string'
|
939
|
+
? document.querySelector(options.el)
|
940
|
+
: options.el || document.createElement(options.tagName || 'div')
|
941
|
+
|
942
|
+
var template = options.template
|
943
|
+
if (template) {
|
944
|
+
// replace option: use the first node in
|
945
|
+
// the template directly
|
946
|
+
if (options.replace && template.childNodes.length === 1) {
|
947
|
+
var replacer = template.childNodes[0].cloneNode(true)
|
948
|
+
if (el.parentNode) {
|
949
|
+
el.parentNode.insertBefore(replacer, el)
|
950
|
+
el.parentNode.removeChild(el)
|
951
|
+
}
|
952
|
+
el = replacer
|
953
|
+
} else {
|
954
|
+
el.innerHTML = ''
|
955
|
+
el.appendChild(template.cloneNode(true))
|
956
|
+
}
|
957
|
+
}
|
958
|
+
|
959
|
+
// apply element options
|
960
|
+
if (options.id) el.id = options.id
|
961
|
+
if (options.className) el.className = options.className
|
962
|
+
var attrs = options.attributes
|
963
|
+
if (attrs) {
|
964
|
+
for (var attr in attrs) {
|
965
|
+
el.setAttribute(attr, attrs[attr])
|
966
|
+
}
|
967
|
+
}
|
968
|
+
|
969
|
+
return el
|
970
|
+
}
|
971
|
+
|
972
|
+
/**
|
973
|
+
* Setup observer.
|
974
|
+
* The observer listens for get/set/mutate events on all VM
|
975
|
+
* values/objects and trigger corresponding binding updates.
|
976
|
+
*/
|
977
|
+
CompilerProto.setupObserver = function () {
|
978
|
+
|
979
|
+
var compiler = this,
|
980
|
+
bindings = compiler.bindings,
|
981
|
+
observer = compiler.observer = new Emitter()
|
982
|
+
|
983
|
+
// a hash to hold event proxies for each root level key
|
984
|
+
// so they can be referenced and removed later
|
985
|
+
observer.proxies = makeHash()
|
986
|
+
|
987
|
+
// add own listeners which trigger binding updates
|
988
|
+
observer
|
989
|
+
.on('get', function (key) {
|
990
|
+
check(key)
|
991
|
+
DepsParser.catcher.emit('get', bindings[key])
|
992
|
+
})
|
993
|
+
.on('set', function (key, val) {
|
994
|
+
observer.emit('change:' + key, val)
|
995
|
+
check(key)
|
996
|
+
bindings[key].update(val)
|
997
|
+
})
|
998
|
+
.on('mutate', function (key, val, mutation) {
|
999
|
+
observer.emit('change:' + key, val, mutation)
|
1000
|
+
check(key)
|
1001
|
+
bindings[key].pub()
|
1002
|
+
})
|
1003
|
+
|
1004
|
+
function check (key) {
|
1005
|
+
if (!bindings[key]) {
|
1006
|
+
compiler.createBinding(key)
|
1007
|
+
}
|
1008
|
+
}
|
1009
|
+
}
|
1010
|
+
|
1011
|
+
/**
|
1012
|
+
* Compile a DOM node (recursive)
|
1013
|
+
*/
|
1014
|
+
CompilerProto.compile = function (node, root) {
|
1015
|
+
|
1016
|
+
var compiler = this,
|
1017
|
+
nodeType = node.nodeType,
|
1018
|
+
tagName = node.tagName
|
1019
|
+
|
1020
|
+
if (nodeType === 1 && tagName !== 'SCRIPT') { // a normal node
|
1021
|
+
|
1022
|
+
// skip anything with v-pre
|
1023
|
+
if (utils.attr(node, 'pre') !== null) return
|
1024
|
+
|
1025
|
+
// special attributes to check
|
1026
|
+
var repeatExp,
|
1027
|
+
withKey,
|
1028
|
+
partialId,
|
1029
|
+
directive,
|
1030
|
+
componentId = utils.attr(node, 'component') || tagName.toLowerCase(),
|
1031
|
+
componentCtor = compiler.getOption('components', componentId)
|
1032
|
+
|
1033
|
+
// It is important that we access these attributes
|
1034
|
+
// procedurally because the order matters.
|
1035
|
+
//
|
1036
|
+
// `utils.attr` removes the attribute once it gets the
|
1037
|
+
// value, so we should not access them all at once.
|
1038
|
+
|
1039
|
+
// v-repeat has the highest priority
|
1040
|
+
// and we need to preserve all other attributes for it.
|
1041
|
+
/* jshint boss: true */
|
1042
|
+
if (repeatExp = utils.attr(node, 'repeat')) {
|
1043
|
+
|
1044
|
+
// repeat block cannot have v-id at the same time.
|
1045
|
+
directive = Directive.parse('repeat', repeatExp, compiler, node)
|
1046
|
+
if (directive) {
|
1047
|
+
directive.Ctor = componentCtor
|
1048
|
+
compiler.bindDirective(directive)
|
1049
|
+
}
|
1050
|
+
|
1051
|
+
// v-with has 2nd highest priority
|
1052
|
+
} else if (!root && ((withKey = utils.attr(node, 'with')) || componentCtor)) {
|
1053
|
+
|
1054
|
+
directive = Directive.parse('with', withKey || '', compiler, node)
|
1055
|
+
if (directive) {
|
1056
|
+
directive.Ctor = componentCtor
|
1057
|
+
compiler.bindDirective(directive)
|
1058
|
+
}
|
1059
|
+
|
1060
|
+
} else {
|
1061
|
+
|
1062
|
+
// check transition property
|
1063
|
+
node.vue_trans = utils.attr(node, 'transition')
|
1064
|
+
|
1065
|
+
// replace innerHTML with partial
|
1066
|
+
partialId = utils.attr(node, 'partial')
|
1067
|
+
if (partialId) {
|
1068
|
+
var partial = compiler.getOption('partials', partialId)
|
1069
|
+
if (partial) {
|
1070
|
+
node.innerHTML = ''
|
1071
|
+
node.appendChild(partial.cloneNode(true))
|
1072
|
+
}
|
1073
|
+
}
|
1074
|
+
|
1075
|
+
// finally, only normal directives left!
|
1076
|
+
compiler.compileNode(node)
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
} else if (nodeType === 3) { // text node
|
1080
|
+
|
1081
|
+
compiler.compileTextNode(node)
|
1082
|
+
|
1083
|
+
}
|
1084
|
+
|
1085
|
+
}
|
1086
|
+
|
1087
|
+
/**
|
1088
|
+
* Compile a normal node
|
1089
|
+
*/
|
1090
|
+
CompilerProto.compileNode = function (node) {
|
1091
|
+
var i, j,
|
1092
|
+
attrs = node.attributes,
|
1093
|
+
prefix = config.prefix + '-'
|
1094
|
+
// parse if has attributes
|
1095
|
+
if (attrs && attrs.length) {
|
1096
|
+
var attr, isDirective, exps, exp, directive
|
1097
|
+
// loop through all attributes
|
1098
|
+
i = attrs.length
|
1099
|
+
while (i--) {
|
1100
|
+
attr = attrs[i]
|
1101
|
+
isDirective = false
|
1102
|
+
|
1103
|
+
if (attr.name.indexOf(prefix) === 0) {
|
1104
|
+
// a directive - split, parse and bind it.
|
1105
|
+
isDirective = true
|
1106
|
+
exps = Directive.split(attr.value)
|
1107
|
+
// loop through clauses (separated by ",")
|
1108
|
+
// inside each attribute
|
1109
|
+
j = exps.length
|
1110
|
+
while (j--) {
|
1111
|
+
exp = exps[j]
|
1112
|
+
directive = Directive.parse(attr.name.slice(prefix.length), exp, this, node)
|
1113
|
+
if (directive) {
|
1114
|
+
this.bindDirective(directive)
|
1115
|
+
}
|
1116
|
+
}
|
1117
|
+
} else {
|
1118
|
+
// non directive attribute, check interpolation tags
|
1119
|
+
exp = TextParser.parseAttr(attr.value)
|
1120
|
+
if (exp) {
|
1121
|
+
directive = Directive.parse('attr', attr.name + ':' + exp, this, node)
|
1122
|
+
if (directive) {
|
1123
|
+
this.bindDirective(directive)
|
1124
|
+
}
|
1125
|
+
}
|
1126
|
+
}
|
1127
|
+
|
1128
|
+
if (isDirective) node.removeAttribute(attr.name)
|
1129
|
+
}
|
1130
|
+
}
|
1131
|
+
// recursively compile childNodes
|
1132
|
+
if (node.childNodes.length) {
|
1133
|
+
var nodes = slice.call(node.childNodes)
|
1134
|
+
for (i = 0, j = nodes.length; i < j; i++) {
|
1135
|
+
this.compile(nodes[i])
|
1136
|
+
}
|
1137
|
+
}
|
1138
|
+
}
|
1139
|
+
|
1140
|
+
/**
|
1141
|
+
* Compile a text node
|
1142
|
+
*/
|
1143
|
+
CompilerProto.compileTextNode = function (node) {
|
1144
|
+
|
1145
|
+
var tokens = TextParser.parse(node.nodeValue)
|
1146
|
+
if (!tokens) return
|
1147
|
+
var el, token, directive, partial, partialId, partialNodes
|
1148
|
+
|
1149
|
+
for (var i = 0, l = tokens.length; i < l; i++) {
|
1150
|
+
token = tokens[i]
|
1151
|
+
if (token.key) { // a binding
|
1152
|
+
if (token.key.charAt(0) === '>') { // a partial
|
1153
|
+
partialId = token.key.slice(1).trim()
|
1154
|
+
partial = this.getOption('partials', partialId)
|
1155
|
+
if (partial) {
|
1156
|
+
el = partial.cloneNode(true)
|
1157
|
+
// save an Array reference of the partial's nodes
|
1158
|
+
// so we can compile them AFTER appending the fragment
|
1159
|
+
partialNodes = slice.call(el.childNodes)
|
1160
|
+
}
|
1161
|
+
} else { // a real binding
|
1162
|
+
el = document.createTextNode('')
|
1163
|
+
directive = Directive.parse('text', token.key, this, el)
|
1164
|
+
if (directive) {
|
1165
|
+
this.bindDirective(directive)
|
1166
|
+
}
|
1167
|
+
}
|
1168
|
+
} else { // a plain string
|
1169
|
+
el = document.createTextNode(token)
|
1170
|
+
}
|
1171
|
+
|
1172
|
+
// insert node
|
1173
|
+
node.parentNode.insertBefore(el, node)
|
1174
|
+
|
1175
|
+
// compile partial after appending, because its children's parentNode
|
1176
|
+
// will change from the fragment to the correct parentNode.
|
1177
|
+
// This could affect directives that need access to its element's parentNode.
|
1178
|
+
if (partialNodes) {
|
1179
|
+
for (var j = 0, k = partialNodes.length; j < k; j++) {
|
1180
|
+
this.compile(partialNodes[j])
|
1181
|
+
}
|
1182
|
+
partialNodes = null
|
1183
|
+
}
|
1184
|
+
|
1185
|
+
}
|
1186
|
+
node.parentNode.removeChild(node)
|
1187
|
+
}
|
1188
|
+
|
1189
|
+
/**
|
1190
|
+
* Add a directive instance to the correct binding & viewmodel
|
1191
|
+
*/
|
1192
|
+
CompilerProto.bindDirective = function (directive) {
|
1193
|
+
|
1194
|
+
// keep track of it so we can unbind() later
|
1195
|
+
this.dirs.push(directive)
|
1196
|
+
|
1197
|
+
// for a simple directive, simply call its bind() or _update()
|
1198
|
+
// and we're done.
|
1199
|
+
if (directive.isEmpty) {
|
1200
|
+
if (directive.bind) directive.bind()
|
1201
|
+
return
|
1202
|
+
}
|
1203
|
+
|
1204
|
+
// otherwise, we got more work to do...
|
1205
|
+
var binding,
|
1206
|
+
compiler = this,
|
1207
|
+
key = directive.key
|
1208
|
+
|
1209
|
+
if (directive.isExp) {
|
1210
|
+
// expression bindings are always created on current compiler
|
1211
|
+
binding = compiler.createBinding(key, true, directive.isFn)
|
1212
|
+
} else {
|
1213
|
+
// recursively locate which compiler owns the binding
|
1214
|
+
while (compiler) {
|
1215
|
+
if (compiler.hasKey(key)) {
|
1216
|
+
break
|
1217
|
+
} else {
|
1218
|
+
compiler = compiler.parentCompiler
|
1219
|
+
}
|
1220
|
+
}
|
1221
|
+
compiler = compiler || this
|
1222
|
+
binding = compiler.bindings[key] || compiler.createBinding(key)
|
1223
|
+
}
|
1224
|
+
|
1225
|
+
binding.instances.push(directive)
|
1226
|
+
directive.binding = binding
|
1227
|
+
|
1228
|
+
// invoke bind hook if exists
|
1229
|
+
if (directive.bind) {
|
1230
|
+
directive.bind()
|
1231
|
+
}
|
1232
|
+
|
1233
|
+
// set initial value
|
1234
|
+
directive.update(binding.val(), true)
|
1235
|
+
}
|
1236
|
+
|
1237
|
+
/**
|
1238
|
+
* Create binding and attach getter/setter for a key to the viewmodel object
|
1239
|
+
*/
|
1240
|
+
CompilerProto.createBinding = function (key, isExp, isFn) {
|
1241
|
+
|
1242
|
+
log(' created binding: ' + key)
|
1243
|
+
|
1244
|
+
var compiler = this,
|
1245
|
+
bindings = compiler.bindings,
|
1246
|
+
computed = compiler.options.computed,
|
1247
|
+
binding = new Binding(compiler, key, isExp, isFn)
|
1248
|
+
|
1249
|
+
if (isExp) {
|
1250
|
+
// expression bindings are anonymous
|
1251
|
+
compiler.defineExp(key, binding)
|
1252
|
+
} else {
|
1253
|
+
bindings[key] = binding
|
1254
|
+
if (binding.root) {
|
1255
|
+
// this is a root level binding. we need to define getter/setters for it.
|
1256
|
+
if (computed && computed[key]) {
|
1257
|
+
// computed property
|
1258
|
+
compiler.defineComputed(key, binding, computed[key])
|
1259
|
+
} else {
|
1260
|
+
// normal property
|
1261
|
+
compiler.defineProp(key, binding)
|
1262
|
+
}
|
1263
|
+
} else {
|
1264
|
+
// ensure path in data so it can be observed
|
1265
|
+
Observer.ensurePath(compiler.data, key)
|
1266
|
+
var parentKey = key.slice(0, key.lastIndexOf('.'))
|
1267
|
+
if (!bindings[parentKey]) {
|
1268
|
+
// this is a nested value binding, but the binding for its parent
|
1269
|
+
// has not been created yet. We better create that one too.
|
1270
|
+
compiler.createBinding(parentKey)
|
1271
|
+
}
|
1272
|
+
}
|
1273
|
+
}
|
1274
|
+
return binding
|
1275
|
+
}
|
1276
|
+
|
1277
|
+
/**
|
1278
|
+
* Define the getter/setter for a root-level property on the VM
|
1279
|
+
* and observe the initial value
|
1280
|
+
*/
|
1281
|
+
CompilerProto.defineProp = function (key, binding) {
|
1282
|
+
|
1283
|
+
var compiler = this,
|
1284
|
+
data = compiler.data,
|
1285
|
+
ob = data.__observer__
|
1286
|
+
|
1287
|
+
// make sure the key is present in data
|
1288
|
+
// so it can be observed
|
1289
|
+
if (!(key in data)) {
|
1290
|
+
data[key] = undefined
|
1291
|
+
}
|
1292
|
+
|
1293
|
+
// if the data object is already observed, but the key
|
1294
|
+
// is not observed, we need to add it to the observed keys.
|
1295
|
+
if (ob && !(key in ob.values)) {
|
1296
|
+
Observer.convert(data, key)
|
1297
|
+
}
|
1298
|
+
|
1299
|
+
binding.value = data[key]
|
1300
|
+
|
1301
|
+
Object.defineProperty(compiler.vm, key, {
|
1302
|
+
get: function () {
|
1303
|
+
return compiler.data[key]
|
1304
|
+
},
|
1305
|
+
set: function (val) {
|
1306
|
+
compiler.data[key] = val
|
1307
|
+
}
|
1308
|
+
})
|
1309
|
+
}
|
1310
|
+
|
1311
|
+
/**
|
1312
|
+
* Define an expression binding, which is essentially
|
1313
|
+
* an anonymous computed property
|
1314
|
+
*/
|
1315
|
+
CompilerProto.defineExp = function (key, binding) {
|
1316
|
+
var getter = ExpParser.parse(key, this)
|
1317
|
+
if (getter) {
|
1318
|
+
this.markComputed(binding, getter)
|
1319
|
+
this.exps.push(binding)
|
1320
|
+
}
|
1321
|
+
}
|
1322
|
+
|
1323
|
+
/**
|
1324
|
+
* Define a computed property on the VM
|
1325
|
+
*/
|
1326
|
+
CompilerProto.defineComputed = function (key, binding, value) {
|
1327
|
+
this.markComputed(binding, value)
|
1328
|
+
var def = {
|
1329
|
+
get: binding.value.$get,
|
1330
|
+
set: binding.value.$set
|
1331
|
+
}
|
1332
|
+
Object.defineProperty(this.vm, key, def)
|
1333
|
+
}
|
1334
|
+
|
1335
|
+
/**
|
1336
|
+
* Process a computed property binding
|
1337
|
+
* so its getter/setter are bound to proper context
|
1338
|
+
*/
|
1339
|
+
CompilerProto.markComputed = function (binding, value) {
|
1340
|
+
binding.isComputed = true
|
1341
|
+
// bind the accessors to the vm
|
1342
|
+
if (binding.isFn) {
|
1343
|
+
binding.value = value
|
1344
|
+
} else {
|
1345
|
+
if (typeof value === 'function') {
|
1346
|
+
value = { $get: value }
|
1347
|
+
}
|
1348
|
+
binding.value = {
|
1349
|
+
$get: utils.bind(value.$get, this.vm),
|
1350
|
+
$set: value.$set
|
1351
|
+
? utils.bind(value.$set, this.vm)
|
1352
|
+
: undefined
|
1353
|
+
}
|
1354
|
+
}
|
1355
|
+
// keep track for dep parsing later
|
1356
|
+
this.computed.push(binding)
|
1357
|
+
}
|
1358
|
+
|
1359
|
+
/**
|
1360
|
+
* Retrive an option from the compiler
|
1361
|
+
*/
|
1362
|
+
CompilerProto.getOption = function (type, id) {
|
1363
|
+
var opts = this.options,
|
1364
|
+
parent = this.parentCompiler
|
1365
|
+
return (opts[type] && opts[type][id]) || (
|
1366
|
+
parent
|
1367
|
+
? parent.getOption(type, id)
|
1368
|
+
: utils[type] && utils[type][id]
|
1369
|
+
)
|
1370
|
+
}
|
1371
|
+
|
1372
|
+
/**
|
1373
|
+
* Execute a user hook
|
1374
|
+
*/
|
1375
|
+
CompilerProto.execHook = function (id, alt) {
|
1376
|
+
var opts = this.options,
|
1377
|
+
hook = opts[id] || opts[alt]
|
1378
|
+
if (hook) {
|
1379
|
+
hook.call(this.vm, opts)
|
1380
|
+
}
|
1381
|
+
}
|
1382
|
+
|
1383
|
+
/**
|
1384
|
+
* Check if a compiler's data contains a keypath
|
1385
|
+
*/
|
1386
|
+
CompilerProto.hasKey = function (key) {
|
1387
|
+
var baseKey = key.split('.')[0]
|
1388
|
+
return hasOwn.call(this.data, baseKey) ||
|
1389
|
+
hasOwn.call(this.vm, baseKey)
|
1390
|
+
}
|
1391
|
+
|
1392
|
+
/**
|
1393
|
+
* Unbind and remove element
|
1394
|
+
*/
|
1395
|
+
CompilerProto.destroy = function () {
|
1396
|
+
|
1397
|
+
var compiler = this,
|
1398
|
+
i, key, dir, instances, binding,
|
1399
|
+
vm = compiler.vm,
|
1400
|
+
el = compiler.el,
|
1401
|
+
directives = compiler.dirs,
|
1402
|
+
exps = compiler.exps,
|
1403
|
+
bindings = compiler.bindings
|
1404
|
+
|
1405
|
+
compiler.execHook('beforeDestroy')
|
1406
|
+
|
1407
|
+
// unwatch
|
1408
|
+
compiler.observer.off()
|
1409
|
+
compiler.emitter.off()
|
1410
|
+
|
1411
|
+
// unbind all direcitves
|
1412
|
+
i = directives.length
|
1413
|
+
while (i--) {
|
1414
|
+
dir = directives[i]
|
1415
|
+
// if this directive is an instance of an external binding
|
1416
|
+
// e.g. a directive that refers to a variable on the parent VM
|
1417
|
+
// we need to remove it from that binding's instances
|
1418
|
+
if (!dir.isEmpty && dir.binding.compiler !== compiler) {
|
1419
|
+
instances = dir.binding.instances
|
1420
|
+
if (instances) instances.splice(instances.indexOf(dir), 1)
|
1421
|
+
}
|
1422
|
+
dir.unbind()
|
1423
|
+
}
|
1424
|
+
|
1425
|
+
// unbind all expressions (anonymous bindings)
|
1426
|
+
i = exps.length
|
1427
|
+
while (i--) {
|
1428
|
+
exps[i].unbind()
|
1429
|
+
}
|
1430
|
+
|
1431
|
+
// unbind/unobserve all own bindings
|
1432
|
+
for (key in bindings) {
|
1433
|
+
binding = bindings[key]
|
1434
|
+
if (binding) {
|
1435
|
+
if (binding.root) {
|
1436
|
+
Observer.unobserve(binding.value, binding.key, compiler.observer)
|
1437
|
+
}
|
1438
|
+
binding.unbind()
|
1439
|
+
}
|
1440
|
+
}
|
1441
|
+
|
1442
|
+
// remove self from parentCompiler
|
1443
|
+
var parent = compiler.parentCompiler,
|
1444
|
+
childId = compiler.childId
|
1445
|
+
if (parent) {
|
1446
|
+
parent.childCompilers.splice(parent.childCompilers.indexOf(compiler), 1)
|
1447
|
+
if (childId) {
|
1448
|
+
delete parent.vm.$[childId]
|
1449
|
+
}
|
1450
|
+
}
|
1451
|
+
|
1452
|
+
// finally remove dom element
|
1453
|
+
if (el === document.body) {
|
1454
|
+
el.innerHTML = ''
|
1455
|
+
} else {
|
1456
|
+
vm.$remove()
|
1457
|
+
}
|
1458
|
+
|
1459
|
+
compiler.execHook('afterDestroy')
|
1460
|
+
}
|
1461
|
+
|
1462
|
+
// Helpers --------------------------------------------------------------------
|
1463
|
+
|
1464
|
+
/**
|
1465
|
+
* shorthand for getting root compiler
|
1466
|
+
*/
|
1467
|
+
function getRoot (compiler) {
|
1468
|
+
while (compiler.parentCompiler) {
|
1469
|
+
compiler = compiler.parentCompiler
|
1470
|
+
}
|
1471
|
+
return compiler
|
1472
|
+
}
|
1473
|
+
|
1474
|
+
module.exports = Compiler
|
1475
|
+
});
|
1476
|
+
require.register("vue/src/viewmodel.js", function(exports, require, module){
|
1477
|
+
var Compiler = require('./compiler'),
|
1478
|
+
utils = require('./utils'),
|
1479
|
+
transition = require('./transition'),
|
1480
|
+
def = utils.defProtected,
|
1481
|
+
nextTick = utils.nextTick
|
1482
|
+
|
1483
|
+
/**
|
1484
|
+
* ViewModel exposed to the user that holds data,
|
1485
|
+
* computed properties, event handlers
|
1486
|
+
* and a few reserved methods
|
1487
|
+
*/
|
1488
|
+
function ViewModel (options) {
|
1489
|
+
// just compile. options are passed directly to compiler
|
1490
|
+
new Compiler(this, options)
|
1491
|
+
}
|
1492
|
+
|
1493
|
+
// All VM prototype methods are inenumerable
|
1494
|
+
// so it can be stringified/looped through as raw data
|
1495
|
+
var VMProto = ViewModel.prototype
|
1496
|
+
|
1497
|
+
/**
|
1498
|
+
* Convenience function to set an actual nested value
|
1499
|
+
* from a flat key string. Used in directives.
|
1500
|
+
*/
|
1501
|
+
def(VMProto, '$set', function (key, value) {
|
1502
|
+
var path = key.split('.'),
|
1503
|
+
obj = getTargetVM(this, path)
|
1504
|
+
if (!obj) return
|
1505
|
+
for (var d = 0, l = path.length - 1; d < l; d++) {
|
1506
|
+
obj = obj[path[d]]
|
1507
|
+
}
|
1508
|
+
obj[path[d]] = value
|
1509
|
+
})
|
1510
|
+
|
1511
|
+
/**
|
1512
|
+
* watch a key on the viewmodel for changes
|
1513
|
+
* fire callback with new value
|
1514
|
+
*/
|
1515
|
+
def(VMProto, '$watch', function (key, callback) {
|
1516
|
+
var self = this
|
1517
|
+
function on () {
|
1518
|
+
var args = arguments
|
1519
|
+
utils.nextTick(function () {
|
1520
|
+
callback.apply(self, args)
|
1521
|
+
})
|
1522
|
+
}
|
1523
|
+
callback._fn = on
|
1524
|
+
self.$compiler.observer.on('change:' + key, on)
|
1525
|
+
})
|
1526
|
+
|
1527
|
+
/**
|
1528
|
+
* unwatch a key
|
1529
|
+
*/
|
1530
|
+
def(VMProto, '$unwatch', function (key, callback) {
|
1531
|
+
// workaround here
|
1532
|
+
// since the emitter module checks callback existence
|
1533
|
+
// by checking the length of arguments
|
1534
|
+
var args = ['change:' + key],
|
1535
|
+
ob = this.$compiler.observer
|
1536
|
+
if (callback) args.push(callback._fn)
|
1537
|
+
ob.off.apply(ob, args)
|
1538
|
+
})
|
1539
|
+
|
1540
|
+
/**
|
1541
|
+
* unbind everything, remove everything
|
1542
|
+
*/
|
1543
|
+
def(VMProto, '$destroy', function () {
|
1544
|
+
this.$compiler.destroy()
|
1545
|
+
})
|
1546
|
+
|
1547
|
+
/**
|
1548
|
+
* broadcast an event to all child VMs recursively.
|
1549
|
+
*/
|
1550
|
+
def(VMProto, '$broadcast', function () {
|
1551
|
+
var children = this.$compiler.childCompilers,
|
1552
|
+
i = children.length,
|
1553
|
+
child
|
1554
|
+
while (i--) {
|
1555
|
+
child = children[i]
|
1556
|
+
child.emitter.emit.apply(child.emitter, arguments)
|
1557
|
+
child.vm.$broadcast.apply(child.vm, arguments)
|
1558
|
+
}
|
1559
|
+
})
|
1560
|
+
|
1561
|
+
/**
|
1562
|
+
* emit an event that propagates all the way up to parent VMs.
|
1563
|
+
*/
|
1564
|
+
def(VMProto, '$dispatch', function () {
|
1565
|
+
var compiler = this.$compiler,
|
1566
|
+
emitter = compiler.emitter,
|
1567
|
+
parent = compiler.parentCompiler
|
1568
|
+
emitter.emit.apply(emitter, arguments)
|
1569
|
+
if (parent) {
|
1570
|
+
parent.vm.$dispatch.apply(parent.vm, arguments)
|
1571
|
+
}
|
1572
|
+
})
|
1573
|
+
|
1574
|
+
/**
|
1575
|
+
* delegate on/off/once to the compiler's emitter
|
1576
|
+
*/
|
1577
|
+
;['emit', 'on', 'off', 'once'].forEach(function (method) {
|
1578
|
+
def(VMProto, '$' + method, function () {
|
1579
|
+
var emitter = this.$compiler.emitter
|
1580
|
+
emitter[method].apply(emitter, arguments)
|
1581
|
+
})
|
1582
|
+
})
|
1583
|
+
|
1584
|
+
// DOM convenience methods
|
1585
|
+
|
1586
|
+
def(VMProto, '$appendTo', function (target, cb) {
|
1587
|
+
target = query(target)
|
1588
|
+
var el = this.$el
|
1589
|
+
transition(el, 1, function () {
|
1590
|
+
target.appendChild(el)
|
1591
|
+
if (cb) nextTick(cb)
|
1592
|
+
}, this.$compiler)
|
1593
|
+
})
|
1594
|
+
|
1595
|
+
def(VMProto, '$remove', function (cb) {
|
1596
|
+
var el = this.$el,
|
1597
|
+
parent = el.parentNode
|
1598
|
+
if (!parent) return
|
1599
|
+
transition(el, -1, function () {
|
1600
|
+
parent.removeChild(el)
|
1601
|
+
if (cb) nextTick(cb)
|
1602
|
+
}, this.$compiler)
|
1603
|
+
})
|
1604
|
+
|
1605
|
+
def(VMProto, '$before', function (target, cb) {
|
1606
|
+
target = query(target)
|
1607
|
+
var el = this.$el,
|
1608
|
+
parent = target.parentNode
|
1609
|
+
if (!parent) return
|
1610
|
+
transition(el, 1, function () {
|
1611
|
+
parent.insertBefore(el, target)
|
1612
|
+
if (cb) nextTick(cb)
|
1613
|
+
}, this.$compiler)
|
1614
|
+
})
|
1615
|
+
|
1616
|
+
def(VMProto, '$after', function (target, cb) {
|
1617
|
+
target = query(target)
|
1618
|
+
var el = this.$el,
|
1619
|
+
parent = target.parentNode,
|
1620
|
+
next = target.nextSibling
|
1621
|
+
if (!parent) return
|
1622
|
+
transition(el, 1, function () {
|
1623
|
+
if (next) {
|
1624
|
+
parent.insertBefore(el, next)
|
1625
|
+
} else {
|
1626
|
+
parent.appendChild(el)
|
1627
|
+
}
|
1628
|
+
if (cb) nextTick(cb)
|
1629
|
+
}, this.$compiler)
|
1630
|
+
})
|
1631
|
+
|
1632
|
+
function query (el) {
|
1633
|
+
return typeof el === 'string'
|
1634
|
+
? document.querySelector(el)
|
1635
|
+
: el
|
1636
|
+
}
|
1637
|
+
|
1638
|
+
/**
|
1639
|
+
* If a VM doesn't contain a path, go up the prototype chain
|
1640
|
+
* to locate the ancestor that has it.
|
1641
|
+
*/
|
1642
|
+
function getTargetVM (vm, path) {
|
1643
|
+
var baseKey = path[0],
|
1644
|
+
binding = vm.$compiler.bindings[baseKey]
|
1645
|
+
return binding
|
1646
|
+
? binding.compiler.vm
|
1647
|
+
: null
|
1648
|
+
}
|
1649
|
+
|
1650
|
+
module.exports = ViewModel
|
1651
|
+
});
|
1652
|
+
require.register("vue/src/binding.js", function(exports, require, module){
|
1653
|
+
var batcher = require('./batcher'),
|
1654
|
+
id = 0
|
1655
|
+
|
1656
|
+
/**
|
1657
|
+
* Binding class.
|
1658
|
+
*
|
1659
|
+
* each property on the viewmodel has one corresponding Binding object
|
1660
|
+
* which has multiple directive instances on the DOM
|
1661
|
+
* and multiple computed property dependents
|
1662
|
+
*/
|
1663
|
+
function Binding (compiler, key, isExp, isFn) {
|
1664
|
+
this.id = id++
|
1665
|
+
this.value = undefined
|
1666
|
+
this.isExp = !!isExp
|
1667
|
+
this.isFn = isFn
|
1668
|
+
this.root = !this.isExp && key.indexOf('.') === -1
|
1669
|
+
this.compiler = compiler
|
1670
|
+
this.key = key
|
1671
|
+
this.instances = []
|
1672
|
+
this.subs = []
|
1673
|
+
this.deps = []
|
1674
|
+
this.unbound = false
|
1675
|
+
}
|
1676
|
+
|
1677
|
+
var BindingProto = Binding.prototype
|
1678
|
+
|
1679
|
+
/**
|
1680
|
+
* Update value and queue instance updates.
|
1681
|
+
*/
|
1682
|
+
BindingProto.update = function (value) {
|
1683
|
+
if (!this.isComputed || this.isFn) {
|
1684
|
+
this.value = value
|
1685
|
+
}
|
1686
|
+
batcher.queue(this)
|
1687
|
+
}
|
1688
|
+
|
1689
|
+
/**
|
1690
|
+
* Actually update the instances.
|
1691
|
+
*/
|
1692
|
+
BindingProto._update = function () {
|
1693
|
+
var i = this.instances.length,
|
1694
|
+
value = this.val()
|
1695
|
+
while (i--) {
|
1696
|
+
this.instances[i].update(value)
|
1697
|
+
}
|
1698
|
+
this.pub()
|
1699
|
+
}
|
1700
|
+
|
1701
|
+
/**
|
1702
|
+
* Return the valuated value regardless
|
1703
|
+
* of whether it is computed or not
|
1704
|
+
*/
|
1705
|
+
BindingProto.val = function () {
|
1706
|
+
return this.isComputed && !this.isFn
|
1707
|
+
? this.value.$get()
|
1708
|
+
: this.value
|
1709
|
+
}
|
1710
|
+
|
1711
|
+
/**
|
1712
|
+
* Notify computed properties that depend on this binding
|
1713
|
+
* to update themselves
|
1714
|
+
*/
|
1715
|
+
BindingProto.pub = function () {
|
1716
|
+
var i = this.subs.length
|
1717
|
+
while (i--) {
|
1718
|
+
this.subs[i].update()
|
1719
|
+
}
|
1720
|
+
}
|
1721
|
+
|
1722
|
+
/**
|
1723
|
+
* Unbind the binding, remove itself from all of its dependencies
|
1724
|
+
*/
|
1725
|
+
BindingProto.unbind = function () {
|
1726
|
+
// Indicate this has been unbound.
|
1727
|
+
// It's possible this binding will be in
|
1728
|
+
// the batcher's flush queue when its owner
|
1729
|
+
// compiler has already been destroyed.
|
1730
|
+
this.unbound = true
|
1731
|
+
var i = this.instances.length
|
1732
|
+
while (i--) {
|
1733
|
+
this.instances[i].unbind()
|
1734
|
+
}
|
1735
|
+
i = this.deps.length
|
1736
|
+
var subs
|
1737
|
+
while (i--) {
|
1738
|
+
subs = this.deps[i].subs
|
1739
|
+
subs.splice(subs.indexOf(this), 1)
|
1740
|
+
}
|
1741
|
+
}
|
1742
|
+
|
1743
|
+
module.exports = Binding
|
1744
|
+
});
|
1745
|
+
require.register("vue/src/observer.js", function(exports, require, module){
|
1746
|
+
/* jshint proto:true */
|
1747
|
+
|
1748
|
+
var Emitter = require('./emitter'),
|
1749
|
+
utils = require('./utils'),
|
1750
|
+
|
1751
|
+
// cache methods
|
1752
|
+
typeOf = utils.typeOf,
|
1753
|
+
def = utils.defProtected,
|
1754
|
+
slice = Array.prototype.slice,
|
1755
|
+
|
1756
|
+
// types
|
1757
|
+
OBJECT = 'Object',
|
1758
|
+
ARRAY = 'Array',
|
1759
|
+
|
1760
|
+
// Array mutation methods to wrap
|
1761
|
+
methods = ['push','pop','shift','unshift','splice','sort','reverse'],
|
1762
|
+
|
1763
|
+
// fix for IE + __proto__ problem
|
1764
|
+
// define methods as inenumerable if __proto__ is present,
|
1765
|
+
// otherwise enumerable so we can loop through and manually
|
1766
|
+
// attach to array instances
|
1767
|
+
hasProto = ({}).__proto__,
|
1768
|
+
|
1769
|
+
// lazy load
|
1770
|
+
ViewModel
|
1771
|
+
|
1772
|
+
// The proxy prototype to replace the __proto__ of
|
1773
|
+
// an observed array
|
1774
|
+
var ArrayProxy = Object.create(Array.prototype)
|
1775
|
+
|
1776
|
+
// Define mutation interceptors so we can emit the mutation info
|
1777
|
+
methods.forEach(function (method) {
|
1778
|
+
def(ArrayProxy, method, function () {
|
1779
|
+
var result = Array.prototype[method].apply(this, arguments)
|
1780
|
+
this.__observer__.emit('mutate', this.__observer__.path, this, {
|
1781
|
+
method: method,
|
1782
|
+
args: slice.call(arguments),
|
1783
|
+
result: result
|
1784
|
+
})
|
1785
|
+
return result
|
1786
|
+
}, !hasProto)
|
1787
|
+
})
|
1788
|
+
|
1789
|
+
// Augment it with several convenience methods
|
1790
|
+
var extensions = {
|
1791
|
+
remove: function (index) {
|
1792
|
+
if (typeof index === 'function') {
|
1793
|
+
var i = this.length,
|
1794
|
+
removed = []
|
1795
|
+
while (i--) {
|
1796
|
+
if (index(this[i])) {
|
1797
|
+
removed.push(this.splice(i, 1)[0])
|
1798
|
+
}
|
1799
|
+
}
|
1800
|
+
return removed.reverse()
|
1801
|
+
} else {
|
1802
|
+
if (typeof index !== 'number') {
|
1803
|
+
index = this.indexOf(index)
|
1804
|
+
}
|
1805
|
+
if (index > -1) {
|
1806
|
+
return this.splice(index, 1)[0]
|
1807
|
+
}
|
1808
|
+
}
|
1809
|
+
},
|
1810
|
+
replace: function (index, data) {
|
1811
|
+
if (typeof index === 'function') {
|
1812
|
+
var i = this.length,
|
1813
|
+
replaced = [],
|
1814
|
+
replacer
|
1815
|
+
while (i--) {
|
1816
|
+
replacer = index(this[i])
|
1817
|
+
if (replacer !== undefined) {
|
1818
|
+
replaced.push(this.splice(i, 1, replacer)[0])
|
1819
|
+
}
|
1820
|
+
}
|
1821
|
+
return replaced.reverse()
|
1822
|
+
} else {
|
1823
|
+
if (typeof index !== 'number') {
|
1824
|
+
index = this.indexOf(index)
|
1825
|
+
}
|
1826
|
+
if (index > -1) {
|
1827
|
+
return this.splice(index, 1, data)[0]
|
1828
|
+
}
|
1829
|
+
}
|
1830
|
+
}
|
1831
|
+
}
|
1832
|
+
|
1833
|
+
for (var method in extensions) {
|
1834
|
+
def(ArrayProxy, method, extensions[method], !hasProto)
|
1835
|
+
}
|
1836
|
+
|
1837
|
+
/**
|
1838
|
+
* Watch an Object, recursive.
|
1839
|
+
*/
|
1840
|
+
function watchObject (obj) {
|
1841
|
+
for (var key in obj) {
|
1842
|
+
convert(obj, key)
|
1843
|
+
}
|
1844
|
+
}
|
1845
|
+
|
1846
|
+
/**
|
1847
|
+
* Watch an Array, overload mutation methods
|
1848
|
+
* and add augmentations by intercepting the prototype chain
|
1849
|
+
*/
|
1850
|
+
function watchArray (arr, path) {
|
1851
|
+
var observer = arr.__observer__
|
1852
|
+
if (!observer) {
|
1853
|
+
observer = new Emitter()
|
1854
|
+
def(arr, '__observer__', observer)
|
1855
|
+
}
|
1856
|
+
observer.path = path
|
1857
|
+
if (hasProto) {
|
1858
|
+
arr.__proto__ = ArrayProxy
|
1859
|
+
} else {
|
1860
|
+
for (var key in ArrayProxy) {
|
1861
|
+
def(arr, key, ArrayProxy[key])
|
1862
|
+
}
|
1863
|
+
}
|
1864
|
+
}
|
1865
|
+
|
1866
|
+
/**
|
1867
|
+
* Define accessors for a property on an Object
|
1868
|
+
* so it emits get/set events.
|
1869
|
+
* Then watch the value itself.
|
1870
|
+
*/
|
1871
|
+
function convert (obj, key) {
|
1872
|
+
var keyPrefix = key.charAt(0)
|
1873
|
+
if ((keyPrefix === '$' || keyPrefix === '_') && key !== '$index') {
|
1874
|
+
return
|
1875
|
+
}
|
1876
|
+
// emit set on bind
|
1877
|
+
// this means when an object is observed it will emit
|
1878
|
+
// a first batch of set events.
|
1879
|
+
var observer = obj.__observer__,
|
1880
|
+
values = observer.values,
|
1881
|
+
val = values[key] = obj[key]
|
1882
|
+
observer.emit('set', key, val)
|
1883
|
+
if (Array.isArray(val)) {
|
1884
|
+
observer.emit('set', key + '.length', val.length)
|
1885
|
+
}
|
1886
|
+
Object.defineProperty(obj, key, {
|
1887
|
+
get: function () {
|
1888
|
+
var value = values[key]
|
1889
|
+
// only emit get on tip values
|
1890
|
+
if (pub.shouldGet && typeOf(value) !== OBJECT) {
|
1891
|
+
observer.emit('get', key)
|
1892
|
+
}
|
1893
|
+
return value
|
1894
|
+
},
|
1895
|
+
set: function (newVal) {
|
1896
|
+
var oldVal = values[key]
|
1897
|
+
unobserve(oldVal, key, observer)
|
1898
|
+
values[key] = newVal
|
1899
|
+
copyPaths(newVal, oldVal)
|
1900
|
+
observer.emit('set', key, newVal)
|
1901
|
+
observe(newVal, key, observer)
|
1902
|
+
}
|
1903
|
+
})
|
1904
|
+
observe(val, key, observer)
|
1905
|
+
}
|
1906
|
+
|
1907
|
+
/**
|
1908
|
+
* Check if a value is watchable
|
1909
|
+
*/
|
1910
|
+
function isWatchable (obj) {
|
1911
|
+
ViewModel = ViewModel || require('./viewmodel')
|
1912
|
+
var type = typeOf(obj)
|
1913
|
+
return (type === OBJECT || type === ARRAY) && !(obj instanceof ViewModel)
|
1914
|
+
}
|
1915
|
+
|
1916
|
+
/**
|
1917
|
+
* When a value that is already converted is
|
1918
|
+
* observed again by another observer, we can skip
|
1919
|
+
* the watch conversion and simply emit set event for
|
1920
|
+
* all of its properties.
|
1921
|
+
*/
|
1922
|
+
function emitSet (obj) {
|
1923
|
+
var type = typeOf(obj),
|
1924
|
+
emitter = obj && obj.__observer__
|
1925
|
+
if (type === ARRAY) {
|
1926
|
+
emitter.emit('set', 'length', obj.length)
|
1927
|
+
} else if (type === OBJECT) {
|
1928
|
+
var key, val
|
1929
|
+
for (key in obj) {
|
1930
|
+
val = obj[key]
|
1931
|
+
emitter.emit('set', key, val)
|
1932
|
+
emitSet(val)
|
1933
|
+
}
|
1934
|
+
}
|
1935
|
+
}
|
1936
|
+
|
1937
|
+
/**
|
1938
|
+
* Make sure all the paths in an old object exists
|
1939
|
+
* in a new object.
|
1940
|
+
* So when an object changes, all missing keys will
|
1941
|
+
* emit a set event with undefined value.
|
1942
|
+
*/
|
1943
|
+
function copyPaths (newObj, oldObj) {
|
1944
|
+
if (typeOf(oldObj) !== OBJECT || typeOf(newObj) !== OBJECT) {
|
1945
|
+
return
|
1946
|
+
}
|
1947
|
+
var path, type, oldVal, newVal
|
1948
|
+
for (path in oldObj) {
|
1949
|
+
if (!(path in newObj)) {
|
1950
|
+
oldVal = oldObj[path]
|
1951
|
+
type = typeOf(oldVal)
|
1952
|
+
if (type === OBJECT) {
|
1953
|
+
newVal = newObj[path] = {}
|
1954
|
+
copyPaths(newVal, oldVal)
|
1955
|
+
} else if (type === ARRAY) {
|
1956
|
+
newObj[path] = []
|
1957
|
+
} else {
|
1958
|
+
newObj[path] = undefined
|
1959
|
+
}
|
1960
|
+
}
|
1961
|
+
}
|
1962
|
+
}
|
1963
|
+
|
1964
|
+
/**
|
1965
|
+
* walk along a path and make sure it can be accessed
|
1966
|
+
* and enumerated in that object
|
1967
|
+
*/
|
1968
|
+
function ensurePath (obj, key) {
|
1969
|
+
var path = key.split('.'), sec
|
1970
|
+
for (var i = 0, d = path.length - 1; i < d; i++) {
|
1971
|
+
sec = path[i]
|
1972
|
+
if (!obj[sec]) {
|
1973
|
+
obj[sec] = {}
|
1974
|
+
if (obj.__observer__) convert(obj, sec)
|
1975
|
+
}
|
1976
|
+
obj = obj[sec]
|
1977
|
+
}
|
1978
|
+
if (typeOf(obj) === OBJECT) {
|
1979
|
+
sec = path[i]
|
1980
|
+
if (!(sec in obj)) {
|
1981
|
+
obj[sec] = undefined
|
1982
|
+
if (obj.__observer__) convert(obj, sec)
|
1983
|
+
}
|
1984
|
+
}
|
1985
|
+
}
|
1986
|
+
|
1987
|
+
/**
|
1988
|
+
* Observe an object with a given path,
|
1989
|
+
* and proxy get/set/mutate events to the provided observer.
|
1990
|
+
*/
|
1991
|
+
function observe (obj, rawPath, observer) {
|
1992
|
+
if (!isWatchable(obj)) return
|
1993
|
+
var path = rawPath ? rawPath + '.' : '',
|
1994
|
+
ob, alreadyConverted = !!obj.__observer__
|
1995
|
+
if (!alreadyConverted) {
|
1996
|
+
def(obj, '__observer__', new Emitter())
|
1997
|
+
}
|
1998
|
+
ob = obj.__observer__
|
1999
|
+
ob.values = ob.values || utils.hash()
|
2000
|
+
observer.proxies = observer.proxies || {}
|
2001
|
+
var proxies = observer.proxies[path] = {
|
2002
|
+
get: function (key) {
|
2003
|
+
observer.emit('get', path + key)
|
2004
|
+
},
|
2005
|
+
set: function (key, val) {
|
2006
|
+
observer.emit('set', path + key, val)
|
2007
|
+
},
|
2008
|
+
mutate: function (key, val, mutation) {
|
2009
|
+
// if the Array is a root value
|
2010
|
+
// the key will be null
|
2011
|
+
var fixedPath = key ? path + key : rawPath
|
2012
|
+
observer.emit('mutate', fixedPath, val, mutation)
|
2013
|
+
// also emit set for Array's length when it mutates
|
2014
|
+
var m = mutation.method
|
2015
|
+
if (m !== 'sort' && m !== 'reverse') {
|
2016
|
+
observer.emit('set', fixedPath + '.length', val.length)
|
2017
|
+
}
|
2018
|
+
}
|
2019
|
+
}
|
2020
|
+
ob
|
2021
|
+
.on('get', proxies.get)
|
2022
|
+
.on('set', proxies.set)
|
2023
|
+
.on('mutate', proxies.mutate)
|
2024
|
+
if (alreadyConverted) {
|
2025
|
+
emitSet(obj)
|
2026
|
+
} else {
|
2027
|
+
var type = typeOf(obj)
|
2028
|
+
if (type === OBJECT) {
|
2029
|
+
watchObject(obj)
|
2030
|
+
} else if (type === ARRAY) {
|
2031
|
+
watchArray(obj)
|
2032
|
+
}
|
2033
|
+
}
|
2034
|
+
}
|
2035
|
+
|
2036
|
+
/**
|
2037
|
+
* Cancel observation, turn off the listeners.
|
2038
|
+
*/
|
2039
|
+
function unobserve (obj, path, observer) {
|
2040
|
+
if (!obj || !obj.__observer__) return
|
2041
|
+
path = path ? path + '.' : ''
|
2042
|
+
var proxies = observer.proxies[path]
|
2043
|
+
if (!proxies) return
|
2044
|
+
obj.__observer__
|
2045
|
+
.off('get', proxies.get)
|
2046
|
+
.off('set', proxies.set)
|
2047
|
+
.off('mutate', proxies.mutate)
|
2048
|
+
observer.proxies[path] = null
|
2049
|
+
}
|
2050
|
+
|
2051
|
+
var pub = module.exports = {
|
2052
|
+
|
2053
|
+
// whether to emit get events
|
2054
|
+
// only enabled during dependency parsing
|
2055
|
+
shouldGet : false,
|
2056
|
+
|
2057
|
+
observe : observe,
|
2058
|
+
unobserve : unobserve,
|
2059
|
+
ensurePath : ensurePath,
|
2060
|
+
convert : convert,
|
2061
|
+
copyPaths : copyPaths,
|
2062
|
+
watchArray : watchArray
|
2063
|
+
}
|
2064
|
+
});
|
2065
|
+
require.register("vue/src/directive.js", function(exports, require, module){
|
2066
|
+
var utils = require('./utils'),
|
2067
|
+
directives = require('./directives'),
|
2068
|
+
filters = require('./filters'),
|
2069
|
+
|
2070
|
+
// Regexes!
|
2071
|
+
|
2072
|
+
// regex to split multiple directive expressions
|
2073
|
+
// split by commas, but ignore commas within quotes, parens and escapes.
|
2074
|
+
SPLIT_RE = /(?:['"](?:\\.|[^'"])*['"]|\((?:\\.|[^\)])*\)|\\.|[^,])+/g,
|
2075
|
+
|
2076
|
+
// match up to the first single pipe, ignore those within quotes.
|
2077
|
+
KEY_RE = /^(?:['"](?:\\.|[^'"])*['"]|\\.|[^\|]|\|\|)+/,
|
2078
|
+
|
2079
|
+
ARG_RE = /^([\w- ]+):(.+)$/,
|
2080
|
+
FILTERS_RE = /\|[^\|]+/g,
|
2081
|
+
FILTER_TOKEN_RE = /[^\s']+|'[^']+'/g,
|
2082
|
+
NESTING_RE = /^\$(parent|root)\./,
|
2083
|
+
SINGLE_VAR_RE = /^[\w\.\$]+$/
|
2084
|
+
|
2085
|
+
/**
|
2086
|
+
* Directive class
|
2087
|
+
* represents a single directive instance in the DOM
|
2088
|
+
*/
|
2089
|
+
function Directive (definition, expression, rawKey, compiler, node) {
|
2090
|
+
|
2091
|
+
this.compiler = compiler
|
2092
|
+
this.vm = compiler.vm
|
2093
|
+
this.el = node
|
2094
|
+
|
2095
|
+
var isEmpty = expression === ''
|
2096
|
+
|
2097
|
+
// mix in properties from the directive definition
|
2098
|
+
if (typeof definition === 'function') {
|
2099
|
+
this[isEmpty ? 'bind' : '_update'] = definition
|
2100
|
+
} else {
|
2101
|
+
for (var prop in definition) {
|
2102
|
+
if (prop === 'unbind' || prop === 'update') {
|
2103
|
+
this['_' + prop] = definition[prop]
|
2104
|
+
} else {
|
2105
|
+
this[prop] = definition[prop]
|
2106
|
+
}
|
2107
|
+
}
|
2108
|
+
}
|
2109
|
+
|
2110
|
+
// empty expression, we're done.
|
2111
|
+
if (isEmpty) {
|
2112
|
+
this.isEmpty = true
|
2113
|
+
return
|
2114
|
+
}
|
2115
|
+
|
2116
|
+
this.expression = expression.trim()
|
2117
|
+
this.rawKey = rawKey
|
2118
|
+
|
2119
|
+
parseKey(this, rawKey)
|
2120
|
+
|
2121
|
+
this.isExp = !SINGLE_VAR_RE.test(this.key) || NESTING_RE.test(this.key)
|
2122
|
+
|
2123
|
+
var filterExps = this.expression.slice(rawKey.length).match(FILTERS_RE)
|
2124
|
+
if (filterExps) {
|
2125
|
+
this.filters = []
|
2126
|
+
var i = 0, l = filterExps.length, filter
|
2127
|
+
for (; i < l; i++) {
|
2128
|
+
filter = parseFilter(filterExps[i], this.compiler)
|
2129
|
+
if (filter) this.filters.push(filter)
|
2130
|
+
}
|
2131
|
+
if (!this.filters.length) this.filters = null
|
2132
|
+
} else {
|
2133
|
+
this.filters = null
|
2134
|
+
}
|
2135
|
+
}
|
2136
|
+
|
2137
|
+
var DirProto = Directive.prototype
|
2138
|
+
|
2139
|
+
/**
|
2140
|
+
* parse a key, extract argument and nesting/root info
|
2141
|
+
*/
|
2142
|
+
function parseKey (dir, rawKey) {
|
2143
|
+
var key = rawKey
|
2144
|
+
if (rawKey.indexOf(':') > -1) {
|
2145
|
+
var argMatch = rawKey.match(ARG_RE)
|
2146
|
+
key = argMatch
|
2147
|
+
? argMatch[2].trim()
|
2148
|
+
: key
|
2149
|
+
dir.arg = argMatch
|
2150
|
+
? argMatch[1].trim()
|
2151
|
+
: null
|
2152
|
+
}
|
2153
|
+
dir.key = key
|
2154
|
+
}
|
2155
|
+
|
2156
|
+
/**
|
2157
|
+
* parse a filter expression
|
2158
|
+
*/
|
2159
|
+
function parseFilter (filter, compiler) {
|
2160
|
+
|
2161
|
+
var tokens = filter.slice(1).match(FILTER_TOKEN_RE)
|
2162
|
+
if (!tokens) return
|
2163
|
+
tokens = tokens.map(function (token) {
|
2164
|
+
return token.replace(/'/g, '').trim()
|
2165
|
+
})
|
2166
|
+
|
2167
|
+
var name = tokens[0],
|
2168
|
+
apply = compiler.getOption('filters', name) || filters[name]
|
2169
|
+
if (!apply) {
|
2170
|
+
utils.warn('Unknown filter: ' + name)
|
2171
|
+
return
|
2172
|
+
}
|
2173
|
+
|
2174
|
+
return {
|
2175
|
+
name : name,
|
2176
|
+
apply : apply,
|
2177
|
+
args : tokens.length > 1
|
2178
|
+
? tokens.slice(1)
|
2179
|
+
: null
|
2180
|
+
}
|
2181
|
+
}
|
2182
|
+
|
2183
|
+
/**
|
2184
|
+
* called when a new value is set
|
2185
|
+
* for computed properties, this will only be called once
|
2186
|
+
* during initialization.
|
2187
|
+
*/
|
2188
|
+
DirProto.update = function (value, init) {
|
2189
|
+
if (!init && value === this.value) return
|
2190
|
+
this.value = value
|
2191
|
+
if (this._update) {
|
2192
|
+
this._update(
|
2193
|
+
this.filters
|
2194
|
+
? this.applyFilters(value)
|
2195
|
+
: value
|
2196
|
+
)
|
2197
|
+
}
|
2198
|
+
}
|
2199
|
+
|
2200
|
+
/**
|
2201
|
+
* pipe the value through filters
|
2202
|
+
*/
|
2203
|
+
DirProto.applyFilters = function (value) {
|
2204
|
+
var filtered = value, filter
|
2205
|
+
for (var i = 0, l = this.filters.length; i < l; i++) {
|
2206
|
+
filter = this.filters[i]
|
2207
|
+
filtered = filter.apply.call(this.vm, filtered, filter.args)
|
2208
|
+
}
|
2209
|
+
return filtered
|
2210
|
+
}
|
2211
|
+
|
2212
|
+
/**
|
2213
|
+
* Unbind diretive
|
2214
|
+
* @ param {Boolean} update
|
2215
|
+
* Sometimes we call unbind before an update (i.e. not destroy)
|
2216
|
+
* just to teardown previous stuff, in that case we do not want
|
2217
|
+
* to null everything.
|
2218
|
+
*/
|
2219
|
+
DirProto.unbind = function (update) {
|
2220
|
+
// this can be called before the el is even assigned...
|
2221
|
+
if (!this.el) return
|
2222
|
+
if (this._unbind) this._unbind(update)
|
2223
|
+
if (!update) this.vm = this.el = this.binding = this.compiler = null
|
2224
|
+
}
|
2225
|
+
|
2226
|
+
// exposed methods ------------------------------------------------------------
|
2227
|
+
|
2228
|
+
/**
|
2229
|
+
* split a unquoted-comma separated expression into
|
2230
|
+
* multiple clauses
|
2231
|
+
*/
|
2232
|
+
Directive.split = function (exp) {
|
2233
|
+
return exp.indexOf(',') > -1
|
2234
|
+
? exp.match(SPLIT_RE) || ['']
|
2235
|
+
: [exp]
|
2236
|
+
}
|
2237
|
+
|
2238
|
+
/**
|
2239
|
+
* make sure the directive and expression is valid
|
2240
|
+
* before we create an instance
|
2241
|
+
*/
|
2242
|
+
Directive.parse = function (dirname, expression, compiler, node) {
|
2243
|
+
|
2244
|
+
var dir = compiler.getOption('directives', dirname) || directives[dirname]
|
2245
|
+
if (!dir) return utils.warn('unknown directive: ' + dirname)
|
2246
|
+
|
2247
|
+
var rawKey
|
2248
|
+
if (expression.indexOf('|') > -1) {
|
2249
|
+
var keyMatch = expression.match(KEY_RE)
|
2250
|
+
if (keyMatch) {
|
2251
|
+
rawKey = keyMatch[0].trim()
|
2252
|
+
}
|
2253
|
+
} else {
|
2254
|
+
rawKey = expression.trim()
|
2255
|
+
}
|
2256
|
+
|
2257
|
+
// have a valid raw key, or be an empty directive
|
2258
|
+
return (rawKey || expression === '')
|
2259
|
+
? new Directive(dir, expression, rawKey, compiler, node)
|
2260
|
+
: utils.warn('invalid directive expression: ' + expression)
|
2261
|
+
}
|
2262
|
+
|
2263
|
+
module.exports = Directive
|
2264
|
+
});
|
2265
|
+
require.register("vue/src/exp-parser.js", function(exports, require, module){
|
2266
|
+
var utils = require('./utils'),
|
2267
|
+
stringSaveRE = /"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g,
|
2268
|
+
stringRestoreRE = /"(\d+)"/g
|
2269
|
+
|
2270
|
+
// Variable extraction scooped from https://github.com/RubyLouvre/avalon
|
2271
|
+
|
2272
|
+
var KEYWORDS =
|
2273
|
+
// keywords
|
2274
|
+
'break,case,catch,continue,debugger,default,delete,do,else,false' +
|
2275
|
+
',finally,for,function,if,in,instanceof,new,null,return,switch,this' +
|
2276
|
+
',throw,true,try,typeof,var,void,while,with,undefined' +
|
2277
|
+
// reserved
|
2278
|
+
',abstract,boolean,byte,char,class,const,double,enum,export,extends' +
|
2279
|
+
',final,float,goto,implements,import,int,interface,long,native' +
|
2280
|
+
',package,private,protected,public,short,static,super,synchronized' +
|
2281
|
+
',throws,transient,volatile' +
|
2282
|
+
// ECMA 5 - use strict
|
2283
|
+
',arguments,let,yield' +
|
2284
|
+
// allow using Math in expressions
|
2285
|
+
',Math',
|
2286
|
+
|
2287
|
+
KEYWORDS_RE = new RegExp(["\\b" + KEYWORDS.replace(/,/g, '\\b|\\b') + "\\b"].join('|'), 'g'),
|
2288
|
+
REMOVE_RE = /\/\*(?:.|\n)*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|'[^']*'|"[^"]*"|[\s\t\n]*\.[\s\t\n]*[$\w\.]+/g,
|
2289
|
+
SPLIT_RE = /[^\w$]+/g,
|
2290
|
+
NUMBER_RE = /\b\d[^,]*/g,
|
2291
|
+
BOUNDARY_RE = /^,+|,+$/g
|
2292
|
+
|
2293
|
+
/**
|
2294
|
+
* Strip top level variable names from a snippet of JS expression
|
2295
|
+
*/
|
2296
|
+
function getVariables (code) {
|
2297
|
+
code = code
|
2298
|
+
.replace(REMOVE_RE, '')
|
2299
|
+
.replace(SPLIT_RE, ',')
|
2300
|
+
.replace(KEYWORDS_RE, '')
|
2301
|
+
.replace(NUMBER_RE, '')
|
2302
|
+
.replace(BOUNDARY_RE, '')
|
2303
|
+
return code
|
2304
|
+
? code.split(/,+/)
|
2305
|
+
: []
|
2306
|
+
}
|
2307
|
+
|
2308
|
+
/**
|
2309
|
+
* A given path could potentially exist not on the
|
2310
|
+
* current compiler, but up in the parent chain somewhere.
|
2311
|
+
* This function generates an access relationship string
|
2312
|
+
* that can be used in the getter function by walking up
|
2313
|
+
* the parent chain to check for key existence.
|
2314
|
+
*
|
2315
|
+
* It stops at top parent if no vm in the chain has the
|
2316
|
+
* key. It then creates any missing bindings on the
|
2317
|
+
* final resolved vm.
|
2318
|
+
*/
|
2319
|
+
function getRel (path, compiler) {
|
2320
|
+
var rel = '',
|
2321
|
+
dist = 0,
|
2322
|
+
self = compiler
|
2323
|
+
while (compiler) {
|
2324
|
+
if (compiler.hasKey(path)) {
|
2325
|
+
break
|
2326
|
+
} else {
|
2327
|
+
compiler = compiler.parentCompiler
|
2328
|
+
dist++
|
2329
|
+
}
|
2330
|
+
}
|
2331
|
+
if (compiler) {
|
2332
|
+
while (dist--) {
|
2333
|
+
rel += '$parent.'
|
2334
|
+
}
|
2335
|
+
if (!compiler.bindings[path] && path.charAt(0) !== '$') {
|
2336
|
+
compiler.createBinding(path)
|
2337
|
+
}
|
2338
|
+
} else {
|
2339
|
+
self.createBinding(path)
|
2340
|
+
}
|
2341
|
+
return rel
|
2342
|
+
}
|
2343
|
+
|
2344
|
+
/**
|
2345
|
+
* Create a function from a string...
|
2346
|
+
* this looks like evil magic but since all variables are limited
|
2347
|
+
* to the VM's data it's actually properly sandboxed
|
2348
|
+
*/
|
2349
|
+
function makeGetter (exp, raw) {
|
2350
|
+
/* jshint evil: true */
|
2351
|
+
var fn
|
2352
|
+
try {
|
2353
|
+
fn = new Function(exp)
|
2354
|
+
} catch (e) {
|
2355
|
+
utils.warn('Invalid expression: ' + raw)
|
2356
|
+
}
|
2357
|
+
return fn
|
2358
|
+
}
|
2359
|
+
|
2360
|
+
/**
|
2361
|
+
* Escape a leading dollar sign for regex construction
|
2362
|
+
*/
|
2363
|
+
function escapeDollar (v) {
|
2364
|
+
return v.charAt(0) === '$'
|
2365
|
+
? '\\' + v
|
2366
|
+
: v
|
2367
|
+
}
|
2368
|
+
|
2369
|
+
module.exports = {
|
2370
|
+
|
2371
|
+
/**
|
2372
|
+
* Parse and return an anonymous computed property getter function
|
2373
|
+
* from an arbitrary expression, together with a list of paths to be
|
2374
|
+
* created as bindings.
|
2375
|
+
*/
|
2376
|
+
parse: function (exp, compiler) {
|
2377
|
+
// extract variable names
|
2378
|
+
var vars = getVariables(exp)
|
2379
|
+
if (!vars.length) {
|
2380
|
+
return makeGetter('return ' + exp, exp)
|
2381
|
+
}
|
2382
|
+
vars = utils.unique(vars)
|
2383
|
+
var accessors = '',
|
2384
|
+
has = utils.hash(),
|
2385
|
+
strings = [],
|
2386
|
+
// construct a regex to extract all valid variable paths
|
2387
|
+
// ones that begin with "$" are particularly tricky
|
2388
|
+
// because we can't use \b for them
|
2389
|
+
pathRE = new RegExp(
|
2390
|
+
"[^$\\w\\.](" +
|
2391
|
+
vars.map(escapeDollar).join('|') +
|
2392
|
+
")[$\\w\\.]*\\b", 'g'
|
2393
|
+
),
|
2394
|
+
body = ('return ' + exp)
|
2395
|
+
.replace(stringSaveRE, saveStrings)
|
2396
|
+
.replace(pathRE, replacePath)
|
2397
|
+
.replace(stringRestoreRE, restoreStrings)
|
2398
|
+
body = accessors + body
|
2399
|
+
|
2400
|
+
function saveStrings (str) {
|
2401
|
+
var i = strings.length
|
2402
|
+
strings[i] = str
|
2403
|
+
return '"' + i + '"'
|
2404
|
+
}
|
2405
|
+
|
2406
|
+
function replacePath (path) {
|
2407
|
+
// keep track of the first char
|
2408
|
+
var c = path.charAt(0)
|
2409
|
+
path = path.slice(1)
|
2410
|
+
var val = 'this.' + getRel(path, compiler) + path
|
2411
|
+
if (!has[path]) {
|
2412
|
+
accessors += val + ';'
|
2413
|
+
has[path] = 1
|
2414
|
+
}
|
2415
|
+
// don't forget to put that first char back
|
2416
|
+
return c + val
|
2417
|
+
}
|
2418
|
+
|
2419
|
+
function restoreStrings (str, i) {
|
2420
|
+
return strings[i]
|
2421
|
+
}
|
2422
|
+
|
2423
|
+
return makeGetter(body, exp)
|
2424
|
+
}
|
2425
|
+
}
|
2426
|
+
});
|
2427
|
+
require.register("vue/src/text-parser.js", function(exports, require, module){
|
2428
|
+
var BINDING_RE = /\{\{(.+?)\}\}/
|
2429
|
+
|
2430
|
+
/**
|
2431
|
+
* Parse a piece of text, return an array of tokens
|
2432
|
+
*/
|
2433
|
+
function parse (text) {
|
2434
|
+
if (!BINDING_RE.test(text)) return null
|
2435
|
+
var m, i, tokens = []
|
2436
|
+
/* jshint boss: true */
|
2437
|
+
while (m = text.match(BINDING_RE)) {
|
2438
|
+
i = m.index
|
2439
|
+
if (i > 0) tokens.push(text.slice(0, i))
|
2440
|
+
tokens.push({ key: m[1].trim() })
|
2441
|
+
text = text.slice(i + m[0].length)
|
2442
|
+
}
|
2443
|
+
if (text.length) tokens.push(text)
|
2444
|
+
return tokens
|
2445
|
+
}
|
2446
|
+
|
2447
|
+
/**
|
2448
|
+
* Parse an attribute value with possible interpolation tags
|
2449
|
+
* return a Directive-friendly expression
|
2450
|
+
*/
|
2451
|
+
function parseAttr (attr) {
|
2452
|
+
var tokens = parse(attr)
|
2453
|
+
if (!tokens) return null
|
2454
|
+
var res = [], token
|
2455
|
+
for (var i = 0, l = tokens.length; i < l; i++) {
|
2456
|
+
token = tokens[i]
|
2457
|
+
res.push(token.key || ('"' + token + '"'))
|
2458
|
+
}
|
2459
|
+
return res.join('+')
|
2460
|
+
}
|
2461
|
+
|
2462
|
+
exports.parse = parse
|
2463
|
+
exports.parseAttr = parseAttr
|
2464
|
+
});
|
2465
|
+
require.register("vue/src/deps-parser.js", function(exports, require, module){
|
2466
|
+
var Emitter = require('./emitter'),
|
2467
|
+
utils = require('./utils'),
|
2468
|
+
Observer = require('./observer'),
|
2469
|
+
catcher = new Emitter()
|
2470
|
+
|
2471
|
+
/**
|
2472
|
+
* Auto-extract the dependencies of a computed property
|
2473
|
+
* by recording the getters triggered when evaluating it.
|
2474
|
+
*/
|
2475
|
+
function catchDeps (binding) {
|
2476
|
+
if (binding.isFn) return
|
2477
|
+
utils.log('\n- ' + binding.key)
|
2478
|
+
var got = utils.hash()
|
2479
|
+
catcher.on('get', function (dep) {
|
2480
|
+
var has = got[dep.key]
|
2481
|
+
if (has && has.compiler === dep.compiler) return
|
2482
|
+
got[dep.key] = dep
|
2483
|
+
utils.log(' - ' + dep.key)
|
2484
|
+
binding.deps.push(dep)
|
2485
|
+
dep.subs.push(binding)
|
2486
|
+
})
|
2487
|
+
binding.value.$get()
|
2488
|
+
catcher.off('get')
|
2489
|
+
}
|
2490
|
+
|
2491
|
+
module.exports = {
|
2492
|
+
|
2493
|
+
/**
|
2494
|
+
* the observer that catches events triggered by getters
|
2495
|
+
*/
|
2496
|
+
catcher: catcher,
|
2497
|
+
|
2498
|
+
/**
|
2499
|
+
* parse a list of computed property bindings
|
2500
|
+
*/
|
2501
|
+
parse: function (bindings) {
|
2502
|
+
utils.log('\nparsing dependencies...')
|
2503
|
+
Observer.shouldGet = true
|
2504
|
+
bindings.forEach(catchDeps)
|
2505
|
+
Observer.shouldGet = false
|
2506
|
+
utils.log('\ndone.')
|
2507
|
+
}
|
2508
|
+
|
2509
|
+
}
|
2510
|
+
});
|
2511
|
+
require.register("vue/src/filters.js", function(exports, require, module){
|
2512
|
+
var keyCodes = {
|
2513
|
+
enter : 13,
|
2514
|
+
tab : 9,
|
2515
|
+
'delete' : 46,
|
2516
|
+
up : 38,
|
2517
|
+
left : 37,
|
2518
|
+
right : 39,
|
2519
|
+
down : 40,
|
2520
|
+
esc : 27
|
2521
|
+
}
|
2522
|
+
|
2523
|
+
module.exports = {
|
2524
|
+
|
2525
|
+
/**
|
2526
|
+
* 'abc' => 'Abc'
|
2527
|
+
*/
|
2528
|
+
capitalize: function (value) {
|
2529
|
+
if (!value && value !== 0) return ''
|
2530
|
+
value = value.toString()
|
2531
|
+
return value.charAt(0).toUpperCase() + value.slice(1)
|
2532
|
+
},
|
2533
|
+
|
2534
|
+
/**
|
2535
|
+
* 'abc' => 'ABC'
|
2536
|
+
*/
|
2537
|
+
uppercase: function (value) {
|
2538
|
+
return (value || value === 0)
|
2539
|
+
? value.toString().toUpperCase()
|
2540
|
+
: ''
|
2541
|
+
},
|
2542
|
+
|
2543
|
+
/**
|
2544
|
+
* 'AbC' => 'abc'
|
2545
|
+
*/
|
2546
|
+
lowercase: function (value) {
|
2547
|
+
return (value || value === 0)
|
2548
|
+
? value.toString().toLowerCase()
|
2549
|
+
: ''
|
2550
|
+
},
|
2551
|
+
|
2552
|
+
/**
|
2553
|
+
* 12345 => $12,345.00
|
2554
|
+
*/
|
2555
|
+
currency: function (value, args) {
|
2556
|
+
if (!value && value !== 0) return ''
|
2557
|
+
var sign = (args && args[0]) || '$',
|
2558
|
+
s = Math.floor(value).toString(),
|
2559
|
+
i = s.length % 3,
|
2560
|
+
h = i > 0 ? (s.slice(0, i) + (s.length > 3 ? ',' : '')) : '',
|
2561
|
+
f = '.' + value.toFixed(2).slice(-2)
|
2562
|
+
return sign + h + s.slice(i).replace(/(\d{3})(?=\d)/g, '$1,') + f
|
2563
|
+
},
|
2564
|
+
|
2565
|
+
/**
|
2566
|
+
* args: an array of strings corresponding to
|
2567
|
+
* the single, double, triple ... forms of the word to
|
2568
|
+
* be pluralized. When the number to be pluralized
|
2569
|
+
* exceeds the length of the args, it will use the last
|
2570
|
+
* entry in the array.
|
2571
|
+
*
|
2572
|
+
* e.g. ['single', 'double', 'triple', 'multiple']
|
2573
|
+
*/
|
2574
|
+
pluralize: function (value, args) {
|
2575
|
+
return args.length > 1
|
2576
|
+
? (args[value - 1] || args[args.length - 1])
|
2577
|
+
: (args[value - 1] || args[0] + 's')
|
2578
|
+
},
|
2579
|
+
|
2580
|
+
/**
|
2581
|
+
* A special filter that takes a handler function,
|
2582
|
+
* wraps it so it only gets triggered on specific keypresses.
|
2583
|
+
*/
|
2584
|
+
key: function (handler, args) {
|
2585
|
+
if (!handler) return
|
2586
|
+
var code = keyCodes[args[0]]
|
2587
|
+
if (!code) {
|
2588
|
+
code = parseInt(args[0], 10)
|
2589
|
+
}
|
2590
|
+
return function (e) {
|
2591
|
+
if (e.keyCode === code) {
|
2592
|
+
handler.call(this, e)
|
2593
|
+
}
|
2594
|
+
}
|
2595
|
+
}
|
2596
|
+
}
|
2597
|
+
});
|
2598
|
+
require.register("vue/src/transition.js", function(exports, require, module){
|
2599
|
+
var endEvent = sniffTransitionEndEvent(),
|
2600
|
+
config = require('./config'),
|
2601
|
+
// exit codes for testing
|
2602
|
+
codes = {
|
2603
|
+
CSS_E : 1,
|
2604
|
+
CSS_L : 2,
|
2605
|
+
JS_E : 3,
|
2606
|
+
JS_L : 4,
|
2607
|
+
CSS_SKIP : -1,
|
2608
|
+
JS_SKIP : -2,
|
2609
|
+
JS_SKIP_E : -3,
|
2610
|
+
JS_SKIP_L : -4,
|
2611
|
+
INIT : -5,
|
2612
|
+
SKIP : -6
|
2613
|
+
}
|
2614
|
+
|
2615
|
+
/**
|
2616
|
+
* stage:
|
2617
|
+
* 1 = enter
|
2618
|
+
* 2 = leave
|
2619
|
+
*/
|
2620
|
+
var transition = module.exports = function (el, stage, cb, compiler) {
|
2621
|
+
|
2622
|
+
var changeState = function () {
|
2623
|
+
cb()
|
2624
|
+
compiler.execHook(stage > 0 ? 'enteredView' : 'leftView')
|
2625
|
+
}
|
2626
|
+
|
2627
|
+
if (compiler.init) {
|
2628
|
+
changeState()
|
2629
|
+
return codes.INIT
|
2630
|
+
}
|
2631
|
+
|
2632
|
+
var transitionId = el.vue_trans
|
2633
|
+
|
2634
|
+
if (transitionId) {
|
2635
|
+
return applyTransitionFunctions(
|
2636
|
+
el,
|
2637
|
+
stage,
|
2638
|
+
changeState,
|
2639
|
+
transitionId,
|
2640
|
+
compiler
|
2641
|
+
)
|
2642
|
+
} else if (transitionId === '') {
|
2643
|
+
return applyTransitionClass(
|
2644
|
+
el,
|
2645
|
+
stage,
|
2646
|
+
changeState
|
2647
|
+
)
|
2648
|
+
} else {
|
2649
|
+
changeState()
|
2650
|
+
return codes.SKIP
|
2651
|
+
}
|
2652
|
+
|
2653
|
+
}
|
2654
|
+
|
2655
|
+
transition.codes = codes
|
2656
|
+
|
2657
|
+
/**
|
2658
|
+
* Togggle a CSS class to trigger transition
|
2659
|
+
*/
|
2660
|
+
function applyTransitionClass (el, stage, changeState) {
|
2661
|
+
|
2662
|
+
if (!endEvent) {
|
2663
|
+
changeState()
|
2664
|
+
return codes.CSS_SKIP
|
2665
|
+
}
|
2666
|
+
|
2667
|
+
var classList = el.classList,
|
2668
|
+
lastLeaveCallback = el.vue_trans_cb
|
2669
|
+
|
2670
|
+
if (stage > 0) { // enter
|
2671
|
+
|
2672
|
+
// cancel unfinished leave transition
|
2673
|
+
if (lastLeaveCallback) {
|
2674
|
+
el.removeEventListener(endEvent, lastLeaveCallback)
|
2675
|
+
el.vue_trans_cb = null
|
2676
|
+
}
|
2677
|
+
|
2678
|
+
// set to hidden state before appending
|
2679
|
+
classList.add(config.enterClass)
|
2680
|
+
// append
|
2681
|
+
changeState()
|
2682
|
+
// force a layout so transition can be triggered
|
2683
|
+
/* jshint unused: false */
|
2684
|
+
var forceLayout = el.clientHeight
|
2685
|
+
// trigger transition
|
2686
|
+
classList.remove(config.enterClass)
|
2687
|
+
return codes.CSS_E
|
2688
|
+
|
2689
|
+
} else { // leave
|
2690
|
+
|
2691
|
+
// trigger hide transition
|
2692
|
+
classList.add(config.leaveClass)
|
2693
|
+
var onEnd = function (e) {
|
2694
|
+
if (e.target === el) {
|
2695
|
+
el.removeEventListener(endEvent, onEnd)
|
2696
|
+
el.vue_trans_cb = null
|
2697
|
+
// actually remove node here
|
2698
|
+
changeState()
|
2699
|
+
classList.remove(config.leaveClass)
|
2700
|
+
}
|
2701
|
+
}
|
2702
|
+
// attach transition end listener
|
2703
|
+
el.addEventListener(endEvent, onEnd)
|
2704
|
+
el.vue_trans_cb = onEnd
|
2705
|
+
return codes.CSS_L
|
2706
|
+
|
2707
|
+
}
|
2708
|
+
|
2709
|
+
}
|
2710
|
+
|
2711
|
+
function applyTransitionFunctions (el, stage, changeState, functionId, compiler) {
|
2712
|
+
|
2713
|
+
var funcs = compiler.getOption('transitions', functionId)
|
2714
|
+
if (!funcs) {
|
2715
|
+
changeState()
|
2716
|
+
return codes.JS_SKIP
|
2717
|
+
}
|
2718
|
+
|
2719
|
+
var enter = funcs.enter,
|
2720
|
+
leave = funcs.leave
|
2721
|
+
|
2722
|
+
if (stage > 0) { // enter
|
2723
|
+
if (typeof enter !== 'function') {
|
2724
|
+
changeState()
|
2725
|
+
return codes.JS_SKIP_E
|
2726
|
+
}
|
2727
|
+
enter(el, changeState)
|
2728
|
+
return codes.JS_E
|
2729
|
+
} else { // leave
|
2730
|
+
if (typeof leave !== 'function') {
|
2731
|
+
changeState()
|
2732
|
+
return codes.JS_SKIP_L
|
2733
|
+
}
|
2734
|
+
leave(el, changeState)
|
2735
|
+
return codes.JS_L
|
2736
|
+
}
|
2737
|
+
|
2738
|
+
}
|
2739
|
+
|
2740
|
+
/**
|
2741
|
+
* Sniff proper transition end event name
|
2742
|
+
*/
|
2743
|
+
function sniffTransitionEndEvent () {
|
2744
|
+
var el = document.createElement('vue'),
|
2745
|
+
defaultEvent = 'transitionend',
|
2746
|
+
events = {
|
2747
|
+
'transition' : defaultEvent,
|
2748
|
+
'mozTransition' : defaultEvent,
|
2749
|
+
'webkitTransition' : 'webkitTransitionEnd'
|
2750
|
+
}
|
2751
|
+
for (var name in events) {
|
2752
|
+
if (el.style[name] !== undefined) {
|
2753
|
+
return events[name]
|
2754
|
+
}
|
2755
|
+
}
|
2756
|
+
}
|
2757
|
+
});
|
2758
|
+
require.register("vue/src/batcher.js", function(exports, require, module){
|
2759
|
+
var utils = require('./utils'),
|
2760
|
+
queue, has, waiting
|
2761
|
+
|
2762
|
+
reset()
|
2763
|
+
|
2764
|
+
exports.queue = function (binding) {
|
2765
|
+
if (!has[binding.id]) {
|
2766
|
+
queue.push(binding)
|
2767
|
+
has[binding.id] = true
|
2768
|
+
if (!waiting) {
|
2769
|
+
waiting = true
|
2770
|
+
utils.nextTick(flush)
|
2771
|
+
}
|
2772
|
+
}
|
2773
|
+
}
|
2774
|
+
|
2775
|
+
function flush () {
|
2776
|
+
for (var i = 0; i < queue.length; i++) {
|
2777
|
+
var b = queue[i]
|
2778
|
+
if (b.unbound) continue
|
2779
|
+
b._update()
|
2780
|
+
has[b.id] = false
|
2781
|
+
}
|
2782
|
+
reset()
|
2783
|
+
}
|
2784
|
+
|
2785
|
+
function reset () {
|
2786
|
+
queue = []
|
2787
|
+
has = utils.hash()
|
2788
|
+
waiting = false
|
2789
|
+
}
|
2790
|
+
});
|
2791
|
+
require.register("vue/src/directives/index.js", function(exports, require, module){
|
2792
|
+
var utils = require('../utils'),
|
2793
|
+
transition = require('../transition')
|
2794
|
+
|
2795
|
+
module.exports = {
|
2796
|
+
|
2797
|
+
on : require('./on'),
|
2798
|
+
repeat : require('./repeat'),
|
2799
|
+
model : require('./model'),
|
2800
|
+
'if' : require('./if'),
|
2801
|
+
'with' : require('./with'),
|
2802
|
+
|
2803
|
+
attr: function (value) {
|
2804
|
+
this.el.setAttribute(this.arg, value)
|
2805
|
+
},
|
2806
|
+
|
2807
|
+
text: function (value) {
|
2808
|
+
this.el.textContent = utils.toText(value)
|
2809
|
+
},
|
2810
|
+
|
2811
|
+
html: function (value) {
|
2812
|
+
this.el.innerHTML = utils.toText(value)
|
2813
|
+
},
|
2814
|
+
|
2815
|
+
show: function (value) {
|
2816
|
+
var el = this.el,
|
2817
|
+
target = value ? '' : 'none',
|
2818
|
+
change = function () {
|
2819
|
+
el.style.display = target
|
2820
|
+
}
|
2821
|
+
transition(el, value ? 1 : -1, change, this.compiler)
|
2822
|
+
},
|
2823
|
+
|
2824
|
+
'class': function (value) {
|
2825
|
+
if (this.arg) {
|
2826
|
+
this.el.classList[value ? 'add' : 'remove'](this.arg)
|
2827
|
+
} else {
|
2828
|
+
if (this.lastVal) {
|
2829
|
+
this.el.classList.remove(this.lastVal)
|
2830
|
+
}
|
2831
|
+
if (value) {
|
2832
|
+
this.el.classList.add(value)
|
2833
|
+
this.lastVal = value
|
2834
|
+
}
|
2835
|
+
}
|
2836
|
+
}
|
2837
|
+
|
2838
|
+
}
|
2839
|
+
});
|
2840
|
+
require.register("vue/src/directives/if.js", function(exports, require, module){
|
2841
|
+
var config = require('../config'),
|
2842
|
+
transition = require('../transition')
|
2843
|
+
|
2844
|
+
module.exports = {
|
2845
|
+
|
2846
|
+
bind: function () {
|
2847
|
+
this.parent = this.el.parentNode
|
2848
|
+
this.ref = document.createComment(config.prefix + '-if-' + this.key)
|
2849
|
+
this.el.vue_ref = this.ref
|
2850
|
+
},
|
2851
|
+
|
2852
|
+
update: function (value) {
|
2853
|
+
|
2854
|
+
var el = this.el
|
2855
|
+
|
2856
|
+
if (!this.parent) { // the node was detached when bound
|
2857
|
+
if (!el.parentNode) {
|
2858
|
+
return
|
2859
|
+
} else {
|
2860
|
+
this.parent = el.parentNode
|
2861
|
+
}
|
2862
|
+
}
|
2863
|
+
|
2864
|
+
// should always have this.parent if we reach here
|
2865
|
+
var parent = this.parent,
|
2866
|
+
ref = this.ref,
|
2867
|
+
compiler = this.compiler
|
2868
|
+
|
2869
|
+
if (!value) {
|
2870
|
+
transition(el, -1, remove, compiler)
|
2871
|
+
} else {
|
2872
|
+
transition(el, 1, insert, compiler)
|
2873
|
+
}
|
2874
|
+
|
2875
|
+
function remove () {
|
2876
|
+
if (!el.parentNode) return
|
2877
|
+
// insert the reference node
|
2878
|
+
var next = el.nextSibling
|
2879
|
+
if (next) {
|
2880
|
+
parent.insertBefore(ref, next)
|
2881
|
+
} else {
|
2882
|
+
parent.appendChild(ref)
|
2883
|
+
}
|
2884
|
+
parent.removeChild(el)
|
2885
|
+
}
|
2886
|
+
|
2887
|
+
function insert () {
|
2888
|
+
if (el.parentNode) return
|
2889
|
+
parent.insertBefore(el, ref)
|
2890
|
+
parent.removeChild(ref)
|
2891
|
+
}
|
2892
|
+
},
|
2893
|
+
|
2894
|
+
unbind: function () {
|
2895
|
+
this.el.vue_ref = null
|
2896
|
+
}
|
2897
|
+
}
|
2898
|
+
});
|
2899
|
+
require.register("vue/src/directives/repeat.js", function(exports, require, module){
|
2900
|
+
var Observer = require('../observer'),
|
2901
|
+
Emitter = require('../emitter'),
|
2902
|
+
utils = require('../utils'),
|
2903
|
+
config = require('../config'),
|
2904
|
+
transition = require('../transition'),
|
2905
|
+
ViewModel // lazy def to avoid circular dependency
|
2906
|
+
|
2907
|
+
/**
|
2908
|
+
* Mathods that perform precise DOM manipulation
|
2909
|
+
* based on mutator method triggered
|
2910
|
+
*/
|
2911
|
+
var mutationHandlers = {
|
2912
|
+
|
2913
|
+
push: function (m) {
|
2914
|
+
var i, l = m.args.length,
|
2915
|
+
base = this.collection.length - l
|
2916
|
+
for (i = 0; i < l; i++) {
|
2917
|
+
this.buildItem(m.args[i], base + i)
|
2918
|
+
}
|
2919
|
+
},
|
2920
|
+
|
2921
|
+
pop: function () {
|
2922
|
+
var vm = this.vms.pop()
|
2923
|
+
if (vm) vm.$destroy()
|
2924
|
+
},
|
2925
|
+
|
2926
|
+
unshift: function (m) {
|
2927
|
+
var i, l = m.args.length
|
2928
|
+
for (i = 0; i < l; i++) {
|
2929
|
+
this.buildItem(m.args[i], i)
|
2930
|
+
}
|
2931
|
+
},
|
2932
|
+
|
2933
|
+
shift: function () {
|
2934
|
+
var vm = this.vms.shift()
|
2935
|
+
if (vm) vm.$destroy()
|
2936
|
+
},
|
2937
|
+
|
2938
|
+
splice: function (m) {
|
2939
|
+
var i, l,
|
2940
|
+
index = m.args[0],
|
2941
|
+
removed = m.args[1],
|
2942
|
+
added = m.args.length - 2,
|
2943
|
+
removedVMs = this.vms.splice(index, removed)
|
2944
|
+
for (i = 0, l = removedVMs.length; i < l; i++) {
|
2945
|
+
removedVMs[i].$destroy()
|
2946
|
+
}
|
2947
|
+
for (i = 0; i < added; i++) {
|
2948
|
+
this.buildItem(m.args[i + 2], index + i)
|
2949
|
+
}
|
2950
|
+
},
|
2951
|
+
|
2952
|
+
sort: function () {
|
2953
|
+
var vms = this.vms,
|
2954
|
+
col = this.collection,
|
2955
|
+
l = col.length,
|
2956
|
+
sorted = new Array(l),
|
2957
|
+
i, j, vm, data
|
2958
|
+
for (i = 0; i < l; i++) {
|
2959
|
+
data = col[i]
|
2960
|
+
for (j = 0; j < l; j++) {
|
2961
|
+
vm = vms[j]
|
2962
|
+
if (vm.$data === data) {
|
2963
|
+
sorted[i] = vm
|
2964
|
+
break
|
2965
|
+
}
|
2966
|
+
}
|
2967
|
+
}
|
2968
|
+
for (i = 0; i < l; i++) {
|
2969
|
+
this.container.insertBefore(sorted[i].$el, this.ref)
|
2970
|
+
}
|
2971
|
+
this.vms = sorted
|
2972
|
+
},
|
2973
|
+
|
2974
|
+
reverse: function () {
|
2975
|
+
var vms = this.vms
|
2976
|
+
vms.reverse()
|
2977
|
+
for (var i = 0, l = vms.length; i < l; i++) {
|
2978
|
+
this.container.insertBefore(vms[i].$el, this.ref)
|
2979
|
+
}
|
2980
|
+
}
|
2981
|
+
}
|
2982
|
+
|
2983
|
+
module.exports = {
|
2984
|
+
|
2985
|
+
bind: function () {
|
2986
|
+
|
2987
|
+
var self = this,
|
2988
|
+
el = self.el,
|
2989
|
+
ctn = self.container = el.parentNode
|
2990
|
+
|
2991
|
+
// extract child VM information, if any
|
2992
|
+
ViewModel = ViewModel || require('../viewmodel')
|
2993
|
+
self.Ctor = self.Ctor || ViewModel
|
2994
|
+
|
2995
|
+
// extract transition information
|
2996
|
+
self.hasTrans = el.hasAttribute(config.attrs.transition)
|
2997
|
+
|
2998
|
+
// create a comment node as a reference node for DOM insertions
|
2999
|
+
self.ref = document.createComment(config.prefix + '-repeat-' + self.key)
|
3000
|
+
ctn.insertBefore(self.ref, el)
|
3001
|
+
ctn.removeChild(el)
|
3002
|
+
|
3003
|
+
self.initiated = false
|
3004
|
+
self.collection = null
|
3005
|
+
self.vms = null
|
3006
|
+
self.mutationListener = function (path, arr, mutation) {
|
3007
|
+
var method = mutation.method
|
3008
|
+
mutationHandlers[method].call(self, mutation)
|
3009
|
+
if (method !== 'push' && method !== 'pop') {
|
3010
|
+
self.updateIndexes()
|
3011
|
+
}
|
3012
|
+
}
|
3013
|
+
|
3014
|
+
},
|
3015
|
+
|
3016
|
+
update: function (collection) {
|
3017
|
+
|
3018
|
+
this.unbind(true)
|
3019
|
+
// attach an object to container to hold handlers
|
3020
|
+
this.container.vue_dHandlers = utils.hash()
|
3021
|
+
// if initiating with an empty collection, we need to
|
3022
|
+
// force a compile so that we get all the bindings for
|
3023
|
+
// dependency extraction.
|
3024
|
+
if (!this.initiated && (!collection || !collection.length)) {
|
3025
|
+
this.buildItem()
|
3026
|
+
this.initiated = true
|
3027
|
+
}
|
3028
|
+
collection = this.collection = collection || []
|
3029
|
+
this.vms = []
|
3030
|
+
|
3031
|
+
// listen for collection mutation events
|
3032
|
+
// the collection has been augmented during Binding.set()
|
3033
|
+
if (!collection.__observer__) Observer.watchArray(collection, null, new Emitter())
|
3034
|
+
collection.__observer__.on('mutate', this.mutationListener)
|
3035
|
+
|
3036
|
+
// create child-vms and append to DOM
|
3037
|
+
if (collection.length) {
|
3038
|
+
for (var i = 0, l = collection.length; i < l; i++) {
|
3039
|
+
this.buildItem(collection[i], i)
|
3040
|
+
}
|
3041
|
+
}
|
3042
|
+
},
|
3043
|
+
|
3044
|
+
/**
|
3045
|
+
* Create a new child VM from a data object
|
3046
|
+
* passing along compiler options indicating this
|
3047
|
+
* is a v-repeat item.
|
3048
|
+
*/
|
3049
|
+
buildItem: function (data, index) {
|
3050
|
+
|
3051
|
+
var node = this.el.cloneNode(true),
|
3052
|
+
ctn = this.container,
|
3053
|
+
ref, item
|
3054
|
+
|
3055
|
+
// append node into DOM first
|
3056
|
+
// so v-if can get access to parentNode
|
3057
|
+
if (data) {
|
3058
|
+
ref = this.vms.length > index
|
3059
|
+
? this.vms[index].$el
|
3060
|
+
: this.ref
|
3061
|
+
// make sure it works with v-if
|
3062
|
+
if (!ref.parentNode) ref = ref.vue_ref
|
3063
|
+
// process transition info before appending
|
3064
|
+
node.vue_trans = utils.attr(node, 'transition', true)
|
3065
|
+
transition(node, 1, function () {
|
3066
|
+
ctn.insertBefore(node, ref)
|
3067
|
+
}, this.compiler)
|
3068
|
+
}
|
3069
|
+
|
3070
|
+
item = new this.Ctor({
|
3071
|
+
el: node,
|
3072
|
+
data: data,
|
3073
|
+
compilerOptions: {
|
3074
|
+
repeat: true,
|
3075
|
+
repeatIndex: index,
|
3076
|
+
repeatCollection: this.collection,
|
3077
|
+
parentCompiler: this.compiler,
|
3078
|
+
delegator: ctn
|
3079
|
+
}
|
3080
|
+
})
|
3081
|
+
|
3082
|
+
if (!data) {
|
3083
|
+
// this is a forced compile for an empty collection.
|
3084
|
+
// let's remove it...
|
3085
|
+
item.$destroy()
|
3086
|
+
} else {
|
3087
|
+
this.vms.splice(index, 0, item)
|
3088
|
+
}
|
3089
|
+
},
|
3090
|
+
|
3091
|
+
/**
|
3092
|
+
* Update index of each item after a mutation
|
3093
|
+
*/
|
3094
|
+
updateIndexes: function () {
|
3095
|
+
var i = this.vms.length
|
3096
|
+
while (i--) {
|
3097
|
+
this.vms[i].$data.$index = i
|
3098
|
+
}
|
3099
|
+
},
|
3100
|
+
|
3101
|
+
unbind: function () {
|
3102
|
+
if (this.collection) {
|
3103
|
+
this.collection.__observer__.off('mutate', this.mutationListener)
|
3104
|
+
var i = this.vms.length
|
3105
|
+
while (i--) {
|
3106
|
+
this.vms[i].$destroy()
|
3107
|
+
}
|
3108
|
+
}
|
3109
|
+
var ctn = this.container,
|
3110
|
+
handlers = ctn.vue_dHandlers
|
3111
|
+
for (var key in handlers) {
|
3112
|
+
ctn.removeEventListener(handlers[key].event, handlers[key])
|
3113
|
+
}
|
3114
|
+
ctn.vue_dHandlers = null
|
3115
|
+
}
|
3116
|
+
}
|
3117
|
+
});
|
3118
|
+
require.register("vue/src/directives/on.js", function(exports, require, module){
|
3119
|
+
var utils = require('../utils')
|
3120
|
+
|
3121
|
+
function delegateCheck (el, root, identifier) {
|
3122
|
+
while (el && el !== root) {
|
3123
|
+
if (el[identifier]) return el
|
3124
|
+
el = el.parentNode
|
3125
|
+
}
|
3126
|
+
}
|
3127
|
+
|
3128
|
+
module.exports = {
|
3129
|
+
|
3130
|
+
isFn: true,
|
3131
|
+
|
3132
|
+
bind: function () {
|
3133
|
+
if (this.compiler.repeat) {
|
3134
|
+
// attach an identifier to the el
|
3135
|
+
// so it can be matched during event delegation
|
3136
|
+
this.el[this.expression] = true
|
3137
|
+
// attach the owner viewmodel of this directive
|
3138
|
+
this.el.vue_viewmodel = this.vm
|
3139
|
+
}
|
3140
|
+
},
|
3141
|
+
|
3142
|
+
update: function (handler) {
|
3143
|
+
this.unbind(true)
|
3144
|
+
if (typeof handler !== 'function') {
|
3145
|
+
return utils.warn('Directive "on" expects a function value.')
|
3146
|
+
}
|
3147
|
+
|
3148
|
+
var compiler = this.compiler,
|
3149
|
+
event = this.arg,
|
3150
|
+
isExp = this.binding.isExp,
|
3151
|
+
ownerVM = this.binding.compiler.vm
|
3152
|
+
|
3153
|
+
if (compiler.repeat &&
|
3154
|
+
// do not delegate if the repeat is combined with an extended VM
|
3155
|
+
!this.vm.constructor.super &&
|
3156
|
+
// blur and focus events do not bubble
|
3157
|
+
event !== 'blur' && event !== 'focus') {
|
3158
|
+
|
3159
|
+
// for each blocks, delegate for better performance
|
3160
|
+
// focus and blur events dont bubble so exclude them
|
3161
|
+
var delegator = compiler.delegator,
|
3162
|
+
identifier = this.expression,
|
3163
|
+
dHandler = delegator.vue_dHandlers[identifier]
|
3164
|
+
|
3165
|
+
if (dHandler) return
|
3166
|
+
|
3167
|
+
// the following only gets run once for the entire each block
|
3168
|
+
dHandler = delegator.vue_dHandlers[identifier] = function (e) {
|
3169
|
+
var target = delegateCheck(e.target, delegator, identifier)
|
3170
|
+
if (target) {
|
3171
|
+
e.el = target
|
3172
|
+
e.targetVM = target.vue_viewmodel
|
3173
|
+
handler.call(isExp ? e.targetVM : ownerVM, e)
|
3174
|
+
}
|
3175
|
+
}
|
3176
|
+
dHandler.event = event
|
3177
|
+
delegator.addEventListener(event, dHandler)
|
3178
|
+
|
3179
|
+
} else {
|
3180
|
+
|
3181
|
+
// a normal, single element handler
|
3182
|
+
var vm = this.vm
|
3183
|
+
this.handler = function (e) {
|
3184
|
+
e.el = e.currentTarget
|
3185
|
+
e.targetVM = vm
|
3186
|
+
handler.call(ownerVM, e)
|
3187
|
+
}
|
3188
|
+
this.el.addEventListener(event, this.handler)
|
3189
|
+
|
3190
|
+
}
|
3191
|
+
},
|
3192
|
+
|
3193
|
+
unbind: function (update) {
|
3194
|
+
this.el.removeEventListener(this.arg, this.handler)
|
3195
|
+
this.handler = null
|
3196
|
+
if (!update) this.el.vue_viewmodel = null
|
3197
|
+
}
|
3198
|
+
}
|
3199
|
+
});
|
3200
|
+
require.register("vue/src/directives/model.js", function(exports, require, module){
|
3201
|
+
var utils = require('../utils'),
|
3202
|
+
isIE9 = navigator.userAgent.indexOf('MSIE 9.0') > 0
|
3203
|
+
|
3204
|
+
module.exports = {
|
3205
|
+
|
3206
|
+
bind: function () {
|
3207
|
+
|
3208
|
+
var self = this,
|
3209
|
+
el = self.el,
|
3210
|
+
type = el.type,
|
3211
|
+
tag = el.tagName
|
3212
|
+
|
3213
|
+
self.lock = false
|
3214
|
+
|
3215
|
+
// determine what event to listen to
|
3216
|
+
self.event =
|
3217
|
+
(self.compiler.options.lazy ||
|
3218
|
+
tag === 'SELECT' ||
|
3219
|
+
type === 'checkbox' || type === 'radio')
|
3220
|
+
? 'change'
|
3221
|
+
: 'input'
|
3222
|
+
|
3223
|
+
// determine the attribute to change when updating
|
3224
|
+
var attr = self.attr = type === 'checkbox'
|
3225
|
+
? 'checked'
|
3226
|
+
: (tag === 'INPUT' || tag === 'SELECT' || tag === 'TEXTAREA')
|
3227
|
+
? 'value'
|
3228
|
+
: 'innerHTML'
|
3229
|
+
|
3230
|
+
var compositionLock = false
|
3231
|
+
this.cLock = function () {
|
3232
|
+
compositionLock = true
|
3233
|
+
}
|
3234
|
+
this.cUnlock = function () {
|
3235
|
+
compositionLock = false
|
3236
|
+
}
|
3237
|
+
el.addEventListener('compositionstart', this.cLock)
|
3238
|
+
el.addEventListener('compositionend', this.cUnlock)
|
3239
|
+
|
3240
|
+
// attach listener
|
3241
|
+
self.set = self.filters
|
3242
|
+
? function () {
|
3243
|
+
if (compositionLock) return
|
3244
|
+
// if this directive has filters
|
3245
|
+
// we need to let the vm.$set trigger
|
3246
|
+
// update() so filters are applied.
|
3247
|
+
// therefore we have to record cursor position
|
3248
|
+
// so that after vm.$set changes the input
|
3249
|
+
// value we can put the cursor back at where it is
|
3250
|
+
var cursorPos
|
3251
|
+
try {
|
3252
|
+
cursorPos = el.selectionStart
|
3253
|
+
} catch (e) {}
|
3254
|
+
self.vm.$set(self.key, el[attr])
|
3255
|
+
// since updates are async
|
3256
|
+
// we need to reset cursor position async too
|
3257
|
+
utils.nextTick(function () {
|
3258
|
+
if (cursorPos !== undefined) {
|
3259
|
+
el.setSelectionRange(cursorPos, cursorPos)
|
3260
|
+
}
|
3261
|
+
})
|
3262
|
+
}
|
3263
|
+
: function () {
|
3264
|
+
if (compositionLock) return
|
3265
|
+
// no filters, don't let it trigger update()
|
3266
|
+
self.lock = true
|
3267
|
+
self.vm.$set(self.key, el[attr])
|
3268
|
+
utils.nextTick(function () {
|
3269
|
+
self.lock = false
|
3270
|
+
})
|
3271
|
+
}
|
3272
|
+
el.addEventListener(self.event, self.set)
|
3273
|
+
|
3274
|
+
// fix shit for IE9
|
3275
|
+
// since it doesn't fire input on backspace / del / cut
|
3276
|
+
if (isIE9) {
|
3277
|
+
self.onCut = function () {
|
3278
|
+
// cut event fires before the value actually changes
|
3279
|
+
utils.nextTick(function () {
|
3280
|
+
self.set()
|
3281
|
+
})
|
3282
|
+
}
|
3283
|
+
self.onDel = function (e) {
|
3284
|
+
if (e.keyCode === 46 || e.keyCode === 8) {
|
3285
|
+
self.set()
|
3286
|
+
}
|
3287
|
+
}
|
3288
|
+
el.addEventListener('cut', self.onCut)
|
3289
|
+
el.addEventListener('keyup', self.onDel)
|
3290
|
+
}
|
3291
|
+
},
|
3292
|
+
|
3293
|
+
update: function (value) {
|
3294
|
+
if (this.lock) return
|
3295
|
+
/* jshint eqeqeq: false */
|
3296
|
+
var self = this,
|
3297
|
+
el = self.el
|
3298
|
+
if (el.tagName === 'SELECT') { // select dropdown
|
3299
|
+
// setting <select>'s value in IE9 doesn't work
|
3300
|
+
var o = el.options,
|
3301
|
+
i = o.length,
|
3302
|
+
index = -1
|
3303
|
+
while (i--) {
|
3304
|
+
if (o[i].value == value) {
|
3305
|
+
index = i
|
3306
|
+
break
|
3307
|
+
}
|
3308
|
+
}
|
3309
|
+
o.selectedIndex = index
|
3310
|
+
} else if (el.type === 'radio') { // radio button
|
3311
|
+
el.checked = value == el.value
|
3312
|
+
} else if (el.type === 'checkbox') { // checkbox
|
3313
|
+
el.checked = !!value
|
3314
|
+
} else {
|
3315
|
+
el[self.attr] = utils.toText(value)
|
3316
|
+
}
|
3317
|
+
},
|
3318
|
+
|
3319
|
+
unbind: function () {
|
3320
|
+
var el = this.el
|
3321
|
+
el.removeEventListener(this.event, this.set)
|
3322
|
+
el.removeEventListener('compositionstart', this.cLock)
|
3323
|
+
el.removeEventListener('compositionend', this.cUnlock)
|
3324
|
+
if (isIE9) {
|
3325
|
+
el.removeEventListener('cut', this.onCut)
|
3326
|
+
el.removeEventListener('keyup', this.onDel)
|
3327
|
+
}
|
3328
|
+
}
|
3329
|
+
}
|
3330
|
+
});
|
3331
|
+
require.register("vue/src/directives/with.js", function(exports, require, module){
|
3332
|
+
var ViewModel
|
3333
|
+
|
3334
|
+
module.exports = {
|
3335
|
+
|
3336
|
+
bind: function () {
|
3337
|
+
if (this.isEmpty) {
|
3338
|
+
this.build()
|
3339
|
+
}
|
3340
|
+
},
|
3341
|
+
|
3342
|
+
update: function (value) {
|
3343
|
+
if (!this.component) {
|
3344
|
+
this.build(value)
|
3345
|
+
} else {
|
3346
|
+
this.component.$data = value
|
3347
|
+
}
|
3348
|
+
},
|
3349
|
+
|
3350
|
+
build: function (value) {
|
3351
|
+
ViewModel = ViewModel || require('../viewmodel')
|
3352
|
+
var Ctor = this.Ctor || ViewModel
|
3353
|
+
this.component = new Ctor({
|
3354
|
+
el: this.el,
|
3355
|
+
data: value,
|
3356
|
+
compilerOptions: {
|
3357
|
+
parentCompiler: this.compiler
|
3358
|
+
}
|
3359
|
+
})
|
3360
|
+
},
|
3361
|
+
|
3362
|
+
unbind: function () {
|
3363
|
+
this.component.$destroy()
|
3364
|
+
}
|
3365
|
+
|
3366
|
+
}
|
3367
|
+
});
|
3368
|
+
require.alias("component-emitter/index.js", "vue/deps/emitter/index.js");
|
3369
|
+
require.alias("component-emitter/index.js", "emitter/index.js");
|
3370
|
+
|
3371
|
+
require.alias("vue/src/main.js", "vue/index.js");
|
3372
|
+
if (typeof exports == "object") {
|
3373
|
+
module.exports = require("vue");
|
3374
|
+
} else if (typeof define == "function" && define.amd) {
|
3375
|
+
define(function(){ return require("vue"); });
|
3376
|
+
} else {
|
3377
|
+
this["Vue"] = require("vue");
|
3378
|
+
}})();
|