diff --git a/src/support/resolve-node-specifier.ts b/src/support/resolve-node-specifier.ts index 8b873b3..ff2a567 100644 --- a/src/support/resolve-node-specifier.ts +++ b/src/support/resolve-node-specifier.ts @@ -19,7 +19,7 @@ import {dirname, relativePathToURL} from './path-utils'; export const resolveNodeSpecifier = (modulePath: string, specifier: string, logger: Logger): string => { - if (isURL(specifier)) { + if (isURL(specifier) || specifier.startsWith('/')) { return specifier; } try { diff --git a/src/test/koa-node-resolve.test.ts b/src/test/koa-node-resolve.test.ts index ad9317d..7e1758a 100644 --- a/src/test/koa-node-resolve.test.ts +++ b/src/test/koa-node-resolve.test.ts @@ -107,7 +107,7 @@ test('nodeResolve middleware works even if baseURL has no pathname', async (t) = }); test('nodeResolve middleware ignores unresolvable specifiers', async (t) => { - t.plan(2); + t.plan(4); const logger = testLogger(); createAndServe( { @@ -138,5 +138,52 @@ test('nodeResolve middleware ignores unresolvable specifiers', async (t) => { `), 'should leave unresolvable specifier in inline scripts alone'); + + const expectedWarning = + '[koa-node-resolve] Unable to resolve Node module specifier "wubble-flurp" due to Error: Cannot find module \'wubble-flurp\' from \''; + const warnings = logger.warns.map((args) => args.join(' ')); + warnings.forEach((msg) => { + t.ok( + msg.startsWith(expectedWarning), + 'Should warn user about being unable to resolve module'); + }); + }); +}); + +test('nodeResolve middleware ignores absolute path specifiers', async (t) => { + t.plan(3); + const logger = testLogger(); + createAndServe( + { + middleware: [nodeResolve({root: fixturesPath, logger})], + routes: { + '/my-module.js': ` + import * as x from '/x.js'; + `, + '/my-page.html': ` + + `, + }, + }, + async (server) => { + t.equal( + squeeze((await request(server).get('/my-module.js')).text), + squeeze(` + import * as x from '/x.js'; + `), + 'should leave absolute path specifier in external scripts alone'); + t.equal( + squeeze((await request(server).get('/my-page.html')).text), + squeeze(` + + `), + 'should leave absolute path specifier in inline scripts alone'); + + const warnings = logger.warns.map((args) => args.join(' ')); + t.equal(warnings.length, 0, 'Should not print any warnings'); }); });