| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | /** * @fileoverview Rule to disallow specified names in exports * @author Milos Djermanovic */"use strict";//------------------------------------------------------------------------------// Requirements//------------------------------------------------------------------------------const astUtils = require("./utils/ast-utils");//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------/** @type {import('../shared/types').Rule} */module.exports = {    meta: {        type: "suggestion",        docs: {            description: "Disallow specified names in exports",            recommended: false,            url: "https://eslint.org/docs/rules/no-restricted-exports"        },        schema: [{            type: "object",            properties: {                restrictedNamedExports: {                    type: "array",                    items: {                        type: "string"                    },                    uniqueItems: true                }            },            additionalProperties: false        }],        messages: {            restrictedNamed: "'{{name}}' is restricted from being used as an exported name."        }    },    create(context) {        const restrictedNames = new Set(context.options[0] && context.options[0].restrictedNamedExports);        /**         * Checks and reports given exported name.         * @param {ASTNode} node exported `Identifier` or string `Literal` node to check.         * @returns {void}         */        function checkExportedName(node) {            const name = astUtils.getModuleExportName(node);            if (restrictedNames.has(name)) {                context.report({                    node,                    messageId: "restrictedNamed",                    data: { name }                });            }        }        return {            ExportAllDeclaration(node) {                if (node.exported) {                    checkExportedName(node.exported);                }            },            ExportNamedDeclaration(node) {                const declaration = node.declaration;                if (declaration) {                    if (declaration.type === "FunctionDeclaration" || declaration.type === "ClassDeclaration") {                        checkExportedName(declaration.id);                    } else if (declaration.type === "VariableDeclaration") {                        context.getDeclaredVariables(declaration)                            .map(v => v.defs.find(d => d.parent === declaration))                            .map(d => d.name) // Identifier nodes                            .forEach(checkExportedName);                    }                } else {                    node.specifiers                        .map(s => s.exported)                        .forEach(checkExportedName);                }            }        };    }};
 |