Skip to content

Commit 99ca082

Browse files
committed
Add new no-empty-array-object-default-in-useOnyx rule
1 parent 9b8816c commit 99ca082

3 files changed

Lines changed: 127 additions & 0 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* @typedef {import('eslint').Rule.RuleModule} RuleModule
3+
*/
4+
5+
/** @type {RuleModule} */
6+
module.exports = {
7+
name: 'no-empty-array-object-default-in-useOnyx',
8+
meta: {
9+
type: 'problem',
10+
docs: {
11+
description: 'Disallow empty array or object as default values in useOnyx destructuring assignments. Use getEmptyArray() or getEmptyObject() instead.',
12+
recommended: 'error',
13+
},
14+
schema: [],
15+
messages: {
16+
noEmptyArrayDefault: 'Avoid using empty array [] as default value in useOnyx. Use getEmptyArray<T>() instead.',
17+
noEmptyObjectDefault: 'Avoid using empty object {} as default value in useOnyx. Use getEmptyObject<T>() instead.',
18+
},
19+
},
20+
create(context) {
21+
return {
22+
VariableDeclarator(node) {
23+
if (
24+
!node.init
25+
|| node.init.type !== 'CallExpression'
26+
|| node.init.callee.name !== 'useOnyx'
27+
) {
28+
return;
29+
}
30+
31+
// Check if the variable declaration is an array pattern (destructuring)
32+
if (node.id.type !== 'ArrayPattern') {
33+
return;
34+
}
35+
36+
node.id.elements.forEach((element) => {
37+
if (!element || element.type !== 'AssignmentPattern') {
38+
return;
39+
}
40+
41+
const defaultValue = element.right;
42+
43+
// Check for empty array default
44+
if (defaultValue.type === 'ArrayExpression' && defaultValue.elements.length === 0) {
45+
context.report({
46+
node: defaultValue,
47+
messageId: 'noEmptyArrayDefault',
48+
});
49+
}
50+
51+
// Check for empty object default
52+
if (defaultValue.type === 'ObjectExpression' && defaultValue.properties.length === 0) {
53+
context.report({
54+
node: defaultValue,
55+
messageId: 'noEmptyObjectDefault',
56+
});
57+
}
58+
});
59+
},
60+
};
61+
},
62+
};
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
const RuleTester = require('eslint').RuleTester;
2+
const rule = require('../no-empty-array-object-default-in-useOnyx');
3+
4+
const ruleTester = new RuleTester({
5+
parserOptions: {
6+
ecmaVersion: 2020,
7+
sourceType: 'module',
8+
},
9+
});
10+
11+
ruleTester.run('no-empty-array-object-default-in-useOnyx', rule, {
12+
valid: [
13+
{
14+
code: 'const [data = getEmptyObject()] = useOnyx(ONYXKEYS.DATA);',
15+
},
16+
{
17+
code: 'const [data = getEmptyArray()] = useOnyx(ONYXKEYS.DATA);',
18+
},
19+
{
20+
code: 'const [data] = useOnyx(ONYXKEYS.DATA);',
21+
},
22+
{
23+
code: 'const [data = null] = useOnyx(ONYXKEYS.DATA);',
24+
},
25+
{
26+
code: 'const [data = undefined] = useOnyx(ONYXKEYS.DATA);',
27+
},
28+
{
29+
code: 'const [data = false] = useOnyx(ONYXKEYS.DATA);',
30+
},
31+
{
32+
code: 'const [data = ""] = useOnyx(ONYXKEYS.DATA);',
33+
},
34+
{
35+
code: 'const [data = 0] = useOnyx(ONYXKEYS.DATA);',
36+
},
37+
{
38+
code: 'const [data = someVariable] = useOnyx(ONYXKEYS.DATA);',
39+
},
40+
{
41+
code: 'const [data = {key: "value"}] = useOnyx(ONYXKEYS.DATA);',
42+
},
43+
{
44+
code: 'const [data = ["item"]] = useOnyx(ONYXKEYS.DATA);',
45+
},
46+
{
47+
code: 'const data = useOnyx(ONYXKEYS.DATA);',
48+
},
49+
],
50+
invalid: [
51+
{
52+
code: 'const [data = {}] = useOnyx(ONYXKEYS.DATA);',
53+
errors: [{
54+
messageId: 'noEmptyObjectDefault',
55+
}],
56+
},
57+
{
58+
code: 'const [data = []] = useOnyx(ONYXKEYS.DATA);',
59+
errors: [{
60+
messageId: 'noEmptyArrayDefault',
61+
}],
62+
},
63+
],
64+
});

rules/expensify.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ module.exports = {
3131
}],
3232
'rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth': 'warn',
3333
'rulesdir/no-use-state-initializer-functions': 'error',
34+
'rulesdir/no-empty-array-object-default-in-useOnyx': 'error',
3435
},
3536
};
3637

0 commit comments

Comments
 (0)