@@ -34,7 +34,7 @@ var requirejs, require, define;
3434 cfg = { } ,
3535 globalDefQueue = [ ] ,
3636 useInteractive = false ,
37- req , s , head , baseElement , scripts , globalI , script , dataMain , src ,
37+ req , s , head , baseElement , dataMain , src ,
3838 interactiveScript , currentlyAddingScript , mainScript , subPath ;
3939
4040 function isFunction ( it ) {
@@ -60,6 +60,21 @@ var requirejs, require, define;
6060 }
6161 }
6262
63+ /**
64+ * Helper function for iterating over an array. If the func returns
65+ * a true value, it will break out of the loop.
66+ */
67+ function eachReverse ( ary , func ) {
68+ if ( ary ) {
69+ var i ;
70+ for ( i = ary . length - 1 ; i > - 1 ; i -= 1 ) {
71+ if ( func ( ary [ i ] , i , ary ) ) {
72+ break ;
73+ }
74+ }
75+ }
76+ }
77+
6378 /**
6479 * Cycles over properties in an object and calls a function for each
6580 * property value. If the function returns a truthy value, then the
@@ -101,6 +116,36 @@ var requirejs, require, define;
101116 } ;
102117 }
103118
119+ function scripts ( ) {
120+ return document . getElementsByTagName ( 'script' ) ;
121+ }
122+
123+ function makeContextModuleFunc ( func , relMap , enableBuildCallback ) {
124+ return function ( ) {
125+ //A version of a require function that passes a moduleName
126+ //value for items that may need to
127+ //look up paths relative to the moduleName
128+ var args = aps . call ( arguments , 0 ) , lastArg ;
129+ if ( enableBuildCallback &&
130+ isFunction ( ( lastArg = args [ args . length - 1 ] ) ) ) {
131+ lastArg . __requireJsBuild = true ;
132+ }
133+ args . push ( relMap ) ;
134+ return func . apply ( null , args ) ;
135+ } ;
136+ }
137+
138+ function addRequireMethods ( req , context , relMap ) {
139+ each ( [
140+ [ 'toUrl' ] ,
141+ [ 'undef' ] ,
142+ [ 'defined' , 'requireDefined' ] ,
143+ [ 'specified' , 'requireSpecified' ]
144+ ] , function ( item ) {
145+ req [ item [ 0 ] ] = makeContextModuleFunc ( context [ item [ 1 ] || item [ 0 ] ] , relMap ) ;
146+ } ) ;
147+ }
148+
104149 /**
105150 * Constructs an error with a pointer to an URL with more information.
106151 * @param {String } id the error ID that maps to an ID on a web page.
@@ -293,17 +338,13 @@ var requirejs, require, define;
293338
294339 function removeScript ( name ) {
295340 if ( isBrowser ) {
296- var scripts = document . getElementsByTagName ( 'script' ) ,
297- i , scriptNode ;
298- for ( i = 0 ; i < scripts . length ; i += 1 ) {
299- scriptNode = scripts [ i ] ;
341+ each ( scripts ( ) , function ( scriptNode ) {
300342 if ( scriptNode . getAttribute ( 'data-requiremodule' ) === name &&
301343 scriptNode . getAttribute ( 'data-requirecontext' ) === context . contextName ) {
302344 scriptNode . parentNode . removeChild ( scriptNode ) ;
303- context . scriptCount -= 1 ;
304- break ;
345+ return true ;
305346 }
306- }
347+ } ) ;
307348 }
308349 }
309350
@@ -481,21 +522,6 @@ var requirejs, require, define;
481522 }
482523 }
483524
484- function makeContextModuleFunc ( func , relMap , enableBuildCallback ) {
485- return function ( ) {
486- //A version of a require function that passes a moduleName
487- //value for items that may need to
488- //look up paths relative to the moduleName
489- var args = aps . call ( arguments , 0 ) , lastArg ;
490- if ( enableBuildCallback &&
491- isFunction ( ( lastArg = args [ args . length - 1 ] ) ) ) {
492- lastArg . __requireJsBuild = true ;
493- }
494- args . push ( relMap ) ;
495- return func . apply ( null , args ) ;
496- } ;
497- }
498-
499525 /**
500526 * Helper function that creates a require function object to give to
501527 * modules that ask for it as a dependency. It needs to be specific
@@ -504,14 +530,12 @@ var requirejs, require, define;
504530 */
505531 function makeRequire ( mod , enableBuildCallback , altRequire ) {
506532 var relMap = mod && mod . map ,
507- modRequire = makeContextModuleFunc ( altRequire || context . require , relMap , enableBuildCallback ) ;
533+ modRequire = makeContextModuleFunc ( altRequire || context . require ,
534+ relMap ,
535+ enableBuildCallback ) ;
536+
537+ addRequireMethods ( modRequire , context , relMap ) ;
508538
509- mixin ( modRequire , {
510- toUrl : makeContextModuleFunc ( context . toUrl , relMap ) ,
511- nameToUrl : makeContextModuleFunc ( context . nameToUrl , relMap ) ,
512- defined : makeContextModuleFunc ( context . requireDefined , relMap ) ,
513- specified : makeContextModuleFunc ( context . requireSpecified , relMap )
514- } ) ;
515539 return modRequire ;
516540 }
517541
@@ -1306,6 +1330,15 @@ var requirejs, require, define;
13061330 }
13071331 } ,
13081332
1333+ requireDefined : function ( id , relMap ) {
1334+ return defined . hasOwnProperty ( makeModuleMap ( id , relMap , false , true ) . id ) ;
1335+ } ,
1336+
1337+ requireSpecified : function ( id , relMap ) {
1338+ id = makeModuleMap ( id , relMap , false , true ) . id ;
1339+ return defined . hasOwnProperty ( id ) || registry . hasOwnProperty ( id ) ;
1340+ } ,
1341+
13091342 require : function ( deps , callback , errback , relMap ) {
13101343 var moduleName , id , map , requireMod , args ;
13111344 if ( typeof deps === 'string' ) {
@@ -1662,24 +1695,6 @@ var requirejs, require, define;
16621695 require = req ;
16631696 }
16641697
1665- /**
1666- * Global require.toUrl(), to match global require, mostly useful
1667- * for debugging/work in the global space.
1668- */
1669- req . toUrl = function ( moduleNamePlusExt ) {
1670- return contexts [ defContextName ] . toUrl ( moduleNamePlusExt ) ;
1671- } ;
1672-
1673- /**
1674- * Global require.undef(), to allow undefining a module, and resetting
1675- * internal state to act like it was not loaded. It *does not* clean up
1676- * any script tag that may have been used to load the module, unless the
1677- * script timed out from loading via a waitSeconds expiration.
1678- */
1679- req . undef = function ( name , contextName ) {
1680- contexts [ contextName || defContextName ] . undef ( name ) ;
1681- } ;
1682-
16831698 req . version = version ;
16841699
16851700 //Used to filter out dependencies that are already paths.
@@ -1690,6 +1705,13 @@ var requirejs, require, define;
16901705 newContext : newContext
16911706 } ;
16921707
1708+ //Create default context.
1709+ req ( { } ) ;
1710+
1711+ //Exports some context-sensitive methods on global require, using
1712+ //default context if no context specified.
1713+ addRequireMethods ( req , contexts [ defContextName ] ) ;
1714+
16931715 if ( isBrowser ) {
16941716 head = s . head = document . getElementsByTagName ( 'head' ) [ 0 ] ;
16951717 //If BASE tag is in play, using appendChild is a problem for IE6.
@@ -1804,28 +1826,22 @@ var requirejs, require, define;
18041826 } ;
18051827
18061828 function getInteractiveScript ( ) {
1807- var scripts , i , script ;
18081829 if ( interactiveScript && interactiveScript . readyState === 'interactive' ) {
18091830 return interactiveScript ;
18101831 }
18111832
1812- scripts = document . getElementsByTagName ( 'script' ) ;
1813- for ( i = scripts . length - 1 ; i > - 1 ; i -= 1 ) {
1814- script = scripts [ i ] ;
1833+ eachReverse ( scripts ( ) , function ( script ) {
18151834 if ( script . readyState === 'interactive' ) {
18161835 return ( interactiveScript = script ) ;
18171836 }
1818- }
1837+ } ) ;
1838+ return interactiveScript ;
18191839 }
18201840
18211841 //Look for a data-main script attribute, which could also adjust the baseUrl.
18221842 if ( isBrowser ) {
18231843 //Figure out baseUrl. Get it from the script tag with require.js in it.
1824- scripts = document . getElementsByTagName ( 'script' ) ;
1825-
1826- for ( globalI = scripts . length - 1 ; globalI > - 1 ; globalI -= 1 ) {
1827- script = scripts [ globalI ] ;
1828-
1844+ eachReverse ( scripts ( ) , function ( script ) {
18291845 //Set the 'head' where we can append children by
18301846 //using the script's parent.
18311847 if ( ! head ) {
@@ -1854,9 +1870,9 @@ var requirejs, require, define;
18541870 //Put the data-main script in the files to load.
18551871 cfg . deps = cfg . deps ? cfg . deps . concat ( dataMain ) : [ dataMain ] ;
18561872
1857- break ;
1873+ return true ;
18581874 }
1859- }
1875+ } ) ;
18601876 }
18611877
18621878 /**
@@ -1943,17 +1959,6 @@ var requirejs, require, define;
19431959 return eval ( text ) ;
19441960 } ;
19451961
1946- //Set up default context. If require was a configuration object, use that as base config.
1962+ //Set up with config info .
19471963 req ( cfg ) ;
1948-
1949- //If modules are built into require.js, then need to make sure dependencies are
1950- //traced. Use a setTimeout in the browser world, to allow all the modules to register
1951- //themselves. In a non-browser env, assume that modules are not built into require.js,
1952- //which seems odd to do on the server.
1953- if ( typeof setTimeout !== 'undefined' ) {
1954- setTimeout ( function ( ) {
1955- var ctx = s . contexts [ ( cfg . context || defContextName ) ] ;
1956- ctx . require ( [ ] ) ;
1957- } , 0 ) ;
1958- }
19591964} ( this ) ) ;
0 commit comments