tsgo-wasm 0.3.0

typescript-go (tsgo) compiled to WASI p1, with an optional wasmtime runtime
use std::time::Duration;
use tsgo_wasm::TypeScript;

#[test]
fn api_session_checks_and_updates_incrementally() {
    let ts = TypeScript::new().unwrap();
    let mut session = ts
        .api_session(
            &[
                ("lib/user.ts", "export interface User { id: number }\n"),
                (
                    "main.ts",
                    "import { User } from './lib/user';\nconst u: User = { id: 'x' };\nexport default u;\n",
                ),
            ],
            Duration::from_secs(60),
        )
        .unwrap();

    let diagnostics = session.diagnostics().unwrap();
    let error = diagnostics
        .iter()
        .find(|d| d.code == 2322)
        .unwrap_or_else(|| panic!("expected TS2322, got: {diagnostics:?}"));
    assert!(error.is_error());
    assert_eq!(error.file_name.as_deref(), Some("main.ts"));
    let range = error.range.expect("range resolved from in-memory source");
    assert_eq!(range.start.line, 2, "got: {error:?}");

    session
        .update_file(
            "main.ts",
            "import { User } from './lib/user';\nconst u: User = { id: 1 };\nexport default u;\n",
        )
        .unwrap();
    let diagnostics = session.diagnostics().unwrap();
    assert!(
        diagnostics.is_empty(),
        "expected clean check, got: {diagnostics:?}"
    );

    session
        .update_file(
            "lib/user.ts",
            "export interface User { id: number; name: string }\n",
        )
        .unwrap();
    let diagnostics = session.diagnostics().unwrap();
    let missing = diagnostics
        .iter()
        .find(|d| d.code == 2741)
        .unwrap_or_else(|| panic!("expected TS2741 missing property, got: {diagnostics:?}"));
    assert!(
        missing
            .related_information
            .iter()
            .any(|r| r.file_name.as_deref() == Some("lib/user.ts")),
        "expected related info pointing at lib/user.ts, got: {missing:?}"
    );
}