12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 'use strict';
- const {getStaticValue} = require('@eslint-community/eslint-utils');
- const {newExpressionSelector} = require('./selectors/index.js');
- const {switchNewExpressionToCallExpression} = require('./fix/index.js');
- const isNumber = require('./utils/is-number.js');
- const ERROR = 'error';
- const ERROR_UNKNOWN = 'error-unknown';
- const SUGGESTION = 'suggestion';
- const messages = {
- [ERROR]: '`new Buffer()` is deprecated, use `Buffer.{{method}}()` instead.',
- [ERROR_UNKNOWN]: '`new Buffer()` is deprecated, use `Buffer.alloc()` or `Buffer.from()` instead.',
- [SUGGESTION]: 'Switch to `Buffer.{{replacement}}()`.',
- };
- const inferMethod = (bufferArguments, scope) => {
- if (bufferArguments.length !== 1) {
- return 'from';
- }
- const [firstArgument] = bufferArguments;
- if (firstArgument.type === 'SpreadElement') {
- return;
- }
- if (firstArgument.type === 'ArrayExpression' || firstArgument.type === 'TemplateLiteral') {
- return 'from';
- }
- if (isNumber(firstArgument, scope)) {
- return 'alloc';
- }
- const staticResult = getStaticValue(firstArgument, scope);
- if (staticResult) {
- const {value} = staticResult;
- if (
- typeof value === 'string'
- || Array.isArray(value)
- ) {
- return 'from';
- }
- }
- };
- function fix(node, sourceCode, method) {
- return function * (fixer) {
- yield fixer.insertTextAfter(node.callee, `.${method}`);
- yield * switchNewExpressionToCallExpression(node, sourceCode, fixer);
- };
- }
- /** @param {import('eslint').Rule.RuleContext} context */
- const create = context => {
- const sourceCode = context.getSourceCode();
- return {
- [newExpressionSelector('Buffer')](node) {
- const method = inferMethod(node.arguments, context.getScope());
- if (method) {
- return {
- node,
- messageId: ERROR,
- data: {method},
- fix: fix(node, sourceCode, method),
- };
- }
- return {
- node,
- messageId: ERROR_UNKNOWN,
- suggest: ['from', 'alloc'].map(replacement => ({
- messageId: SUGGESTION,
- data: {replacement},
- fix: fix(node, sourceCode, replacement),
- })),
- };
- },
- };
- };
- /** @type {import('eslint').Rule.RuleModule} */
- module.exports = {
- create,
- meta: {
- type: 'problem',
- docs: {
- description: 'Enforce the use of `Buffer.from()` and `Buffer.alloc()` instead of the deprecated `new Buffer()`.',
- },
- fixable: 'code',
- hasSuggestions: true,
- messages,
- },
- };
|