| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | /** * @fileoverview Rule to disallow assignments to native objects or read-only global variables * @author Ilya Volodin */"use strict";//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------/** @type {import('../shared/types').Rule} */module.exports = {    meta: {        type: "suggestion",        docs: {            description: "Disallow assignments to native objects or read-only global variables",            recommended: true,            url: "https://eslint.org/docs/rules/no-global-assign"        },        schema: [            {                type: "object",                properties: {                    exceptions: {                        type: "array",                        items: { type: "string" },                        uniqueItems: true                    }                },                additionalProperties: false            }        ],        messages: {            globalShouldNotBeModified: "Read-only global '{{name}}' should not be modified."        }    },    create(context) {        const config = context.options[0];        const exceptions = (config && config.exceptions) || [];        /**         * Reports write references.         * @param {Reference} reference A reference to check.         * @param {int} index The index of the reference in the references.         * @param {Reference[]} references The array that the reference belongs to.         * @returns {void}         */        function checkReference(reference, index, references) {            const identifier = reference.identifier;            if (reference.init === false &&                reference.isWrite() &&                /*                 * Destructuring assignments can have multiple default value,                 * so possibly there are multiple writeable references for the same identifier.                 */                (index === 0 || references[index - 1].identifier !== identifier)            ) {                context.report({                    node: identifier,                    messageId: "globalShouldNotBeModified",                    data: {                        name: identifier.name                    }                });            }        }        /**         * Reports write references if a given variable is read-only builtin.         * @param {Variable} variable A variable to check.         * @returns {void}         */        function checkVariable(variable) {            if (variable.writeable === false && !exceptions.includes(variable.name)) {                variable.references.forEach(checkReference);            }        }        return {            Program() {                const globalScope = context.getScope();                globalScope.variables.forEach(checkVariable);            }        };    }};
 |