diff --git a/docs/rules/component-tags-order.md b/docs/rules/component-tags-order.md index cc4aebbfa..4fc8d245e 100644 --- a/docs/rules/component-tags-order.md +++ b/docs/rules/component-tags-order.md @@ -26,7 +26,7 @@ This rule warns about the order of the top-level tags, such as `', + code: '', output: null, options: [ { @@ -155,14 +155,14 @@ tester.run('component-tags-order', rule, { ['script:not([setup])', 'script[setup]', 'template'], 'style[scoped]', 'style:not([scoped])', - 'i18n:not([lang=en])', - 'i18n:not([lang=ja])' + 'i18n:not([locale=en])', + 'i18n:not([locale=ja])' ] } ] }, { - code: '', + code: '', output: null, options: [ { @@ -172,8 +172,8 @@ tester.run('component-tags-order', rule, { 'script[setup]', 'style[scoped]', 'style:not([scoped])', - 'i18n[lang=en]', - 'i18n[lang=ja]' + 'i18n[locale=en]', + 'i18n[locale=ja]' ] } ] diff --git a/tests/lib/utils/selector.js b/tests/lib/utils/selector.js new file mode 100644 index 000000000..6677a9fa4 --- /dev/null +++ b/tests/lib/utils/selector.js @@ -0,0 +1,88 @@ +'use strict' + +const fs = require('fs') +const path = require('path') +const assert = require('assert') + +const Linter = require('eslint').Linter + +const selector = require('../../../lib/utils/selector') +const utils = require('../../../lib/utils') + +const FIXTURE_ROOT = path.resolve(__dirname, '../../fixtures/utils/selector') + +/** + * Load test patterns from fixtures. + * + * @returns {object} The loaded patterns. + */ +function loadPatterns() { + return fs.readdirSync(FIXTURE_ROOT).map((name) => { + const code0 = fs.readFileSync( + path.join(FIXTURE_ROOT, name, 'source.vue'), + 'utf8' + ) + const code = code0.replace(/^/, ``) + const inputSelector = /^/.exec(code0)[1].trim() + return { code, name, inputSelector } + }) +} + +function extractElements(code, inputSelector) { + const linter = new Linter() + const matches = [] + + linter.defineRule('vue/selector-test', (context) => { + const parsed = selector.parseSelector(inputSelector, context) + return utils.defineDocumentVisitor(context, { + VElement(node) { + if (parsed.test(node)) { + matches.push( + context.getSourceCode().text.slice(...node.startTag.range) + ) + } + } + }) + }) + linter.defineParser('vue-eslint-parser', require('vue-eslint-parser')) + const messages = linter.verify( + code, + { + parser: 'vue-eslint-parser', + parserOptions: { ecmaVersion: 2018 }, + rules: { 'vue/selector-test': 'error' } + }, + undefined, + true + ) + + return { + selector: inputSelector, + matches, + errors: messages.map((message) => message.message) + } +} + +describe('parseSelector()', () => { + for (const { name, code, inputSelector } of loadPatterns()) { + describe(`'test/fixtures/utils/selector/${name}/source.vue'`, () => { + it('should to parse the selector to match the valid elements.', () => { + const elements = extractElements(code, inputSelector) + const actual = JSON.stringify(elements, null, 4) + + // update fixture + // fs.writeFileSync( + // path.join(FIXTURE_ROOT, name, 'result.json'), + // actual, + // 'utf8' + // ) + + const expected = fs.readFileSync( + path.join(FIXTURE_ROOT, name, 'result.json'), + 'utf8' + ) + assert.strictEqual(actual, expected) + }) + }) + } +})