diff --git a/demos/jeesh-module.js b/demos/jeesh-module.js new file mode 100644 index 0000000..8e259ed --- /dev/null +++ b/demos/jeesh-module.js @@ -0,0 +1 @@ +ender('li') \ No newline at end of file diff --git a/src/script.js b/src/script.js index 075e4f4..2be5739 100644 --- a/src/script.js +++ b/src/script.js @@ -1,97 +1,156 @@ -!function(win, doc, timeout) { +!function (win, doc) { var head = doc.getElementsByTagName('head')[0], - list = {}, ids = {}, delay = {}, - scripts = {}, s = 'string', f = false, - push = 'push', domContentLoaded = 'DOMContentLoaded', readyState = 'readyState', + list = {}, ids = {}, delay = {}, scripts = {}, + s = 'string', f = false, push = 'push', complete = /^c|loade/, + domContentLoaded = 'DOMContentLoaded', readyState = 'readyState', addEventListener = 'addEventListener', onreadystatechange = 'onreadystatechange', - every = function(ar, fn) { - for (var i = 0, j = ar.length; i < j; ++i) { - if (!fn(ar[i])) { - return f; - } - } - return 1; - }; - function each(ar, fn) { - every(ar, function(el) { - return !fn(el); - }); - } + faux = doc.createElement('script'), + preloadExplicit = typeof faux.preload == 'boolean', + preloadReal = preloadExplicit || (faux[readyState] && faux[readyState] == 'uninitialized'), + async = !preloadReal && faux.async === true if (!doc[readyState] && doc[addEventListener]) { doc[addEventListener](domContentLoaded, function fn() { doc.removeEventListener(domContentLoaded, fn, f); - doc[readyState] = "complete"; + doc[readyState] = 'complete'; }, f); - doc[readyState] = "loading"; + doc[readyState] = 'loading'; + } + + function timeout(fn) { + setTimeout(fn, 0) + } + + function every(ar, fn, i) { + for (i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f + return 1; } - var $script = function(paths, idOrDone, optDone) { - paths = paths[push] ? paths : [paths]; + function each(ar, fn) { + every(ar, function (el) { return !fn(el) }) + } + + function $script(paths, idOrDone, optDone) { + paths = paths[push] ? paths : [paths] var idOrDoneIsDone = idOrDone && idOrDone.call, + workingPaths = paths.slice(0), loadedPaths = {}, done = idOrDoneIsDone ? idOrDone : optDone, id = idOrDoneIsDone ? paths.join('') : idOrDone, - queue = paths.length; - function loopFn(item) { - return item.call ? item() : list[item]; - } - function callback() { - if (!--queue) { - list[id] = 1; - done && done(); - for (var dset in delay) { - every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = []); - } - } + queue = paths.length + + function loopFn(item) { + return item.call ? item() : list[item] + } + + function callback() { + if (!--queue) { + list[id] = 1 + done && done() + for (var dset in delay) { + every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = []) } - timeout(function() { - each(paths, function(path) { + } + } + + timeout(function () { + each(paths, function (path, p) { + p = $script.path ? $script.path + path + '.js' : path if (scripts[path]) { - id && (ids[id] = 1); - callback(); - return; + ids[id] = id || f + return callback() } - scripts[path] = 1; - id && (ids[id] = 1); - create($script.path ? - $script.path + path + '.js' : - path, callback); - }); - }, 0); - return $script; - }; + scripts[path] = 1 + ids[id] = id || f + !$script.order ? create(p, callback) : preload(p, function (el) { + if (async) return callback() + loadedPaths[p] = el || 1 + if (el) { + if (workingPaths[0] == p) { + head.insertBefore(el, head.firstChild) + timeout(function () { + callback() + workingPaths.shift() + while (loadedPaths[workingPaths[0]]) { + head.insertBefore(loadedPaths[workingPaths[0]], head.firstChild) + timeout(callback) + workingPaths.shift() + } + }) + } + return + } + workingPaths[0] == p && create(p, callback) + workingPaths.shift() + while (loadedPaths[workingPaths[0]]) { + create(workingPaths[0], callback) + workingPaths.shift() + } + }) + }) + }) + return $script + } + + function create(path, fn, type) { + var el = doc.createElement('script'), loaded = f + el.type = type || 'text/javascript' + el.async = !$script.order + el.onload = el[onreadystatechange] = function () { + if ((el[readyState] && !(complete.test(el[readyState]))) || loaded) return + el.onload = el[onreadystatechange] = null + loaded = 1 + fn && fn() + } + el.src = path + head.insertBefore(el, head.firstChild) + } + + function bind(fn) { + var a = Array.prototype.slice.call(arguments, 1) + return function () { + fn.apply(null, a) + } + } - function create(path, fn) { - var el = doc.createElement("script"), - loaded = f; - el.onload = el.onerror = el[onreadystatechange] = function () { - if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) { - return; + function preload(path, fn, el) { + if (preloadReal) { + el = doc.createElement('script') + el.type = 'text/javascript' + if (preloadExplicit) { + el.preload = true + el.onpreload = bind(fn, el) + } else { + el[onreadystatechange] = function () { + if (complete.test(el[readyState])) { + fn(el) + el[onreadystatechange] = null + } + } } - el.onload = el[onreadystatechange] = null; - loaded = 1; - fn(); - }; - el.async = 1; - el.src = path; - head.insertBefore(el, head.firstChild); + el.src = path // setting .src begins the preload + } else if (async) { + create(path, fn) + } else { + create(path, fn, 'text/cache-script') + } } - $script.get = create; - - $script.ready = function(deps, ready, req) { - deps = deps[push] ? deps : [deps]; - var missing = []; - !each(deps, function(dep) { - list[dep] || missing[push](dep); - }) && every(deps, function(dep) { - return list[dep]; - }) ? ready() : !function(key) { - delay[key] = delay[key] || []; - delay[key][push](ready); - req && req(missing); - }(deps.join('|')); - return $script; + $script.get = create + $script.order = true + + $script.ready = function (deps, ready, req) { + deps = deps[push] ? deps : [deps] + var missing = [] + !each(deps, function (dep) { + list[dep] || missing[push](dep) + }) && every(deps, function (dep) { + return list[dep] + }) ? ready() : !function (key) { + delay[key] = delay[key] || [] + delay[key][push](ready) + req && req(missing) + }(deps.join('|')) + return $script }; var old = win.$script; @@ -100,8 +159,8 @@ return this; }; - (typeof module !== 'undefined' && module.exports) ? - (module.exports = $script) : - (win['$script'] = $script); + typeof module !== 'undefined' && module.exports && (module.exports = $script) + + win['$script'] = $script -}(this, document, setTimeout); +}(this, document); diff --git a/tests/hugelibrary.js b/tests/hugelibrary.js new file mode 100644 index 0000000..c0dd48d --- /dev/null +++ b/tests/hugelibrary.js @@ -0,0 +1,144 @@ +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); +!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}();!function () {}(); + +!function (context) { + var n = 2, i; + for (i = 0; i < 200; i++) { + n = n * n + } + + context.LIBRARY = function () { + console.log('log some shit'); + } + +}(this); \ No newline at end of file diff --git a/tests/plugin.js b/tests/plugin.js new file mode 100644 index 0000000..561a27f --- /dev/null +++ b/tests/plugin.js @@ -0,0 +1 @@ +LIBRARY() \ No newline at end of file diff --git a/tests/test.html b/tests/test.html index 1417dc1..f5973ff 100644 --- a/tests/test.html +++ b/tests/test.html @@ -12,6 +12,7 @@