diff --git a/.changeset/fruity-knives-ring.md b/.changeset/fruity-knives-ring.md
new file mode 100644
index 000000000000..059b2df1c7a2
--- /dev/null
+++ b/.changeset/fruity-knives-ring.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: set AST `root.start` to `0` and `root.end` to `template.length`
diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js
index 8f7ef76be567..5fbd1bddf282 100644
--- a/packages/svelte/src/compiler/phases/1-parse/index.js
+++ b/packages/svelte/src/compiler/phases/1-parse/index.js
@@ -115,21 +115,8 @@ export class Parser {
e.unexpected_eof(this.index);
}
- if (this.root.fragment.nodes.length) {
- let start = /** @type {number} */ (this.root.fragment.nodes[0].start);
- while (regex_whitespace.test(template[start])) start += 1;
-
- let end = /** @type {number} */ (
- this.root.fragment.nodes[this.root.fragment.nodes.length - 1].end
- );
- while (regex_whitespace.test(template[end - 1])) end -= 1;
-
- this.root.start = start;
- this.root.end = end;
- } else {
- // @ts-ignore
- this.root.start = this.root.end = null;
- }
+ this.root.start = 0;
+ this.root.end = template.length;
const options_index = this.root.fragment.nodes.findIndex(
/** @param {any} thing */
diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json
index dba258a6b164..daa1804bcc8c 100644
--- a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json
+++ b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json
@@ -1,7 +1,7 @@
{
"css": null,
"js": [],
- "start": 37,
+ "start": 0,
"end": 117,
"type": "Root",
"fragment": {
diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json
index 1aca0ce03607..5912afd3c15a 100644
--- a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json
+++ b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json
@@ -2,7 +2,7 @@
"css": null,
"js": [],
"start": 0,
- "end": 27,
+ "end": 76,
"type": "Root",
"fragment": {
"type": "Fragment",
diff --git a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json
index a126acb4c3f8..418be8135d2b 100644
--- a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json
+++ b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json
@@ -1079,7 +1079,7 @@
}
},
"js": [],
- "start": 808,
+ "start": 0,
"end": 820,
"type": "Root",
"fragment": {
diff --git a/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json b/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json
index e410cf2a801b..d052affe46a2 100644
--- a/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json
+++ b/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json
@@ -398,8 +398,8 @@
}
},
"js": [],
- "start": null,
- "end": null,
+ "start": 0,
+ "end": 386,
"type": "Root",
"fragment": {
"type": "Fragment",
diff --git a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json
index b66ee7288f2e..05c6ea3d1dbf 100644
--- a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json
+++ b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json
@@ -1,7 +1,7 @@
{
"css": null,
"js": [],
- "start": 30,
+ "start": 0,
"end": 192,
"type": "Root",
"fragment": {
diff --git a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json
index 181f1ba25000..ddcdb86225f0 100644
--- a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json
+++ b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json
@@ -1,7 +1,7 @@
{
"css": null,
"js": [],
- "start": 45,
+ "start": 0,
"end": 119,
"type": "Root",
"fragment": {
diff --git a/packages/svelte/tests/parser-modern/samples/options/output.json b/packages/svelte/tests/parser-modern/samples/options/output.json
index 6feee2d4f506..080ecd8d4fa3 100644
--- a/packages/svelte/tests/parser-modern/samples/options/output.json
+++ b/packages/svelte/tests/parser-modern/samples/options/output.json
@@ -2,7 +2,7 @@
"css": null,
"js": [],
"start": 0,
- "end": 102,
+ "end": 169,
"type": "Root",
"fragment": {
"type": "Fragment",
diff --git a/packages/svelte/tests/parser-modern/samples/script-style-no-markup/input.svelte b/packages/svelte/tests/parser-modern/samples/script-style-no-markup/input.svelte
new file mode 100644
index 000000000000..c4dc4d5271af
--- /dev/null
+++ b/packages/svelte/tests/parser-modern/samples/script-style-no-markup/input.svelte
@@ -0,0 +1,6 @@
+
+
diff --git a/packages/svelte/tests/parser-modern/samples/script-style-no-markup/output.json b/packages/svelte/tests/parser-modern/samples/script-style-no-markup/output.json
new file mode 100644
index 000000000000..b5e42e92170d
--- /dev/null
+++ b/packages/svelte/tests/parser-modern/samples/script-style-no-markup/output.json
@@ -0,0 +1,112 @@
+{
+ "css": {
+ "type": "StyleSheet",
+ "start": 54,
+ "end": 91,
+ "attributes": [],
+ "children": [
+ {
+ "type": "Rule",
+ "prelude": {
+ "type": "SelectorList",
+ "start": 63,
+ "end": 66,
+ "children": [
+ {
+ "type": "ComplexSelector",
+ "start": 63,
+ "end": 66,
+ "children": [
+ {
+ "type": "RelativeSelector",
+ "combinator": null,
+ "selectors": [
+ {
+ "type": "TypeSelector",
+ "name": "div",
+ "start": 63,
+ "end": 66
+ }
+ ],
+ "start": 63,
+ "end": 66
+ }
+ ]
+ }
+ ]
+ },
+ "block": {
+ "type": "Block",
+ "start": 67,
+ "end": 82,
+ "children": [
+ {
+ "type": "Declaration",
+ "start": 69,
+ "end": 79,
+ "property": "color",
+ "value": "red"
+ }
+ ]
+ },
+ "start": 63,
+ "end": 82
+ }
+ ],
+ "content": {
+ "start": 61,
+ "end": 83,
+ "styles": "\n\tdiv { color: red; }\n",
+ "comment": null
+ }
+ },
+ "js": [],
+ "start": 0,
+ "end": 91,
+ "type": "Root",
+ "fragment": {
+ "type": "Fragment",
+ "nodes": [
+ {
+ "type": "Text",
+ "start": 53,
+ "end": 54,
+ "raw": "\n",
+ "data": "\n"
+ }
+ ]
+ },
+ "options": null,
+ "instance": {
+ "type": "Script",
+ "start": 0,
+ "end": 53,
+ "context": "default",
+ "content": {
+ "type": "Program",
+ "start": 8,
+ "end": 44,
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 3,
+ "column": 0
+ }
+ },
+ "body": [],
+ "sourceType": "module",
+ "trailingComments": [
+ {
+ "type": "Line",
+ "value": " script and style but no markup",
+ "start": 10,
+ "end": 43
+ }
+ ]
+ },
+ "attributes": []
+ }
+}
diff --git a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json
index 33dd78879cff..9563f410ed91 100644
--- a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json
+++ b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json
@@ -77,7 +77,7 @@
},
"js": [],
"start": 0,
- "end": 35,
+ "end": 205,
"type": "Root",
"fragment": {
"type": "Fragment",
diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json
index acf484d8ae16..d465af36ce76 100644
--- a/packages/svelte/tests/parser-modern/samples/snippets/output.json
+++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json
@@ -1,7 +1,7 @@
{
"css": null,
"js": [],
- "start": 29,
+ "start": 0,
"end": 101,
"type": "Root",
"fragment": {
diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json
index 9c515ad9058f..02dbb740872e 100644
--- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json
+++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json
@@ -1,7 +1,7 @@
{
"css": null,
"js": [],
- "start": 54,
+ "start": 0,
"end": 173,
"type": "Root",
"fragment": {