33import shutil
44from pathlib import Path
55import tempfile
6+ import os
67
78import smoketests
89from .. import Smoketest , STDB_DIR , run_cmd , TEMPLATE_CARGO_TOML
@@ -18,12 +19,12 @@ def _append_to_file(path: Path, content: str):
1819 f .write (content )
1920
2021
21- def _parse_quickstart (doc_path : Path , language : str ) -> str :
22+ def _parse_quickstart (doc_path : Path , language : str , extra_langs : list [ str ] = None ) -> str :
2223 """Extract code blocks from `quickstart.md` docs.
2324 This will replicate the steps in the quickstart guide, so if it fails the quickstart guide is broken.
2425 """
2526 content = Path (doc_path ).read_text ()
26- blocks = re .findall (rf"```{ language } \n(.*?)\n```" , content , re .DOTALL )
27+ blocks = re .findall (rf"```(?: { '|' . join ([ language , * extra_langs ]) } ) \n(.*?)\n```" , content , re .DOTALL )
2728
2829 end = ""
2930 if language == "csharp" :
@@ -60,6 +61,8 @@ class BaseQuickstart(Smoketest):
6061 MODULE_CODE = ""
6162
6263 lang = None
64+ client_lang = None
65+ codeblock_lang = ()
6366 server_doc = None
6467 client_doc = None
6568 server_file = None
@@ -92,7 +95,7 @@ def generate_server(self, server_path: Path):
9295 self .spacetime ("init" , "--lang" , self .lang , server_path , capture_stderr = True )
9396 shutil .copy2 (STDB_DIR / "rust-toolchain.toml" , server_path )
9497 # Replay the quickstart guide steps
95- _write_file (server_path / self .server_file , _parse_quickstart (self .server_doc , self .lang ))
98+ _write_file (server_path / self .server_file , _parse_quickstart (self .server_doc , self .lang , self . codeblock_lang ))
9699 self .server_postprocess (server_path )
97100 self .spacetime ("build" , "-d" , "-p" , server_path , capture_stderr = True )
98101
@@ -115,12 +118,12 @@ def _test_quickstart(self):
115118 run_cmd (* self .build_cmd , cwd = client_path , capture_stderr = True )
116119
117120 self .spacetime (
118- "generate" , "--lang" , self .lang ,
121+ "generate" , "--lang" , self .client_lang or self . lang ,
119122 "--out-dir" , client_path / self .module_bindings ,
120123 "--project-path" , self .project_path , capture_stderr = True
121124 )
122125 # Replay the quickstart guide steps
123- main = _parse_quickstart (self .client_doc , self .lang )
126+ main = _parse_quickstart (self .client_doc , self .lang , self . codeblock_lang )
124127 for src , dst in self .replacements .items ():
125128 main = main .replace (src , dst )
126129 main += "\n " + self .extra_code
@@ -257,3 +260,32 @@ def test_quickstart(self):
257260 if not smoketests .HAVE_DOTNET :
258261 self .skipTest ("C# SDK requires .NET to be installed." )
259262 self ._test_quickstart ()
263+
264+ class TypeScript (BaseQuickstart ):
265+ lang = "typescript"
266+ client_lang = "rust"
267+ codeblock_lang = ["ts" , "tsx" , "rust" ]
268+ server_doc = STDB_DIR / "docs/docs/modules/typescript/quickstart.md"
269+ client_doc = Rust .client_doc
270+ server_file = "src/index.ts"
271+ client_file = Rust .client_file
272+ module_bindings = Rust .module_bindings
273+ run_cmd = Rust .run_cmd
274+ build_cmd = Rust .build_cmd
275+
276+ replacements = Rust .replacements
277+ extra_code = Rust .extra_code
278+ connected_str = Rust .connected_str
279+
280+ project_init = Rust .project_init
281+
282+
283+ sdk_setup = Rust .sdk_setup
284+
285+ def server_postprocess (self , server_path : Path ):
286+ spacetimedb_dep = "spacetimedb@file:" + str ((STDB_DIR / "sdks/typescript" ).absolute ())
287+ run_cmd ("pnpm" , "install" , spacetimedb_dep , cwd = server_path )
288+
289+ def test_quickstart (self ):
290+ """Run the TypeScript quickstart guides for server."""
291+ self ._test_quickstart ()
0 commit comments