eslint-plugin-unicorn
Version:
More than 300 powerful ESLint rules
70 lines (53 loc) • 1.77 kB
JavaScript
import {isNumericLiteral, isBigIntLiteral} from '../ast/index.js';
import unwrapTypeScriptExpression from './unwrap-typescript-expression.js';
// Determine whether this node is a decimal integer literal.
// Copied from https://github.com/eslint/eslint/blob/cc4871369645c3409dc56ded7a555af8a9f63d51/lib/rules/utils/ast-utils.js#L1237
const DECIMAL_INTEGER_PATTERN = /^(?:0|0[0-7]*[89]\d*|[1-9](?:_?\d)*)$/u;
export const isDecimalInteger = text => DECIMAL_INTEGER_PATTERN.test(text);
export const isDecimalIntegerNode = node => isNumericLiteral(node) && isDecimalInteger(node.raw);
export const isNumeric = node => isNumericLiteral(node) || isBigIntLiteral(node);
export const isLegacyOctal = node => isNumericLiteral(node) && /^0\d+$/.test(node.raw);
export function getStaticNumberValue(node) {
node = unwrapTypeScriptExpression(node);
if (isNumericLiteral(node)) {
return node.value;
}
if (
node.type === 'UnaryExpression'
&& (node.operator === '+' || node.operator === '-')
) {
const value = getStaticNumberValue(node.argument);
if (typeof value === 'number') {
return node.operator === '-' ? -value : value;
}
}
}
export function getPrefix(text) {
let prefix = '';
let data = text;
if (/^0[box]/i.test(text)) {
prefix = text.slice(0, 2);
data = text.slice(2);
}
return {prefix, data};
}
export function parseNumber(text) {
const {
number,
mark = '',
sign = '',
power = '',
} = text.match(/^(?<number>[\d._]*)(?:(?<mark>e)(?<sign>[+-])?(?<power>[\d_]+))?$/i).groups;
return {
number,
mark,
sign,
power,
};
}
export function parseFloatNumber(text) {
const parts = text.split('.');
const [integer, fractional = ''] = parts;
const dot = parts.length === 2 ? '.' : '';
return {integer, dot, fractional};
}