diff --git a/crates/oxc_linter/src/loader/partial_loader/svelte.rs b/crates/oxc_linter/src/loader/partial_loader/svelte.rs index 32375f7cf9c7f..a821a46099ea6 100644 --- a/crates/oxc_linter/src/loader/partial_loader/svelte.rs +++ b/crates/oxc_linter/src/loader/partial_loader/svelte.rs @@ -16,32 +16,46 @@ impl<'a> SveltePartialLoader<'a> { } pub fn parse(self) -> Vec> { - self.parse_script().map_or_else(Vec::new, |source| vec![source]) + self.parse_scripts() } - fn parse_script(&self) -> Option> { + /// Each *.svelte file can contain at most + /// * one `" - let offset = script_end_finder.find(&self.source_text.as_bytes()[pointer..])?; - let js_end = pointer + offset; + let offset = script_end_finder.find(&self.source_text.as_bytes()[*pointer..])?; + let js_end = *pointer + offset; + *pointer += offset + SCRIPT_END.len(); let source_text = &self.source_text[js_start..js_end]; let source_type = SourceType::mjs().with_typescript(is_ts); @@ -86,4 +100,25 @@ mod test { let result = parse_svelte(source_text); assert_eq!(result.source_text.trim(), r#"console.log("hi");"#); } + + #[test] + fn test_parse_svelte_with_module_script() { + let source_text = r#" + + +

Hello World

+ "#; + + let sources = SveltePartialLoader::new(source_text).parse(); + assert_eq!(sources.len(), 2); + assert_eq!( + sources[0].source_text.trim(), + "export async function load() { /* some loading logic */ }" + ); + assert_eq!(sources[1].source_text.trim(), r#"console.log("hi");"#); + } }