All Downloads are FREE. Search and download functionalities are using the official Maven repository.

js.lib.require.js Maven / Gradle / Ivy

There is a newer version: 0.1.57
Show newest version
//
// This file is part of Honey Require
//
// Copyright (c) 2015 Torben Haase
//
// Honey Require is free software: you can redistribute it and/or modify it
// under the terms of the MIT License (MIT).
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// You should have received a copy of the MIT License along with Honey Require.
// If not, see .
//
////////////////////////////////////////////////////////////////////////////////

// NOTE The load parameter points to the function, which prepares the
//      environment for each module and runs its code. Scroll down to the end of
//      the file to see the function definition.
(function(load) { 'use strict';

// NOTE Mozilla still sets the wrong fileName property for errors that occur
//      inside an eval call (even with sourceURL). However, the stack
//      contains the correct source, so it can be used to re-threw the error
//      with the correct fileName property.
// WARN Re-throwing an error object will mess up the stack trace and the
//      column number.
    if (typeof (new Error()).fileName == "string") {
        self.addEventListener("error", function(evt) {
            if (evt.error instanceof Error) {
                if (pwd[0]) {
                    evt.preventDefault();
                    throw new evt.error.constructor(evt.error.message, pwd[0].uri, evt.error.lineNumber);
                }
                else {
                    var m = evt.error.stack.match(/^[^\n@]*@([^\n]+):\d+:\d+/);
                    if (m === null) {
                        console.warn("Honey: unable to read file name from stack");
                    }
                    else if (evt.error.fileName != m[1]) {
                        evt.preventDefault();
                        throw new evt.error.constructor(evt.error.message, m[1], evt.error.lineNumber);
                    }
                }
            }
        }, false);
    }

// INFO Current module descriptors
//      pwd[0] contains the descriptor of the currently loaded module,
//      pwd[1] contains the descriptor its parent module and so on.

    var pwd = Array();

// INFO Path parser
//      Older browsers don't support the URL interface, therefore we use an
//      anchor element as parser in that case. Thes breaks web worker support,
//      but we don't care since these browsers also don't support web workers.

    var parser = URL ? new URL(location.href) : document.createElement('A');

// INFO Module cache
//      Contains getter functions for the exports objects of all the loaded
//      modules. The getter for the module 'mymod' is name '$name' to prevent
//      collisions with predefined object properties (see note below).
//      As long as a module has not been loaded the getter is either undefined
//      or contains the module code as a function (in case the module has been
//      pre-loaded in a bundle).
// WARN IE8 supports defineProperty only for DOM objects, therfore we use a
//      HTMLDivElement as cache in that case. This breaks web worker support,
//      but we don't care since IE8 has no web workers at all.

    try {
        var cache = new Object();
        Object.defineProperty(cache, "foo", {'value':"bar",'configurable':true});
        delete cache.foo;
    }
    catch (e) {
        console.warn("Honey: falling back to DOM workaround for defineProperty ("+e+")");
        cache = document.createElement('DIV');
    }

// INFO Send lock
//      Sending the request causes the event loop to continue. Therefore
//      pending AJAX load events for the same url might be executed before
//      the synchronous onLoad is called. This should be no problem, but in
//      Chrome the responseText of the sneaked in load events will be empty.
//      Therefore we have to lock the loading while executing send().

    var lock = new Object();

// INFO Honey options
//      The values can be set by defining a object called Honey. The
//      Honey object has to be defined before this script here is loaded
//      and changing the values in the Honey object will have no effect
//      afterwards!

    var requirePath = self.Honey&&self.Honey.requirePath!==undefined ? self.Honey.requirePath.slice(0) : ['./'];
    var requireCompiler = self.Honey&&self.Honey.requireCompiler!==undefined ? self.Honey.requireCompiler : null;

// NOTE Parse module root paths
    var base = [location.origin, location.href.substr(0, location.href.lastIndexOf("/")+1)];
    for (var i=0; i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy