requirejs-rails 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,10 +32,12 @@ module Requirejs::Rails
32
32
  baseUrl
33
33
  callback
34
34
  catchError
35
+ config
35
36
  context
36
37
  deps
37
38
  jQuery
38
39
  locale
40
+ map
39
41
  packages
40
42
  paths
41
43
  priority
@@ -61,6 +63,7 @@ module Requirejs::Rails
61
63
  inlineText
62
64
  locale
63
65
  mainConfigFile
66
+ map
64
67
  modules
65
68
  name
66
69
  namespace
@@ -7,24 +7,18 @@ module Requirejs
7
7
  class Engine < ::Rails::Engine
8
8
 
9
9
  ### Configuration setup
10
- config.before_configuration do |app|
10
+ config.before_configuration do
11
11
  config.requirejs = Requirejs::Rails::Config.new
12
12
  config.requirejs.precompile = [/require\.js$/]
13
-
14
- # Location of the user-supplied config parameters, which will be
15
- # merged with the default params. It should be a YAML file with
16
- # a single top-level hash, keys/values corresponding to require.js
17
- # config parameters.
18
- config.requirejs.user_config_file = Pathname.new(app.paths["config"].first)+'requirejs.yml'
19
- if config.requirejs.user_config_file.exist?
20
- config.requirejs.user_config = YAML.load(config.requirejs.user_config_file.read)
21
- else
22
- config.requirejs.user_config = {}
23
- end
24
13
  end
25
14
 
26
15
  config.before_initialize do |app|
27
16
  config = app.config
17
+
18
+ # Process the user config file in #before_initalization (instead of #before_configuration) so that
19
+ # environment-specific configuration can be injected into the user configuration file
20
+ process_user_config_file(app, config)
21
+
28
22
  config.assets.precompile += config.requirejs.precompile
29
23
 
30
24
  manifest_path = File.join(::Rails.public_path, config.assets.prefix, "rjs_manifest.yml")
@@ -43,11 +37,40 @@ module Requirejs
43
37
  initializer "requirejs.manifest", :after => "sprockets.environment" do |app|
44
38
  config = app.config
45
39
  if config.requirejs.manifest_path.exist? && config.assets.digests
46
- rjs_digests = YAML.load_file(config.requirejs.manifest_path)
40
+ rjs_digests = YAML.load(ERB.new(File.new(config.requirejs.manifest_path).read).result)
47
41
  config.assets.digests.merge!(rjs_digests)
48
42
  end
49
43
  end
50
44
 
45
+ private
46
+
47
+ # Process the user-supplied config parameters, which will be
48
+ # merged with the default params. It should be a YAML file with
49
+ # a single top-level hash, keys/values corresponding to require.js
50
+ # config parameters.
51
+ def process_user_config_file(app, config)
52
+ config_path = Pathname.new(app.paths["config"].first)
53
+ config.requirejs.user_config_file = config_path+'requirejs.yml'
54
+
55
+ yaml_file_contents = nil
56
+ if config.requirejs.user_config_file.exist?
57
+ yaml_file_contents = config.requirejs.user_config_file.read
58
+ else
59
+ # if requirejs.yml doesn't exist, look for requirejs.yml.erb and process it as an erb
60
+ config.requirejs.user_config_file = config_path+'requirejs.yml.erb'
61
+
62
+ if config.requirejs.user_config_file.exist?
63
+ yaml_file_contents = ERB.new(config.requirejs.user_config_file.read).result
64
+ end
65
+ end
66
+
67
+ if yaml_file_contents.nil?
68
+ # If we couldn't find any matching file contents to process, empty user config
69
+ config.requirejs.user_config = {}
70
+ else
71
+ config.requirejs.user_config = YAML.load(yaml_file_contents)
72
+ end
73
+ end
51
74
  end # class Engine
52
75
  end
53
76
  end
@@ -1,6 +1,6 @@
1
1
  module Requirejs
2
2
  module Rails
3
- Version = "0.9.0"
4
- LibVersion = "2.0.2"
3
+ Version = "0.9.1"
4
+ LibVersion = "2.1.2"
5
5
  end
6
6
  end
@@ -107,7 +107,7 @@ EOM
107
107
  "requirejs:test_node"] do
108
108
  requirejs.config.target_dir.mkpath
109
109
 
110
- `node #{requirejs.config.driver_path}`
110
+ `node "#{requirejs.config.driver_path}"`
111
111
  unless $?.success?
112
112
  raise RuntimeError, "Asset compilation with node failed."
113
113
  end
@@ -1,5 +1,5 @@
1
1
  /**
2
- * almond 0.1.1 Copyright (c) 2011, The Dojo Foundation All Rights Reserved.
2
+ * almond 0.2.3 Copyright (c) 2011-2012, The Dojo Foundation All Rights Reserved.
3
3
  * Available via the MIT or new BSD license.
4
4
  * see: http://github.com/jrburke/almond for details
5
5
  */
@@ -10,305 +10,387 @@
10
10
 
11
11
  var requirejs, require, define;
12
12
  (function (undef) {
13
- var defined = {},
14
- waiting = {},
15
- config = {},
16
- defining = {},
17
- aps = [].slice,
18
- main, req;
19
-
20
- /**
21
- * Given a relative module name, like ./something, normalize it to
22
- * a real name that can be mapped to a path.
23
- * @param {String} name the relative name
24
- * @param {String} baseName a real name that the name arg is relative
25
- * to.
26
- * @returns {String} normalized name
27
- */
28
- function normalize(name, baseName) {
29
- var baseParts = baseName && baseName.split("/"),
30
- map = config.map,
31
- starMap = (map && map['*']) || {},
32
- nameParts, nameSegment, mapValue, foundMap, i, j, part;
33
-
34
- //Adjust any relative paths.
35
- if (name && name.charAt(0) === ".") {
36
- //If have a base name, try to normalize against it,
37
- //otherwise, assume it is a top-level require that will
38
- //be relative to baseUrl in the end.
39
- if (baseName) {
40
- //Convert baseName to array, and lop off the last part,
41
- //so that . matches that "directory" and not name of the baseName's
42
- //module. For instance, baseName of "one/two/three", maps to
43
- //"one/two/three.js", but we want the directory, "one/two" for
44
- //this normalization.
45
- baseParts = baseParts.slice(0, baseParts.length - 1);
46
-
47
- name = baseParts.concat(name.split("/"));
48
-
49
- //start trimDots
50
- for (i = 0; (part = name[i]); i++) {
51
- if (part === ".") {
52
- name.splice(i, 1);
53
- i -= 1;
54
- } else if (part === "..") {
55
- if (i === 1 && (name[2] === '..' || name[0] === '..')) {
56
- //End of the line. Keep at least one non-dot
57
- //path segment at the front so it can be mapped
58
- //correctly to disk. Otherwise, there is likely
59
- //no path mapping for a path starting with '..'.
60
- //This can still fail, but catches the most reasonable
61
- //uses of ..
62
- return true;
63
- } else if (i > 0) {
64
- name.splice(i - 1, 2);
65
- i -= 2;
66
- }
67
- }
68
- }
69
- //end trimDots
70
-
71
- name = name.join("/");
13
+ var main, req, makeMap, handlers,
14
+ defined = {},
15
+ waiting = {},
16
+ config = {},
17
+ defining = {},
18
+ hasOwn = Object.prototype.hasOwnProperty,
19
+ aps = [].slice;
20
+
21
+ function hasProp(obj, prop) {
22
+ return hasOwn.call(obj, prop);
23
+ }
24
+
25
+ /**
26
+ * Given a relative module name, like ./something, normalize it to
27
+ * a real name that can be mapped to a path.
28
+ * @param {String} name the relative name
29
+ * @param {String} baseName a real name that the name arg is relative
30
+ * to.
31
+ * @returns {String} normalized name
32
+ */
33
+ function normalize(name, baseName) {
34
+ var nameParts, nameSegment, mapValue, foundMap,
35
+ foundI, foundStarMap, starI, i, j, part,
36
+ baseParts = baseName && baseName.split("/"),
37
+ map = config.map,
38
+ starMap = (map && map['*']) || {};
39
+
40
+ //Adjust any relative paths.
41
+ if (name && name.charAt(0) === ".") {
42
+ //If have a base name, try to normalize against it,
43
+ //otherwise, assume it is a top-level require that will
44
+ //be relative to baseUrl in the end.
45
+ if (baseName) {
46
+ //Convert baseName to array, and lop off the last part,
47
+ //so that . matches that "directory" and not name of the baseName's
48
+ //module. For instance, baseName of "one/two/three", maps to
49
+ //"one/two/three.js", but we want the directory, "one/two" for
50
+ //this normalization.
51
+ baseParts = baseParts.slice(0, baseParts.length - 1);
52
+
53
+ name = baseParts.concat(name.split("/"));
54
+
55
+ //start trimDots
56
+ for (i = 0; i < name.length; i += 1) {
57
+ part = name[i];
58
+ if (part === ".") {
59
+ name.splice(i, 1);
60
+ i -= 1;
61
+ } else if (part === "..") {
62
+ if (i === 1 && (name[2] === '..' || name[0] === '..')) {
63
+ //End of the line. Keep at least one non-dot
64
+ //path segment at the front so it can be mapped
65
+ //correctly to disk. Otherwise, there is likely
66
+ //no path mapping for a path starting with '..'.
67
+ //This can still fail, but catches the most reasonable
68
+ //uses of ..
69
+ break;
70
+ } else if (i > 0) {
71
+ name.splice(i - 1, 2);
72
+ i -= 2;
72
73
  }
74
+ }
73
75
  }
76
+ //end trimDots
77
+
78
+ name = name.join("/");
79
+ } else if (name.indexOf('./') === 0) {
80
+ // No baseName, so this is ID is resolved relative
81
+ // to baseUrl, pull off the leading dot.
82
+ name = name.substring(2);
83
+ }
84
+ }
74
85
 
75
- //Apply map config if available.
76
- if ((baseParts || starMap) && map) {
77
- nameParts = name.split('/');
78
-
79
- for (i = nameParts.length; i > 0; i -= 1) {
80
- nameSegment = nameParts.slice(0, i).join("/");
81
-
82
- if (baseParts) {
83
- //Find the longest baseName segment match in the config.
84
- //So, do joins on the biggest to smallest lengths of baseParts.
85
- for (j = baseParts.length; j > 0; j -= 1) {
86
- mapValue = map[baseParts.slice(0, j).join('/')];
87
-
88
- //baseName segment has config, find if it has one for
89
- //this name.
90
- if (mapValue) {
91
- mapValue = mapValue[nameSegment];
92
- if (mapValue) {
93
- //Match, update name to the new value.
94
- foundMap = mapValue;
95
- break;
96
- }
97
- }
98
- }
99
- }
100
-
101
- foundMap = foundMap || starMap[nameSegment];
102
-
103
- if (foundMap) {
104
- nameParts.splice(0, i, foundMap);
105
- name = nameParts.join('/');
106
- break;
107
- }
86
+ //Apply map config if available.
87
+ if ((baseParts || starMap) && map) {
88
+ nameParts = name.split('/');
89
+
90
+ for (i = nameParts.length; i > 0; i -= 1) {
91
+ nameSegment = nameParts.slice(0, i).join("/");
92
+
93
+ if (baseParts) {
94
+ //Find the longest baseName segment match in the config.
95
+ //So, do joins on the biggest to smallest lengths of baseParts.
96
+ for (j = baseParts.length; j > 0; j -= 1) {
97
+ mapValue = map[baseParts.slice(0, j).join('/')];
98
+
99
+ //baseName segment has config, find if it has one for
100
+ //this name.
101
+ if (mapValue) {
102
+ mapValue = mapValue[nameSegment];
103
+ if (mapValue) {
104
+ //Match, update name to the new value.
105
+ foundMap = mapValue;
106
+ foundI = i;
107
+ break;
108
+ }
108
109
  }
110
+ }
109
111
  }
110
112
 
111
- return name;
112
- }
113
+ if (foundMap) {
114
+ break;
115
+ }
113
116
 
114
- function makeRequire(relName, forceSync) {
115
- return function () {
116
- //A version of a require function that passes a moduleName
117
- //value for items that may need to
118
- //look up paths relative to the moduleName
119
- return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
120
- };
121
- }
117
+ //Check for a star map match, but just hold on to it,
118
+ //if there is a shorter segment match later in a matching
119
+ //config, then favor over this star map.
120
+ if (!foundStarMap && starMap && starMap[nameSegment]) {
121
+ foundStarMap = starMap[nameSegment];
122
+ starI = i;
123
+ }
124
+ }
122
125
 
123
- function makeNormalize(relName) {
124
- return function (name) {
125
- return normalize(name, relName);
126
- };
127
- }
126
+ if (!foundMap && foundStarMap) {
127
+ foundMap = foundStarMap;
128
+ foundI = starI;
129
+ }
128
130
 
129
- function makeLoad(depName) {
130
- return function (value) {
131
- defined[depName] = value;
132
- };
131
+ if (foundMap) {
132
+ nameParts.splice(0, foundI, foundMap);
133
+ name = nameParts.join('/');
134
+ }
133
135
  }
134
136
 
135
- function callDep(name) {
136
- if (waiting.hasOwnProperty(name)) {
137
- var args = waiting[name];
138
- delete waiting[name];
139
- defining[name] = true;
140
- main.apply(undef, args);
141
- }
137
+ return name;
138
+ }
142
139
 
143
- if (!defined.hasOwnProperty(name)) {
144
- throw new Error('No ' + name);
145
- }
146
- return defined[name];
147
- }
140
+ function makeRequire(relName, forceSync) {
141
+ return function () {
142
+ //A version of a require function that passes a moduleName
143
+ //value for items that may need to
144
+ //look up paths relative to the moduleName
145
+ return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
146
+ };
147
+ }
148
148
 
149
- /**
150
- * Makes a name map, normalizing the name, and using a plugin
151
- * for normalization if necessary. Grabs a ref to plugin
152
- * too, as an optimization.
153
- */
154
- function makeMap(name, relName) {
155
- var prefix, plugin,
156
- index = name.indexOf('!');
157
-
158
- if (index !== -1) {
159
- prefix = normalize(name.slice(0, index), relName);
160
- name = name.slice(index + 1);
161
- plugin = callDep(prefix);
162
-
163
- //Normalize according
164
- if (plugin && plugin.normalize) {
165
- name = plugin.normalize(name, makeNormalize(relName));
166
- } else {
167
- name = normalize(name, relName);
168
- }
169
- } else {
170
- name = normalize(name, relName);
171
- }
149
+ function makeNormalize(relName) {
150
+ return function (name) {
151
+ return normalize(name, relName);
152
+ };
153
+ }
172
154
 
173
- //Using ridiculous property names for space reasons
174
- return {
175
- f: prefix ? prefix + '!' + name : name, //fullName
176
- n: name,
177
- p: plugin
178
- };
155
+ function makeLoad(depName) {
156
+ return function (value) {
157
+ defined[depName] = value;
158
+ };
159
+ }
160
+
161
+ function callDep(name) {
162
+ if (hasProp(waiting, name)) {
163
+ var args = waiting[name];
164
+ delete waiting[name];
165
+ defining[name] = true;
166
+ main.apply(undef, args);
179
167
  }
180
168
 
181
- function makeConfig(name) {
182
- return function () {
183
- return (config && config.config && config.config[name]) || {};
184
- };
169
+ if (!hasProp(defined, name) && !hasProp(defining, name)) {
170
+ throw new Error('No ' + name);
171
+ }
172
+ return defined[name];
173
+ }
174
+
175
+ //Turns a plugin!resource to [plugin, resource]
176
+ //with the plugin being undefined if the name
177
+ //did not have a plugin prefix.
178
+ function splitPrefix(name) {
179
+ var prefix,
180
+ index = name ? name.indexOf('!') : -1;
181
+ if (index > -1) {
182
+ prefix = name.substring(0, index);
183
+ name = name.substring(index + 1, name.length);
184
+ }
185
+ return [prefix, name];
186
+ }
187
+
188
+ /**
189
+ * Makes a name map, normalizing the name, and using a plugin
190
+ * for normalization if necessary. Grabs a ref to plugin
191
+ * too, as an optimization.
192
+ */
193
+ makeMap = function (name, relName) {
194
+ var plugin,
195
+ parts = splitPrefix(name),
196
+ prefix = parts[0];
197
+
198
+ name = parts[1];
199
+
200
+ if (prefix) {
201
+ prefix = normalize(prefix, relName);
202
+ plugin = callDep(prefix);
185
203
  }
186
204
 
187
- main = function (name, deps, callback, relName) {
188
- var args = [],
189
- usingExports,
190
- cjsModule, depName, ret, map, i;
191
-
192
- //Use name if no relName
193
- relName = relName || name;
194
-
195
- //Call the callback to define the module, if necessary.
196
- if (typeof callback === 'function') {
197
-
198
- //Pull out the defined dependencies and pass the ordered
199
- //values to the callback.
200
- //Default to [require, exports, module] if no deps
201
- deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
202
- for (i = 0; i < deps.length; i++) {
203
- map = makeMap(deps[i], relName);
204
- depName = map.f;
205
-
206
- //Fast path CommonJS standard dependencies.
207
- if (depName === "require") {
208
- args[i] = makeRequire(name);
209
- } else if (depName === "exports") {
210
- //CommonJS module spec 1.1
211
- args[i] = defined[name] = {};
212
- usingExports = true;
213
- } else if (depName === "module") {
214
- //CommonJS module spec 1.1
215
- cjsModule = args[i] = {
216
- id: name,
217
- uri: '',
218
- exports: defined[name],
219
- config: makeConfig(name)
220
- };
221
- } else if (defined.hasOwnProperty(depName) || waiting.hasOwnProperty(depName)) {
222
- args[i] = callDep(depName);
223
- } else if (map.p) {
224
- map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
225
- args[i] = defined[depName];
226
- } else if (!defining[depName]) {
227
- throw new Error(name + ' missing ' + depName);
228
- }
229
- }
205
+ //Normalize according
206
+ if (prefix) {
207
+ if (plugin && plugin.normalize) {
208
+ name = plugin.normalize(name, makeNormalize(relName));
209
+ } else {
210
+ name = normalize(name, relName);
211
+ }
212
+ } else {
213
+ name = normalize(name, relName);
214
+ parts = splitPrefix(name);
215
+ prefix = parts[0];
216
+ name = parts[1];
217
+ if (prefix) {
218
+ plugin = callDep(prefix);
219
+ }
220
+ }
230
221
 
231
- ret = callback.apply(defined[name], args);
232
-
233
- if (name) {
234
- //If setting exports via "module" is in play,
235
- //favor that over return value and exports. After that,
236
- //favor a non-undefined return value over exports use.
237
- if (cjsModule && cjsModule.exports !== undef &&
238
- cjsModule.exports !== defined[name]) {
239
- defined[name] = cjsModule.exports;
240
- } else if (ret !== undef || !usingExports) {
241
- //Use the return value from the function.
242
- defined[name] = ret;
243
- }
244
- }
245
- } else if (name) {
246
- //May just be an object definition for the module. Only
247
- //worry about defining if have a module name.
248
- defined[name] = callback;
249
- }
222
+ //Using ridiculous property names for space reasons
223
+ return {
224
+ f: prefix ? prefix + '!' + name : name, //fullName
225
+ n: name,
226
+ pr: prefix,
227
+ p: plugin
250
228
  };
229
+ };
251
230
 
252
- requirejs = require = req = function (deps, callback, relName, forceSync) {
253
- if (typeof deps === "string") {
254
- //Just return the module wanted. In this scenario, the
255
- //deps arg is the module name, and second arg (if passed)
256
- //is just the relName.
257
- //Normalize module name, if it contains . or ..
258
- return callDep(makeMap(deps, callback).f);
259
- } else if (!deps.splice) {
260
- //deps is a config object, not an array.
261
- config = deps;
262
- if (callback.splice) {
263
- //callback is an array, which means it is a dependency list.
264
- //Adjust args if there are dependencies
265
- deps = callback;
266
- callback = relName;
267
- relName = null;
268
- } else {
269
- deps = undef;
270
- }
271
- }
272
-
273
- //Support require(['a'])
274
- callback = callback || function () {};
275
-
276
- //Simulate async callback;
277
- if (forceSync) {
278
- main(undef, deps, callback, relName);
231
+ function makeConfig(name) {
232
+ return function () {
233
+ return (config && config.config && config.config[name]) || {};
234
+ };
235
+ }
236
+
237
+ handlers = {
238
+ require: function (name) {
239
+ return makeRequire(name);
240
+ },
241
+ exports: function (name) {
242
+ var e = defined[name];
243
+ if (typeof e !== 'undefined') {
244
+ return e;
245
+ } else {
246
+ return (defined[name] = {});
247
+ }
248
+ },
249
+ module: function (name) {
250
+ return {
251
+ id: name,
252
+ uri: '',
253
+ exports: defined[name],
254
+ config: makeConfig(name)
255
+ };
256
+ }
257
+ };
258
+
259
+ main = function (name, deps, callback, relName) {
260
+ var cjsModule, depName, ret, map, i,
261
+ args = [],
262
+ usingExports;
263
+
264
+ //Use name if no relName
265
+ relName = relName || name;
266
+
267
+ //Call the callback to define the module, if necessary.
268
+ if (typeof callback === 'function') {
269
+
270
+ //Pull out the defined dependencies and pass the ordered
271
+ //values to the callback.
272
+ //Default to [require, exports, module] if no deps
273
+ deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
274
+ for (i = 0; i < deps.length; i += 1) {
275
+ map = makeMap(deps[i], relName);
276
+ depName = map.f;
277
+
278
+ //Fast path CommonJS standard dependencies.
279
+ if (depName === "require") {
280
+ args[i] = handlers.require(name);
281
+ } else if (depName === "exports") {
282
+ //CommonJS module spec 1.1
283
+ args[i] = handlers.exports(name);
284
+ usingExports = true;
285
+ } else if (depName === "module") {
286
+ //CommonJS module spec 1.1
287
+ cjsModule = args[i] = handlers.module(name);
288
+ } else if (hasProp(defined, depName) ||
289
+ hasProp(waiting, depName) ||
290
+ hasProp(defining, depName)) {
291
+ args[i] = callDep(depName);
292
+ } else if (map.p) {
293
+ map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
294
+ args[i] = defined[depName];
279
295
  } else {
280
- setTimeout(function () {
281
- main(undef, deps, callback, relName);
282
- }, 15);
296
+ throw new Error(name + ' missing ' + depName);
297
+ }
298
+ }
299
+
300
+ ret = callback.apply(defined[name], args);
301
+
302
+ if (name) {
303
+ //If setting exports via "module" is in play,
304
+ //favor that over return value and exports. After that,
305
+ //favor a non-undefined return value over exports use.
306
+ if (cjsModule && cjsModule.exports !== undef &&
307
+ cjsModule.exports !== defined[name]) {
308
+ defined[name] = cjsModule.exports;
309
+ } else if (ret !== undef || !usingExports) {
310
+ //Use the return value from the function.
311
+ defined[name] = ret;
283
312
  }
313
+ }
314
+ } else if (name) {
315
+ //May just be an object definition for the module. Only
316
+ //worry about defining if have a module name.
317
+ defined[name] = callback;
318
+ }
319
+ };
320
+
321
+ requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
322
+ if (typeof deps === "string") {
323
+ if (handlers[deps]) {
324
+ //callback in this case is really relName
325
+ return handlers[deps](callback);
326
+ }
327
+ //Just return the module wanted. In this scenario, the
328
+ //deps arg is the module name, and second arg (if passed)
329
+ //is just the relName.
330
+ //Normalize module name, if it contains . or ..
331
+ return callDep(makeMap(deps, callback).f);
332
+ } else if (!deps.splice) {
333
+ //deps is a config object, not an array.
334
+ config = deps;
335
+ if (callback.splice) {
336
+ //callback is an array, which means it is a dependency list.
337
+ //Adjust args if there are dependencies
338
+ deps = callback;
339
+ callback = relName;
340
+ relName = null;
341
+ } else {
342
+ deps = undef;
343
+ }
344
+ }
284
345
 
285
- return req;
286
- };
346
+ //Support require(['a'])
347
+ callback = callback || function () {};
287
348
 
288
- /**
289
- * Just drops the config on the floor, but returns req in case
290
- * the config return value is used.
291
- */
292
- req.config = function (cfg) {
293
- config = cfg;
294
- return req;
295
- };
349
+ //If relName is a function, it is an errback handler,
350
+ //so remove it.
351
+ if (typeof relName === 'function') {
352
+ relName = forceSync;
353
+ forceSync = alt;
354
+ }
296
355
 
297
- define = function (name, deps, callback) {
356
+ //Simulate async callback;
357
+ if (forceSync) {
358
+ main(undef, deps, callback, relName);
359
+ } else {
360
+ setTimeout(function () {
361
+ main(undef, deps, callback, relName);
362
+ }, 15);
363
+ }
298
364
 
299
- //This module may not have dependencies
300
- if (!deps.splice) {
301
- //deps is not an array, so probably means
302
- //an object literal or factory function for
303
- //the value. Adjust args.
304
- callback = deps;
305
- deps = [];
306
- }
365
+ return req;
366
+ };
367
+
368
+ /**
369
+ * Just drops the config on the floor, but returns req in case
370
+ * the config return value is used.
371
+ */
372
+ req.config = function (cfg) {
373
+ config = cfg;
374
+ return req;
375
+ };
376
+
377
+ define = function (name, deps, callback) {
378
+
379
+ //This module may not have dependencies
380
+ if (!deps.splice) {
381
+ //deps is not an array, so probably means
382
+ //an object literal or factory function for
383
+ //the value. Adjust args.
384
+ callback = deps;
385
+ deps = [];
386
+ }
307
387
 
308
- waiting[name] = [name, deps, callback];
309
- };
388
+ if (!hasProp(defined, name) && !hasProp(waiting, name)) {
389
+ waiting[name] = [name, deps, callback];
390
+ }
391
+ };
310
392
 
311
- define.amd = {
312
- jQuery: true
313
- };
393
+ define.amd = {
394
+ jQuery: true
395
+ };
314
396
  }());