diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js
index 20d4cc4644..8140439145 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/index.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/index.js
@@ -753,10 +753,11 @@ const legacy_scope_tweaker = {
state.scope.get(specifier.local.name)
);
if (
- binding.kind === 'state' ||
- binding.kind === 'frozen_state' ||
- (binding.kind === 'normal' &&
- (binding.declaration_kind === 'let' || binding.declaration_kind === 'var'))
+ binding !== null &&
+ (binding.kind === 'state' ||
+ binding.kind === 'frozen_state' ||
+ (binding.kind === 'normal' &&
+ (binding.declaration_kind === 'let' || binding.declaration_kind === 'var')))
) {
binding.kind = 'prop';
if (specifier.exported.name !== specifier.local.name) {
diff --git a/packages/svelte/tests/runtime-legacy/samples/prop-const/Nested.svelte b/packages/svelte/tests/runtime-legacy/samples/prop-const/Nested.svelte
new file mode 100644
index 0000000000..392bc7555d
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/prop-const/Nested.svelte
@@ -0,0 +1,7 @@
+
+
+
a: {a}
+b: {b}
diff --git a/packages/svelte/tests/runtime-legacy/samples/prop-const/_config.js b/packages/svelte/tests/runtime-legacy/samples/prop-const/_config.js
new file mode 100644
index 0000000000..040b911cc6
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/prop-const/_config.js
@@ -0,0 +1,27 @@
+import { test } from '../../test';
+
+export default test({
+ get props() {
+ return { a: 3, b: 4 };
+ },
+
+ html: `
+ a: 3
+ b: 2
+ `,
+
+ async test({ assert, component, target }) {
+ await component.$set({
+ a: 5,
+ b: 6
+ });
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ a: 5
+ b: 2
+ `
+ );
+ }
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/prop-const/main.svelte b/packages/svelte/tests/runtime-legacy/samples/prop-const/main.svelte
new file mode 100644
index 0000000000..e9184c8da4
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/prop-const/main.svelte
@@ -0,0 +1,8 @@
+
+
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/props-reactive-b/_config.js b/packages/svelte/tests/runtime-legacy/samples/props-reactive-b/_config.js
new file mode 100644
index 0000000000..b92d81bd53
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/props-reactive-b/_config.js
@@ -0,0 +1,37 @@
+import { test } from '../../test';
+
+export default test({
+ get props() {
+ return { a: 1, b: 2 };
+ },
+
+ html: `
+ a: 1
+ b: 2
+ c: 3
+ `,
+
+ async test({ assert, component, target }) {
+ await component.$set({ a: 4 });
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ a: 4
+ b: 2
+ c: 6
+ `
+ );
+
+ await component.$set({ b: 5 });
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ a: 4
+ b: 5
+ c: 9
+ `
+ );
+ }
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/props-reactive-b/main.svelte b/packages/svelte/tests/runtime-legacy/samples/props-reactive-b/main.svelte
new file mode 100644
index 0000000000..1c40f4a344
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/props-reactive-b/main.svelte
@@ -0,0 +1,8 @@
+
+
+a: {a}
+b: {$$props.b}
+c: {c}
diff --git a/packages/svelte/tests/runtime-legacy/samples/spread-from-import/_config.js b/packages/svelte/tests/runtime-legacy/samples/spread-from-import/_config.js
new file mode 100644
index 0000000000..d81175494f
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/spread-from-import/_config.js
@@ -0,0 +1,13 @@
+import { test } from '../../test';
+
+export default test({
+ html: `
+
+
+
+ `
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/spread-from-import/main.svelte b/packages/svelte/tests/runtime-legacy/samples/spread-from-import/main.svelte
new file mode 100644
index 0000000000..5cec0ebb08
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/spread-from-import/main.svelte
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/spread-from-import/spread.js b/packages/svelte/tests/runtime-legacy/samples/spread-from-import/spread.js
new file mode 100644
index 0000000000..8ecf7628f3
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/spread-from-import/spread.js
@@ -0,0 +1,6 @@
+export function spread() {
+ return {
+ class: 'tooltip',
+ id: null
+ };
+}
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/App.svelte b/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/App.svelte
new file mode 100644
index 0000000000..4ec51de6d5
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/App.svelte
@@ -0,0 +1,11 @@
+
+
+Hello {name}
+
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/_config.js b/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/_config.js
new file mode 100644
index 0000000000..a8330e86b0
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/_config.js
@@ -0,0 +1,15 @@
+import { test } from '../../test';
+
+export default test({
+ skip_if_ssr: true,
+ compileOptions: {
+ cssHash: () => 'svelte-xyz'
+ },
+ async test({ assert, component, window }) {
+ assert.htmlEqual(
+ window.document.head.innerHTML,
+ ''
+ );
+ assert.htmlEqual(component.div.innerHTML, 'Hello World
');
+ }
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/main.svelte b/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/main.svelte
new file mode 100644
index 0000000000..eb2d6c0ee6
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-dom-detached/main.svelte
@@ -0,0 +1,18 @@
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-dom/App.svelte b/packages/svelte/tests/runtime-legacy/samples/target-dom/App.svelte
new file mode 100644
index 0000000000..4ec51de6d5
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-dom/App.svelte
@@ -0,0 +1,11 @@
+
+
+Hello {name}
+
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-dom/_config.js b/packages/svelte/tests/runtime-legacy/samples/target-dom/_config.js
new file mode 100644
index 0000000000..a8330e86b0
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-dom/_config.js
@@ -0,0 +1,15 @@
+import { test } from '../../test';
+
+export default test({
+ skip_if_ssr: true,
+ compileOptions: {
+ cssHash: () => 'svelte-xyz'
+ },
+ async test({ assert, component, window }) {
+ assert.htmlEqual(
+ window.document.head.innerHTML,
+ ''
+ );
+ assert.htmlEqual(component.div.innerHTML, 'Hello World
');
+ }
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-dom/main.svelte b/packages/svelte/tests/runtime-legacy/samples/target-dom/main.svelte
new file mode 100644
index 0000000000..4d5a825ad3
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-dom/main.svelte
@@ -0,0 +1,18 @@
+
+
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/App.svelte b/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/App.svelte
new file mode 100644
index 0000000000..4ec51de6d5
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/App.svelte
@@ -0,0 +1,11 @@
+
+
+Hello {name}
+
+
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/_config.js b/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/_config.js
new file mode 100644
index 0000000000..34f10f4652
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/_config.js
@@ -0,0 +1,18 @@
+import { test } from '../../test';
+
+export default test({
+ skip_if_ssr: true,
+ compileOptions: {
+ cssHash: () => 'svelte-xyz'
+ },
+ async test({ assert, component, window }) {
+ assert.htmlEqual(
+ window.document.head.innerHTML,
+ ''
+ );
+ assert.htmlEqual(
+ component.div.shadowRoot.innerHTML,
+ 'Hello World
'
+ );
+ }
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/main.svelte b/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/main.svelte
new file mode 100644
index 0000000000..8674130bb8
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/target-shadow-dom/main.svelte
@@ -0,0 +1,19 @@
+
+
+