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'); + })); } },