PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 3.2.5
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v3.2.5
4.7.0 4.6.1 4.6.0 4.5.5 4.5.4 4.5.3 4.5.2 3.2.20 3.2.21 3.2.22 3.2.3 3.2.5 3.2.6 3.2.7 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.7.0 3.7.1 All 111 releases
wp-optimize / vendor / robloach / component-installer / src / ComponentInstaller / Resources / require.js

require.js in WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance 3.2.5, at vendor/robloach/component-installer/src/ComponentInstaller/Resources/require.js

2,020 lines 79.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /** vim: et:ts=4:sw=4:sts=4
2 * @license RequireJS 2.1.5 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
3 * Available via the MIT or new BSD license.
4 * see: http://github.com/jrburke/requirejs for details
5 */
6 //Not using strict: uneven strict support in browsers, #392, and causes
7 //problems with requirejs.exec()/transpiler plugins that may not be strict.
8 /*jslint regexp: true, nomen: true, sloppy: true */
9 /*global window, navigator, document, importScripts, setTimeout, opera */
10
11 var requirejs, require, define;
12 (function (global) {
13 var req, s, head, baseElement, dataMain, src,
14 interactiveScript, currentlyAddingScript, mainScript, subPath,
15 version = '2.1.5',
16 commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
17 cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
18 jsSuffixRegExp = /\.js$/,
19 currDirRegExp = /^\.\//,
20 op = Object.prototype,
21 ostring = op.toString,
22 hasOwn = op.hasOwnProperty,
23 ap = Array.prototype,
24 apsp = ap.splice,
25 isBrowser = !!(typeof window !== 'undefined' && navigator && document),
26 isWebWorker = !isBrowser && typeof importScripts !== 'undefined',
27 //PS3 indicates loaded and complete, but need to wait for complete
28 //specifically. Sequence is 'loading', 'loaded', execution,
29 // then 'complete'. The UA check is unfortunate, but not sure how
30 //to feature test w/o causing perf issues.
31 readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
32 /^complete$/ : /^(complete|loaded)$/,
33 defContextName = '_',
34 //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
35 isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',
36 contexts = {},
37 cfg = {},
38 globalDefQueue = [],
39 useInteractive = false;
40
41 function isFunction(it) {
42 return ostring.call(it) === '[object Function]';
43 }
44
45 function isArray(it) {
46 return ostring.call(it) === '[object Array]';
47 }
48
49 /**
50 * Helper function for iterating over an array. If the func returns
51 * a true value, it will break out of the loop.
52 */
53 function each(ary, func) {
54 if (ary) {
55 var i;
56 for (i = 0; i < ary.length; i += 1) {
57 if (ary[i] && func(ary[i], i, ary)) {
58 break;
59 }
60 }
61 }
62 }
63
64 /**
65 * Helper function for iterating over an array backwards. If the func
66 * returns a true value, it will break out of the loop.
67 */
68 function eachReverse(ary, func) {
69 if (ary) {
70 var i;
71 for (i = ary.length - 1; i > -1; i -= 1) {
72 if (ary[i] && func(ary[i], i, ary)) {
73 break;
74 }
75 }
76 }
77 }
78
79 function hasProp(obj, prop) {
80 return hasOwn.call(obj, prop);
81 }
82
83 function getOwn(obj, prop) {
84 return hasProp(obj, prop) && obj[prop];
85 }
86
87 /**
88 * Cycles over properties in an object and calls a function for each
89 * property value. If the function returns a truthy value, then the
90 * iteration is stopped.
91 */
92 function eachProp(obj, func) {
93 var prop;
94 for (prop in obj) {
95 if (hasProp(obj, prop)) {
96 if (func(obj[prop], prop)) {
97 break;
98 }
99 }
100 }
101 }
102
103 /**
104 * Simple function to mix in properties from source into target,
105 * but only if target does not already have a property of the same name.
106 */
107 function mixin(target, source, force, deepStringMixin) {
108 if (source) {
109 eachProp(source, function (value, prop) {
110 if (force || !hasProp(target, prop)) {
111 if (deepStringMixin && typeof value !== 'string') {
112 if (!target[prop]) {
113 target[prop] = {};
114 }
115 mixin(target[prop], value, force, deepStringMixin);
116 } else {
117 target[prop] = value;
118 }
119 }
120 });
121 }
122 return target;
123 }
124
125 //Similar to Function.prototype.bind, but the 'this' object is specified
126 //first, since it is easier to read/figure out what 'this' will be.
127 function bind(obj, fn) {
128 return function () {
129 return fn.apply(obj, arguments);
130 };
131 }
132
133 function scripts() {
134 return document.getElementsByTagName('script');
135 }
136
137 //Allow getting a global that expressed in
138 //dot notation, like 'a.b.c'.
139 function getGlobal(value) {
140 if (!value) {
141 return value;
142 }
143 var g = global;
144 each(value.split('.'), function (part) {
145 g = g[part];
146 });
147 return g;
148 }
149
150 /**
151 * Constructs an error with a pointer to an URL with more information.
152 * @param {String} id the error ID that maps to an ID on a web page.
153 * @param {String} message human readable error.
154 * @param {Error} [err] the original error, if there is one.
155 *
156 * @returns {Error}
157 */
158 function makeError(id, msg, err, requireModules) {
159 var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
160 e.requireType = id;
161 e.requireModules = requireModules;
162 if (err) {
163 e.originalError = err;
164 }
165 return e;
166 }
167
168 if (typeof define !== 'undefined') {
169 //If a define is already in play via another AMD loader,
170 //do not overwrite.
171 return;
172 }
173
174 if (typeof requirejs !== 'undefined') {
175 if (isFunction(requirejs)) {
176 //Do not overwrite and existing requirejs instance.
177 return;
178 }
179 cfg = requirejs;
180 requirejs = undefined;
181 }
182
183 //Allow for a require config object
184 if (typeof require !== 'undefined' && !isFunction(require)) {
185 //assume it is a config object.
186 cfg = require;
187 require = undefined;
188 }
189
190 function newContext(contextName) {
191 var inCheckLoaded, Module, context, handlers,
192 checkLoadedTimeoutId,
193 config = {
194 //Defaults. Do not set a default for map
195 //config to speed up normalize(), which
196 //will run faster if there is no default.
197 waitSeconds: 7,
198 baseUrl: './',
199 paths: {},
200 pkgs: {},
201 shim: {},
202 config: {}
203 },
204 registry = {},
205 //registry of just enabled modules, to speed
206 //cycle breaking code when lots of modules
207 //are registered, but not activated.
208 enabledRegistry = {},
209 undefEvents = {},
210 defQueue = [],
211 defined = {},
212 urlFetched = {},
213 requireCounter = 1,
214 unnormalizedCounter = 1;
215
216 /**
217 * Trims the . and .. from an array of path segments.
218 * It will keep a leading path segment if a .. will become
219 * the first path segment, to help with module name lookups,
220 * which act like paths, but can be remapped. But the end result,
221 * all paths that use this function should look normalized.
222 * NOTE: this method MODIFIES the input array.
223 * @param {Array} ary the array of path segments.
224 */
225 function trimDots(ary) {
226 var i, part;
227 for (i = 0; ary[i]; i += 1) {
228 part = ary[i];
229 if (part === '.') {
230 ary.splice(i, 1);
231 i -= 1;
232 } else if (part === '..') {
233 if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {
234 //End of the line. Keep at least one non-dot
235 //path segment at the front so it can be mapped
236 //correctly to disk. Otherwise, there is likely
237 //no path mapping for a path starting with '..'.
238 //This can still fail, but catches the most reasonable
239 //uses of ..
240 break;
241 } else if (i > 0) {
242 ary.splice(i - 1, 2);
243 i -= 2;
244 }
245 }
246 }
247 }
248
249 /**
250 * Given a relative module name, like ./something, normalize it to
251 * a real name that can be mapped to a path.
252 * @param {String} name the relative name
253 * @param {String} baseName a real name that the name arg is relative
254 * to.
255 * @param {Boolean} applyMap apply the map config to the value. Should
256 * only be done if this normalization is for a dependency ID.
257 * @returns {String} normalized name
258 */
259 function normalize(name, baseName, applyMap) {
260 var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment,
261 foundMap, foundI, foundStarMap, starI,
262 baseParts = baseName && baseName.split('/'),
263 normalizedBaseParts = baseParts,
264 map = config.map,
265 starMap = map && map['*'];
266
267 //Adjust any relative paths.
268 if (name && name.charAt(0) === '.') {
269 //If have a base name, try to normalize against it,
270 //otherwise, assume it is a top-level require that will
271 //be relative to baseUrl in the end.
272 if (baseName) {
273 if (getOwn(config.pkgs, baseName)) {
274 //If the baseName is a package name, then just treat it as one
275 //name to concat the name with.
276 normalizedBaseParts = baseParts = [baseName];
277 } else {
278 //Convert baseName to array, and lop off the last part,
279 //so that . matches that 'directory' and not name of the baseName's
280 //module. For instance, baseName of 'one/two/three', maps to
281 //'one/two/three.js', but we want the directory, 'one/two' for
282 //this normalization.
283 normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
284 }
285
286 name = normalizedBaseParts.concat(name.split('/'));
287 trimDots(name);
288
289 //Some use of packages may use a . path to reference the
290 //'main' module name, so normalize for that.
291 pkgConfig = getOwn(config.pkgs, (pkgName = name[0]));
292 name = name.join('/');
293 if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {
294 name = pkgName;
295 }
296 } else if (name.indexOf('./') === 0) {
297 // No baseName, so this is ID is resolved relative
298 // to baseUrl, pull off the leading dot.
299 name = name.substring(2);
300 }
301 }
302
303 //Apply map config if available.
304 if (applyMap && map && (baseParts || starMap)) {
305 nameParts = name.split('/');
306
307 for (i = nameParts.length; i > 0; i -= 1) {
308 nameSegment = nameParts.slice(0, i).join('/');
309
310 if (baseParts) {
311 //Find the longest baseName segment match in the config.
312 //So, do joins on the biggest to smallest lengths of baseParts.
313 for (j = baseParts.length; j > 0; j -= 1) {
314 mapValue = getOwn(map, baseParts.slice(0, j).join('/'));
315
316 //baseName segment has config, find if it has one for
317 //this name.
318 if (mapValue) {
319 mapValue = getOwn(mapValue, nameSegment);
320 if (mapValue) {
321 //Match, update name to the new value.
322 foundMap = mapValue;
323 foundI = i;
324 break;
325 }
326 }
327 }
328 }
329
330 if (foundMap) {
331 break;
332 }
333
334 //Check for a star map match, but just hold on to it,
335 //if there is a shorter segment match later in a matching
336 //config, then favor over this star map.
337 if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {
338 foundStarMap = getOwn(starMap, nameSegment);
339 starI = i;
340 }
341 }
342
343 if (!foundMap && foundStarMap) {
344 foundMap = foundStarMap;
345 foundI = starI;
346 }
347
348 if (foundMap) {
349 nameParts.splice(0, foundI, foundMap);
350 name = nameParts.join('/');
351 }
352 }
353
354 return name;
355 }
356
357 function removeScript(name) {
358 if (isBrowser) {
359 each(scripts(), function (scriptNode) {
360 if (scriptNode.getAttribute('data-requiremodule') === name &&
361 scriptNode.getAttribute('data-requirecontext') === context.contextName) {
362 scriptNode.parentNode.removeChild(scriptNode);
363 return true;
364 }
365 });
366 }
367 }
368
369 function hasPathFallback(id) {
370 var pathConfig = getOwn(config.paths, id);
371 if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {
372 removeScript(id);
373 //Pop off the first array value, since it failed, and
374 //retry
375 pathConfig.shift();
376 context.require.undef(id);
377 context.require([id]);
378 return true;
379 }
380 }
381
382 //Turns a plugin!resource to [plugin, resource]
383 //with the plugin being undefined if the name
384 //did not have a plugin prefix.
385 function splitPrefix(name) {
386 var prefix,
387 index = name ? name.indexOf('!') : -1;
388 if (index > -1) {
389 prefix = name.substring(0, index);
390 name = name.substring(index + 1, name.length);
391 }
392 return [prefix, name];
393 }
394
395 /**
396 * Creates a module mapping that includes plugin prefix, module
397 * name, and path. If parentModuleMap is provided it will
398 * also normalize the name via require.normalize()
399 *
400 * @param {String} name the module name
401 * @param {String} [parentModuleMap] parent module map
402 * for the module name, used to resolve relative names.
403 * @param {Boolean} isNormalized: is the ID already normalized.
404 * This is true if this call is done for a define() module ID.
405 * @param {Boolean} applyMap: apply the map config to the ID.
406 * Should only be true if this map is for a dependency.
407 *
408 * @returns {Object}
409 */
410 function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
411 var url, pluginModule, suffix, nameParts,
412 prefix = null,
413 parentName = parentModuleMap ? parentModuleMap.name : null,
414 originalName = name,
415 isDefine = true,
416 normalizedName = '';
417
418 //If no name, then it means it is a require call, generate an
419 //internal name.
420 if (!name) {
421 isDefine = false;
422 name = '_@r' + (requireCounter += 1);
423 }
424
425 nameParts = splitPrefix(name);
426 prefix = nameParts[0];
427 name = nameParts[1];
428
429 if (prefix) {
430 prefix = normalize(prefix, parentName, applyMap);
431 pluginModule = getOwn(defined, prefix);
432 }
433
434 //Account for relative paths if there is a base name.
435 if (name) {
436 if (prefix) {
437 if (pluginModule && pluginModule.normalize) {
438 //Plugin is loaded, use its normalize method.
439 normalizedName = pluginModule.normalize(name, function (name) {
440 return normalize(name, parentName, applyMap);
441 });
442 } else {
443 normalizedName = normalize(name, parentName, applyMap);
444 }
445 } else {
446 //A regular module.
447 normalizedName = normalize(name, parentName, applyMap);
448
449 //Normalized name may be a plugin ID due to map config
450 //application in normalize. The map config values must
451 //already be normalized, so do not need to redo that part.
452 nameParts = splitPrefix(normalizedName);
453 prefix = nameParts[0];
454 normalizedName = nameParts[1];
455 isNormalized = true;
456
457 url = context.nameToUrl(normalizedName);
458 }
459 }
460
461 //If the id is a plugin id that cannot be determined if it needs
462 //normalization, stamp it with a unique ID so two matching relative
463 //ids that may conflict can be separate.
464 suffix = prefix && !pluginModule && !isNormalized ?
465 '_unnormalized' + (unnormalizedCounter += 1) :
466 '';
467
468 return {
469 prefix: prefix,
470 name: normalizedName,
471 parentMap: parentModuleMap,
472 unnormalized: !!suffix,
473 url: url,
474 originalName: originalName,
475 isDefine: isDefine,
476 id: (prefix ?
477 prefix + '!' + normalizedName :
478 normalizedName) + suffix
479 };
480 }
481
482 function getModule(depMap) {
483 var id = depMap.id,
484 mod = getOwn(registry, id);
485
486 if (!mod) {
487 mod = registry[id] = new context.Module(depMap);
488 }
489
490 return mod;
491 }
492
493 function on(depMap, name, fn) {
494 var id = depMap.id,
495 mod = getOwn(registry, id);
496
497 if (hasProp(defined, id) &&
498 (!mod || mod.defineEmitComplete)) {
499 if (name === 'defined') {
500 fn(defined[id]);
501 }
502 } else {
503 getModule(depMap).on(name, fn);
504 }
505 }
506
507 function onError(err, errback) {
508 var ids = err.requireModules,
509 notified = false;
510
511 if (errback) {
512 errback(err);
513 } else {
514 each(ids, function (id) {
515 var mod = getOwn(registry, id);
516 if (mod) {
517 //Set error on module, so it skips timeout checks.
518 mod.error = err;
519 if (mod.events.error) {
520 notified = true;
521 mod.emit('error', err);
522 }
523 }
524 });
525
526 if (!notified) {
527 req.onError(err);
528 }
529 }
530 }
531
532 /**
533 * Internal method to transfer globalQueue items to this context's
534 * defQueue.
535 */
536 function takeGlobalQueue() {
537 //Push all the globalDefQueue items into the context's defQueue
538 if (globalDefQueue.length) {
539 //Array splice in the values since the context code has a
540 //local var ref to defQueue, so cannot just reassign the one
541 //on context.
542 apsp.apply(defQueue,
543 [defQueue.length - 1, 0].concat(globalDefQueue));
544 globalDefQueue = [];
545 }
546 }
547
548 handlers = {
549 'require': function (mod) {
550 if (mod.require) {
551 return mod.require;
552 } else {
553 return (mod.require = context.makeRequire(mod.map));
554 }
555 },
556 'exports': function (mod) {
557 mod.usingExports = true;
558 if (mod.map.isDefine) {
559 if (mod.exports) {
560 return mod.exports;
561 } else {
562 return (mod.exports = defined[mod.map.id] = {});
563 }
564 }
565 },
566 'module': function (mod) {
567 if (mod.module) {
568 return mod.module;
569 } else {
570 return (mod.module = {
571 id: mod.map.id,
572 uri: mod.map.url,
573 config: function () {
574 return (config.config && getOwn(config.config, mod.map.id)) || {};
575 },
576 exports: defined[mod.map.id]
577 });
578 }
579 }
580 };
581
582 function cleanRegistry(id) {
583 //Clean up machinery used for waiting modules.
584 delete registry[id];
585 delete enabledRegistry[id];
586 }
587
588 function breakCycle(mod, traced, processed) {
589 var id = mod.map.id;
590
591 if (mod.error) {
592 mod.emit('error', mod.error);
593 } else {
594 traced[id] = true;
595 each(mod.depMaps, function (depMap, i) {
596 var depId = depMap.id,
597 dep = getOwn(registry, depId);
598
599 //Only force things that have not completed
600 //being defined, so still in the registry,
601 //and only if it has not been matched up
602 //in the module already.
603 if (dep && !mod.depMatched[i] && !processed[depId]) {
604 if (getOwn(traced, depId)) {
605 mod.defineDep(i, defined[depId]);
606 mod.check(); //pass false?
607 } else {
608 breakCycle(dep, traced, processed);
609 }
610 }
611 });
612 processed[id] = true;
613 }
614 }
615
616 function checkLoaded() {
617 var map, modId, err, usingPathFallback,
618 waitInterval = config.waitSeconds * 1000,
619 //It is possible to disable the wait interval by using waitSeconds of 0.
620 expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
621 noLoads = [],
622 reqCalls = [],
623 stillLoading = false,
624 needCycleCheck = true;
625
626 //Do not bother if this call was a result of a cycle break.
627 if (inCheckLoaded) {
628 return;
629 }
630
631 inCheckLoaded = true;
632
633 //Figure out the state of all the modules.
634 eachProp(enabledRegistry, function (mod) {
635 map = mod.map;
636 modId = map.id;
637
638 //Skip things that are not enabled or in error state.
639 if (!mod.enabled) {
640 return;
641 }
642
643 if (!map.isDefine) {
644 reqCalls.push(mod);
645 }
646
647 if (!mod.error) {
648 //If the module should be executed, and it has not
649 //been inited and time is up, remember it.
650 if (!mod.inited && expired) {
651 if (hasPathFallback(modId)) {
652 usingPathFallback = true;
653 stillLoading = true;
654 } else {
655 noLoads.push(modId);
656 removeScript(modId);
657 }
658 } else if (!mod.inited && mod.fetched && map.isDefine) {
659 stillLoading = true;
660 if (!map.prefix) {
661 //No reason to keep looking for unfinished
662 //loading. If the only stillLoading is a
663 //plugin resource though, keep going,
664 //because it may be that a plugin resource
665 //is waiting on a non-plugin cycle.
666 return (needCycleCheck = false);
667 }
668 }
669 }
670 });
671
672 if (expired && noLoads.length) {
673 //If wait time expired, throw error of unloaded modules.
674 err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);
675 err.contextName = context.contextName;
676 return onError(err);
677 }
678
679 //Not expired, check for a cycle.
680 if (needCycleCheck) {
681 each(reqCalls, function (mod) {
682 breakCycle(mod, {}, {});
683 });
684 }
685
686 //If still waiting on loads, and the waiting load is something
687 //other than a plugin resource, or there are still outstanding
688 //scripts, then just try back later.
689 if ((!expired || usingPathFallback) && stillLoading) {
690 //Something is still waiting to load. Wait for it, but only
691 //if a timeout is not already in effect.
692 if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
693 checkLoadedTimeoutId = setTimeout(function () {
694 checkLoadedTimeoutId = 0;
695 checkLoaded();
696 }, 50);
697 }
698 }
699
700 inCheckLoaded = false;
701 }
702
703 Module = function (map) {
704 this.events = getOwn(undefEvents, map.id) || {};
705 this.map = map;
706 this.shim = getOwn(config.shim, map.id);
707 this.depExports = [];
708 this.depMaps = [];
709 this.depMatched = [];
710 this.pluginMaps = {};
711 this.depCount = 0;
712
713 /* this.exports this.factory
714 this.depMaps = [],
715 this.enabled, this.fetched
716 */
717 };
718
719 Module.prototype = {
720 init: function (depMaps, factory, errback, options) {
721 options = options || {};
722
723 //Do not do more inits if already done. Can happen if there
724 //are multiple define calls for the same module. That is not
725 //a normal, common case, but it is also not unexpected.
726 if (this.inited) {
727 return;
728 }
729
730 this.factory = factory;
731
732 if (errback) {
733 //Register for errors on this module.
734 this.on('error', errback);
735 } else if (this.events.error) {
736 //If no errback already, but there are error listeners
737 //on this module, set up an errback to pass to the deps.
738 errback = bind(this, function (err) {
739 this.emit('error', err);
740 });
741 }
742
743 //Do a copy of the dependency array, so that
744 //source inputs are not modified. For example
745 //"shim" deps are passed in here directly, and
746 //doing a direct modification of the depMaps array
747 //would affect that config.
748 this.depMaps = depMaps && depMaps.slice(0);
749
750 this.errback = errback;
751
752 //Indicate this module has be initialized
753 this.inited = true;
754
755 this.ignore = options.ignore;
756
757 //Could have option to init this module in enabled mode,
758 //or could have been previously marked as enabled. However,
759 //the dependencies are not known until init is called. So
760 //if enabled previously, now trigger dependencies as enabled.
761 if (options.enabled || this.enabled) {
762 //Enable this module and dependencies.
763 //Will call this.check()
764 this.enable();
765 } else {
766 this.check();
767 }
768 },
769
770 defineDep: function (i, depExports) {
771 //Because of cycles, defined callback for a given
772 //export can be called more than once.
773 if (!this.depMatched[i]) {
774 this.depMatched[i] = true;
775 this.depCount -= 1;
776 this.depExports[i] = depExports;
777 }
778 },
779
780 fetch: function () {
781 if (this.fetched) {
782 return;
783 }
784 this.fetched = true;
785
786 context.startTime = (new Date()).getTime();
787
788 var map = this.map;
789
790 //If the manager is for a plugin managed resource,
791 //ask the plugin to load it now.
792 if (this.shim) {
793 context.makeRequire(this.map, {
794 enableBuildCallback: true
795 })(this.shim.deps || [], bind(this, function () {
796 return map.prefix ? this.callPlugin() : this.load();
797 }));
798 } else {
799 //Regular dependency.
800 return map.prefix ? this.callPlugin() : this.load();
801 }
802 },
803
804 load: function () {
805 var url = this.map.url;
806
807 //Regular dependency.
808 if (!urlFetched[url]) {
809 urlFetched[url] = true;
810 context.load(this.map.id, url);
811 }
812 },
813
814 /**
815 * Checks if the module is ready to define itself, and if so,
816 * define it.
817 */
818 check: function () {
819 if (!this.enabled || this.enabling) {
820 return;
821 }
822
823 var err, cjsModule,
824 id = this.map.id,
825 depExports = this.depExports,
826 exports = this.exports,
827 factory = this.factory;
828
829 if (!this.inited) {
830 this.fetch();
831 } else if (this.error) {
832 this.emit('error', this.error);
833 } else if (!this.defining) {
834 //The factory could trigger another require call
835 //that would result in checking this module to
836 //define itself again. If already in the process
837 //of doing that, skip this work.
838 this.defining = true;
839
840 if (this.depCount < 1 && !this.defined) {
841 if (isFunction(factory)) {
842 //If there is an error listener, favor passing
843 //to that instead of throwing an error.
844 if (this.events.error) {
845 try {
846 exports = context.execCb(id, factory, depExports, exports);
847 } catch (e) {
848 err = e;
849 }
850 } else {
851 exports = context.execCb(id, factory, depExports, exports);
852 }
853
854 if (this.map.isDefine) {
855 //If setting exports via 'module' is in play,
856 //favor that over return value and exports. After that,
857 //favor a non-undefined return value over exports use.
858 cjsModule = this.module;
859 if (cjsModule &&
860 cjsModule.exports !== undefined &&
861 //Make sure it is not already the exports value
862 cjsModule.exports !== this.exports) {
863 exports = cjsModule.exports;
864 } else if (exports === undefined && this.usingExports) {
865 //exports already set the defined value.
866 exports = this.exports;
867 }
868 }
869
870 if (err) {
871 err.requireMap = this.map;
872 err.requireModules = [this.map.id];
873 err.requireType = 'define';
874 return onError((this.error = err));
875 }
876
877 } else {
878 //Just a literal value
879 exports = factory;
880 }
881
882 this.exports = exports;
883
884 if (this.map.isDefine && !this.ignore) {
885 defined[id] = exports;
886
887 if (req.onResourceLoad) {
888 req.onResourceLoad(context, this.map, this.depMaps);
889 }
890 }
891
892 //Clean up
893 cleanRegistry(id);
894
895 this.defined = true;
896 }
897
898 //Finished the define stage. Allow calling check again
899 //to allow define notifications below in the case of a
900 //cycle.
901 this.defining = false;
902
903 if (this.defined && !this.defineEmitted) {
904 this.defineEmitted = true;
905 this.emit('defined', this.exports);
906 this.defineEmitComplete = true;
907 }
908
909 }
910 },
911
912 callPlugin: function () {
913 var map = this.map,
914 id = map.id,
915 //Map already normalized the prefix.
916 pluginMap = makeModuleMap(map.prefix);
917
918 //Mark this as a dependency for this plugin, so it
919 //can be traced for cycles.
920 this.depMaps.push(pluginMap);
921
922 on(pluginMap, 'defined', bind(this, function (plugin) {
923 var load, normalizedMap, normalizedMod,
924 name = this.map.name,
925 parentName = this.map.parentMap ? this.map.parentMap.name : null,
926 localRequire = context.makeRequire(map.parentMap, {
927 enableBuildCallback: true
928 });
929
930 //If current map is not normalized, wait for that
931 //normalized name to load instead of continuing.
932 if (this.map.unnormalized) {
933 //Normalize the ID if the plugin allows it.
934 if (plugin.normalize) {
935 name = plugin.normalize(name, function (name) {
936 return normalize(name, parentName, true);
937 }) || '';
938 }
939
940 //prefix and name should already be normalized, no need
941 //for applying map config again either.
942 normalizedMap = makeModuleMap(map.prefix + '!' + name,
943 this.map.parentMap);
944 on(normalizedMap,
945 'defined', bind(this, function (value) {
946 this.init([], function () { return value; }, null, {
947 enabled: true,
948 ignore: true
949 });
950 }));
951
952 normalizedMod = getOwn(registry, normalizedMap.id);
953 if (normalizedMod) {
954 //Mark this as a dependency for this plugin, so it
955 //can be traced for cycles.
956 this.depMaps.push(normalizedMap);
957
958 if (this.events.error) {
959 normalizedMod.on('error', bind(this, function (err) {
960 this.emit('error', err);
961 }));
962 }
963 normalizedMod.enable();
964 }
965
966 return;
967 }
968
969 load = bind(this, function (value) {
970 this.init([], function () { return value; }, null, {
971 enabled: true
972 });
973 });
974
975 load.error = bind(this, function (err) {
976 this.inited = true;
977 this.error = err;
978 err.requireModules = [id];
979
980 //Remove temp unnormalized modules for this module,
981 //since they will never be resolved otherwise now.
982 eachProp(registry, function (mod) {
983 if (mod.map.id.indexOf(id + '_unnormalized') === 0) {
984 cleanRegistry(mod.map.id);
985 }
986 });
987
988 onError(err);
989 });
990
991 //Allow plugins to load other code without having to know the
992 //context or how to 'complete' the load.
993 load.fromText = bind(this, function (text, textAlt) {
994 /*jslint evil: true */
995 var moduleName = map.name,
996 moduleMap = makeModuleMap(moduleName),
997 hasInteractive = useInteractive;
998
999 //As of 2.1.0, support just passing the text, to reinforce
1000 //fromText only being called once per resource. Still
1001 //support old style of passing moduleName but discard
1002 //that moduleName in favor of the internal ref.
1003 if (textAlt) {
1004 text = textAlt;
1005 }
1006
1007 //Turn off interactive script matching for IE for any define
1008 //calls in the text, then turn it back on at the end.
1009 if (hasInteractive) {
1010 useInteractive = false;
1011 }
1012
1013 //Prime the system by creating a module instance for
1014 //it.
1015 getModule(moduleMap);
1016
1017 //Transfer any config to this other module.
1018 if (hasProp(config.config, id)) {
1019 config.config[moduleName] = config.config[id];
1020 }
1021
1022 try {
1023 req.exec(text);
1024 } catch (e) {
1025 return onError(makeError('fromtexteval',
1026 'fromText eval for ' + id +
1027 ' failed: ' + e,
1028 e,
1029 [id]));
1030 }
1031
1032 if (hasInteractive) {
1033 useInteractive = true;
1034 }
1035
1036 //Mark this as a dependency for the plugin
1037 //resource
1038 this.depMaps.push(moduleMap);
1039
1040 //Support anonymous modules.
1041 context.completeLoad(moduleName);
1042
1043 //Bind the value of that module to the value for this
1044 //resource ID.
1045 localRequire([moduleName], load);
1046 });
1047
1048 //Use parentName here since the plugin's name is not reliable,
1049 //could be some weird string with no path that actually wants to
1050 //reference the parentName's path.
1051 plugin.load(map.name, localRequire, load, config);
1052 }));
1053
1054 context.enable(pluginMap, this);
1055 this.pluginMaps[pluginMap.id] = pluginMap;
1056 },
1057
1058 enable: function () {
1059 enabledRegistry[this.map.id] = this;
1060 this.enabled = true;
1061
1062 //Set flag mentioning that the module is enabling,
1063 //so that immediate calls to the defined callbacks
1064 //for dependencies do not trigger inadvertent load
1065 //with the depCount still being zero.
1066 this.enabling = true;
1067
1068 //Enable each dependency
1069 each(this.depMaps, bind(this, function (depMap, i) {
1070 var id, mod, handler;
1071
1072 if (typeof depMap === 'string') {
1073 //Dependency needs to be converted to a depMap
1074 //and wired up to this module.
1075 depMap = makeModuleMap(depMap,
1076 (this.map.isDefine ? this.map : this.map.parentMap),
1077 false,
1078 !this.skipMap);
1079 this.depMaps[i] = depMap;
1080
1081 handler = getOwn(handlers, depMap.id);
1082
1083 if (handler) {
1084 this.depExports[i] = handler(this);
1085 return;
1086 }
1087
1088 this.depCount += 1;
1089
1090 on(depMap, 'defined', bind(this, function (depExports) {
1091 this.defineDep(i, depExports);
1092 this.check();
1093 }));
1094
1095 if (this.errback) {
1096 on(depMap, 'error', this.errback);
1097 }
1098 }
1099
1100 id = depMap.id;
1101 mod = registry[id];
1102
1103 //Skip special modules like 'require', 'exports', 'module'
1104 //Also, don't call enable if it is already enabled,
1105 //important in circular dependency cases.
1106 if (!hasProp(handlers, id) && mod && !mod.enabled) {
1107 context.enable(depMap, this);
1108 }
1109 }));
1110
1111 //Enable each plugin that is used in
1112 //a dependency
1113 eachProp(this.pluginMaps, bind(this, function (pluginMap) {
1114 var mod = getOwn(registry, pluginMap.id);
1115 if (mod && !mod.enabled) {
1116 context.enable(pluginMap, this);
1117 }
1118 }));
1119
1120 this.enabling = false;
1121
1122 this.check();
1123 },
1124
1125 on: function (name, cb) {
1126 var cbs = this.events[name];
1127 if (!cbs) {
1128 cbs = this.events[name] = [];
1129 }
1130 cbs.push(cb);
1131 },
1132
1133 emit: function (name, evt) {
1134 each(this.events[name], function (cb) {
1135 cb(evt);
1136 });
1137 if (name === 'error') {
1138 //Now that the error handler was triggered, remove
1139 //the listeners, since this broken Module instance
1140 //can stay around for a while in the registry.
1141 delete this.events[name];
1142 }
1143 }
1144 };
1145
1146 function callGetModule(args) {
1147 //Skip modules already defined.
1148 if (!hasProp(defined, args[0])) {
1149 getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);
1150 }
1151 }
1152
1153 function removeListener(node, func, name, ieName) {
1154 //Favor detachEvent because of IE9
1155 //issue, see attachEvent/addEventListener comment elsewhere
1156 //in this file.
1157 if (node.detachEvent && !isOpera) {
1158 //Probably IE. If not it will throw an error, which will be
1159 //useful to know.
1160 if (ieName) {
1161 node.detachEvent(ieName, func);
1162 }
1163 } else {
1164 node.removeEventListener(name, func, false);
1165 }
1166 }
1167
1168 /**
1169 * Given an event from a script node, get the requirejs info from it,
1170 * and then removes the event listeners on the node.
1171 * @param {Event} evt
1172 * @returns {Object}
1173 */
1174 function getScriptData(evt) {
1175 //Using currentTarget instead of target for Firefox 2.0's sake. Not
1176 //all old browsers will be supported, but this one was easy enough
1177 //to support and still makes sense.
1178 var node = evt.currentTarget || evt.srcElement;
1179
1180 //Remove the listeners once here.
1181 removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');
1182 removeListener(node, context.onScriptError, 'error');
1183
1184 return {
1185 node: node,
1186 id: node && node.getAttribute('data-requiremodule')
1187 };
1188 }
1189
1190 function intakeDefines() {
1191 var args;
1192
1193 //Any defined modules in the global queue, intake them now.
1194 takeGlobalQueue();
1195
1196 //Make sure any remaining defQueue items get properly processed.
1197 while (defQueue.length) {
1198 args = defQueue.shift();
1199 if (args[0] === null) {
1200 return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
1201 } else {
1202 //args are id, deps, factory. Should be normalized by the
1203 //define() function.
1204 callGetModule(args);
1205 }
1206 }
1207 }
1208
1209 context = {
1210 config: config,
1211 contextName: contextName,
1212 registry: registry,
1213 defined: defined,
1214 urlFetched: urlFetched,
1215 defQueue: defQueue,
1216 Module: Module,
1217 makeModuleMap: makeModuleMap,
1218 nextTick: req.nextTick,
1219 onError: onError,
1220
1221 /**
1222 * Set a configuration for the context.
1223 * @param {Object} cfg config object to integrate.
1224 */
1225 configure: function (cfg) {
1226 //Make sure the baseUrl ends in a slash.
1227 if (cfg.baseUrl) {
1228 if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {
1229 cfg.baseUrl += '/';
1230 }
1231 }
1232
1233 //Save off the paths and packages since they require special processing,
1234 //they are additive.
1235 var pkgs = config.pkgs,
1236 shim = config.shim,
1237 objs = {
1238 paths: true,
1239 config: true,
1240 map: true
1241 };
1242
1243 eachProp(cfg, function (value, prop) {
1244 if (objs[prop]) {
1245 if (prop === 'map') {
1246 if (!config.map) {
1247 config.map = {};
1248 }
1249 mixin(config[prop], value, true, true);
1250 } else {
1251 mixin(config[prop], value, true);
1252 }
1253 } else {
1254 config[prop] = value;
1255 }
1256 });
1257
1258 //Merge shim
1259 if (cfg.shim) {
1260 eachProp(cfg.shim, function (value, id) {
1261 //Normalize the structure
1262 if (isArray(value)) {
1263 value = {
1264 deps: value
1265 };
1266 }
1267 if ((value.exports || value.init) && !value.exportsFn) {
1268 value.exportsFn = context.makeShimExports(value);
1269 }
1270 shim[id] = value;
1271 });
1272 config.shim = shim;
1273 }
1274
1275 //Adjust packages if necessary.
1276 if (cfg.packages) {
1277 each(cfg.packages, function (pkgObj) {
1278 var location;
1279
1280 pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;
1281 location = pkgObj.location;
1282
1283 //Create a brand new object on pkgs, since currentPackages can
1284 //be passed in again, and config.pkgs is the internal transformed
1285 //state for all package configs.
1286 pkgs[pkgObj.name] = {
1287 name: pkgObj.name,
1288 location: location || pkgObj.name,
1289 //Remove leading dot in main, so main paths are normalized,
1290 //and remove any trailing .js, since different package
1291 //envs have different conventions: some use a module name,
1292 //some use a file name.
1293 main: (pkgObj.main || 'main')
1294 .replace(currDirRegExp, '')
1295 .replace(jsSuffixRegExp, '')
1296 };
1297 });
1298
1299 //Done with modifications, assing packages back to context config
1300 config.pkgs = pkgs;
1301 }
1302
1303 //If there are any "waiting to execute" modules in the registry,
1304 //update the maps for them, since their info, like URLs to load,
1305 //may have changed.
1306 eachProp(registry, function (mod, id) {
1307 //If module already has init called, since it is too
1308 //late to modify them, and ignore unnormalized ones
1309 //since they are transient.
1310 if (!mod.inited && !mod.map.unnormalized) {
1311 mod.map = makeModuleMap(id);
1312 }
1313 });
1314
1315 //If a deps array or a config callback is specified, then call
1316 //require with those args. This is useful when require is defined as a
1317 //config object before require.js is loaded.
1318 if (cfg.deps || cfg.callback) {
1319 context.require(cfg.deps || [], cfg.callback);
1320 }
1321 },
1322
1323 makeShimExports: function (value) {
1324 function fn() {
1325 var ret;
1326 if (value.init) {
1327 ret = value.init.apply(global, arguments);
1328 }
1329 return ret || (value.exports && getGlobal(value.exports));
1330 }
1331 return fn;
1332 },
1333
1334 makeRequire: function (relMap, options) {
1335 options = options || {};
1336
1337 function localRequire(deps, callback, errback) {
1338 var id, map, requireMod;
1339
1340 if (options.enableBuildCallback && callback && isFunction(callback)) {
1341 callback.__requireJsBuild = true;
1342 }
1343
1344 if (typeof deps === 'string') {
1345 if (isFunction(callback)) {
1346 //Invalid call
1347 return onError(makeError('requireargs', 'Invalid require call'), errback);
1348 }
1349
1350 //If require|exports|module are requested, get the
1351 //value for them from the special handlers. Caveat:
1352 //this only works while module is being defined.
1353 if (relMap && hasProp(handlers, deps)) {
1354 return handlers[deps](registry[relMap.id]);
1355 }
1356
1357 //Synchronous access to one module. If require.get is
1358 //available (as in the Node adapter), prefer that.
1359 if (req.get) {
1360 return req.get(context, deps, relMap, localRequire);
1361 }
1362
1363 //Normalize module name, if it contains . or ..
1364 map = makeModuleMap(deps, relMap, false, true);
1365 id = map.id;
1366
1367 if (!hasProp(defined, id)) {
1368 return onError(makeError('notloaded', 'Module name "' +
1369 id +
1370 '" has not been loaded yet for context: ' +
1371 contextName +
1372 (relMap ? '' : '. Use require([])')));
1373 }
1374 return defined[id];
1375 }
1376
1377 //Grab defines waiting in the global queue.
1378 intakeDefines();
1379
1380 //Mark all the dependencies as needing to be loaded.
1381 context.nextTick(function () {
1382 //Some defines could have been added since the
1383 //require call, collect them.
1384 intakeDefines();
1385
1386 requireMod = getModule(makeModuleMap(null, relMap));
1387
1388 //Store if map config should be applied to this require
1389 //call for dependencies.
1390 requireMod.skipMap = options.skipMap;
1391
1392 requireMod.init(deps, callback, errback, {
1393 enabled: true
1394 });
1395
1396 checkLoaded();
1397 });
1398
1399 return localRequire;
1400 }
1401
1402 mixin(localRequire, {
1403 isBrowser: isBrowser,
1404
1405 /**
1406 * Converts a module name + .extension into an URL path.
1407 * *Requires* the use of a module name. It does not support using
1408 * plain URLs like nameToUrl.
1409 */
1410 toUrl: function (moduleNamePlusExt) {
1411 var ext,
1412 index = moduleNamePlusExt.lastIndexOf('.'),
1413 segment = moduleNamePlusExt.split('/')[0],
1414 isRelative = segment === '.' || segment === '..';
1415
1416 //Have a file extension alias, and it is not the
1417 //dots from a relative path.
1418 if (index !== -1 && (!isRelative || index > 1)) {
1419 ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
1420 moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
1421 }
1422
1423 return context.nameToUrl(normalize(moduleNamePlusExt,
1424 relMap && relMap.id, true), ext, true);
1425 },
1426
1427 defined: function (id) {
1428 return hasProp(defined, makeModuleMap(id, relMap, false, true).id);
1429 },
1430
1431 specified: function (id) {
1432 id = makeModuleMap(id, relMap, false, true).id;
1433 return hasProp(defined, id) || hasProp(registry, id);
1434 }
1435 });
1436
1437 //Only allow undef on top level require calls
1438 if (!relMap) {
1439 localRequire.undef = function (id) {
1440 //Bind any waiting define() calls to this context,
1441 //fix for #408
1442 takeGlobalQueue();
1443
1444 var map = makeModuleMap(id, relMap, true),
1445 mod = getOwn(registry, id);
1446
1447 delete defined[id];
1448 delete urlFetched[map.url];
1449 delete undefEvents[id];
1450
1451 if (mod) {
1452 //Hold on to listeners in case the
1453 //module will be attempted to be reloaded
1454 //using a different config.
1455 if (mod.events.defined) {
1456 undefEvents[id] = mod.events;
1457 }
1458
1459 cleanRegistry(id);
1460 }
1461 };
1462 }
1463
1464 return localRequire;
1465 },
1466
1467 /**
1468 * Called to enable a module if it is still in the registry
1469 * awaiting enablement. A second arg, parent, the parent module,
1470 * is passed in for context, when this method is overriden by
1471 * the optimizer. Not shown here to keep code compact.
1472 */
1473 enable: function (depMap) {
1474 var mod = getOwn(registry, depMap.id);
1475 if (mod) {
1476 getModule(depMap).enable();
1477 }
1478 },
1479
1480 /**
1481 * Internal method used by environment adapters to complete a load event.
1482 * A load event could be a script load or just a load pass from a synchronous
1483 * load call.
1484 * @param {String} moduleName the name of the module to potentially complete.
1485 */
1486 completeLoad: function (moduleName) {
1487 var found, args, mod,
1488 shim = getOwn(config.shim, moduleName) || {},
1489 shExports = shim.exports;
1490
1491 takeGlobalQueue();
1492
1493 while (defQueue.length) {
1494 args = defQueue.shift();
1495 if (args[0] === null) {
1496 args[0] = moduleName;
1497 //If already found an anonymous module and bound it
1498 //to this name, then this is some other anon module
1499 //waiting for its completeLoad to fire.
1500 if (found) {
1501 break;
1502 }
1503 found = true;
1504 } else if (args[0] === moduleName) {
1505 //Found matching define call for this script!
1506 found = true;
1507 }
1508
1509 callGetModule(args);
1510 }
1511
1512 //Do this after the cycle of callGetModule in case the result
1513 //of those calls/init calls changes the registry.
1514 mod = getOwn(registry, moduleName);
1515
1516 if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {
1517 if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {
1518 if (hasPathFallback(moduleName)) {
1519 return;
1520 } else {
1521 return onError(makeError('nodefine',
1522 'No define call for ' + moduleName,
1523 null,
1524 [moduleName]));
1525 }
1526 } else {
1527 //A script that does not call define(), so just simulate
1528 //the call for it.
1529 callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);
1530 }
1531 }
1532
1533 checkLoaded();
1534 },
1535
1536 /**
1537 * Converts a module name to a file path. Supports cases where
1538 * moduleName may actually be just an URL.
1539 * Note that it **does not** call normalize on the moduleName,
1540 * it is assumed to have already been normalized. This is an
1541 * internal API, not a public one. Use toUrl for the public API.
1542 */
1543 nameToUrl: function (moduleName, ext, skipExt) {
1544 var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,
1545 parentPath;
1546
1547 //If a colon is in the URL, it indicates a protocol is used and it is just
1548 //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)
1549 //or ends with .js, then assume the user meant to use an url and not a module id.
1550 //The slash is important for protocol-less URLs as well as full paths.
1551 if (req.jsExtRegExp.test(moduleName)) {
1552 //Just a plain path, not module name lookup, so just return it.
1553 //Add extension if it is included. This is a bit wonky, only non-.js things pass
1554 //an extension, this method probably needs to be reworked.
1555 url = moduleName + (ext || '');
1556 } else {
1557 //A module that needs to be converted to a path.
1558 paths = config.paths;
1559 pkgs = config.pkgs;
1560
1561 syms = moduleName.split('/');
1562 //For each module name segment, see if there is a path
1563 //registered for it. Start with most specific name
1564 //and work up from it.
1565 for (i = syms.length; i > 0; i -= 1) {
1566 parentModule = syms.slice(0, i).join('/');
1567 pkg = getOwn(pkgs, parentModule);
1568 parentPath = getOwn(paths, parentModule);
1569 if (parentPath) {
1570 //If an array, it means there are a few choices,
1571 //Choose the one that is desired
1572 if (isArray(parentPath)) {
1573 parentPath = parentPath[0];
1574 }
1575 syms.splice(0, i, parentPath);
1576 break;
1577 } else if (pkg) {
1578 //If module name is just the package name, then looking
1579 //for the main module.
1580 if (moduleName === pkg.name) {
1581 pkgPath = pkg.location + '/' + pkg.main;
1582 } else {
1583 pkgPath = pkg.location;
1584 }
1585 syms.splice(0, i, pkgPath);
1586 break;
1587 }
1588 }
1589
1590 //Join the path parts together, then figure out if baseUrl is needed.
1591 url = syms.join('/');
1592 url += (ext || (/\?/.test(url) || skipExt ? '' : '.js'));
1593 url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;
1594 }
1595
1596 return config.urlArgs ? url +
1597 ((url.indexOf('?') === -1 ? '?' : '&') +
1598 config.urlArgs) : url;
1599 },
1600
1601 //Delegates to req.load. Broken out as a separate function to
1602 //allow overriding in the optimizer.
1603 load: function (id, url) {
1604 req.load(context, id, url);
1605 },
1606
1607 /**
1608 * Executes a module callack function. Broken out as a separate function
1609 * solely to allow the build system to sequence the files in the built
1610 * layer in the right sequence.
1611 *
1612 * @private
1613 */
1614 execCb: function (name, callback, args, exports) {
1615 return callback.apply(exports, args);
1616 },
1617
1618 /**
1619 * callback for script loads, used to check status of loading.
1620 *
1621 * @param {Event} evt the event from the browser for the script
1622 * that was loaded.
1623 */
1624 onScriptLoad: function (evt) {
1625 //Using currentTarget instead of target for Firefox 2.0's sake. Not
1626 //all old browsers will be supported, but this one was easy enough
1627 //to support and still makes sense.
1628 if (evt.type === 'load' ||
1629 (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {
1630 //Reset interactive script so a script node is not held onto for
1631 //to long.
1632 interactiveScript = null;
1633
1634 //Pull out the name of the module and the context.
1635 var data = getScriptData(evt);
1636 context.completeLoad(data.id);
1637 }
1638 },
1639
1640 /**
1641 * Callback for script errors.
1642 */
1643 onScriptError: function (evt) {
1644 var data = getScriptData(evt);
1645 if (!hasPathFallback(data.id)) {
1646 return onError(makeError('scripterror', 'Script error', evt, [data.id]));
1647 }
1648 }
1649 };
1650
1651 context.require = context.makeRequire();
1652 return context;
1653 }
1654
1655 /**
1656 * Main entry point.
1657 *
1658 * If the only argument to require is a string, then the module that
1659 * is represented by that string is fetched for the appropriate context.
1660 *
1661 * If the first argument is an array, then it will be treated as an array
1662 * of dependency string names to fetch. An optional function callback can
1663 * be specified to execute when all of those dependencies are available.
1664 *
1665 * Make a local req variable to help Caja compliance (it assumes things
1666 * on a require that are not standardized), and to give a short
1667 * name for minification/local scope use.
1668 */
1669 req = requirejs = function (deps, callback, errback, optional) {
1670
1671 //Find the right context, use default
1672 var context, config,
1673 contextName = defContextName;
1674
1675 // Determine if have config object in the call.
1676 if (!isArray(deps) && typeof deps !== 'string') {
1677 // deps is a config object
1678 config = deps;
1679 if (isArray(callback)) {
1680 // Adjust args if there are dependencies
1681 deps = callback;
1682 callback = errback;
1683 errback = optional;
1684 } else {
1685 deps = [];
1686 }
1687 }
1688
1689 if (config && config.context) {
1690 contextName = config.context;
1691 }
1692
1693 context = getOwn(contexts, contextName);
1694 if (!context) {
1695 context = contexts[contextName] = req.s.newContext(contextName);
1696 }
1697
1698 if (config) {
1699 context.configure(config);
1700 }
1701
1702 return context.require(deps, callback, errback);
1703 };
1704
1705 /**
1706 * Support require.config() to make it easier to cooperate with other
1707 * AMD loaders on globally agreed names.
1708 */
1709 req.config = function (config) {
1710 return req(config);
1711 };
1712
1713 /**
1714 * Execute something after the current tick
1715 * of the event loop. Override for other envs
1716 * that have a better solution than setTimeout.
1717 * @param {Function} fn function to execute later.
1718 */
1719 req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
1720 setTimeout(fn, 4);
1721 } : function (fn) { fn(); };
1722
1723 /**
1724 * Export require as a global, but only if it does not already exist.
1725 */
1726 if (!require) {
1727 require = req;
1728 }
1729
1730 req.version = version;
1731
1732 //Used to filter out dependencies that are already paths.
1733 req.jsExtRegExp = /^\/|:|\?|\.js$/;
1734 req.isBrowser = isBrowser;
1735 s = req.s = {
1736 contexts: contexts,
1737 newContext: newContext
1738 };
1739
1740 //Create default context.
1741 req({});
1742
1743 //Exports some context-sensitive methods on global require.
1744 each([
1745 'toUrl',
1746 'undef',
1747 'defined',
1748 'specified'
1749 ], function (prop) {
1750 //Reference from contexts instead of early binding to default context,
1751 //so that during builds, the latest instance of the default context
1752 //with its config gets used.
1753 req[prop] = function () {
1754 var ctx = contexts[defContextName];
1755 return ctx.require[prop].apply(ctx, arguments);
1756 };
1757 });
1758
1759 if (isBrowser) {
1760 head = s.head = document.getElementsByTagName('head')[0];
1761 //If BASE tag is in play, using appendChild is a problem for IE6.
1762 //When that browser dies, this can be removed. Details in this jQuery bug:
1763 //http://dev.jquery.com/ticket/2709
1764 baseElement = document.getElementsByTagName('base')[0];
1765 if (baseElement) {
1766 head = s.head = baseElement.parentNode;
1767 }
1768 }
1769
1770 /**
1771 * Any errors that require explicitly generates will be passed to this
1772 * function. Intercept/override it if you want custom error handling.
1773 * @param {Error} err the error object.
1774 */
1775 req.onError = function (err) {
1776 throw err;
1777 };
1778
1779 /**
1780 * Does the request to load a module for the browser case.
1781 * Make this a separate function to allow other environments
1782 * to override it.
1783 *
1784 * @param {Object} context the require context to find state.
1785 * @param {String} moduleName the name of the module.
1786 * @param {Object} url the URL to the module.
1787 */
1788 req.load = function (context, moduleName, url) {
1789 var config = (context && context.config) || {},
1790 node;
1791 if (isBrowser) {
1792 //In the browser so use a script tag
1793 node = config.xhtml ?
1794 document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
1795 document.createElement('script');
1796 node.type = config.scriptType || 'text/javascript';
1797 node.charset = 'utf-8';
1798 node.async = true;
1799
1800 node.setAttribute('data-requirecontext', context.contextName);
1801 node.setAttribute('data-requiremodule', moduleName);
1802
1803 //Set up load listener. Test attachEvent first because IE9 has
1804 //a subtle issue in its addEventListener and script onload firings
1805 //that do not match the behavior of all other browsers with
1806 //addEventListener support, which fire the onload event for a
1807 //script right after the script execution. See:
1808 //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
1809 //UNFORTUNATELY Opera implements attachEvent but does not follow the script
1810 //script execution mode.
1811 if (node.attachEvent &&
1812 //Check if node.attachEvent is artificially added by custom script or
1813 //natively supported by browser
1814 //read https://github.com/jrburke/requirejs/issues/187
1815 //if we can NOT find [native code] then it must NOT natively supported.
1816 //in IE8, node.attachEvent does not have toString()
1817 //Note the test for "[native code" with no closing brace, see:
1818 //https://github.com/jrburke/requirejs/issues/273
1819 !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&
1820 !isOpera) {
1821 //Probably IE. IE (at least 6-8) do not fire
1822 //script onload right after executing the script, so
1823 //we cannot tie the anonymous define call to a name.
1824 //However, IE reports the script as being in 'interactive'
1825 //readyState at the time of the define call.
1826 useInteractive = true;
1827
1828 node.attachEvent('onreadystatechange', context.onScriptLoad);
1829 //It would be great to add an error handler here to catch
1830 //404s in IE9+. However, onreadystatechange will fire before
1831 //the error handler, so that does not help. If addEventListener
1832 //is used, then IE will fire error before load, but we cannot
1833 //use that pathway given the connect.microsoft.com issue
1834 //mentioned above about not doing the 'script execute,
1835 //then fire the script load event listener before execute
1836 //next script' that other browsers do.
1837 //Best hope: IE10 fixes the issues,
1838 //and then destroys all installs of IE 6-9.
1839 //node.attachEvent('onerror', context.onScriptError);
1840 } else {
1841 node.addEventListener('load', context.onScriptLoad, false);
1842 node.addEventListener('error', context.onScriptError, false);
1843 }
1844 node.src = url;
1845
1846 //For some cache cases in IE 6-8, the script executes before the end
1847 //of the appendChild execution, so to tie an anonymous define
1848 //call to the module name (which is stored on the node), hold on
1849 //to a reference to this node, but clear after the DOM insertion.
1850 currentlyAddingScript = node;
1851 if (baseElement) {
1852 head.insertBefore(node, baseElement);
1853 } else {
1854 head.appendChild(node);
1855 }
1856 currentlyAddingScript = null;
1857
1858 return node;
1859 } else if (isWebWorker) {
1860 try {
1861 //In a web worker, use importScripts. This is not a very
1862 //efficient use of importScripts, importScripts will block until
1863 //its script is downloaded and evaluated. However, if web workers
1864 //are in play, the expectation that a build has been done so that
1865 //only one script needs to be loaded anyway. This may need to be
1866 //reevaluated if other use cases become common.
1867 importScripts(url);
1868
1869 //Account for anonymous modules
1870 context.completeLoad(moduleName);
1871 } catch (e) {
1872 context.onError(makeError('importscripts',
1873 'importScripts failed for ' +
1874 moduleName + ' at ' + url,
1875 e,
1876 [moduleName]));
1877 }
1878 }
1879 };
1880
1881 function getInteractiveScript() {
1882 if (interactiveScript && interactiveScript.readyState === 'interactive') {
1883 return interactiveScript;
1884 }
1885
1886 eachReverse(scripts(), function (script) {
1887 if (script.readyState === 'interactive') {
1888 return (interactiveScript = script);
1889 }
1890 });
1891 return interactiveScript;
1892 }
1893
1894 //Look for a data-main script attribute, which could also adjust the baseUrl.
1895 if (isBrowser) {
1896 //Figure out baseUrl. Get it from the script tag with require.js in it.
1897 eachReverse(scripts(), function (script) {
1898 //Set the 'head' where we can append children by
1899 //using the script's parent.
1900 if (!head) {
1901 head = script.parentNode;
1902 }
1903
1904 //Look for a data-main attribute to set main script for the page
1905 //to load. If it is there, the path to data main becomes the
1906 //baseUrl, if it is not already set.
1907 dataMain = script.getAttribute('data-main');
1908 if (dataMain) {
1909 //Set final baseUrl if there is not already an explicit one.
1910 if (!cfg.baseUrl) {
1911 //Pull off the directory of data-main for use as the
1912 //baseUrl.
1913 src = dataMain.split('/');
1914 mainScript = src.pop();
1915 subPath = src.length ? src.join('/') + '/' : './';
1916
1917 cfg.baseUrl = subPath;
1918 dataMain = mainScript;
1919 }
1920
1921 //Strip off any trailing .js since dataMain is now
1922 //like a module name.
1923 dataMain = dataMain.replace(jsSuffixRegExp, '');
1924
1925 //Put the data-main script in the files to load.
1926 cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];
1927
1928 return true;
1929 }
1930 });
1931 }
1932
1933 /**
1934 * The function that handles definitions of modules. Differs from
1935 * require() in that a string for the module should be the first argument,
1936 * and the function to execute after dependencies are loaded should
1937 * return a value to define the module corresponding to the first argument's
1938 * name.
1939 */
1940 define = function (name, deps, callback) {
1941 var node, context;
1942
1943 //Allow for anonymous modules
1944 if (typeof name !== 'string') {
1945 //Adjust args appropriately
1946 callback = deps;
1947 deps = name;
1948 name = null;
1949 }
1950
1951 //This module may not have dependencies
1952 if (!isArray(deps)) {
1953 callback = deps;
1954 deps = [];
1955 }
1956
1957 //If no name, and callback is a function, then figure out if it a
1958 //CommonJS thing with dependencies.
1959 if (!deps.length && isFunction(callback)) {
1960 //Remove comments from the callback string,
1961 //look for require calls, and pull them into the dependencies,
1962 //but only if there are function args.
1963 if (callback.length) {
1964 callback
1965 .toString()
1966 .replace(commentRegExp, '')
1967 .replace(cjsRequireRegExp, function (match, dep) {
1968 deps.push(dep);
1969 });
1970
1971 //May be a CommonJS thing even without require calls, but still
1972 //could use exports, and module. Avoid doing exports and module
1973 //work though if it just needs require.
1974 //REQUIRES the function to expect the CommonJS variables in the
1975 //order listed below.
1976 deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);
1977 }
1978 }
1979
1980 //If in IE 6-8 and hit an anonymous define() call, do the interactive
1981 //work.
1982 if (useInteractive) {
1983 node = currentlyAddingScript || getInteractiveScript();
1984 if (node) {
1985 if (!name) {
1986 name = node.getAttribute('data-requiremodule');
1987 }
1988 context = contexts[node.getAttribute('data-requirecontext')];
1989 }
1990 }
1991
1992 //Always save off evaluating the def call until the script onload handler.
1993 //This allows multiple modules to be in a file without prematurely
1994 //tracing dependencies, and allows for anonymous module support,
1995 //where the module name is not known until the script onload event
1996 //occurs. If no context, use the global queue, and get it processed
1997 //in the onscript load callback.
1998 (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
1999 };
2000
2001 define.amd = {
2002 jQuery: true
2003 };
2004
2005
2006 /**
2007 * Executes the text. Normally just uses eval, but can be modified
2008 * to use a better, environment-specific call. Only used for transpiling
2009 * loader plugins, not for plain JS modules.
2010 * @param {String} text the text to execute/evaluate.
2011 */
2012 req.exec = function (text) {
2013 /*jslint evil: true */
2014 return eval(text);
2015 };
2016
2017 //Set up with config info.
2018 req(cfg);
2019 }(this));
2020