nixos/home/ags/node_modules/eslint-plugin-es-x/lib/rules/no-resizable-and-growable-arraybuffers.js
2025-02-27 02:26:55 +01:00

95 lines
3.2 KiB
JavaScript

"use strict"
const {
CONSTRUCT,
ReferenceTracker,
} = require("@eslint-community/eslint-utils")
const {
definePrototypeMethodHandler,
} = require("../util/define-prototype-method-handler")
const { getSourceCode } = require("eslint-compat-utils")
/**
* @param {Node|undefined} node
* @returns {boolean}
*/
function isSpreadElement(node) {
return node && node.type === "SpreadElement"
}
module.exports = {
meta: {
docs: {
description: "disallow resizable and growable ArrayBuffers",
category: "ES2024",
recommended: false,
url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-resizable-and-growable-arraybuffers.html",
},
fixable: null,
messages: {
forbiddenForResizableArrayBuffer:
"ES2024 Resizable ArrayBuffer is forbidden.",
forbiddenForGrowableSharedArrayBuffer:
"ES2024 Growable SharedArrayBuffer is forbidden.",
},
schema: [
{
type: "object",
properties: {
aggressive: { type: "boolean" },
},
additionalProperties: false,
},
],
type: "problem",
},
create(context) {
return {
...definePrototypeMethodHandler(
context,
{
ArrayBuffer: ["maxByteLength", "resizable", "resize"],
SharedArrayBuffer: ["grow", "growable", "maxByteLength"],
},
{
createReport({ className }) {
return {
messageId:
className === "ArrayBuffer"
? "forbiddenForResizableArrayBuffer"
: "forbiddenForGrowableSharedArrayBuffer",
}
},
},
),
"Program:exit"(program) {
const sourceCode = getSourceCode(context)
const tracker = new ReferenceTracker(
sourceCode.getScope(program),
)
for (const { node, path } of tracker.iterateGlobalReferences({
ArrayBuffer: { [CONSTRUCT]: true },
SharedArrayBuffer: { [CONSTRUCT]: true },
})) {
if (node.type !== "NewExpression") {
continue
}
const args = node.arguments.slice(0, 2)
if (args.some(isSpreadElement)) {
continue
}
const reportedNode = args[1]
if (reportedNode) {
context.report({
node: reportedNode,
messageId:
path[0] === "ArrayBuffer"
? "forbiddenForResizableArrayBuffer"
: "forbiddenForGrowableSharedArrayBuffer",
})
}
}
},
}
},
}