1
1
define ( [ "module" ] , function ( module ) {
2
2
var cache = ( module . config && module . config ( ) ) || { } ;
3
+ var tokensRE = / [ \? : ] | [ ^ : \? ] + / g;
3
4
4
5
function resolve ( resource , has , isBuild ) {
5
- var tokens = resource . match ( / [ \? : ] | [ ^ : \? ] + / g ) ;
6
+ var tokens = resource . match ( tokensRE ) ;
6
7
var i = 0 ;
7
8
var get = function ( skip ) {
8
9
var term = tokens [ i ++ ] ;
@@ -24,13 +25,22 @@ define(["module"], function (module) {
24
25
return get ( skip ) ;
25
26
}
26
27
}
27
- // a module
28
- return term ;
28
+ // A module or empty string.
29
+ // This allows to tell apart "undefined flag at build time" and "no module required" cases.
30
+ return term || "" ;
29
31
}
30
32
} ;
31
33
return get ( ) ;
32
34
}
33
35
36
+ function forEachModule ( tokens , callback ) {
37
+ for ( var i = 0 ; i < tokens . length ; i ++ ) {
38
+ if ( tokens [ i ] !== ":" && tokens [ i ] !== "?" && tokens [ i + 1 ] !== "?" ) {
39
+ callback ( tokens [ i ] , i ) ;
40
+ }
41
+ }
42
+ }
43
+
34
44
var has = function ( name ) {
35
45
var global = ( function ( ) {
36
46
return this ;
@@ -42,29 +52,26 @@ define(["module"], function (module) {
42
52
has . cache = cache ;
43
53
44
54
has . add = function ( name , test , now , force ) {
45
- ( typeof cache [ name ] === "undefined" || force ) && ( cache [ name ] = test ) ;
46
- return now && has ( name ) ;
55
+ if ( ! has ( "builder" ) ) {
56
+ ( typeof cache [ name ] === "undefined" || force ) && ( cache [ name ] = test ) ;
57
+ return now && has ( name ) ;
58
+ }
47
59
} ;
48
60
49
61
has . normalize = function ( resource , normalize ) {
50
- var tokens = resource . match ( / [ \? : ] | [ ^ : \? ] + / g ) ;
62
+ var tokens = resource . match ( tokensRE ) ;
51
63
52
- for ( var i = 0 ; i < tokens . length ; i ++ ) {
53
- if ( tokens [ i ] !== ":" && tokens [ i ] !== "?" && tokens [ i + 1 ] !== "?" ) {
54
- // The module could be another plugin
55
- var parts = tokens [ i ] . split ( "!" ) ;
56
- parts [ 0 ] = normalize ( parts [ 0 ] ) ;
57
- tokens [ i ] = parts . join ( "!" ) ;
58
- }
59
- }
64
+ forEachModule ( tokens , function ( module , index ) {
65
+ tokens [ index ] = normalize ( module ) ;
66
+ } ) ;
60
67
61
68
return tokens . join ( "" ) ;
62
69
} ;
63
70
64
71
has . load = function ( resource , req , onLoad , config ) {
65
72
config = config || { } ;
66
73
67
- if ( ! resource || config . isBuild ) {
74
+ if ( ! resource ) {
68
75
onLoad ( ) ;
69
76
return ;
70
77
}
@@ -79,10 +86,20 @@ define(["module"], function (module) {
79
86
} ;
80
87
81
88
has . addModules = function ( pluginName , resource , addModules ) {
89
+ var modulesToInclude = [ ] ;
90
+
82
91
var mid = resolve ( resource , has , true ) ;
83
92
if ( mid ) {
84
- addModules ( [ mid ] ) ;
93
+ modulesToInclude . push ( mid ) ;
94
+ } else if ( typeof mid === "undefined" ) {
95
+ // has expression cannot be resolved at build time so include all the modules just in case.
96
+ var tokens = resource . match ( tokensRE ) ;
97
+ forEachModule ( tokens , function ( module ) {
98
+ modulesToInclude . push ( module ) ;
99
+ } ) ;
85
100
}
101
+
102
+ addModules ( modulesToInclude ) ;
86
103
} ;
87
104
88
105
return has ;
0 commit comments