|
|
- /**
- * @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/latest/rules/no-restricted-exports"
- },
-
- schema: [{
- anyOf: [
- {
- type: "object",
- properties: {
- restrictedNamedExports: {
- type: "array",
- items: {
- type: "string"
- },
- uniqueItems: true
- }
- },
- additionalProperties: false
- },
- {
- type: "object",
- properties: {
- restrictedNamedExports: {
- type: "array",
- items: {
- type: "string",
- pattern: "^(?!default$)"
- },
- uniqueItems: true
- },
- restrictDefaultExports: {
- type: "object",
- properties: {
-
- // Allow/Disallow `export default foo; export default 42; export default function foo() {}` format
- direct: {
- type: "boolean"
- },
-
- // Allow/Disallow `export { foo as default };` declarations
- named: {
- type: "boolean"
- },
-
- // Allow/Disallow `export { default } from "mod"; export { default as default } from "mod";` declarations
- defaultFrom: {
- type: "boolean"
- },
-
- // Allow/Disallow `export { foo as default } from "mod";` declarations
- namedFrom: {
- type: "boolean"
- },
-
- // Allow/Disallow `export * as default from "mod"`; declarations
- namespaceFrom: {
- type: "boolean"
- }
- },
- additionalProperties: false
- }
- },
- additionalProperties: false
- }
- ]
- }],
-
- messages: {
- restrictedNamed: "'{{name}}' is restricted from being used as an exported name.",
- restrictedDefault: "Exporting 'default' is restricted."
- }
- },
-
- create(context) {
-
- const restrictedNames = new Set(context.options[0] && context.options[0].restrictedNamedExports);
- const restrictDefaultExports = context.options[0] && context.options[0].restrictDefaultExports;
- const sourceCode = context.sourceCode;
-
- /**
- * 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;
- }
-
- if (name === "default") {
- if (node.parent.type === "ExportAllDeclaration") {
- if (restrictDefaultExports && restrictDefaultExports.namespaceFrom) {
- context.report({
- node,
- messageId: "restrictedDefault"
- });
- }
-
- } else { // ExportSpecifier
- const isSourceSpecified = !!node.parent.parent.source;
- const specifierLocalName = astUtils.getModuleExportName(node.parent.local);
-
- if (!isSourceSpecified && restrictDefaultExports && restrictDefaultExports.named) {
- context.report({
- node,
- messageId: "restrictedDefault"
- });
- return;
- }
-
- if (isSourceSpecified && restrictDefaultExports) {
- if (
- (specifierLocalName === "default" && restrictDefaultExports.defaultFrom) ||
- (specifierLocalName !== "default" && restrictDefaultExports.namedFrom)
- ) {
- context.report({
- node,
- messageId: "restrictedDefault"
- });
- }
- }
- }
- }
- }
-
- return {
- ExportAllDeclaration(node) {
- if (node.exported) {
- checkExportedName(node.exported);
- }
- },
-
- ExportDefaultDeclaration(node) {
- if (restrictDefaultExports && restrictDefaultExports.direct) {
- context.report({
- node,
- messageId: "restrictedDefault"
- });
- }
- },
-
- ExportNamedDeclaration(node) {
- const declaration = node.declaration;
-
- if (declaration) {
- if (declaration.type === "FunctionDeclaration" || declaration.type === "ClassDeclaration") {
- checkExportedName(declaration.id);
- } else if (declaration.type === "VariableDeclaration") {
- sourceCode.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);
- }
- }
- };
- }
- };
|