109 строки
3.2 KiB
JavaScript
109 строки
3.2 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.length === 2 &&
|
|
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;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
},
|
|
};
|