95 lines
3.2 KiB
JavaScript
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",
|
|
})
|
|
}
|
|
}
|
|
},
|
|
}
|
|
},
|
|
}
|