| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 | 
							- (function umd(root, factory) {
 
-     if (typeof module === 'object' && typeof exports === 'object')
 
-         module.exports = factory()
 
-     else if (typeof define === 'function' && define.amd)
 
-         define([], factory)
 
-     else
 
-         root.httpVueLoader = factory()
 
- })(this, function factory() {
 
-     'use strict';
 
-     var scopeIndex = 0;
 
-     StyleContext.prototype = {
 
-         withBase: function (callback) {
 
-             var tmpBaseElt;
 
-             if (this.component.baseURI) {
 
-                 // firefox and chrome need the <base> to be set while inserting or modifying <style> in a document.
 
-                 tmpBaseElt = document.createElement('base');
 
-                 tmpBaseElt.href = this.component.baseURI;
 
-                 var headElt = this.component.getHead();
 
-                 headElt.insertBefore(tmpBaseElt, headElt.firstChild);
 
-             }
 
-             callback.call(this);
 
-             if (tmpBaseElt)
 
-                 this.component.getHead().removeChild(tmpBaseElt);
 
-         },
 
-         scopeStyles: function (styleElt, scopeName) {
 
-             function process() {
 
-                 var sheet = styleElt.sheet;
 
-                 var rules = sheet.cssRules;
 
-                 for (var i = 0; i < rules.length; ++i) {
 
-                     var rule = rules[i];
 
-                     if (rule.type !== 1)
 
-                         continue;
 
-                     var scopedSelectors = [];
 
-                     rule.selectorText.split(/\s*,\s*/).forEach(function (sel) {
 
-                         scopedSelectors.push(scopeName + ' ' + sel);
 
-                         var segments = sel.match(/([^ :]+)(.+)?/);
 
-                         scopedSelectors.push(segments[1] + scopeName + (segments[2] || ''));
 
-                     });
 
-                     var scopedRule = scopedSelectors.join(',') + rule.cssText.substr(rule.selectorText.length);
 
-                     sheet.deleteRule(i);
 
-                     sheet.insertRule(scopedRule, i);
 
-                 }
 
-             }
 
-             try {
 
-                 // firefox may fail sheet.cssRules with InvalidAccessError
 
-                 process();
 
-             } catch (ex) {
 
-                 if (ex instanceof DOMException && ex.code === DOMException.INVALID_ACCESS_ERR) {
 
-                     styleElt.sheet.disabled = true;
 
-                     styleElt.addEventListener('load', function onStyleLoaded() {
 
-                         styleElt.removeEventListener('load', onStyleLoaded);
 
-                         // firefox need this timeout otherwise we have to use document.importNode(style, true)
 
-                         setTimeout(function () {
 
-                             process();
 
-                             styleElt.sheet.disabled = false;
 
-                         });
 
-                     });
 
-                     return;
 
-                 }
 
-                 throw ex;
 
-             }
 
-         },
 
-         compile: function () {
 
-             var hasTemplate = this.template !== null;
 
-             var scoped = this.elt.hasAttribute('scoped');
 
-             if (scoped) {
 
-                 // no template, no scopable style needed
 
-                 if (!hasTemplate)
 
-                     return;
 
-                 // firefox does not tolerate this attribute
 
-                 this.elt.removeAttribute('scoped');
 
-             }
 
-             this.withBase(function () {
 
-                 this.component.getHead().appendChild(this.elt);
 
-             });
 
-             if (scoped)
 
-                 this.scopeStyles(this.elt, '[' + this.component.getScopeId() + ']');
 
-             return Promise.resolve();
 
-         },
 
-         getContent: function () {
 
-             return this.elt.textContent;
 
-         },
 
-         setContent: function (content) {
 
-             this.withBase(function () {
 
-                 this.elt.textContent = content;
 
-             });
 
-         }
 
-     };
 
-     function StyleContext(component, elt) {
 
-         this.component = component;
 
-         this.elt = elt;
 
-     }
 
-     ScriptContext.prototype = {
 
-         getContent: function () {
 
-             return this.elt.textContent;
 
-         },
 
-         setContent: function (content) {
 
-             this.elt.textContent = content;
 
-         },
 
-         compile: function (module) {
 
-             var childModuleRequire = function (childURL) {
 
-                 return httpVueLoader.require(resolveURL(this.component.baseURI, childURL));
 
-             }.bind(this);
 
-             var childLoader = function (childURL, childName) {
 
-                 return httpVueLoader(resolveURL(this.component.baseURI, childURL), childName);
 
-             }.bind(this);
 
-             try {
 
-                 Function('exports', 'require', 'httpVueLoader', 'module', this.getContent()).call(this.module.exports, this.module.exports, childModuleRequire, childLoader, this.module);
 
-             } catch (ex) {
 
-                 if (!('lineNumber' in ex)) {
 
-                     return Promise.reject(ex);
 
-                 }
 
-                 var vueFileData = responseText.replace(/\r?\n/g, '\n');
 
-                 var lineNumber = vueFileData.substr(0, vueFileData.indexOf(script)).split('\n').length + ex.lineNumber - 1;
 
-                 throw new (ex.constructor)(ex.message, url, lineNumber);
 
-             }
 
-             return Promise.resolve(this.module.exports)
 
-                 .then(httpVueLoader.scriptExportsHandler.bind(this))
 
-                 .then(function (exports) {
 
-                     this.module.exports = exports;
 
-                 }.bind(this));
 
-         }
 
-     };
 
-     function ScriptContext(component, elt) {
 
-         this.component = component;
 
-         this.elt = elt;
 
-         this.module = {exports: {}};
 
-     }
 
-     TemplateContext.prototype = {
 
-         getContent: function () {
 
-             return this.elt.innerHTML;
 
-         },
 
-         setContent: function (content) {
 
-             this.elt.innerHTML = content;
 
-         },
 
-         getRootElt: function () {
 
-             var tplElt = this.elt.content || this.elt;
 
-             if ('firstElementChild' in tplElt)
 
-                 return tplElt.firstElementChild;
 
-             for (tplElt = tplElt.firstChild; tplElt !== null; tplElt = tplElt.nextSibling)
 
-                 if (tplElt.nodeType === Node.ELEMENT_NODE)
 
-                     return tplElt;
 
-             return null;
 
-         },
 
-         compile: function () {
 
-             return Promise.resolve();
 
-         }
 
-     };
 
-     function TemplateContext(component, elt) {
 
-         this.component = component;
 
-         this.elt = elt;
 
-     }
 
-     Component.prototype = {
 
-         getHead: function () {
 
-             return document.head || document.getElementsByTagName('head')[0];
 
-         },
 
-         getScopeId: function () {
 
-             if (this._scopeId === '') {
 
-                 this._scopeId = 'data-s-' + (scopeIndex++).toString(36);
 
-                 this.template.getRootElt().setAttribute(this._scopeId, '');
 
-             }
 
-             return this._scopeId;
 
-         },
 
-         load: function (componentURL) {
 
-             return httpVueLoader.httpRequest(componentURL)
 
-                 .then(function (responseText) {
 
-                     this.baseURI = componentURL.substr(0, componentURL.lastIndexOf('/') + 1);
 
-                     var doc = document.implementation.createHTMLDocument('');
 
-                     // IE requires the <base> to come with <style>
 
-                     doc.body.innerHTML = (this.baseURI ? '<base href="' + this.baseURI + '">' : '') + responseText;
 
-                     for (var it = doc.body.firstChild; it; it = it.nextSibling) {
 
-                         switch (it.nodeName) {
 
-                             case 'TEMPLATE':
 
-                                 this.template = new TemplateContext(this, it);
 
-                                 break;
 
-                             case 'SCRIPT':
 
-                                 this.script = new ScriptContext(this, it);
 
-                                 break;
 
-                             case 'STYLE':
 
-                                 this.styles.push(new StyleContext(this, it));
 
-                                 break;
 
-                         }
 
-                     }
 
-                     return this;
 
-                 }.bind(this));
 
-         },
 
-         _normalizeSection: function (eltCx) {
 
-             var p;
 
-             if (eltCx === null || !eltCx.elt.hasAttribute('src')) {
 
-                 p = Promise.resolve(null);
 
-             } else {
 
-                 p = httpVueLoader.httpRequest(eltCx.elt.getAttribute('src'))
 
-                     .then(function (content) {
 
-                         eltCx.elt.removeAttribute('src');
 
-                         return content;
 
-                     });
 
-             }
 
-             return p
 
-                 .then(function (content) {
 
-                     if (eltCx !== null && eltCx.elt.hasAttribute('lang')) {
 
-                         var lang = eltCx.elt.getAttribute('lang');
 
-                         eltCx.elt.removeAttribute('lang');
 
-                         return httpVueLoader.langProcessor[lang.toLowerCase()].call(this, content === null ? eltCx.getContent() : content);
 
-                     }
 
-                     return content;
 
-                 }.bind(this))
 
-                 .then(function (content) {
 
-                     if (content !== null)
 
-                         eltCx.setContent(content);
 
-                 });
 
-         },
 
-         normalize: function () {
 
-             return Promise.all(Array.prototype.concat(
 
-                 this._normalizeSection(this.template),
 
-                 this._normalizeSection(this.script),
 
-                 this.styles.map(this._normalizeSection)
 
-             ))
 
-                 .then(function () {
 
-                     return this;
 
-                 }.bind(this));
 
-         },
 
-         compile: function () {
 
-             return Promise.all(Array.prototype.concat(
 
-                 this.template && this.template.compile(),
 
-                 this.script && this.script.compile(),
 
-                 this.styles.map(function (style) {
 
-                     return style.compile();
 
-                 })
 
-             ))
 
-                 .then(function () {
 
-                     return this;
 
-                 }.bind(this));
 
-         }
 
-     };
 
-     function Component(name) {
 
-         this.name = name;
 
-         this.template = null;
 
-         this.script = null;
 
-         this.styles = [];
 
-         this._scopeId = '';
 
-     }
 
-     function identity(value) {
 
-         return value;
 
-     }
 
-     function parseComponentURL(url) {
 
-         var comp = url.match(/(.*?)([^/]+?)\/?(\.vue)?(\?.*|#.*|$)/);
 
-         return {
 
-             name: comp[2],
 
-             url: comp[1] + comp[2] + (comp[3] === undefined ? '/index.vue' : comp[3]) + comp[4]
 
-         };
 
-     }
 
-     function resolveURL(baseURL, url) {
 
-         if (url.substr(0, 2) === './' || url.substr(0, 3) === '../') {
 
-             return baseURL + url;
 
-         }
 
-         return url;
 
-     }
 
-     httpVueLoader.load = function (url, name) {
 
-         return function () {
 
-             return new Component(name).load(url)
 
-                 .then(function (component) {
 
-                     return component.normalize();
 
-                 })
 
-                 .then(function (component) {
 
-                     return component.compile();
 
-                 })
 
-                 .then(function (component) {
 
-                     var exports = component.script !== null ? component.script.module.exports : {};
 
-                     if (component.template !== null)
 
-                         exports.template = component.template.getContent();
 
-                     if (exports.name === undefined)
 
-                         if (component.name !== undefined)
 
-                             exports.name = component.name;
 
-                     exports._baseURI = component.baseURI;
 
-                     return exports;
 
-                 });
 
-         };
 
-     };
 
-     httpVueLoader.register = function (Vue, url) {
 
-         var comp = parseComponentURL(url);
 
-         Vue.component(comp.name, httpVueLoader.load(comp.url));
 
-     };
 
-     httpVueLoader.install = function (Vue) {
 
-         Vue.mixin({
 
-             beforeCreate: function () {
 
-                 var components = this.$options.components;
 
-                 for (var componentName in components) {
 
-                     if (typeof (components[componentName]) === 'string' && components[componentName].substr(0, 4) === 'url:') {
 
-                         var comp = parseComponentURL(components[componentName].substr(4));
 
-                         var componentURL = ('_baseURI' in this.$options) ? resolveURL(this.$options._baseURI, comp.url) : comp.url;
 
-                         if (isNaN(componentName))
 
-                             components[componentName] = httpVueLoader.load(componentURL, componentName);
 
-                         else
 
-                             components[componentName] = Vue.component(comp.name, httpVueLoader.load(componentURL, comp.name));
 
-                     }
 
-                 }
 
-             }
 
-         });
 
-     };
 
-     httpVueLoader.require = function (moduleName) {
 
-         return window[moduleName];
 
-     };
 
-     httpVueLoader.httpRequest = function (url) {
 
-         return new Promise(function (resolve, reject) {
 
-             var xhr = new XMLHttpRequest();
 
-             xhr.open('GET', url);
 
-             xhr.responseType = 'text';
 
-             xhr.onreadystatechange = function () {
 
-                 if (xhr.readyState === 4) {
 
-                     if (xhr.status >= 200 && xhr.status < 300)
 
-                         resolve(xhr.responseText);
 
-                     else
 
-                         reject(xhr.status);
 
-                 }
 
-             };
 
-             xhr.send(null);
 
-         });
 
-     };
 
-     httpVueLoader.langProcessor = {
 
-         html: identity,
 
-         js: identity,
 
-         css: identity
 
-     };
 
-     httpVueLoader.scriptExportsHandler = identity;
 
-     function httpVueLoader(url, name) {
 
-         var comp = parseComponentURL(url);
 
-         return httpVueLoader.load(comp.url, name);
 
-     }
 
-     return httpVueLoader;
 
- });
 
 
  |