diff --git a/CHANGELOG.md b/CHANGELOG.md
index ef5ba2307f..60553037e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
## Unreleased
+* In `vars` array, correctly indicate whether `module` variables are `mutated` or `reassigned` ([#3215](https://github.com/sveltejs/svelte/issues/3215))
* Exclude global variables from `$capture_state` ([#4463](https://github.com/sveltejs/svelte/issues/4463))
## 3.19.1
diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts
index 9822529ece..2569820464 100644
--- a/src/compiler/compile/Component.ts
+++ b/src/compiler/compile/Component.ts
@@ -780,7 +780,7 @@ export default class Component {
const component = this;
const { content } = script;
- const { instance_scope, instance_scope_map: map } = this;
+ const { instance_scope, module_scope, instance_scope_map: map } = this;
let scope = instance_scope;
@@ -797,7 +797,12 @@ export default class Component {
const deep = assignee.type === 'MemberExpression';
names.forEach(name => {
- if (scope.find_owner(name) === instance_scope) {
+ const scope_owner = scope.find_owner(name);
+ if (
+ scope_owner !== null
+ ? scope_owner === instance_scope
+ : module_scope && module_scope.has(name)
+ ) {
const variable = component.var_lookup.get(name);
variable[deep ? 'mutated' : 'reassigned'] = true;
}
diff --git a/test/vars/samples/modules-vars/_config.js b/test/vars/samples/modules-vars/_config.js
new file mode 100644
index 0000000000..e178941db6
--- /dev/null
+++ b/test/vars/samples/modules-vars/_config.js
@@ -0,0 +1,72 @@
+export default {
+ test(assert, vars) {
+ assert.deepEqual(vars, [
+ {
+ name: "a",
+ export_name: null,
+ injected: false,
+ module: true,
+ mutated: false,
+ reassigned: true,
+ referenced: false,
+ referenced_from_script: false,
+ writable: true
+ },
+ {
+ name: "b",
+ export_name: null,
+ injected: false,
+ module: true,
+ mutated: true,
+ reassigned: false,
+ referenced: false,
+ referenced_from_script: false,
+ writable: true
+ },
+ {
+ name: "c",
+ export_name: null,
+ injected: false,
+ module: true,
+ mutated: false,
+ reassigned: false,
+ referenced: false,
+ referenced_from_script: false,
+ writable: true
+ },
+ {
+ name: "d",
+ export_name: null,
+ injected: false,
+ module: true,
+ mutated: false,
+ reassigned: false,
+ referenced: false,
+ referenced_from_script: false,
+ writable: true
+ },
+ {
+ name: "c",
+ export_name: null,
+ injected: false,
+ module: false,
+ mutated: false,
+ reassigned: true,
+ referenced: false,
+ referenced_from_script: true,
+ writable: true
+ },
+ {
+ name: "foo",
+ export_name: null,
+ injected: false,
+ module: false,
+ mutated: false,
+ reassigned: false,
+ referenced: false,
+ referenced_from_script: false,
+ writable: false
+ }
+ ]);
+ }
+};
diff --git a/test/vars/samples/modules-vars/input.svelte b/test/vars/samples/modules-vars/input.svelte
new file mode 100644
index 0000000000..8bbd5bdc5e
--- /dev/null
+++ b/test/vars/samples/modules-vars/input.svelte
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file