Expand description
Β§Oak TypeScript Parser
High-performance incremental TypeScript parser for the oak ecosystem with flexible configuration, optimized for modern JavaScript development.
Β§π― Overview
Oak TypeScript is a robust parser for TypeScript, designed to handle complete TypeScript syntax including modern features. Built on the solid foundation of oak-core, it provides both high-level convenience and detailed AST generation for TypeScript analysis and tooling.
Β§β¨ Features
- Complete TypeScript Syntax: Supports all TypeScript features including modern specifications
- Full AST Generation: Generates comprehensive Abstract Syntax Trees
- Lexer Support: Built-in tokenization with proper span information
- Error Recovery: Graceful handling of syntax errors with detailed diagnostics
Β§π Quick Start
Basic example:
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_typescript::{TypeScriptParser, TypeScriptLanguage};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = TypeScriptLanguage::standard();
let mut session = ParseSession::<TypeScriptLanguage>::default();
let parser = TypeScriptParser::new(&config);
let source = SourceText::new(r#"
interface User {
id: number;
name: string;
email?: string;
}
function greet(user: User): string {
return `Hello, ${user.name}!`;
}
"#);
let result = parser.parse(&source, &[], &mut session);
println!("Parsed TypeScript code successfully.");
Ok(())
}Β§π Parsing Examples
Β§Interface Parsing
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_typescript::{TypeScriptParser, TypeScriptLanguage};
let config = TypeScriptLanguage::standard();
let mut session = ParseSession::<TypeScriptLanguage>::default();
let parser = TypeScriptParser::new(&config);
let source = SourceText::new(r#"
interface User {
id: number;
name: string;
email?: string;
roles: string[];
}
"#);
let result = parser.parse(&source, &[], &mut session);
println!("Parsed TypeScript interface successfully.");Β§Function Parsing
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_typescript::{TypeScriptParser, TypeScriptLanguage};
let config = TypeScriptLanguage::standard();
let mut session = ParseSession::<TypeScriptLanguage>::default();
let parser = TypeScriptParser::new(&config);
let source = SourceText::new(r#"
function calculateTotal(items: Item[]): number {
return items.reduce((sum, item) => sum + item.price, 0);
}
"#);
let result = parser.parse(&source, &[], &mut session);
println!("Parsed TypeScript function successfully.");Β§Class Parsing
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_typescript::{TypeScriptParser, TypeScriptLanguage};
let config = TypeScriptLanguage::standard();
let mut session = ParseSession::<TypeScriptLanguage>::default();
let parser = TypeScriptParser::new(&config);
let source = SourceText::new(r#"
class UserService {
private users: User[] = [];
constructor(private apiClient: ApiClient) {}
async getUser(id: number): Promise<User> {
return this.apiClient.get(`/users/${id}`);
}
}
"#);
let result = parser.parse(&source, &[], &mut session);
println!("Parsed TypeScript class successfully.");Β§π§ Advanced Features
Β§Token-Level Parsing
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_typescript::{TypeScriptParser, TypeScriptLanguage};
let config = TypeScriptLanguage::standard();
let mut session = ParseSession::<TypeScriptLanguage>::default();
let parser = TypeScriptParser::new(&config);
let source = SourceText::new("const x: number = 42;");
let result = parser.parse(&source, &[], &mut session);
// Token information is available in the parse resultΒ§Error Handling
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_typescript::{TypeScriptParser, TypeScriptLanguage};
let config = TypeScriptLanguage::standard();
let mut session = ParseSession::<TypeScriptLanguage>::default();
let parser = TypeScriptParser::new(&config);
let source = SourceText::new(r#"
interface User {
name: string
age: number;
}
"#);
let result = parser.parse(&source, &[], &mut session);
if let Some(errors) = result.result.err() {
println!("Parse error: {:?}", errors);
}Β§ποΈ AST Structure
The parser generates a comprehensive AST with the following main structures:
- SourceFile: Root container for TypeScript source files
- InterfaceDeclaration: TypeScript interface definitions
- ClassDeclaration: TypeScript class definitions
- FunctionDeclaration: Function and method definitions
- VariableStatement: Variable declarations
- Expression: Various expression types
- TypeAnnotation: Type annotations and type references
Β§π Performance
- Streaming: Parse large TypeScript files without loading entirely into memory
- Incremental: Re-parse only changed sections
- Memory Efficient: Smart AST node allocation
- Fast Recovery: Quick error recovery for better IDE integration
Β§π Integration
Oak of typescript integrates seamlessly with:
- Web Development: Build TypeScript development tools and analyzers
- IDE Support: Language server protocol compatibility for TypeScript
- Build Tools: Integrate with bundlers and build pipelines
- Code Analysis: Analyze and understand TypeScript codebases
- Documentation Tools: Extract documentation from TypeScript source code
Β§π Examples
Check out the examples directory for comprehensive examples:
- Complete TypeScript source file parsing
- Interface and class analysis
- Type extraction and validation
- Integration with development workflows
Β§π€ Contributing
Contributions are welcome!
Please feel free to submit pull requests at the project repository or open issues.
Re-exportsΒ§
pub use crate::ast::TypeScriptRoot;pub use crate::highlighter::TypeScriptHighlighter;pub use crate::language::TypeScriptLanguage;pub use crate::lexer::TypeScriptLexer;pub use crate::lsp::TypeScriptLanguageService;pub use crate::parser::TypeScriptParser;pub use crate::mcp::serve_typescript_mcp;pub use crate::mcp::serve_typescript_mcp_axum;
ModulesΒ§
StructsΒ§
- Type
Script Builder - TypeScript θ―θ¨η AST ζε»Ίε¨
- Type
Script Formatter - TypeScript θ―θ¨ηζ ΌεΌεε¨