// lib/rules/no-native-navigation.js module.exports = { meta: { type: 'problem', docs: { description: 'Forbid native navigation methods in Vue components', category: 'Best Practices', recommended: true, }, fixable: null, schema: [], // no options messages: { avoidNativeNavigation: 'Avoid using native navigation methods. Use Vue Router methods instead.', }, }, create(context) { // Check if the current file is a Vue component const isVueComponent = context.getFilename().endsWith('.vue'); // If not a Vue component, return an empty object to skip checks if (!isVueComponent) { return {}; } return { MemberExpression(node) { // Check for location.href if ( node.object.type === 'Identifier' && node.object.name === 'location' && node.property.type === 'Identifier' && node.property.name === 'href' ) { context.report({ node, messageId: 'avoidNativeNavigation', }); } // Check for history.go, history.push, etc. if ( node.object.type === 'Identifier' && node.object.name === 'history' && ['go', 'push', 'replace', 'back', 'forward'].includes(node.property.name) ) { context.report({ node, messageId: 'avoidNativeNavigation', }); } }, CallExpression(node) { // Additional check for window.location methods if ( node.callee.type === 'MemberExpression' && node.callee.object.type === 'Identifier' && node.callee.object.name === 'location' && ['assign', 'replace'].includes(node.callee.property.name) ) { context.report({ node, messageId: 'avoidNativeNavigation', }); } } }; } };