/files/vue/0.12.6/vue.js
JavaScript | 2202 lines | 1172 code | 269 blank | 761 comment | 208 complexity | a5baba801995bd480cee2383ac343706 MD5 | raw file
- /**
- * Vue.js v0.12.6
- * (c) 2015 Evan You
- * Released under the MIT License.
- */
- (function webpackUniversalModuleDefinition(root, factory) {
- if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory();
- else if(typeof define === 'function' && define.amd)
- define(factory);
- else if(typeof exports === 'object')
- exports["Vue"] = factory();
- else
- root["Vue"] = factory();
- })(this, function() {
- return /******/ (function(modules) { // webpackBootstrap
- /******/ // The module cache
- /******/ var installedModules = {};
- /******/ // The require function
- /******/ function __webpack_require__(moduleId) {
- /******/ // Check if module is in cache
- /******/ if(installedModules[moduleId])
- /******/ return installedModules[moduleId].exports;
- /******/ // Create a new module (and put it into the cache)
- /******/ var module = installedModules[moduleId] = {
- /******/ exports: {},
- /******/ id: moduleId,
- /******/ loaded: false
- /******/ };
- /******/ // Execute the module function
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
- /******/ // Flag the module as loaded
- /******/ module.loaded = true;
- /******/ // Return the exports of the module
- /******/ return module.exports;
- /******/ }
- /******/ // expose the modules object (__webpack_modules__)
- /******/ __webpack_require__.m = modules;
- /******/ // expose the module cache
- /******/ __webpack_require__.c = installedModules;
- /******/ // __webpack_public_path__
- /******/ __webpack_require__.p = "";
- /******/ // Load entry module and return exports
- /******/ return __webpack_require__(0);
- /******/ })
- /************************************************************************/
- /******/ ([
- /* 0 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- var extend = _.extend
- /**
- * The exposed Vue constructor.
- *
- * API conventions:
- * - public API methods/properties are prefiexed with `$`
- * - internal methods/properties are prefixed with `_`
- * - non-prefixed properties are assumed to be proxied user
- * data.
- *
- * @constructor
- * @param {Object} [options]
- * @public
- */
- function Vue (options) {
- this._init(options)
- }
- /**
- * Mixin global API
- */
- extend(Vue, __webpack_require__(9))
- /**
- * Vue and every constructor that extends Vue has an
- * associated options object, which can be accessed during
- * compilation steps as `this.constructor.options`.
- *
- * These can be seen as the default options of every
- * Vue instance.
- */
- Vue.options = {
- replace: true,
- directives: __webpack_require__(28),
- elementDirectives: __webpack_require__(50),
- filters: __webpack_require__(53),
- transitions: {},
- components: {},
- partials: {}
- }
- /**
- * Build up the prototype
- */
- var p = Vue.prototype
- /**
- * $data has a setter which does a bunch of
- * teardown/setup work
- */
- Object.defineProperty(p, '$data', {
- get: function () {
- return this._data
- },
- set: function (newData) {
- if (newData !== this._data) {
- this._setData(newData)
- }
- }
- })
- /**
- * Mixin internal instance methods
- */
- extend(p, __webpack_require__(55))
- extend(p, __webpack_require__(56))
- extend(p, __webpack_require__(57))
- extend(p, __webpack_require__(58))
- extend(p, __webpack_require__(60))
- /**
- * Mixin public API methods
- */
- extend(p, __webpack_require__(61))
- extend(p, __webpack_require__(62))
- extend(p, __webpack_require__(63))
- extend(p, __webpack_require__(64))
- extend(p, __webpack_require__(65))
- module.exports = _.Vue = Vue
- /***/ },
- /* 1 */
- /***/ function(module, exports, __webpack_require__) {
- var lang = __webpack_require__(4)
- var extend = lang.extend
- extend(exports, lang)
- extend(exports, __webpack_require__(5))
- extend(exports, __webpack_require__(6))
- extend(exports, __webpack_require__(2))
- extend(exports, __webpack_require__(7))
- extend(exports, __webpack_require__(8))
- /***/ },
- /* 2 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- var config = __webpack_require__(3)
- /**
- * Assert whether a prop is valid.
- *
- * @param {Object} prop
- * @param {*} value
- */
- exports.assertProp = function (prop, value) {
- var options = prop.options
- var type = options.type
- var valid = true
- var expectedType
- if (type) {
- if (type === String) {
- expectedType = 'string'
- valid = typeof value === expectedType
- } else if (type === Number) {
- expectedType = 'number'
- valid = typeof value === 'number'
- } else if (type === Boolean) {
- expectedType = 'boolean'
- valid = typeof value === 'boolean'
- } else if (type === Function) {
- expectedType = 'function'
- valid = typeof value === 'function'
- } else if (type === Object) {
- expectedType = 'object'
- valid = _.isPlainObject(value)
- } else if (type === Array) {
- expectedType = 'array'
- valid = _.isArray(value)
- } else {
- valid = value instanceof type
- }
- }
- if (!valid) {
- _.warn(
- 'Invalid prop: type check failed for ' +
- prop.path + '="' + prop.raw + '".' +
- ' Expected ' + formatType(expectedType) +
- ', got ' + formatValue(value) + '.'
- )
- return false
- }
- var validator = options.validator
- if (validator) {
- if (!validator.call(null, value)) {
- _.warn(
- 'Invalid prop: custom validator check failed for ' +
- prop.path + '="' + prop.raw + '"'
- )
- return false
- }
- }
- return true
- }
- function formatType (val) {
- return val
- ? val.charAt(0).toUpperCase() + val.slice(1)
- : 'custom type'
- }
- function formatValue (val) {
- return Object.prototype.toString.call(val).slice(8, -1)
- }
- /**
- * Check if an element is a component, if yes return its
- * component id.
- *
- * @param {Element} el
- * @param {Object} options
- * @return {String|undefined}
- */
- exports.commonTagRE = /^(div|p|span|img|a|br|ul|ol|li|h1|h2|h3|h4|h5|code|pre)$/
- exports.checkComponent = function (el, options) {
- var tag = el.tagName.toLowerCase()
- if (tag === 'component') {
- // dynamic syntax
- var exp = el.getAttribute('is')
- el.removeAttribute('is')
- return exp
- } else if (
- !exports.commonTagRE.test(tag) &&
- _.resolveAsset(options, 'components', tag)
- ) {
- return tag
- /* eslint-disable no-cond-assign */
- } else if (tag = _.attr(el, 'component')) {
- /* eslint-enable no-cond-assign */
- return tag
- }
- }
- /**
- * Create an "anchor" for performing dom insertion/removals.
- * This is used in a number of scenarios:
- * - block instance
- * - v-html
- * - v-if
- * - component
- * - repeat
- *
- * @param {String} content
- * @param {Boolean} persist - IE trashes empty textNodes on
- * cloneNode(true), so in certain
- * cases the anchor needs to be
- * non-empty to be persisted in
- * templates.
- * @return {Comment|Text}
- */
- exports.createAnchor = function (content, persist) {
- return config.debug
- ? document.createComment(content)
- : document.createTextNode(persist ? ' ' : '')
- }
- /***/ },
- /* 3 */
- /***/ function(module, exports, __webpack_require__) {
- module.exports = {
- /**
- * The prefix to look for when parsing directives.
- *
- * @type {String}
- */
- prefix: 'v-',
- /**
- * Whether to print debug messages.
- * Also enables stack trace for warnings.
- *
- * @type {Boolean}
- */
- debug: false,
- /**
- * Whether to suppress warnings.
- *
- * @type {Boolean}
- */
- silent: false,
- /**
- * Whether allow observer to alter data objects'
- * __proto__.
- *
- * @type {Boolean}
- */
- proto: true,
- /**
- * Whether to parse mustache tags in templates.
- *
- * @type {Boolean}
- */
- interpolate: true,
- /**
- * Whether to use async rendering.
- */
- async: true,
- /**
- * Whether to warn against errors caught when evaluating
- * expressions.
- */
- warnExpressionErrors: true,
- /**
- * Internal flag to indicate the delimiters have been
- * changed.
- *
- * @type {Boolean}
- */
- _delimitersChanged: true,
- /**
- * List of asset types that a component can own.
- *
- * @type {Array}
- */
- _assetTypes: [
- 'component',
- 'directive',
- 'elementDirective',
- 'filter',
- 'transition',
- 'partial'
- ],
- /**
- * prop binding modes
- */
- _propBindingModes: {
- ONE_WAY: 0,
- TWO_WAY: 1,
- ONE_TIME: 2
- },
- /**
- * Max circular updates allowed in a batcher flush cycle.
- */
- _maxUpdateCount: 100
- }
- /**
- * Interpolation delimiters.
- * We need to mark the changed flag so that the text parser
- * knows it needs to recompile the regex.
- *
- * @type {Array<String>}
- */
- var delimiters = ['{{', '}}']
- Object.defineProperty(module.exports, 'delimiters', {
- get: function () {
- return delimiters
- },
- set: function (val) {
- delimiters = val
- this._delimitersChanged = true
- }
- })
- /***/ },
- /* 4 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * Check is a string starts with $ or _
- *
- * @param {String} str
- * @return {Boolean}
- */
- exports.isReserved = function (str) {
- var c = (str + '').charCodeAt(0)
- return c === 0x24 || c === 0x5F
- }
- /**
- * Guard text output, make sure undefined outputs
- * empty string
- *
- * @param {*} value
- * @return {String}
- */
- exports.toString = function (value) {
- return value == null
- ? ''
- : value.toString()
- }
- /**
- * Check and convert possible numeric numbers before
- * setting back to data
- *
- * @param {*} value
- * @return {*|Number}
- */
- exports.toNumber = function (value) {
- return (
- isNaN(value) ||
- value === null ||
- typeof value === 'boolean'
- ) ? value
- : Number(value)
- }
- /**
- * Convert string boolean literals into real booleans.
- *
- * @param {*} value
- * @return {*|Boolean}
- */
- exports.toBoolean = function (value) {
- return value === 'true'
- ? true
- : value === 'false'
- ? false
- : value
- }
- /**
- * Strip quotes from a string
- *
- * @param {String} str
- * @return {String | false}
- */
- exports.stripQuotes = function (str) {
- var a = str.charCodeAt(0)
- var b = str.charCodeAt(str.length - 1)
- return a === b && (a === 0x22 || a === 0x27)
- ? str.slice(1, -1)
- : false
- }
- /**
- * Camelize a hyphen-delmited string.
- *
- * @param {String} str
- * @return {String}
- */
- exports.camelize = function (str) {
- return str.replace(/-(\w)/g, toUpper)
- }
- function toUpper (_, c) {
- return c ? c.toUpperCase() : ''
- }
- /**
- * Hyphenate a camelCase string.
- *
- * @param {String} str
- * @return {String}
- */
- exports.hyphenate = function (str) {
- return str
- .replace(/([a-z\d])([A-Z])/g, '$1-$2')
- .toLowerCase()
- }
- /**
- * Converts hyphen/underscore/slash delimitered names into
- * camelized classNames.
- *
- * e.g. my-component => MyComponent
- * some_else => SomeElse
- * some/comp => SomeComp
- *
- * @param {String} str
- * @return {String}
- */
- var classifyRE = /(?:^|[-_\/])(\w)/g
- exports.classify = function (str) {
- return str.replace(classifyRE, toUpper)
- }
- /**
- * Simple bind, faster than native
- *
- * @param {Function} fn
- * @param {Object} ctx
- * @return {Function}
- */
- exports.bind = function (fn, ctx) {
- return function (a) {
- var l = arguments.length
- return l
- ? l > 1
- ? fn.apply(ctx, arguments)
- : fn.call(ctx, a)
- : fn.call(ctx)
- }
- }
- /**
- * Convert an Array-like object to a real Array.
- *
- * @param {Array-like} list
- * @param {Number} [start] - start index
- * @return {Array}
- */
- exports.toArray = function (list, start) {
- start = start || 0
- var i = list.length - start
- var ret = new Array(i)
- while (i--) {
- ret[i] = list[i + start]
- }
- return ret
- }
- /**
- * Mix properties into target object.
- *
- * @param {Object} to
- * @param {Object} from
- */
- exports.extend = function (to, from) {
- for (var key in from) {
- to[key] = from[key]
- }
- return to
- }
- /**
- * Quick object check - this is primarily used to tell
- * Objects from primitive values when we know the value
- * is a JSON-compliant type.
- *
- * @param {*} obj
- * @return {Boolean}
- */
- exports.isObject = function (obj) {
- return obj !== null && typeof obj === 'object'
- }
- /**
- * Strict object type check. Only returns true
- * for plain JavaScript objects.
- *
- * @param {*} obj
- * @return {Boolean}
- */
- var toString = Object.prototype.toString
- exports.isPlainObject = function (obj) {
- return toString.call(obj) === '[object Object]'
- }
- /**
- * Array type check.
- *
- * @param {*} obj
- * @return {Boolean}
- */
- exports.isArray = Array.isArray
- /**
- * Define a non-enumerable property
- *
- * @param {Object} obj
- * @param {String} key
- * @param {*} val
- * @param {Boolean} [enumerable]
- */
- exports.define = function (obj, key, val, enumerable) {
- Object.defineProperty(obj, key, {
- value: val,
- enumerable: !!enumerable,
- writable: true,
- configurable: true
- })
- }
- /**
- * Debounce a function so it only gets called after the
- * input stops arriving after the given wait period.
- *
- * @param {Function} func
- * @param {Number} wait
- * @return {Function} - the debounced function
- */
- exports.debounce = function (func, wait) {
- var timeout, args, context, timestamp, result
- var later = function () {
- var last = Date.now() - timestamp
- if (last < wait && last >= 0) {
- timeout = setTimeout(later, wait - last)
- } else {
- timeout = null
- result = func.apply(context, args)
- if (!timeout) context = args = null
- }
- }
- return function () {
- context = this
- args = arguments
- timestamp = Date.now()
- if (!timeout) {
- timeout = setTimeout(later, wait)
- }
- return result
- }
- }
- /**
- * Manual indexOf because it's slightly faster than
- * native.
- *
- * @param {Array} arr
- * @param {*} obj
- */
- exports.indexOf = function (arr, obj) {
- for (var i = 0, l = arr.length; i < l; i++) {
- if (arr[i] === obj) return i
- }
- return -1
- }
- /**
- * Make a cancellable version of an async callback.
- *
- * @param {Function} fn
- * @return {Function}
- */
- exports.cancellable = function (fn) {
- var cb = function () {
- if (!cb.cancelled) {
- return fn.apply(this, arguments)
- }
- }
- cb.cancel = function () {
- cb.cancelled = true
- }
- return cb
- }
- /***/ },
- /* 5 */
- /***/ function(module, exports, __webpack_require__) {
- // can we use __proto__?
- exports.hasProto = '__proto__' in {}
- // Browser environment sniffing
- var inBrowser = exports.inBrowser =
- typeof window !== 'undefined' &&
- Object.prototype.toString.call(window) !== '[object Object]'
- exports.isIE9 =
- inBrowser &&
- navigator.userAgent.toLowerCase().indexOf('msie 9.0') > 0
- exports.isAndroid =
- inBrowser &&
- navigator.userAgent.toLowerCase().indexOf('android') > 0
- // Transition property/event sniffing
- if (inBrowser && !exports.isIE9) {
- var isWebkitTrans =
- window.ontransitionend === undefined &&
- window.onwebkittransitionend !== undefined
- var isWebkitAnim =
- window.onanimationend === undefined &&
- window.onwebkitanimationend !== undefined
- exports.transitionProp = isWebkitTrans
- ? 'WebkitTransition'
- : 'transition'
- exports.transitionEndEvent = isWebkitTrans
- ? 'webkitTransitionEnd'
- : 'transitionend'
- exports.animationProp = isWebkitAnim
- ? 'WebkitAnimation'
- : 'animation'
- exports.animationEndEvent = isWebkitAnim
- ? 'webkitAnimationEnd'
- : 'animationend'
- }
- /**
- * Defer a task to execute it asynchronously. Ideally this
- * should be executed as a microtask, so we leverage
- * MutationObserver if it's available, and fallback to
- * setTimeout(0).
- *
- * @param {Function} cb
- * @param {Object} ctx
- */
- exports.nextTick = (function () {
- var callbacks = []
- var pending = false
- var timerFunc
- function handle () {
- pending = false
- var copies = callbacks.slice(0)
- callbacks = []
- for (var i = 0; i < copies.length; i++) {
- copies[i]()
- }
- }
- /* istanbul ignore if */
- if (typeof MutationObserver !== 'undefined') {
- var counter = 1
- var observer = new MutationObserver(handle)
- var textNode = document.createTextNode(counter)
- observer.observe(textNode, {
- characterData: true
- })
- timerFunc = function () {
- counter = (counter + 1) % 2
- textNode.data = counter
- }
- } else {
- timerFunc = setTimeout
- }
- return function (cb, ctx) {
- var func = ctx
- ? function () { cb.call(ctx) }
- : cb
- callbacks.push(func)
- if (pending) return
- pending = true
- timerFunc(handle, 0)
- }
- })()
- /***/ },
- /* 6 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- var config = __webpack_require__(3)
- /**
- * Query an element selector if it's not an element already.
- *
- * @param {String|Element} el
- * @return {Element}
- */
- exports.query = function (el) {
- if (typeof el === 'string') {
- var selector = el
- el = document.querySelector(el)
- if (!el) {
- _.warn('Cannot find element: ' + selector)
- }
- }
- return el
- }
- /**
- * Check if a node is in the document.
- * Note: document.documentElement.contains should work here
- * but always returns false for comment nodes in phantomjs,
- * making unit tests difficult. This is fixed byy doing the
- * contains() check on the node's parentNode instead of
- * the node itself.
- *
- * @param {Node} node
- * @return {Boolean}
- */
- exports.inDoc = function (node) {
- var doc = document.documentElement
- var parent = node && node.parentNode
- return doc === node ||
- doc === parent ||
- !!(parent && parent.nodeType === 1 && (doc.contains(parent)))
- }
- /**
- * Extract an attribute from a node.
- *
- * @param {Node} node
- * @param {String} attr
- */
- exports.attr = function (node, attr) {
- attr = config.prefix + attr
- var val = node.getAttribute(attr)
- if (val !== null) {
- node.removeAttribute(attr)
- }
- return val
- }
- /**
- * Insert el before target
- *
- * @param {Element} el
- * @param {Element} target
- */
- exports.before = function (el, target) {
- target.parentNode.insertBefore(el, target)
- }
- /**
- * Insert el after target
- *
- * @param {Element} el
- * @param {Element} target
- */
- exports.after = function (el, target) {
- if (target.nextSibling) {
- exports.before(el, target.nextSibling)
- } else {
- target.parentNode.appendChild(el)
- }
- }
- /**
- * Remove el from DOM
- *
- * @param {Element} el
- */
- exports.remove = function (el) {
- el.parentNode.removeChild(el)
- }
- /**
- * Prepend el to target
- *
- * @param {Element} el
- * @param {Element} target
- */
- exports.prepend = function (el, target) {
- if (target.firstChild) {
- exports.before(el, target.firstChild)
- } else {
- target.appendChild(el)
- }
- }
- /**
- * Replace target with el
- *
- * @param {Element} target
- * @param {Element} el
- */
- exports.replace = function (target, el) {
- var parent = target.parentNode
- if (parent) {
- parent.replaceChild(el, target)
- }
- }
- /**
- * Add event listener shorthand.
- *
- * @param {Element} el
- * @param {String} event
- * @param {Function} cb
- */
- exports.on = function (el, event, cb) {
- el.addEventListener(event, cb)
- }
- /**
- * Remove event listener shorthand.
- *
- * @param {Element} el
- * @param {String} event
- * @param {Function} cb
- */
- exports.off = function (el, event, cb) {
- el.removeEventListener(event, cb)
- }
- /**
- * Add class with compatibility for IE & SVG
- *
- * @param {Element} el
- * @param {Strong} cls
- */
- exports.addClass = function (el, cls) {
- if (el.classList) {
- el.classList.add(cls)
- } else {
- var cur = ' ' + (el.getAttribute('class') || '') + ' '
- if (cur.indexOf(' ' + cls + ' ') < 0) {
- el.setAttribute('class', (cur + cls).trim())
- }
- }
- }
- /**
- * Remove class with compatibility for IE & SVG
- *
- * @param {Element} el
- * @param {Strong} cls
- */
- exports.removeClass = function (el, cls) {
- if (el.classList) {
- el.classList.remove(cls)
- } else {
- var cur = ' ' + (el.getAttribute('class') || '') + ' '
- var tar = ' ' + cls + ' '
- while (cur.indexOf(tar) >= 0) {
- cur = cur.replace(tar, ' ')
- }
- el.setAttribute('class', cur.trim())
- }
- }
- /**
- * Extract raw content inside an element into a temporary
- * container div
- *
- * @param {Element} el
- * @param {Boolean} asFragment
- * @return {Element}
- */
- exports.extractContent = function (el, asFragment) {
- var child
- var rawContent
- /* istanbul ignore if */
- if (
- exports.isTemplate(el) &&
- el.content instanceof DocumentFragment
- ) {
- el = el.content
- }
- if (el.hasChildNodes()) {
- trim(el, el.firstChild)
- trim(el, el.lastChild)
- rawContent = asFragment
- ? document.createDocumentFragment()
- : document.createElement('div')
- /* eslint-disable no-cond-assign */
- while (child = el.firstChild) {
- /* eslint-enable no-cond-assign */
- rawContent.appendChild(child)
- }
- }
- return rawContent
- }
- function trim (content, node) {
- if (node && node.nodeType === 3 && !node.data.trim()) {
- content.removeChild(node)
- }
- }
- /**
- * Check if an element is a template tag.
- * Note if the template appears inside an SVG its tagName
- * will be in lowercase.
- *
- * @param {Element} el
- */
- exports.isTemplate = function (el) {
- return el.tagName &&
- el.tagName.toLowerCase() === 'template'
- }
- /***/ },
- /* 7 */
- /***/ function(module, exports, __webpack_require__) {
- var config = __webpack_require__(3)
- /**
- * Enable debug utilities. The enableDebug() function and
- * all _.log() & _.warn() calls will be dropped in the
- * minified production build.
- */
- enableDebug()
- function enableDebug () {
- var hasConsole = typeof console !== 'undefined'
- /**
- * Log a message.
- *
- * @param {String} msg
- */
- exports.log = function (msg) {
- if (hasConsole && config.debug) {
- console.log('[Vue info]: ' + msg)
- }
- }
- /**
- * We've got a problem here.
- *
- * @param {String} msg
- */
- exports.warn = function (msg, e) {
- if (hasConsole && (!config.silent || config.debug)) {
- console.warn('[Vue warn]: ' + msg)
- /* istanbul ignore if */
- if (config.debug) {
- console.warn((e || new Error('Warning Stack Trace')).stack)
- }
- }
- }
- /**
- * Assert asset exists
- */
- exports.assertAsset = function (val, type, id) {
- /* istanbul ignore if */
- if (type === 'directive') {
- if (id === 'with') {
- exports.warn(
- 'v-with has been deprecated in ^0.12.0. ' +
- 'Use props instead.'
- )
- return
- }
- if (id === 'events') {
- exports.warn(
- 'v-events has been deprecated in ^0.12.0. ' +
- 'Pass down methods as callback props instead.'
- )
- return
- }
- }
- if (!val) {
- exports.warn('Failed to resolve ' + type + ': ' + id)
- }
- }
- }
- /***/ },
- /* 8 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- var extend = _.extend
- /**
- * Option overwriting strategies are functions that handle
- * how to merge a parent option value and a child option
- * value into the final value.
- *
- * All strategy functions follow the same signature:
- *
- * @param {*} parentVal
- * @param {*} childVal
- * @param {Vue} [vm]
- */
- var strats = Object.create(null)
- /**
- * Helper that recursively merges two data objects together.
- */
- function mergeData (to, from) {
- var key, toVal, fromVal
- for (key in from) {
- toVal = to[key]
- fromVal = from[key]
- if (!to.hasOwnProperty(key)) {
- to.$add(key, fromVal)
- } else if (_.isObject(toVal) && _.isObject(fromVal)) {
- mergeData(toVal, fromVal)
- }
- }
- return to
- }
- /**
- * Data
- */
- strats.data = function (parentVal, childVal, vm) {
- if (!vm) {
- // in a Vue.extend merge, both should be functions
- if (!childVal) {
- return parentVal
- }
- if (typeof childVal !== 'function') {
- _.warn(
- 'The "data" option should be a function ' +
- 'that returns a per-instance value in component ' +
- 'definitions.'
- )
- return parentVal
- }
- if (!parentVal) {
- return childVal
- }
- // when parentVal & childVal are both present,
- // we need to return a function that returns the
- // merged result of both functions... no need to
- // check if parentVal is a function here because
- // it has to be a function to pass previous merges.
- return function mergedDataFn () {
- return mergeData(
- childVal.call(this),
- parentVal.call(this)
- )
- }
- } else if (parentVal || childVal) {
- return function mergedInstanceDataFn () {
- // instance merge
- var instanceData = typeof childVal === 'function'
- ? childVal.call(vm)
- : childVal
- var defaultData = typeof parentVal === 'function'
- ? parentVal.call(vm)
- : undefined
- if (instanceData) {
- return mergeData(instanceData, defaultData)
- } else {
- return defaultData
- }
- }
- }
- }
- /**
- * El
- */
- strats.el = function (parentVal, childVal, vm) {
- if (!vm && childVal && typeof childVal !== 'function') {
- _.warn(
- 'The "el" option should be a function ' +
- 'that returns a per-instance value in component ' +
- 'definitions.'
- )
- return
- }
- var ret = childVal || parentVal
- // invoke the element factory if this is instance merge
- return vm && typeof ret === 'function'
- ? ret.call(vm)
- : ret
- }
- /**
- * Hooks and param attributes are merged as arrays.
- */
- strats.created =
- strats.ready =
- strats.attached =
- strats.detached =
- strats.beforeCompile =
- strats.compiled =
- strats.beforeDestroy =
- strats.destroyed =
- strats.props = function (parentVal, childVal) {
- return childVal
- ? parentVal
- ? parentVal.concat(childVal)
- : _.isArray(childVal)
- ? childVal
- : [childVal]
- : parentVal
- }
- /**
- * 0.11 deprecation warning
- */
- strats.paramAttributes = function () {
- /* istanbul ignore next */
- _.warn(
- '"paramAttributes" option has been deprecated in 0.12. ' +
- 'Use "props" instead.'
- )
- }
- /**
- * Assets
- *
- * When a vm is present (instance creation), we need to do
- * a three-way merge between constructor options, instance
- * options and parent options.
- */
- strats.directives =
- strats.filters =
- strats.transitions =
- strats.components =
- strats.partials =
- strats.elementDirectives = function (parentVal, childVal) {
- var res = Object.create(parentVal)
- return childVal
- ? extend(res, childVal)
- : res
- }
- /**
- * Events & Watchers.
- *
- * Events & watchers hashes should not overwrite one
- * another, so we merge them as arrays.
- */
- strats.watch =
- strats.events = function (parentVal, childVal) {
- if (!childVal) return parentVal
- if (!parentVal) return childVal
- var ret = {}
- extend(ret, parentVal)
- for (var key in childVal) {
- var parent = ret[key]
- var child = childVal[key]
- if (parent && !_.isArray(parent)) {
- parent = [parent]
- }
- ret[key] = parent
- ? parent.concat(child)
- : [child]
- }
- return ret
- }
- /**
- * Other object hashes.
- */
- strats.methods =
- strats.computed = function (parentVal, childVal) {
- if (!childVal) return parentVal
- if (!parentVal) return childVal
- var ret = Object.create(parentVal)
- extend(ret, childVal)
- return ret
- }
- /**
- * Default strategy.
- */
- var defaultStrat = function (parentVal, childVal) {
- return childVal === undefined
- ? parentVal
- : childVal
- }
- /**
- * Make sure component options get converted to actual
- * constructors.
- *
- * @param {Object} components
- */
- function guardComponents (components) {
- if (components) {
- var def
- for (var key in components) {
- if (_.commonTagRE.test(key)) {
- _.warn(
- 'Do not use built-in HTML elements as component ' +
- 'name: ' + key
- )
- }
- def = components[key]
- if (_.isPlainObject(def)) {
- def.name = key
- components[key] = _.Vue.extend(def)
- }
- }
- }
- }
- /**
- * Ensure all props option syntax are normalized into the
- * Object-based format.
- *
- * @param {Object} options
- */
- function guardProps (options) {
- var props = options.props
- if (_.isPlainObject(props)) {
- options.props = Object.keys(props).map(function (key) {
- var val = props[key]
- if (!_.isPlainObject(val)) {
- val = { type: val }
- }
- val.name = key
- return val
- })
- } else if (_.isArray(props)) {
- options.props = props.map(function (prop) {
- return typeof prop === 'string'
- ? { name: prop }
- : prop
- })
- }
- }
- /**
- * Merge two option objects into a new one.
- * Core utility used in both instantiation and inheritance.
- *
- * @param {Object} parent
- * @param {Object} child
- * @param {Vue} [vm] - if vm is present, indicates this is
- * an instantiation merge.
- */
- exports.mergeOptions = function merge (parent, child, vm) {
- guardComponents(child.components)
- guardProps(child)
- var options = {}
- var key
- if (child.mixins) {
- for (var i = 0, l = child.mixins.length; i < l; i++) {
- parent = merge(parent, child.mixins[i], vm)
- }
- }
- for (key in parent) {
- mergeField(key)
- }
- for (key in child) {
- if (!(parent.hasOwnProperty(key))) {
- mergeField(key)
- }
- }
- function mergeField (key) {
- var strat = strats[key] || defaultStrat
- options[key] = strat(parent[key], child[key], vm, key)
- }
- return options
- }
- /**
- * Resolve an asset.
- * This function is used because child instances need access
- * to assets defined in its ancestor chain.
- *
- * @param {Object} options
- * @param {String} type
- * @param {String} id
- * @return {Object|Function}
- */
- exports.resolveAsset = function resolve (options, type, id) {
- var asset = options[type][id]
- while (!asset && options._parent) {
- options = options._parent.$options
- asset = options[type][id]
- }
- return asset
- }
- /***/ },
- /* 9 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- var config = __webpack_require__(3)
- /**
- * Expose useful internals
- */
- exports.util = _
- exports.nextTick = _.nextTick
- exports.config = __webpack_require__(3)
- exports.compiler = __webpack_require__(10)
- exports.parsers = {
- path: __webpack_require__(23),
- text: __webpack_require__(13),
- template: __webpack_require__(25),
- directive: __webpack_require__(15),
- expression: __webpack_require__(22)
- }
- /**
- * Each instance constructor, including Vue, has a unique
- * cid. This enables us to create wrapped "child
- * constructors" for prototypal inheritance and cache them.
- */
- exports.cid = 0
- var cid = 1
- /**
- * Class inehritance
- *
- * @param {Object} extendOptions
- */
- exports.extend = function (extendOptions) {
- extendOptions = extendOptions || {}
- var Super = this
- var Sub = createClass(
- extendOptions.name ||
- Super.options.name ||
- 'VueComponent'
- )
- Sub.prototype = Object.create(Super.prototype)
- Sub.prototype.constructor = Sub
- Sub.cid = cid++
- Sub.options = _.mergeOptions(
- Super.options,
- extendOptions
- )
- Sub['super'] = Super
- // allow further extension
- Sub.extend = Super.extend
- // create asset registers, so extended classes
- // can have their private assets too.
- config._assetTypes.forEach(function (type) {
- Sub[type] = Super[type]
- })
- return Sub
- }
- /**
- * A function that returns a sub-class constructor with the
- * given name. This gives us much nicer output when
- * logging instances in the console.
- *
- * @param {String} name
- * @return {Function}
- */
- function createClass (name) {
- return new Function(
- 'return function ' + _.classify(name) +
- ' (options) { this._init(options) }'
- )()
- }
- /**
- * Plugin system
- *
- * @param {Object} plugin
- */
- exports.use = function (plugin) {
- // additional parameters
- var args = _.toArray(arguments, 1)
- args.unshift(this)
- if (typeof plugin.install === 'function') {
- plugin.install.apply(plugin, args)
- } else {
- plugin.apply(null, args)
- }
- return this
- }
- /**
- * Create asset registration methods with the following
- * signature:
- *
- * @param {String} id
- * @param {*} definition
- */
- config._assetTypes.forEach(function (type) {
- exports[type] = function (id, definition) {
- if (!definition) {
- return this.options[type + 's'][id]
- } else {
- if (
- type === 'component' &&
- _.isPlainObject(definition)
- ) {
- definition.name = id
- definition = _.Vue.extend(definition)
- }
- this.options[type + 's'][id] = definition
- }
- }
- })
- /***/ },
- /* 10 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- _.extend(exports, __webpack_require__(11))
- _.extend(exports, __webpack_require__(27))
- /***/ },
- /* 11 */
- /***/ function(module, exports, __webpack_require__) {
- var _ = __webpack_require__(1)
- var compileProps = __webpack_require__(12)
- var config = __webpack_require__(3)
- var textParser = __webpack_require__(13)
- var dirParser = __webpack_require__(15)
- var templateParser = __webpack_require__(25)
- var resolveAsset = _.resolveAsset
- var componentDef = __webpack_require__(26)
- // terminal directives
- var terminalDirectives = [
- 'repeat',
- 'if'
- ]
- /**
- * Compile a template and return a reusable composite link
- * function, which recursively contains more link functions
- * inside. This top level compile function would normally
- * be called on instance root nodes, but can also be used
- * for partial compilation if the partial argument is true.
- *
- * The returned composite link function, when called, will
- * return an unlink function that tearsdown all directives
- * created during the linking phase.
- *
- * @param {Element|DocumentFragment} el
- * @param {Object} options
- * @param {Boolean} partial
- * @param {Vue} [host] - host vm of transcluded content
- * @return {Function}
- */
- exports.compile = function (el, options, partial, host) {
- // link function for the node itself.
- var nodeLinkFn = partial || !options._asComponent
- ? compileNode(el, options)
- : null
- // link function for the childNodes
- var childLinkFn =
- !(nodeLinkFn && nodeLinkFn.terminal) &&
- el.tagName !== 'SCRIPT' &&
- el.hasChildNodes()
- ? compileNodeList(el.childNodes, options)
- : null
- /**
- * A composite linker function to be called on a already
- * compiled piece of DOM, which instantiates all directive
- * instances.
- *
- * @param {Vue} vm
- * @param {Element|DocumentFragment} el
- * @return {Function|undefined}
- */
- return function compositeLinkFn (vm, el) {
- // cache childNodes before linking parent, fix #657
- var childNodes = _.toArray(el.childNodes)
- // link
- var dirs = linkAndCapture(function () {
- if (nodeLinkFn) nodeLinkFn(vm, el, host)
- if (childLinkFn) childLinkFn(vm, childNodes, host)
- }, vm)
- return makeUnlinkFn(vm, dirs)
- }
- }
- /**
- * Apply a linker to a vm/element pair and capture the
- * directives created during the process.
- *
- * @param {Function} linker
- * @param {Vue} vm
- */
- function linkAndCapture (linker, vm) {
- var originalDirCount = vm._directives.length
- linker()
- return vm._directives.slice(originalDirCount)
- }
- /**
- * Linker functions return an unlink function that
- * tearsdown all directives instances generated during
- * the process.
- *
- * We create unlink functions with only the necessary
- * information to avoid retaining additional closures.
- *
- * @param {Vue} vm
- * @param {Array} dirs
- * @param {Vue} [context]
- * @param {Array} [contextDirs]
- * @return {Function}
- */
- function makeUnlinkFn (vm, dirs, context, contextDirs) {
- return function unlink (destroying) {
- teardownDirs(vm, dirs, destroying)
- if (context && contextDirs) {
- teardownDirs(context, contextDirs)
- }
- }
- }
- /**
- * Teardown partial linked directives.
- *
- * @param {Vue} vm
- * @param {Array} dirs
- * @param {Boolean} destroying
- */
- function teardownDirs (vm, dirs, destroying) {
- var i = dirs.length
- while (i--) {
- dirs[i]._teardown()
- if (!destroying) {
- vm._directives.$remove(dirs[i])
- }
- }
- }
- /**
- * Compile link props on an instance.
- *
- * @param {Vue} vm
- * @param {Element} el
- * @param {Object} options
- * @return {Function}
- */
- exports.compileAndLinkProps = function (vm, el, props) {
- var propsLinkFn = compileProps(el, props)
- var propDirs = linkAndCapture(function () {
- propsLinkFn(vm, null)
- }, vm)
- return makeUnlinkFn(vm, propDirs)
- }
- /**
- * Compile the root element of an instance.
- *
- * 1. attrs on context container (context scope)
- * 2. attrs on the component template root node, if
- * replace:true (child scope)
- *
- * If this is a block instance, we only need to compile 1.
- *
- * This function does compile and link at the same time,
- * since root linkers can not be reused. It returns the
- * unlink function for potential context directives on the
- * container.
- *
- * @param {Vue} vm
- * @param {Element} el
- * @param {Object} options
- * @return {Function}
- */
- exports.compileAndLinkRoot = function (vm, el, options) {
- var containerAttrs = options._containerAttrs
- var replacerAttrs = options._replacerAttrs
- var contextLinkFn, replacerLinkFn
- // only need to compile other attributes for
- // non-block instances
- if (el.nodeType !== 11) {
- // for components, container and replacer need to be
- // compiled separately and linked in different scopes.
- if (options._asComponent) {
- // 2. container attributes
- if (containerAttrs) {
- contextLinkFn = compileDirectives(containerAttrs, options)
- }
- if (replacerAttrs) {
- // 3. replacer attributes
- replacerLinkFn = compileDirectives(replacerAttrs, options)
- }
- } else {
- // non-component, just compile as a normal element.
- replacerLinkFn = compileDirectives(el, options)
- }
- }
- // link context scope dirs
- var context = vm._context
- var contextDirs
- if (context && contextLinkFn) {
- contextDirs = linkAndCapture(function () {
- contextLinkFn(context, el)
- }, context)
- }
- // link self
- var selfDirs = linkAndCapture(function () {
- if (replacerLinkFn) replacerLinkFn(vm, el)
- }, vm)
- // return the unlink function that tearsdown context
- // container directives.
- return makeUnlinkFn(vm, selfDirs, context, contextDirs)
- }
- /**
- * Compile a node and return a nodeLinkFn based on the
- * node type.
- *
- * @param {Node} node
- * @param {Object} options
- * @return {Function|null}
- */
- function compileNode (node, options) {
- var type = node.nodeType
- if (type === 1 && node.tagName !== 'SCRIPT') {
- return compileElement(node, options)
- } else if (type === 3 && config.interpolate && node.data.trim()) {
- return compileTextNode(node, options)
- } else {
- return null
- }
- }
- /**
- * Compile an element and return a nodeLinkFn.
- *
- * @param {Element} el
- * @param {Object} options
- * @return {Function|null}
- */
- function compileElement (el, options) {
- var linkFn
- var hasAttrs = el.hasAttributes()
- // check terminal directives (repeat & if)
- if (hasAttrs) {
- linkFn = checkTerminalDirectives(el, options)
- }
- // check element directives
- if (!linkFn) {
- linkFn = checkElementDirectives(el, options)
- }
- // check component
- if (!linkFn) {
- linkFn = checkComponent(el, options)
- }
- // normal directives
- if (!linkFn && hasAttrs) {
- linkFn = compileDirectives(el, options)
- }
- // if the element is a textarea, we need to interpolate
- // its content on initial render.
- if (el.tagName === 'TEXTAREA') {
- var realLinkFn = linkFn
- linkFn = function (vm, el) {
- el.value = vm.$interpolate(el.value)
- if (realLinkFn) realLinkFn(vm, el)
- }
- linkFn.terminal = true
- }
- return linkFn
- }
- /**
- * Compile a textNode and return a nodeLinkFn.
- *
- * @param {TextNode} node
- * @param {Object} options
- * @return {Function|null} textNodeLinkFn
- */
- function compileTextNode (node, options) {
- var tokens = textParser.parse(node.data)
- if (!tokens) {
- return null
- }
- var frag = document.createDocumentFragment()
- var el, token
- for (var i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i]
- el = token.tag
- ? processTextToken(token, options)
- : document.createTextNode(token.value)
- frag.appendChild(el)
- }
- return makeTextNodeLinkFn(tokens, frag, options)
- }
- /**
- * Process a single text token.
- *
- * @param {Object} token
- * @param {Object} options
- * @return {Node}
- */
- function processTextToken (token, options) {
- var el
- if (token.oneTime) {
- el = document.createTextNode(token.value)
- } else {
- if (token.html) {
- el = document.createComment('v-html')
- setTokenType('html')
- } else {
- // IE will clean up empty textNodes during
- // frag.cloneNode(true), so we have to give it
- // something here...
- el = document.createTextNode(' ')
- setTokenType('text')
- }
- }
- function setTokenType (type) {
- token.type = type
- token.def = resolveAsset(options, 'directives', type)
- token.descriptor = dirParser.parse(token.value)[0]
- }
- return el
- }
- /**
- * Build a function that processes a textNode.
- *
- * @param {Array<Object>} tokens
- * @param {DocumentFragment} frag
- */
- function makeTextNodeLinkFn (tokens, frag) {
- return function textNodeLinkFn (vm, el) {
- var fragClone = frag.cloneNode(true)
- var childNodes = _.toArray(fragClone.childNodes)
- var token, value, node
- for (var i = 0, l = tokens.length; i < l; i++) {
- token = tokens[i]
- value = token.value
- if (token.tag) {
- node = childNodes[i]
- if (token.oneTime) {
- value = vm.$eval(value)
- if (token.html) {
- _.replace(node, templateParser.parse(value, true))
- } else {
- node.data = value
- }
- } else {
- vm._bindDir(token.type, node,
- token.descriptor, token.def)
- }
- }
- }
- _.replace(el, fragClone)
- }
- }
- /**
- * Compile a node list and return a childLinkFn.
- *
- * @param {NodeList} nodeList
- * @param {Object} options
- * @return {Function|undefined}
- */
- function compileNodeList (nodeList, options) {
- var linkFns = []
- var nodeLinkFn, childLinkFn, node
- for (var i = 0, l = nodeList.length; i < l; i++) {
- node = nodeList[i]
- nodeLinkFn = compileNode(node, options)
- childLinkFn =
- !(nodeLinkFn && nodeLinkFn.terminal) &&
- node.tagName !== 'SCRIPT' &&
- node.hasChildNodes()
- ? compileNodeList(node.childNodes, options)
- : null
- linkFns.push(nodeLinkFn, childLinkFn)
- }
- return linkFns.length
- ? makeChildLinkFn(linkFns)
- : null
- }
- /**
- * Make a child link function for a node's childNodes.
- *
- * @param {Array<Function>} linkFns
- * @return {Function} childLinkFn
- */
- function makeChildLinkFn (linkFns) {
- return function childLinkFn (vm, nodes, host) {
- var node, nodeLinkFn, childrenLinkFn
- for (var i = 0, n = 0, l = linkFns.length; i < l; n++) {
- node = nodes[n]
- nodeLinkFn = linkFns[i++]
- childrenLinkFn = linkFns[i++]
- // cache childNodes before linking parent, fix #657
- var childNodes = _.toArray(node.childNodes)
- if (nodeLinkFn) {
- nodeLinkFn(vm, node, host)
- }
- if (childrenLinkFn) {
- childrenLinkFn(vm, childNodes, host)
- }
- }
- }
- }
- /**
- * Check for element directives (custom elements that should
- * be resovled as terminal directives).
- *
- * @param {Element} el
- * @param {Object} options
- */
- function checkElementDirectives (el, options) {
- var tag = el.tagName.toLowerCase()
- if (_.commonTagRE.test(tag)) return
- var def = resolveAsset(options, 'elementDirectives', tag)
- if (def) {
- return makeTerminalNodeLinkFn(el, tag, '', options, def)
- }
- }
- /**
- * Check if an element is a component. If yes, return
- * a component link function.
- *
- * @param {Element} el
- * @param {Object} options
- * @param {Boolean} hasAttrs
- * @return {Function|undefined}
- */
- function checkComponent (el, options, hasAttrs) {
- var componentId = _.checkComponent(el, options, hasAttrs)
- if (componentId) {
- var componentLinkFn = function (vm, el, host) {
- vm._bindDir('component', el, {
- expression: componentId
- }, componentDef, host)
- }
- componentLinkFn.terminal = true
- return componentLinkFn
- }
- }
- /**
- * Check an element for terminal directives in fixed order.
- * If it finds one, return a terminal link function.
- *
- * @param {Element} el
- * @param {Object} options
- * @return {Function} terminalLinkFn
- */
- function checkTerminalDirectives (el, options) {
- if (_.attr(el, 'pre') !== null) {
- return skip
- }
- var value, dirName
- for (var i = 0, l = terminalDirectives.length; i < l; i++) {
- dirName = terminalDirectives[i]
- if ((value = _.attr(el, dirName)) !== null) {
- return makeTerminalNodeLinkFn(el, dirName, value, options)
- }
- }
- }
- function skip () {}
- skip.terminal = true
- /**
- * Build a node link function for a terminal directive.
- * A terminal link function terminates the current
- * compilation recursion and handles compilation of the
- * subtree in the directive.
- *
- * @param {Element} el
- * @param {String} dirName
- * @param {String} value
- * @param {Object} options
- * @param {Object} [def]
- * @return {Function} terminalLinkFn
- */
- function makeTerminalNodeLinkFn (el, dirName, value, options, def) {
- var descriptor = dirParser.parse(value)[0]
- // no need to call resolveAsset since terminal directives
- // are always internal
- def = def || options.directives[dirName]
- var fn = function terminalNodeLinkFn (vm, el, host) {
- vm._bindDir(dirName, el, descriptor, def, host)
- }
- fn.terminal = true
- return fn
- }
- /**
- * Compile the directives on an element and return a linker.
- *
- * @param {Element|Object} elOrAttrs
- * - could be an object of already-extracted
- * container attributes.
- * @param {Object} options
- * @return {Function}
- */
- function compileDirectives (elOrAttrs, options) {
- var attrs = _.isPlainObject(elOrAttrs)
- ? mapToList(elOrAttrs)
- : elOrAttrs.attributes
- var i = attrs.length
- var dirs = []
- var attr, name, value, dir, dirName, dirDef
- while (i--) {
- attr = attrs[i]
- name = attr.name
- value = attr.value
- if (name.indexOf(config.prefix) === 0) {
- dirName = name.slice(config.prefix.length)
- dirDef = resolveAsset(options, 'directives', dirName)
- _.assertAsset(dirDef, 'directive', dirName)
- if (dirDef) {
- dirs.push({
- name: dirName,
- descriptors: dirParser.parse(value),
- def: dirDef
- })
- }
- } else if (config.interpolate) {
- dir = collectAttrDirective(name, value, options)
- if (dir) {
- dirs.push(dir)
- }
- }
- }
- // sort by priority, LOW to HIGH
- if (dirs.length) {
- dirs.sort(directiveComparator)
- return makeNodeLinkFn(dirs)
- }
- }
- /**
- * Convert a map (Object) of attributes to an Array.
- *
- * @param {Object} map
- * @return {Array}
- */
- function mapToList (map) {
- var list = []
- for (var key in map) {
- list.push({
- name: key,
- value: map[key]
- })
- }
- return list
- }
- /**
- * Build a link function for all directives on a single node.
- *
- * @param {Array} directives
- * @return {Function} directivesLinkFn
- */
- function makeNodeLinkFn (directives) {
- return function nodeLinkFn (vm, el, host) {
- // reverse apply because it's sorted low to high
- var i = directives.length
- var dir, j, k
- while (i--) {
- dir = directives[i]
- if (dir._link) {
- // custom link fn
- dir._link(vm, el)
- } else {
- k = dir.descriptors.length
- for (j = 0; j < k; j++) {
- vm._bindDir(dir.name, el,
- dir.descriptors[j], dir.def, host)
- }
- }
- }
- }
- }
- /**
- * Check an attribute for potential dynamic bindings,
- * and return a directive object.
- *
- * @param {String} name
- * @param {String} value
- * @param {Object} options
- * @return {Object}
- */
- function collectAttrDirective (name, value, options) {
- var tokens = textParser.parse(value)
- if (tokens) {
- var def = options.directives.attr
- var i = tokens.length
- var allOneTime = true
- while (i--) {
- var token = tokens[i]
- if (token.tag && !token.oneTime) {
- allOneTime = false
- }
- }
- return {
- def: def,
- _link: allOneTime
- ? function (vm, el) {
- el.setAttribute(name, vm.$interpolate(value))
- }
- : function (vm, el) {
-