Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Support single character extension. (issue #38) #39

Merged
merged 2 commits into from
Jul 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 35 additions & 10 deletions lib/extension.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,44 @@
'use strict';

var path = require('path');

var EXTRE = /\.[^.]*/g;
var LONGEXTRE = /^[.]?[^.]+([.].+[^.])$/;
function getLongExtension(basename) {
if (basename[basename.length - 1] === '.') {
return null;
}

var startIndex = (basename[0] === '.') ? 1 : 0;

var dotIndex = basename.indexOf('.', startIndex);
if (dotIndex <= startIndex) {
return null;
}

return basename.slice(dotIndex);
}

function getPossibleExtensions(longExtension) {
var arr = [longExtension];
var len = longExtension.length;
var startIndex = 1;

while (startIndex < len) {
var dotIndex = longExtension.indexOf('.', startIndex);
if (dotIndex < 0) {
break;
}
arr.push(longExtension.slice(dotIndex));
startIndex = dotIndex + 1;
}

return arr;
}

module.exports = function(input) {
var basename = path.basename(input);
var longExtension = LONGEXTRE.exec(basename);
var longExtension = getLongExtension(basename);
if (!longExtension) {
return;
}
var possibleExtensions = longExtension[1].match(EXTRE);
if (!possibleExtensions) {
return;
}
return possibleExtensions.map(function(_, idx, exts) {
return exts.slice(idx).join('');
});
return getPossibleExtensions(longExtension);
};
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
"scripts": {
"lint": "eslint .",
"pretest": "rm -rf tmp/ && npm run lint",
"test": "mocha --async-only",
"cover": "istanbul cover _mocha --report lcovonly",
"test": "mocha --async-only test test/lib",
"cover": "istanbul cover _mocha --report lcovonly test test/lib",
"coveralls": "npm run cover && istanbul-coveralls"
},
"dependencies": {
Expand Down
9 changes: 9 additions & 0 deletions test/fixtures/test.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = {
data: {
trueKey: true,
falseKey: false,
subKey: {
subProp: 1
}
}
};
16 changes: 16 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,22 @@ describe('rechoir', function() {

done();
});

it('should register a module loader even if the extension is single character (issue #38)', function(done) {
var fpath = path.join(__dirname, 'fixtures', 'test.s');
rechoir.prepare({
'.s': [
'nothere',
'../require-stub',
],
}, fpath);

expect(function() {
require(fpath);
}).toNotThrow(Error);

done();
});
});

});
127 changes: 127 additions & 0 deletions test/lib/extension.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
'use strict';

var expect = require('expect');
var extension = require('../../lib/extension');

describe('Take out possible extensions from a file path', function() {

it('should return an extension: ".js" from "app.js"', function(done) {
expect(extension('app.js')).toEqual('.js');
expect(extension('a/b/c/app.js')).toEqual('.js');
done();
});

it('should return extensions: ".babel.js" and ".js" from "app.babel.js"', function(done) {
expect(extension('app.babel.js')).toEqual(['.babel.js', '.js']);
expect(extension('a/b/c/app.babel.js')).toEqual(['.babel.js', '.js']);
done();
});

it('should return extensions: ".aaa.bbb.ccc", ".aaa.bbb" and ".ccc" from "app.aaa.bbb.ccc"', function(done) {
expect(extension('app.aaa.bbb.ccc')).toEqual(['.aaa.bbb.ccc', '.bbb.ccc', '.ccc']);
expect(extension('a/b/c/app.aaa.bbb.ccc')).toEqual(['.aaa.bbb.ccc', '.bbb.ccc', '.ccc']);
done();
});

it('should return an extension: ".j" from "app.j"', function(done) {
expect(extension('app.j')).toEqual('.j');
expect(extension('a/b/c/app.j')).toEqual('.j');
done();
});

it('should return extensions: ".b.j" and ".j" from "app.b.j"', function(done) {
expect(extension('app.b.j')).toEqual(['.b.j', '.j']);
expect(extension('a/b/c/app.b.j')).toEqual(['.b.j', '.j']);
done();
});

it('should return extensions: ".a.b.c", ".a.b" and ".c" from "app.a.b.c"', function(done) {
expect(extension('app.a.b.c')).toEqual(['.a.b.c', '.b.c', '.c']);
expect(extension('a/b/c/app.a.b.c')).toEqual(['.a.b.c', '.b.c', '.c']);
done();
});

it('should return undefined from "."', function(done) {
expect(extension('.')).toBe(undefined);
expect(extension('a/b/c/.')).toBe(undefined);
done();
});

it('should return undefined from ".."', function(done) {
expect(extension('..')).toBe(undefined);
expect(extension('a/b/c/..')).toBe(undefined);
done();
});

it('should return undefined from "..."', function(done) {
expect(extension('...')).toBe(undefined);
expect(extension('a/b/c/...')).toBe(undefined);
done();
});

it('should return undefined from "a."', function(done) {
expect(extension('a.')).toBe(undefined);
expect(extension('a/b/c/a.')).toBe(undefined);
done();
});

it('should return undefined from "app."', function(done) {
expect(extension('app.')).toBe(undefined);
expect(extension('a/b/c/app.')).toBe(undefined);
done();
});

it('should return undefined from "a.b.c."', function(done) {
expect(extension('a.b.c.')).toBe(undefined);
expect(extension('a/b/c/a.b.c.')).toBe(undefined);
done();
});

it('should return undefined from ".a"', function(done) {
expect(extension('.a')).toBe(undefined);
expect(extension('a/b/c/.a')).toBe(undefined);
done();
});

it('should return undefined from ".app"', function(done) {
expect(extension('.app')).toBe(undefined);
expect(extension('a/b/c/.app')).toBe(undefined);
done();
});

it('should return undefined from ".a."', function(done) {
expect(extension('.a.')).toBe(undefined);
expect(extension('a/b/c/.a.')).toBe(undefined);
done();
});

it('should return undefined from ".app."', function(done) {
expect(extension('.app.')).toBe(undefined);
expect(extension('a/b/c/.app.')).toBe(undefined);
done();
});

it('should return undefined from ".a.b.c."', function(done) {
expect(extension('.a.b.c.')).toBe(undefined);
expect(extension('a/b/c/.a.b.c.')).toBe(undefined);
done();
});

it('should return ".b.c" and ".c" from ".a.b.c"', function(done) {
expect(extension('.a.b.c')).toEqual(['.b.c', '.c']);
expect(extension('a/b/c/.a.b.c')).toEqual(['.b.c', '.c']);
done();
});

it('should return ".bb.cc" and ".cc" from ".aa.bb.cc"', function(done) {
expect(extension('.aa.bb.cc')).toEqual(['.bb.cc', '.cc']);
expect(extension('a/b/c/.aa.bb.cc')).toEqual(['.bb.cc', '.cc']);
done();
});

it('should return "..b" and ".b" from ".a..b"', function(done) {
expect(extension('.a..b')).toEqual(['..b', '.b']);
expect(extension('a/b/c/.a..b')).toEqual(['..b', '.b']);
done();
});
});