diff --git a/codemods/buffer-equal/index.js b/codemods/buffer-equal/index.js new file mode 100644 index 0000000..5ddc9aa --- /dev/null +++ b/codemods/buffer-equal/index.js @@ -0,0 +1,63 @@ +import jscodeshift from 'jscodeshift'; +import { + DEFAULT_IMPORT, + getImportIdentifierMap, + removeImport, +} from '../shared.js'; + +/** + * @typedef {import('../../types.js').Codemod} Codemod + * @typedef {import('../../types.js').CodemodOptions} CodemodOptions + */ + +/** + * @param {CodemodOptions} [options] + * @returns {Codemod} + */ +export default function (options) { + return { + name: 'buffer-equal', + transform: ({ file }) => { + const j = jscodeshift; + const root = j(file.source); + let transformCount = 0; + let dirtyFlag = false; + + const map = getImportIdentifierMap('buffer-equal', root, j); + + const identifier = map[DEFAULT_IMPORT]; + + const callExpressions = root.find(j.CallExpression, { + callee: { + name: identifier, + }, + }); + + if (!callExpressions.length) { + removeImport('buffer-equal', root, j); + return root.toSource(options); + } + + callExpressions.forEach((p) => { + const args = p.node.arguments; + if (args.length === 2 && args[0].type !== 'SpreadElement') { + const [firstArg, secondArg] = args; + j(p).replaceWith( + j.callExpression( + j.memberExpression(firstArg, j.identifier('equals')), + [secondArg], + ), + ); + dirtyFlag = true; + transformCount++; + } + }); + + if (transformCount === callExpressions.length) { + removeImport('buffer-equal', root, j); + } + + return dirtyFlag ? root.toSource(options) : file.source; + }, + }; +} diff --git a/index.js b/index.js index cd4b772..8d53e8b 100644 --- a/index.js +++ b/index.js @@ -36,6 +36,7 @@ import arrayPrototypeUnshift from './codemods/array.prototype.unshift/index.js'; import arrayPrototypeValues from './codemods/array.prototype.values/index.js'; import arrayPrototypeWith from './codemods/array.prototype.with/index.js'; import arraybufferPrototypeSlice from './codemods/arraybuffer.prototype.slice/index.js'; +import bufferEqual from './codemods/buffer-equal/index.js'; import chalk from './codemods/chalk/index.js'; import cloneRegexp from './codemods/clone-regexp/index.js'; import concatMap from './codemods/concat-map/index.js'; @@ -203,6 +204,7 @@ export const codemods = { "array.prototype.values": arrayPrototypeValues, "array.prototype.with": arrayPrototypeWith, "arraybuffer.prototype.slice": arraybufferPrototypeSlice, + "buffer-equal": bufferEqual, "chalk": chalk, "clone-regexp": cloneRegexp, "concat-map": concatMap, diff --git a/test/fixtures/buffer-equal/case-1/after.js b/test/fixtures/buffer-equal/case-1/after.js new file mode 100644 index 0000000..f359b31 --- /dev/null +++ b/test/fixtures/buffer-equal/case-1/after.js @@ -0,0 +1,6 @@ +const { Buffer } = require('node:buffer'); + +const buf1 = Buffer.from('abc'); + +const arr = Buffer.from([253, 254, 255]).equals(Buffer.from([253, 254, 255])); +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-1/before.js b/test/fixtures/buffer-equal/case-1/before.js new file mode 100644 index 0000000..7b5d264 --- /dev/null +++ b/test/fixtures/buffer-equal/case-1/before.js @@ -0,0 +1,7 @@ +const { Buffer } = require('node:buffer'); +const bufferEqual = require('buffer-equal'); + +const buf1 = Buffer.from('abc'); + +const arr = bufferEqual(Buffer.from([253, 254, 255]), Buffer.from([253, 254, 255])); +const str = bufferEqual(buf1, Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-1/result.js b/test/fixtures/buffer-equal/case-1/result.js new file mode 100644 index 0000000..f359b31 --- /dev/null +++ b/test/fixtures/buffer-equal/case-1/result.js @@ -0,0 +1,6 @@ +const { Buffer } = require('node:buffer'); + +const buf1 = Buffer.from('abc'); + +const arr = Buffer.from([253, 254, 255]).equals(Buffer.from([253, 254, 255])); +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-2/after.js b/test/fixtures/buffer-equal/case-2/after.js new file mode 100644 index 0000000..80cb59b --- /dev/null +++ b/test/fixtures/buffer-equal/case-2/after.js @@ -0,0 +1,8 @@ +const { Buffer } = require('node:buffer'); +const bufferEqual = require('buffer-equal'); + +const buf1 = Buffer.from('abc'); +const buffs = [Buffer.from([253, 254, 255]), Buffer.from([253, 254, 255])] + +const arr = bufferEqual(...buffs); +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-2/before.js b/test/fixtures/buffer-equal/case-2/before.js new file mode 100644 index 0000000..8f87e13 --- /dev/null +++ b/test/fixtures/buffer-equal/case-2/before.js @@ -0,0 +1,8 @@ +const { Buffer } = require('node:buffer'); +const bufferEqual = require('buffer-equal'); + +const buf1 = Buffer.from('abc'); +const buffs = [Buffer.from([253, 254, 255]), Buffer.from([253, 254, 255])] + +const arr = bufferEqual(...buffs); +const str = bufferEqual(buf1, Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-2/result.js b/test/fixtures/buffer-equal/case-2/result.js new file mode 100644 index 0000000..80cb59b --- /dev/null +++ b/test/fixtures/buffer-equal/case-2/result.js @@ -0,0 +1,8 @@ +const { Buffer } = require('node:buffer'); +const bufferEqual = require('buffer-equal'); + +const buf1 = Buffer.from('abc'); +const buffs = [Buffer.from([253, 254, 255]), Buffer.from([253, 254, 255])] + +const arr = bufferEqual(...buffs); +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-3/after.js b/test/fixtures/buffer-equal/case-3/after.js new file mode 100644 index 0000000..fd83f15 --- /dev/null +++ b/test/fixtures/buffer-equal/case-3/after.js @@ -0,0 +1,5 @@ +const { Buffer } = require('node:buffer'); + +const buf1 = Buffer.from('abc'); + +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-3/before.js b/test/fixtures/buffer-equal/case-3/before.js new file mode 100644 index 0000000..7caf580 --- /dev/null +++ b/test/fixtures/buffer-equal/case-3/before.js @@ -0,0 +1,6 @@ +const { Buffer } = require('node:buffer'); +const bufferEqual = require('buffer-equal'); + +const buf1 = Buffer.from('abc'); + +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file diff --git a/test/fixtures/buffer-equal/case-3/result.js b/test/fixtures/buffer-equal/case-3/result.js new file mode 100644 index 0000000..fd83f15 --- /dev/null +++ b/test/fixtures/buffer-equal/case-3/result.js @@ -0,0 +1,5 @@ +const { Buffer } = require('node:buffer'); + +const buf1 = Buffer.from('abc'); + +const str = buf1.equals(Buffer.from('def')); \ No newline at end of file