Skip to content

Commit db2f6a6

Browse files
authored
Merge pull request #126 from ember-cli/moduleId
require.moduleId
2 parents f62bc54 + 204838b commit db2f6a6

File tree

3 files changed

+69
-39
lines changed

3 files changed

+69
-39
lines changed

README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,27 @@ require('foo') // => 'hi';
3131
require('foo') === require('foo/bar/baz');
3232
```
3333

34+
### `require('require')`
35+
36+
When within a module, one can require `require`. This provides a `require` scoped to the current module. Enabling dynamic, relatively path requires.
37+
38+
```js
39+
40+
define('foo/apple', ['require'], function() { return 'apple'; });
41+
define('foo/bar', ['require'], function(require){ return require('./apple'););
42+
43+
require('foo/bar'); // 'apple';
44+
```
45+
46+
This scoped `require` also enables a module some reflection, in this case the ability for a module to see its own `moduleId`;
47+
48+
```js
49+
50+
define('my/name/is', ['require'], function(require) {
51+
require.moduleId // => 'my/name/is';
52+
});
53+
```
54+
3455
### `define.exports('foo', {})`
3556
3657
`define.exports` enables a fastpath for non-lazy dependency-less modules, for example:

lib/loader/loader.js

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ var loader, define, requireModule, require, requirejs;
4343
requirejs: requirejs
4444
};
4545

46-
requirejs = require = requireModule = function(name) {
46+
requirejs = require = requireModule = function(id) {
4747
var token = heimdall.start('require');
4848
heimdall.increment(__require);
4949
var pending = [];
50-
var mod = findModule(name, '(require)', pending);
50+
var mod = findModule(id, '(require)', pending);
5151

5252
for (var i = pending.length - 1; i >= 0; i--) {
5353
pending[i].exports();
@@ -80,16 +80,16 @@ var loader, define, requireModule, require, requirejs;
8080
var uuid = 0;
8181

8282
function unsupportedModule(length) {
83-
throw new Error('an unsupported module was defined, expected `define(name, deps, module)` instead got: `' +
83+
throw new Error('an unsupported module was defined, expected `define(id, deps, module)` instead got: `' +
8484
length + '` arguments to define`');
8585
}
8686

8787
var defaultDeps = ['require', 'exports', 'module'];
8888

89-
function Module(name, deps, callback, alias) {
89+
function Module(id, deps, callback, alias) {
9090
heimdall.increment(modules);
91-
this.id = uuid++;
92-
this.name = name;
91+
this.uuid = uuid++;
92+
this.id = id;
9393
this.deps = !deps.length && callback.length ? defaultDeps : deps;
9494
this.module = { exports: {} };
9595
this.callback = callback;
@@ -126,7 +126,7 @@ var loader, define, requireModule, require, requirejs;
126126
heimdall.increment(__exports);
127127

128128
if (loader.wrapModules) {
129-
this.callback = loader.wrapModules(this.name, this.callback);
129+
this.callback = loader.wrapModules(this.id, this.callback);
130130
}
131131

132132
this.reify();
@@ -191,27 +191,28 @@ var loader, define, requireModule, require, requirejs;
191191
} else if (dep === 'module') {
192192
entry.exports = this.module;
193193
} else {
194-
entry.module = findModule(resolve(dep, this.name), this.name, pending);
194+
entry.module = findModule(resolve(dep, this.id), this.id, pending);
195195
}
196196
}
197197
};
198198

199199
Module.prototype.makeRequire = function() {
200-
var name = this.name;
200+
var id = this.id;
201201
var r = function(dep) {
202-
return require(resolve(dep, name));
202+
return require(resolve(dep, id));
203203
};
204204
r['default'] = r;
205+
r.moduleId = id;
205206
r.has = function(dep) {
206-
return has(resolve(dep, name));
207+
return has(resolve(dep, id));
207208
};
208209
return r;
209210
};
210211

211-
define = function(name, deps, callback) {
212-
var module = registry[name];
212+
define = function(id, deps, callback) {
213+
var module = registry[id];
213214

214-
// If a module for this name has already been defined and is in any state
215+
// If a module for this id has already been defined and is in any state
215216
// other than `new` (meaning it has been or is currently being required),
216217
// then we return early to avoid redefinition.
217218
if (module && module.state !== 'new') {
@@ -230,9 +231,9 @@ var loader, define, requireModule, require, requirejs;
230231
}
231232

232233
if (callback instanceof Alias) {
233-
registry[name] = new Module(callback.name, deps, callback, true);
234+
registry[id] = new Module(callback.id, deps, callback, true);
234235
} else {
235-
registry[name] = new Module(name, deps, callback, false);
236+
registry[id] = new Module(id, deps, callback, false);
236237
}
237238
heimdall.stop(token);
238239
};
@@ -260,31 +261,31 @@ var loader, define, requireModule, require, requirejs;
260261
// we don't support all of AMD
261262
// define.amd = {};
262263

263-
function Alias(path) {
264-
this.name = path;
264+
function Alias(id) {
265+
this.id = id;
265266
}
266267

267-
define.alias = function(path, target) {
268+
define.alias = function(id, target) {
268269
if (arguments.length === 2) {
269-
return define(target, new Alias(path));
270+
return define(target, new Alias(id));
270271
}
271272

272-
return new Alias(path);
273+
return new Alias(id);
273274
};
274275

275-
function missingModule(name, referrer) {
276-
throw new Error('Could not find module `' + name + '` imported from `' + referrer + '`');
276+
function missingModule(id, referrer) {
277+
throw new Error('Could not find module `' + id + '` imported from `' + referrer + '`');
277278
}
278279

279-
function findModule(name, referrer, pending) {
280+
function findModule(id, referrer, pending) {
280281
heimdall.increment(__findModule);
281-
var mod = registry[name] || registry[name + '/index'];
282+
var mod = registry[id] || registry[id + '/index'];
282283

283284
while (mod && mod.isAlias) {
284-
mod = registry[mod.name];
285+
mod = registry[mod.id];
285286
}
286287

287-
if (!mod) { missingModule(name, referrer); }
288+
if (!mod) { missingModule(id, referrer); }
288289

289290
if (pending && mod.state !== 'pending' && mod.state !== 'finalized') {
290291
mod.findDeps(pending);
@@ -294,13 +295,13 @@ var loader, define, requireModule, require, requirejs;
294295
return mod;
295296
}
296297

297-
function resolve(child, name) {
298+
function resolve(child, id) {
298299
heimdall.increment(__resolve);
299300
if (child.charAt(0) !== '.') { return child; }
300301
heimdall.increment(resolveRelative);
301302

302303
var parts = child.split('/');
303-
var nameParts = name.split('/');
304+
var nameParts = id.split('/');
304305
var parentBase = nameParts.slice(0, -1);
305306

306307
for (var i = 0, l = parts.length; i < l; i++) {
@@ -319,14 +320,14 @@ var loader, define, requireModule, require, requirejs;
319320
return parentBase.join('/');
320321
}
321322

322-
function has(name) {
323-
return !!(registry[name] || registry[name + '/index']);
323+
function has(id) {
324+
return !!(registry[id] || registry[id + '/index']);
324325
}
325326

326327
requirejs.entries = requirejs._eak_seen = registry;
327328
requirejs.has = has;
328-
requirejs.unsee = function(moduleName) {
329-
findModule(moduleName, '(unsee)', false).unsee();
329+
requirejs.unsee = function(id) {
330+
findModule(id, '(unsee)', false).unsee();
330331
};
331332

332333
requirejs.clear = function() {

tests/all.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ var tree;
88
/**
99
* Simple helper to get the current state of a given module.
1010
*/
11-
function getModuleState(name) {
12-
return requirejs.entries[name].state;
11+
function getModuleState(id) {
12+
return requirejs.entries[id].state;
1313
}
1414

1515
function statsForMonitor(monitor, tree) {
@@ -141,7 +141,6 @@ test('simple define/require', function() {
141141
deepEqual(Object.keys(requirejs.entries), ['foo']);
142142
});
143143

144-
145144
test('define without deps', function() {
146145
var fooCalled = 0;
147146

@@ -170,7 +169,6 @@ test('define without deps', function() {
170169
deepEqual(Object.keys(requirejs.entries), ['foo']);
171170
});
172171

173-
174172
test('multiple define/require', function() {
175173
define('foo', [], function() {
176174

@@ -813,7 +811,7 @@ test('provides good error message when an un-named AMD module is provided', func
813811
define(function() {
814812

815813
});
816-
}, new Error('an unsupported module was defined, expected `define(name, deps, module)` instead got: `1` arguments to define`'));
814+
}, new Error('an unsupported module was defined, expected `define(id, deps, module)` instead got: `1` arguments to define`'));
817815
});
818816

819817

@@ -1418,7 +1416,7 @@ test('alias chaining with relative deps works', function() {
14181416
test('wrapModules is called when present', function() {
14191417
var fooCalled = 0;
14201418
var annotatorCalled = 0;
1421-
loader.wrapModules = function(name, callback) {
1419+
loader.wrapModules = function(id, callback) {
14221420
annotatorCalled++;
14231421
return callback;
14241422
};
@@ -1669,3 +1667,13 @@ test('define.exports', function(assert) {
16691667
define.exports('foo/bar', defaultExport);
16701668
assert.equal(require('foo/bar'), defaultExport);
16711669
});
1670+
1671+
test('require.moduleId', function(assert) {
1672+
define('foo', ['require'], function(require) {
1673+
assert.equal(require.moduleId, 'foo');
1674+
return require.moduleId;
1675+
});
1676+
1677+
define.alias('foo', 'foo/bar');
1678+
assert.equal(require('foo/bar'), 'foo');
1679+
});

0 commit comments

Comments
 (0)