Skip to content

Commit 8bee038

Browse files
sttkphated
authored andcommitted
Fix: Preserve first dot of relative path (fixes #5)
1 parent a55455a commit 8bee038

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

index.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,22 @@ function replaceExt(npath, ext) {
1212
}
1313

1414
var nFileName = path.basename(npath, path.extname(npath)) + ext;
15-
return path.join(path.dirname(npath), nFileName);
15+
var nFilepath = path.join(path.dirname(npath), nFileName);
16+
17+
// Because `path.join` removes the head './' from the given path.
18+
// This removal can cause a problem when passing the result to `require` or
19+
// `import`.
20+
if (startsWithSingleDot(npath)) {
21+
return '.' + path.sep + nFilepath;
22+
}
23+
24+
return nFilepath;
25+
}
26+
27+
function startsWithSingleDot(fpath) {
28+
var first2chars = fpath.slice(0, 2);
29+
return (first2chars === '.' + path.sep) ||
30+
(first2chars === './');
1631
}
1732

1833
module.exports = replaceExt;

test/main.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
var path = require('path');
4+
var os = require('os');
45

56
var expect = require('expect');
67

@@ -61,4 +62,27 @@ describe('replace-ext', function() {
6162
done();
6263
});
6364

65+
it('Should preserve the first dot of relative dir name.', function(done) {
66+
if (os.platform() === 'win32') {
67+
expect(replaceExt('a/b/c.js', '.ts')).toEqual('a\\b\\c.ts');
68+
expect(replaceExt('./a/b/c.js', '.ts')).toEqual('.\\a\\b\\c.ts');
69+
expect(replaceExt('../a/b/c.js', '.ts')).toEqual('..\\a\\b\\c.ts');
70+
expect(replaceExt('/a/b/c.js', '.ts')).toEqual('\\a\\b\\c.ts');
71+
72+
expect(replaceExt('C:/a/b/c.js', '.ts')).toEqual('C:\\a\\b\\c.ts');
73+
74+
expect(replaceExt('a\\b\\c.js', '.ts')).toEqual('a\\b\\c.ts');
75+
expect(replaceExt('.\\a\\b\\c.js', '.ts')).toEqual('.\\a\\b\\c.ts');
76+
expect(replaceExt('..\\a\\b\\c.js', '.ts')).toEqual('..\\a\\b\\c.ts');
77+
expect(replaceExt('\\a\\b\\c.js', '.ts')).toEqual('\\a\\b\\c.ts');
78+
79+
expect(replaceExt('C:\\a\\b\\c.js', '.ts')).toEqual('C:\\a\\b\\c.ts');
80+
} else {
81+
expect(replaceExt('a/b/c.js', '.ts')).toEqual('a/b/c.ts');
82+
expect(replaceExt('./a/b/c.js', '.ts')).toEqual('./a/b/c.ts');
83+
expect(replaceExt('../a/b/c.js', '.ts')).toEqual('../a/b/c.ts');
84+
expect(replaceExt('/a/b/c.js', '.ts')).toEqual('/a/b/c.ts');
85+
}
86+
done();
87+
});
6488
});

0 commit comments

Comments
 (0)