-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
no-fb-only.js
65 lines (58 loc) · 2 KB
/
no-fb-only.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @oncall recoil
*/
// Simple eslint rule that warns on usage of `@fb-only` style comments.
// These comments introduce a split point where code behaves differently
// depending on whether it's run at facebook or in OSS and it's very difficult
// to debug, especially if the person working on that code does not have access
// to facebook's internal code. To minimize that complexity all of these split
// points should be defined in one place and dependency injected in Recoil
// at runtime.
const regexps = [
[/^.*(@fb-only).*$/, '@fb-only'],
[/^.*(@oss-only).*$/, '@oss-only'],
];
// If a file paths matches any of provided regular expressions it will be
// excluded from this lint rule.
const excludePaths = [/.*eslint-rules.*/];
module.exports = {
meta: {
docs: {
description: 'disallow @fb-only style comments',
},
},
create(context) {
return {
// Only match the top level `Program` AST node that represents the entire file.
Program(node) {
const lines = context.getSourceCode().text.split('\n');
const filename = context.getFilename();
if (excludePaths.some(r => r.test(filename))) {
return;
}
lines.forEach((line, lineNumber) => {
for (const [regexp, descriptor] of regexps) {
const match = line.match(regexp);
if (match) {
context.report({
message:
`Usage of "${descriptor}". Please consider dependency injecting this condition ` +
`instead. See "${__filename}" for more details`,
loc: {
start: {line: lineNumber + 1, column: 0},
end: {line: lineNumber + 1, column: line.length - 1},
},
});
}
}
});
},
};
},
};