| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | /** * @fileoverview Rule to suggest using "Reflect" api over Function/Object methods * @author Keith Cirkel <http://keithcirkel.co.uk> * @deprecated in ESLint v3.9.0 */"use strict";//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------module.exports = {    meta: {        docs: {            description: "require `Reflect` methods where applicable",            category: "ECMAScript 6",            recommended: false,            replacedBy: [],            url: "https://eslint.org/docs/rules/prefer-reflect"        },        deprecated: true,        schema: [            {                type: "object",                properties: {                    exceptions: {                        type: "array",                        items: {                            enum: [                                "apply",                                "call",                                "delete",                                "defineProperty",                                "getOwnPropertyDescriptor",                                "getPrototypeOf",                                "setPrototypeOf",                                "isExtensible",                                "getOwnPropertyNames",                                "preventExtensions"                            ]                        },                        uniqueItems: true                    }                },                additionalProperties: false            }        ]    },    create(context) {        const existingNames = {            apply: "Function.prototype.apply",            call: "Function.prototype.call",            defineProperty: "Object.defineProperty",            getOwnPropertyDescriptor: "Object.getOwnPropertyDescriptor",            getPrototypeOf: "Object.getPrototypeOf",            setPrototypeOf: "Object.setPrototypeOf",            isExtensible: "Object.isExtensible",            getOwnPropertyNames: "Object.getOwnPropertyNames",            preventExtensions: "Object.preventExtensions"        };        const reflectSubsitutes = {            apply: "Reflect.apply",            call: "Reflect.apply",            defineProperty: "Reflect.defineProperty",            getOwnPropertyDescriptor: "Reflect.getOwnPropertyDescriptor",            getPrototypeOf: "Reflect.getPrototypeOf",            setPrototypeOf: "Reflect.setPrototypeOf",            isExtensible: "Reflect.isExtensible",            getOwnPropertyNames: "Reflect.getOwnPropertyNames",            preventExtensions: "Reflect.preventExtensions"        };        const exceptions = (context.options[0] || {}).exceptions || [];        /**         * Reports the Reflect violation based on the `existing` and `substitute`         * @param {Object} node The node that violates the rule.         * @param {string} existing The existing method name that has been used.         * @param {string} substitute The Reflect substitute that should be used.         * @returns {void}         */        function report(node, existing, substitute) {            context.report({                node,                message: "Avoid using {{existing}}, instead use {{substitute}}.",                data: {                    existing,                    substitute                }            });        }        return {            CallExpression(node) {                const methodName = (node.callee.property || {}).name;                const isReflectCall = (node.callee.object || {}).name === "Reflect";                const hasReflectSubsitute = reflectSubsitutes.hasOwnProperty(methodName);                const userConfiguredException = exceptions.indexOf(methodName) !== -1;                if (hasReflectSubsitute && !isReflectCall && !userConfiguredException) {                    report(node, existingNames[methodName], reflectSubsitutes[methodName]);                }            },            UnaryExpression(node) {                const isDeleteOperator = node.operator === "delete";                const targetsIdentifier = node.argument.type === "Identifier";                const userConfiguredException = exceptions.indexOf("delete") !== -1;                if (isDeleteOperator && !targetsIdentifier && !userConfiguredException) {                    report(node, "the delete keyword", "Reflect.deleteProperty");                }            }        };    }};
 |