Skip to content

Commit

Permalink
Allow leading underscores in filename. Fixes #30 (#31)
Browse files Browse the repository at this point in the history
  • Loading branch information
jfmengels authored and sindresorhus committed May 22, 2016
1 parent 5fdf17d commit 87663a4
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 4 deletions.
17 changes: 14 additions & 3 deletions rules/filename-case.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@ function fixFilename(chosenCase, filename) {
.join('.');
}

var leadingUnserscoresRegex = /^(_+)(.*)$/;
function splitFilename(filename) {
var res = leadingUnserscoresRegex.exec(filename);
return {
leading: (res && res[1]) || '',
trailing: (res && res[2]) || filename
};
}

module.exports = function (context) {
var chosenCase = cases[context.options[0].case || 'camelCase'];
var filenameWithExt = context.getFilename();
Expand All @@ -70,12 +79,14 @@ module.exports = function (context) {
Program: function (node) {
var extension = path.extname(filenameWithExt);
var filename = path.basename(filenameWithExt, extension);
var fixedFilename = fixFilename(chosenCase, filename);
var splitName = splitFilename(filename);
var fixedFilename = fixFilename(chosenCase, splitName.trailing);

if (fixedFilename !== filename) {
if (fixedFilename !== splitName.trailing) {
context.report({
node: node,
message: 'Filename is not in ' + chosenCase.name + '. Rename it to `' + fixedFilename + extension + '`.'
message: 'Filename is not in ' + chosenCase.name +
'. Rename it to `' + splitName.leading + fixedFilename + extension + '`.'
});
}
}
Expand Down
42 changes: 41 additions & 1 deletion test/filename-case.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,15 @@ test(() => {
testCase('<text>', 'camelCase'),
testCase('<text>', 'snakeCase'),
testCase('<text>', 'kebabCase'),
testCase('<text>', 'pascalCase')
testCase('<text>', 'pascalCase'),
testCase('src/foo/_fooBar.js', 'camelCase'),
testCase('src/foo/___fooBar.js', 'camelCase'),
testCase('src/foo/_foo_bar.js', 'snakeCase'),
testCase('src/foo/___foo_bar.js', 'snakeCase'),
testCase('src/foo/_foo-bar.js', 'kebabCase'),
testCase('src/foo/___foo-bar.js', 'kebabCase'),
testCase('src/foo/_FooBar.js', 'pascalCase'),
testCase('src/foo/___FooBar.js', 'pascalCase')
],
invalid: [
testCase('src/foo/foo_bar.js',
Expand Down Expand Up @@ -114,6 +122,38 @@ test(() => {
testCase('test/foo/foo-bar.test-utils.js',
'pascalCase',
'Filename is not in pascal case. Rename it to `FooBar.TestUtils.js`.'
),
testCase('src/foo/_FOO-BAR.js',
'camelCase',
'Filename is not in camel case. Rename it to `_fooBar.js`.'
),
testCase('src/foo/___FOO-BAR.js',
'camelCase',
'Filename is not in camel case. Rename it to `___fooBar.js`.'
),
testCase('src/foo/_FOO-BAR.js',
'snakeCase',
'Filename is not in snake case. Rename it to `_foo_bar.js`.'
),
testCase('src/foo/___FOO-BAR.js',
'snakeCase',
'Filename is not in snake case. Rename it to `___foo_bar.js`.'
),
testCase('src/foo/_FOO-BAR.js',
'kebabCase',
'Filename is not in kebab case. Rename it to `_foo-bar.js`.'
),
testCase('src/foo/___FOO-BAR.js',
'kebabCase',
'Filename is not in kebab case. Rename it to `___foo-bar.js`.'
),
testCase('src/foo/_FOO-BAR.js',
'pascalCase',
'Filename is not in pascal case. Rename it to `_FooBar.js`.'
),
testCase('src/foo/___FOO-BAR.js',
'pascalCase',
'Filename is not in pascal case. Rename it to `___FooBar.js`.'
)
]
});
Expand Down

0 comments on commit 87663a4

Please sign in to comment.