packlet 0.1.1

A high-performance tool that bundles local code dependencies into a single markdown file by following import statements from an entry point
Documentation
mod parser;
mod resolver;
mod tsconfig_parser;

use crate::core::language::{AnalysisContext, ImportStatement, LanguageAdapter, ResolvedImport};
use anyhow::Result;
use async_trait::async_trait;
use parser::JsParser;
use resolver::JsResolver;
use std::path::Path;

#[derive(Clone)]
pub struct JsAdapter {
    parser: JsParser,
    resolver: JsResolver,
}

impl JsAdapter {
    pub fn new() -> Self {
        Self {
            parser: JsParser::new(),
            resolver: JsResolver::new(),
        }
    }
}

#[async_trait]
impl LanguageAdapter for JsAdapter {
    fn name(&self) -> &str {
        "JavaScript/TypeScript"
    }

    fn supported_extensions(&self) -> &[&str] {
        &[
            "js", "mjs", "cjs", "ts", "tsx", "jsx", "d.ts", "vue", "svelte",
        ]
    }

    async fn parse_imports(
        &self,
        file_path: &Path,
        content: &str,
        _context: &AnalysisContext,
    ) -> Result<Vec<ImportStatement>> {
        let file_path = file_path.to_path_buf();
        let content = content.to_string();
        let parser = self.parser;

        tokio::task::spawn_blocking(move || parser.parse(&file_path, &content)).await?
    }

    async fn resolve_import(
        &self,
        import: &ImportStatement,
        from_file: &Path,
        context: &AnalysisContext,
    ) -> Result<Option<ResolvedImport>> {
        self.resolver
            .resolve(&import.specifier, from_file, &*context.fs)
            .await
    }
}