diff --git a/lib/rules/split-platform-components.js b/lib/rules/split-platform-components.js
index 4fa5916..4a56287 100644
--- a/lib/rules/split-platform-components.js
+++ b/lib/rules/split-platform-components.js
@@ -11,6 +11,12 @@ module.exports = function (context) {
const androidMessage = 'Android components should be placed in android files';
const iosMessage = 'IOS components should be placed in ios files';
const conflictMessage = 'IOS and Android components can\'t be mixed';
+ const iosPathRegex = context.options[0] && context.options[0].iosPathRegex
+ ? new RegExp(context.options[0].iosPathRegex)
+ : /\.ios\.js$/;
+ const androidPathRegex = context.options[0] && context.options[0].androidPathRegex
+ ? new RegExp(context.options[0].androidPathRegex)
+ : /\.android\.js$/;
function getName(node) {
if (node.type === 'Property') {
@@ -37,11 +43,11 @@ module.exports = function (context) {
components.forEach((node) => {
const propName = getName(node);
- if (propName.includes('IOS') && !filename.endsWith('.ios.js')) {
+ if (propName.includes('IOS') && !filename.match(iosPathRegex)) {
context.report(node, containsAndroidAndIOS ? conflictMessage : iosMessage);
}
- if (propName.includes('Android') && !filename.endsWith('.android.js')) {
+ if (propName.includes('Android') && !filename.match(androidPathRegex)) {
context.report(node, containsAndroidAndIOS ? conflictMessage : androidMessage);
}
});
@@ -71,4 +77,15 @@ module.exports = function (context) {
};
};
-module.exports.schema = [];
+module.exports.schema = [{
+ type: 'object',
+ properties: {
+ androidPathRegex: {
+ type: 'string',
+ },
+ iosPathRegex: {
+ type: 'string',
+ },
+ },
+ additionalProperties: false,
+}];
diff --git a/tests/lib/rules/split-platform-components.js b/tests/lib/rules/split-platform-components.js
index 10d8a8f..69cc365 100644
--- a/tests/lib/rules/split-platform-components.js
+++ b/tests/lib/rules/split-platform-components.js
@@ -112,6 +112,48 @@ ruleTester.run('split-platform-components', rule, {
classes: true,
jsx: true,
},
+ }, {
+ code: [
+ 'const React = require(\'react-native\');',
+ 'const {',
+ ' ActivityIndicatiorIOS,',
+ '} = React',
+ 'const Hello = React.createClass({',
+ ' render: function() {',
+ ' return ;',
+ ' }',
+ '});',
+ ].join('\n'),
+ options: [{
+ iosPathRegex: '\\.ios(\\.test)?\\.js$',
+ }],
+ filename: 'Hello.ios.test.js',
+ parser: 'babel-eslint',
+ ecmaFeatures: {
+ classes: true,
+ jsx: true,
+ },
+ }, {
+ code: [
+ 'const React = require(\'react-native\');',
+ 'const {',
+ ' ProgressBarAndroid,',
+ '} = React',
+ 'const Hello = React.createClass({',
+ ' render: function() {',
+ ' return ;',
+ ' }',
+ '});',
+ ].join('\n'),
+ parser: 'babel-eslint',
+ options: [{
+ androidPathRegex: '\\.android(\\.test)?\\.js$',
+ }],
+ filename: 'Hello.android.test.js',
+ ecmaFeatures: {
+ classes: true,
+ jsx: true,
+ },
}],
invalid: [{