From 5ce6a6795caa5c40d6d56f2394565310046167ca Mon Sep 17 00:00:00 2001 From: Hendrik Heil Date: Tue, 30 Jan 2024 14:56:17 +0100 Subject: [PATCH 1/3] fix: support multiple macro calls in vue/define-macros-order --- lib/rules/define-macros-order.js | 20 +++++++++++++------- tests/lib/rules/define-macros-order.js | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/rules/define-macros-order.js b/lib/rules/define-macros-order.js index 7c915ca80..036770f1b 100644 --- a/lib/rules/define-macros-order.js +++ b/lib/rules/define-macros-order.js @@ -104,7 +104,7 @@ function create(context) { const order = (options[0] && options[0].order) || DEFAULT_ORDER /** @type {boolean} */ const defineExposeLast = (options[0] && options[0].defineExposeLast) || false - /** @type {Map} */ + /** @type {Map} */ const macrosNodes = new Map() /** @type {ASTNode} */ let defineExposeNode @@ -112,19 +112,21 @@ function create(context) { return utils.compositingVisitors( utils.defineScriptSetupVisitor(context, { onDefinePropsExit(node) { - macrosNodes.set(MACROS_PROPS, getDefineMacrosStatement(node)) + macrosNodes.set(MACROS_PROPS, [getDefineMacrosStatement(node)]) }, onDefineEmitsExit(node) { - macrosNodes.set(MACROS_EMITS, getDefineMacrosStatement(node)) + macrosNodes.set(MACROS_EMITS, [getDefineMacrosStatement(node)]) }, onDefineOptionsExit(node) { - macrosNodes.set(MACROS_OPTIONS, getDefineMacrosStatement(node)) + macrosNodes.set(MACROS_OPTIONS, [getDefineMacrosStatement(node)]) }, onDefineSlotsExit(node) { - macrosNodes.set(MACROS_SLOTS, getDefineMacrosStatement(node)) + macrosNodes.set(MACROS_SLOTS, [getDefineMacrosStatement(node)]) }, onDefineModelExit(node) { - macrosNodes.set(MACROS_MODEL, getDefineMacrosStatement(node)) + const currentModelMacros = macrosNodes.get(MACROS_MODEL) ?? [] + currentModelMacros.push(getDefineMacrosStatement(node)) + macrosNodes.set(MACROS_MODEL, currentModelMacros) }, onDefineExposeExit(node) { defineExposeNode = getDefineMacrosStatement(node) @@ -142,7 +144,10 @@ function create(context) { program ) const orderedList = order - .map((name) => ({ name, node: macrosNodes.get(name) })) + .flatMap((name) => { + const nodes = macrosNodes.get(name) ?? [] + return nodes?.map((node) => ({ name, node })) + }) .filter( /** @returns {data is OrderedData} */ (data) => utils.isDef(data.node) @@ -165,6 +170,7 @@ function create(context) { .map(({ node }) => node) const targetStatementIndex = moveTargetNodes.indexOf(targetStatement) + if (targetStatementIndex >= 0) { moveTargetNodes = moveTargetNodes.slice(0, targetStatementIndex) } diff --git a/tests/lib/rules/define-macros-order.js b/tests/lib/rules/define-macros-order.js index 09ac0208d..25c7a91c6 100644 --- a/tests/lib/rules/define-macros-order.js +++ b/tests/lib/rules/define-macros-order.js @@ -238,6 +238,22 @@ tester.run('define-macros-order', rule, { parser: require.resolve('@typescript-eslint/parser') } } + }, + { + filename: 'test.vue', + code: ` + + `, + options: [ + { + order: ['defineModel', 'defineSlots'] + } + ] } ], invalid: [ From da93adcfecc03b7b2661aad7327226c54094de4f Mon Sep 17 00:00:00 2001 From: Hendrik Heil Date: Wed, 31 Jan 2024 16:23:00 +0100 Subject: [PATCH 2/3] tests: add invalid tests for multiple defineModel calls --- tests/lib/rules/define-macros-order.js | 97 ++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/tests/lib/rules/define-macros-order.js b/tests/lib/rules/define-macros-order.js index 25c7a91c6..78c3637d2 100644 --- a/tests/lib/rules/define-macros-order.js +++ b/tests/lib/rules/define-macros-order.js @@ -834,6 +834,103 @@ tester.run('define-macros-order', rule, { line: 8 } ] + }, + { + filename: 'test.vue', + code: ` + + `, + output: ` + + `, + options: [ + { + order: ['defineModel', 'defineOptions'] + } + ], + errors: [ + { + message: message('defineModel'), + line: 6 + } + ] + }, + { + filename: 'test.vue', + code: ` + + `, + output: ` + + `, + options: [ + { + order: ['defineModel', 'defineOptions'] + } + ], + errors: [ + { + message: message('defineModel'), + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + `, + output: ` + + `, + options: [ + { + order: ['defineModel', 'defineOptions'], + defineExposeLast: true + } + ], + errors: [ + { + message: message('defineModel'), + line: 5 + }, + { + message: defineExposeNotTheLast, + line: 6 + } + ] } ] }) From d389cec669f9dd167c74024ab6f4267eced2c64e Mon Sep 17 00:00:00 2001 From: Hendrik Heil Date: Wed, 31 Jan 2024 18:04:56 +0100 Subject: [PATCH 3/3] Update define-macros-order.js Co-authored-by: Flo Edelmann --- lib/rules/define-macros-order.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/define-macros-order.js b/lib/rules/define-macros-order.js index 036770f1b..f24c58af7 100644 --- a/lib/rules/define-macros-order.js +++ b/lib/rules/define-macros-order.js @@ -146,7 +146,7 @@ function create(context) { const orderedList = order .flatMap((name) => { const nodes = macrosNodes.get(name) ?? [] - return nodes?.map((node) => ({ name, node })) + return nodes.map((node) => ({ name, node })) }) .filter( /** @returns {data is OrderedData} */