diff --git a/src/loader.ts b/src/loader.ts
index 9c25093..9634b54 100644
--- a/src/loader.ts
+++ b/src/loader.ts
@@ -1,6 +1,7 @@
'use strict';
import ModuleShim = DojoLoader.ModuleShim;
import Module = DojoLoader.Module;
+import Package = DojoLoader.Package;
declare const load: (module: string) => any;
declare const Packages: {} | undefined;
@@ -544,16 +545,16 @@ declare const Packages: {} | undefined;
}
function getModuleInformation(moduleId: string, referenceModule?: DojoLoader.Module): DojoLoader.Module {
- let match = moduleId.match(/^([^\/]+)(\/(.+))?$/);
- let packageId = match ? match[1] : '';
- let pack = config && config.pkgs ? config.pkgs[packageId] : {};
+ let packageId = '';
+ let pack: Package = {};
let moduleIdInPackage = '';
- if (pack) {
- moduleId = packageId + '/' + (moduleIdInPackage = ((match && match[3]) || pack.main || 'main'));
- }
- else {
- packageId = '';
+ const matches = Object.keys((config && config.pkgs || {})).filter(pkg => (moduleId + '/').indexOf(pkg + '/') === 0).sort((a, b) => a.length > b.length ? -1 : 1);
+
+ if (matches.length) {
+ packageId = matches.shift() as string;
+ pack = config.pkgs![packageId];
+ moduleId = packageId + '/' + (moduleIdInPackage = (moduleId.substr(packageId.length + 1) || pack.main || 'main'));
}
let module = modules[moduleId];
diff --git a/tests/functional/require/config/packages3.html b/tests/functional/require/config/packages3.html
new file mode 100644
index 0000000..29f419d
--- /dev/null
+++ b/tests/functional/require/config/packages3.html
@@ -0,0 +1,27 @@
+
+
+
+
+ require.config Test
+
+
+
+
+
+
+
diff --git a/tests/functional/require/config/packages4.html b/tests/functional/require/config/packages4.html
new file mode 100644
index 0000000..1ed9d1c
--- /dev/null
+++ b/tests/functional/require/config/packages4.html
@@ -0,0 +1,26 @@
+
+
+
+
+ require.config Test
+
+
+
+
+
+
+
diff --git a/tests/functional/require/require.ts b/tests/functional/require/require.ts
index e395504..c8e9310 100644
--- a/tests/functional/require/require.ts
+++ b/tests/functional/require/require.ts
@@ -97,6 +97,18 @@ registerSuite({
return executeTest(this, './config/packages2.html', function (results: any) {
assert.strictEqual(results, appMessage, '"app" module should load');
});
+ },
+
+ 'package name with slashes'(this: any) {
+ return executeTest(this, './config/packages3.html', function (results: any) {
+ assert.strictEqual(results, appMessage, '"app" module should load');
+ });
+ },
+
+ 'nested packages'(this: any) {
+ return executeTest(this, './config/packages4.html', function (results: any) {
+ assert.strictEqual(results, appMessage, '"app" module should load');
+ });
}
},
diff --git a/tests/unit/require.ts b/tests/unit/require.ts
index e92fd4e..f7dabcb 100644
--- a/tests/unit/require.ts
+++ b/tests/unit/require.ts
@@ -505,6 +505,48 @@ registerSuite({
], dfd.callback(function (app: any) {
assert.strictEqual(app, 'app', '"app" module should load');
}));
+ },
+ 'slashes in package name'(this: any) {
+ let dfd = this.async(DEFAULT_TIMEOUT);
+
+ setErrorHandler(dfd);
+
+ global.require.config({
+ packages: [
+ {
+ name: '@test/common',
+ location: './_build/tests/common',
+ main: 'app'
+ }
+ ]
+ });
+
+ global.require([
+ '@test/common'
+ ], dfd.callback(function (app: any) {
+ assert.strictEqual(app, 'app', '"app" module should load');
+ }));
+ },
+ 'single @ package'(this: any) {
+ let dfd = this.async(DEFAULT_TIMEOUT);
+
+ setErrorHandler(dfd);
+
+ global.require.config({
+ packages: [
+ {
+ name: '@test',
+ location: './_build/tests',
+ main: 'app'
+ }
+ ]
+ });
+
+ global.require([
+ '@test/common/app'
+ ], dfd.callback(function (app: any) {
+ assert.strictEqual(app, 'app', '"app" module should load');
+ }));
}
},