react-native-macos/packages/eslint-plugin-react-native-.../platform-colors.js

108 строки
3.1 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
module.exports = {
meta: {
type: 'problem',
docs: {
description:
'Ensure that PlatformColor() and DynamicColorIOS() are passed literals of the expected shape.',
},
messages: {
platformColorArgsLength:
'PlatformColor() must have at least one argument that is a literal.',
platformColorArgTypes:
'PlatformColor() every argument must be a literal.',
dynamicColorIOSArg:
'DynamicColorIOS() must take a single argument of type Object containing two keys: light and dark.',
dynamicColorIOSLight:
'DynamicColorIOS() light value must be either a literal or a PlatformColor() call.',
dynamicColorIOSDark:
'DynamicColorIOS() dark value must be either a literal or a PlatformColor() call.',
},
schema: [],
},
create: function (context) {
return {
CallExpression: function (node) {
if (node.callee.name === 'PlatformColor') {
const args = node.arguments;
if (args.length === 0) {
context.report({
node,
messageId: 'platformColorArgsLength',
});
return;
}
if (!args.every(arg => arg.type === 'Literal')) {
context.report({
node,
messageId: 'platformColorArgTypes',
});
return;
}
} else if (node.callee.name === 'DynamicColorIOS') {
const args = node.arguments;
if (!(args.length === 1 && args[0].type === 'ObjectExpression')) {
context.report({
node,
messageId: 'dynamicColorIOSArg',
});
return;
}
const properties = args[0].properties;
if (
!(
properties[0].type === 'Property' &&
properties[0].key.name === 'light' &&
properties[1].type === 'Property' &&
properties[1].key.name === 'dark'
)
) {
context.report({
node,
messageId: 'dynamicColorIOSArg',
});
return;
}
const light = properties[0];
if (
!(
light.value.type === 'Literal' ||
(light.value.type === 'CallExpression' &&
light.value.callee.name === 'PlatformColor')
)
) {
context.report({
node,
messageId: 'dynamicColorIOSLight',
});
return;
}
const dark = properties[1];
if (
!(
dark.value.type === 'Literal' ||
(dark.value.type === 'CallExpression' &&
dark.value.callee.name === 'PlatformColor')
)
) {
context.report({
node,
messageId: 'dynamicColorIOSDark',
});
return;
}
}
},
};
},
};