Skip to main content

sqry_lang_svelte/
lib.rs

1pub mod relations;
2
3pub use relations::SvelteGraphBuilder;
4
5use sqry_core::ast::Scope;
6use sqry_core::plugin::{
7    LanguageMetadata, LanguagePlugin, SafeParser,
8    error::{ParseError, ScopeError},
9};
10use std::path::Path;
11use tree_sitter::Tree;
12
13/// Svelte language plugin.
14pub struct SveltePlugin {
15    graph_builder: SvelteGraphBuilder,
16}
17
18impl SveltePlugin {
19    /// Creates a new Svelte plugin instance.
20    #[must_use]
21    pub fn new() -> Self {
22        Self {
23            graph_builder: SvelteGraphBuilder::default(),
24        }
25    }
26}
27
28impl Default for SveltePlugin {
29    fn default() -> Self {
30        Self::new()
31    }
32}
33
34impl LanguagePlugin for SveltePlugin {
35    fn metadata(&self) -> LanguageMetadata {
36        LanguageMetadata {
37            id: "svelte",
38            name: "Svelte",
39            version: env!("CARGO_PKG_VERSION"),
40            author: "Verivus Pty Ltd",
41            description: "Svelte.js Single-File Component support for sqry",
42            tree_sitter_version: "0.25",
43        }
44    }
45
46    fn extensions(&self) -> &'static [&'static str] {
47        &["svelte"]
48    }
49
50    fn language(&self) -> tree_sitter::Language {
51        tree_sitter_svelte_sqry::language()
52    }
53
54    fn parse_ast(&self, content: &[u8]) -> Result<Tree, ParseError> {
55        let parser = SafeParser::with_defaults();
56        parser.parse(&self.language(), content, None)
57    }
58
59    fn extract_scopes(
60        &self,
61        _tree: &Tree,
62        _content: &[u8],
63        _file_path: &Path,
64    ) -> Result<Vec<Scope>, ScopeError> {
65        Ok(Vec::new())
66    }
67
68    fn graph_builder(&self) -> Option<&dyn sqry_core::graph::GraphBuilder> {
69        Some(&self.graph_builder)
70    }
71}
72
73#[cfg(test)]
74mod tests {
75    use super::*;
76
77    #[test]
78    fn test_plugin_metadata() {
79        let plugin = SveltePlugin::default();
80        let metadata = plugin.metadata();
81        assert_eq!(metadata.id, "svelte");
82        assert_eq!(metadata.name, "Svelte");
83    }
84
85    #[test]
86    fn test_extensions() {
87        let plugin = SveltePlugin::default();
88        assert_eq!(plugin.extensions(), &["svelte"]);
89    }
90
91    #[test]
92    fn test_can_parse() {
93        let plugin = SveltePlugin::default();
94        let content = b"<template><div>Hello</div></template>";
95        let tree = plugin.parse_ast(content);
96        assert!(tree.is_ok());
97    }
98}