From 9b587dbc8343e34365d4a0fc58eb918a6d567c9c Mon Sep 17 00:00:00 2001 From: sharkykh Date: Sun, 14 Jul 2019 00:20:05 +0300 Subject: [PATCH 1/3] Better support for dynamic components --- README.md | 2 +- src/component-not-registered.js | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b71e6c..3992d0b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Rules -- [component-not-registered](src/component-not-registered.js) - Warn if a component is used in a [SFC file](https://vuejs.org/v2/guide/single-file-components.html) without being registered (a.k.a. a globally registered component). **Does not support dynamically assigned components.** +- [component-not-registered](src/component-not-registered.js) - Warn if a component is used in a [SFC file](https://vuejs.org/v2/guide/single-file-components.html) without being registered (a.k.a. a globally registered component). **Supports simple dynamically assigned components (only literal values).** ## License diff --git a/src/component-not-registered.js b/src/component-not-registered.js index e87a6b4..1de4fbb 100644 --- a/src/component-not-registered.js +++ b/src/component-not-registered.js @@ -1,7 +1,9 @@ /** * @fileoverview Warn if a component is used in a template without being registered within that file. * @author sharkykh - * Based on https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/component-name-in-template-casing.js + * Based on: + * 1. https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/component-name-in-template-casing.js + * 2. https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-unused-components.js */ 'use strict'; @@ -111,6 +113,28 @@ module.exports = { report(open, name); } }, + "VAttribute[directive=true][key.name.name='bind'][key.argument.name='is']"(node) { + if ( + !node.value || // `` + node.value.type !== 'VExpressionContainer' || + !node.value.expression // `` + ) { + return; + } + + if (node.value.expression.type === 'Literal') { + const name = node.value.expression.value; + if (!isComponentRegistered(name)) { + report(node.value.expression, name); + } + } + }, + "VAttribute[directive=false][key.name='is']"(node) { + const name = node.value.value; + if (!isComponentRegistered(name)) { + report(node.value, name); + } + }, Program(node) { hasInvalidEOF = utils.hasInvalidEOF(node); } From 49a85ead3e685dd466f396927c8d6df9120da819 Mon Sep 17 00:00:00 2001 From: sharkykh Date: Sun, 14 Jul 2019 00:20:08 +0300 Subject: [PATCH 2/3] Update tests --- package.json | 1 + tests/component-not-registered.js | 95 ++++++++++++++++++++++++++++--- yarn.lock | 5 ++ 3 files changed, 93 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index f09927b..0f2b5ba 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "eslint-plugin-vue": "^5.2.3" }, "devDependencies": { + "dedent": "^0.7.0", "eslint": "^6.0.1", "eslint-config-xo-space": "^0.21.0", "eslint-plugin-vue": "^5.2.3", diff --git a/tests/component-not-registered.js b/tests/component-not-registered.js index 6cf5c40..d812916 100644 --- a/tests/component-not-registered.js +++ b/tests/component-not-registered.js @@ -8,6 +8,7 @@ // Requirements // ------------------------------------------------------------------------------ +const dedent = require('dedent'); const { RuleTester } = require('eslint'); const rule = require('../src/component-not-registered.js'); @@ -25,24 +26,32 @@ const tester = new RuleTester({ tester.run('component-not-registered', rule, { valid: [ - { // 1 + { filename: 'test.vue', - code: `