diff --git a/lib/rules/define-macros-order.js b/lib/rules/define-macros-order.js
index 9c8ea45e6..1db259fa1 100644
--- a/lib/rules/define-macros-order.js
+++ b/lib/rules/define-macros-order.js
@@ -19,6 +19,17 @@ const MACROS_PROPS = 'defineProps'
const ORDER = [MACROS_EMITS, MACROS_PROPS]
const DEFAULT_ORDER = [MACROS_PROPS, MACROS_EMITS]
+/**
+ * @param {VElement} scriptSetup
+ * @param {ASTNode} node
+ */
+function inScriptSetup(scriptSetup, node) {
+ return (
+ scriptSetup.range[0] <= node.range[0] &&
+ node.range[1] <= scriptSetup.range[1]
+ )
+}
+
/**
* @param {ASTNode} node
*/
@@ -33,9 +44,10 @@ function isUseStrictStatement(node) {
/**
* Get an index of the first statement after imports and interfaces in order
* to place defineEmits and defineProps before this statement
+ * @param {VElement} scriptSetup
* @param {Program} program
*/
-function getTargetStatementPosition(program) {
+function getTargetStatementPosition(scriptSetup, program) {
const skipStatements = new Set([
'ImportDeclaration',
'TSInterfaceDeclaration',
@@ -45,7 +57,11 @@ function getTargetStatementPosition(program) {
])
for (const [index, item] of program.body.entries()) {
- if (!skipStatements.has(item.type) && !isUseStrictStatement(item)) {
+ if (
+ inScriptSetup(scriptSetup, item) &&
+ !skipStatements.has(item.type) &&
+ !isUseStrictStatement(item)
+ ) {
return index
}
}
@@ -104,7 +120,10 @@ function create(context) {
'Program:exit'(program) {
const shouldFirstNode = macrosNodes.get(order[0])
const shouldSecondNode = macrosNodes.get(order[1])
- const firstStatementIndex = getTargetStatementPosition(program)
+ const firstStatementIndex = getTargetStatementPosition(
+ scriptSetup,
+ program
+ )
const firstStatement = program.body[firstStatementIndex]
// have both defineEmits and defineProps
diff --git a/tests/lib/rules/define-macros-order.js b/tests/lib/rules/define-macros-order.js
index ce5f30040..65a07887f 100644
--- a/tests/lib/rules/define-macros-order.js
+++ b/tests/lib/rules/define-macros-order.js
@@ -387,6 +387,42 @@ tester.run('define-macros-order', rule, {
line: 3
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ errors: [
+ {
+ message: message('defineProps'),
+ line: 11
+ }
+ ]
}
]
})