diff --git a/.github/workflows/typescript-test.yml b/.github/workflows/typescript-test.yml
index e4067202112..b1270896ab5 100644
--- a/.github/workflows/typescript-test.yml
+++ b/.github/workflows/typescript-test.yml
@@ -102,16 +102,16 @@ jobs:
spacetime server clear -y
- name: Generate client bindings
- working-directory: modules/quickstart-chat
+ working-directory: templates/quickstart-chat-ts/spacetimedb
run: |
- spacetime generate --lang typescript --out-dir ../../crates/bindings-typescript/examples/quickstart-chat/src/module_bindings
- cd ../../crates/bindings-typescript
+ spacetime generate --lang typescript --out-dir ../src/module_bindings
+ cd ../../../crates/bindings-typescript
pnpm format
- name: Check for changes
- working-directory: crates/bindings-typescript
+ working-directory: templates/quickstart-chat-ts
run: |
- "${GITHUB_WORKSPACE}"/tools/check-diff.sh examples/quickstart-chat/src/module_bindings || {
+ "${GITHUB_WORKSPACE}"/tools/check-diff.sh src/module_bindings || {
echo "Error: Bindings are dirty. Please generate bindings again and commit them to this branch."
exit 1
}
@@ -122,18 +122,18 @@ jobs:
# disown
# - name: Publish module to SpacetimeDB
- # working-directory: SpacetimeDB/modules/quickstart-chat
+ # working-directory: SpacetimeDB/templates/quickstart-chat-ts/spacetimedb
# run: |
# spacetime logout && spacetime login --server-issued-login local
# spacetime publish -s local quickstart-chat -c -y
# - name: Publish module to SpacetimeDB
- # working-directory: SpacetimeDB/modules/quickstart-chat
+ # working-directory: SpacetimeDB/templates/quickstart-chat-ts/spacetimedb
# run: |
# spacetime logs quickstart-chat
- name: Check that quickstart-chat builds
- working-directory: crates/bindings-typescript/examples/quickstart-chat
+ working-directory: templates/quickstart-chat-ts
run: pnpm build
# - name: Run quickstart-chat tests
diff --git a/Cargo.toml b/Cargo.toml
index b4d0819d29a..ddb808dc64f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -40,7 +40,7 @@ members = [
"modules/keynote-benchmarks",
"modules/perf-test",
"modules/module-test",
- "modules/quickstart-chat",
+ "templates/quickstart-chat-rs/spacetimedb",
"modules/sdk-test",
"modules/sdk-test-connect-disconnect",
"modules/sdk-test-procedure",
diff --git a/crates/bindings-typescript/examples/basic-react/.gitignore b/crates/bindings-typescript/examples/basic-react/.gitignore
deleted file mode 100644
index a547bf36d8d..00000000000
--- a/crates/bindings-typescript/examples/basic-react/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/crates/bindings-typescript/examples/empty/.gitignore b/crates/bindings-typescript/examples/empty/.gitignore
deleted file mode 100644
index a547bf36d8d..00000000000
--- a/crates/bindings-typescript/examples/empty/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/crates/bindings-typescript/examples/quickstart-chat/.gitignore b/crates/bindings-typescript/examples/quickstart-chat/.gitignore
deleted file mode 100644
index a547bf36d8d..00000000000
--- a/crates/bindings-typescript/examples/quickstart-chat/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/crates/cli/build.rs b/crates/cli/build.rs
index 45b2b7da86f..d84ffff2164 100644
--- a/crates/cli/build.rs
+++ b/crates/cli/build.rs
@@ -55,16 +55,16 @@ fn get_manifest_dir() -> PathBuf {
//
// * `get_templates_json` - returns contents of the JSON file with the list of templates
// * `get_template_files` - returns a HashMap with templates contents based on the
-// templates list at crates/cli/templates/templates-list.json
+// templates list at templates/templates-list.json
// * `get_cursorrules` - returns contents of a cursorrules file
fn generate_template_files() {
let manifest_dir = get_manifest_dir();
- let manifest_path = Path::new(&manifest_dir);
- let templates_json_path = manifest_path.join("templates/templates-list.json");
+ let repo_root = get_repo_root();
+ let templates_json_path = repo_root.join("templates/templates-list.json");
let out_dir = std::env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("embedded_templates.rs");
- println!("cargo:rerun-if-changed=templates/templates-list.json");
+ println!("cargo:rerun-if-changed=../../templates/templates-list.json");
let templates_json =
fs::read_to_string(&templates_json_path).expect("Failed to read templates/templates-list.json");
@@ -76,8 +76,9 @@ fn generate_template_files() {
generated_code.push_str("use std::collections::HashMap;\n\n");
generated_code.push_str("pub fn get_templates_json() -> &'static str {\n");
- generated_code
- .push_str(" include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/templates/templates-list.json\"))\n");
+ generated_code.push_str(
+ " include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../../templates/templates-list.json\"))\n",
+ );
generated_code.push_str("}\n\n");
generated_code
@@ -92,8 +93,9 @@ fn generate_template_files() {
let server_path = PathBuf::from(server_source);
let client_path = PathBuf::from(client_source);
- let server_full_path = Path::new(&manifest_dir).join(&server_path);
- let client_full_path = Path::new(&manifest_dir).join(&client_path);
+ let templates_dir = repo_root.join("templates");
+ let server_full_path = templates_dir.join(&server_path);
+ let client_full_path = templates_dir.join(&client_path);
if server_full_path.exists() {
generate_template_entry(&mut generated_code, &server_path, server_source, &manifest_dir);
diff --git a/crates/cli/templates/basic-c-sharp/client/.gitignore b/crates/cli/templates/basic-c-sharp/client/.gitignore
deleted file mode 100644
index 7a73d109b63..00000000000
--- a/crates/cli/templates/basic-c-sharp/client/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin/
-obj/
-module_bindings/
diff --git a/crates/cli/templates/basic-c-sharp/server/.gitignore b/crates/cli/templates/basic-c-sharp/server/.gitignore
deleted file mode 100644
index 1746e3269ed..00000000000
--- a/crates/cli/templates/basic-c-sharp/server/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-obj
diff --git a/crates/cli/templates/basic-rust/server/.cargo/config.toml b/crates/cli/templates/basic-rust/server/.cargo/config.toml
deleted file mode 100644
index f4e8c002fc2..00000000000
--- a/crates/cli/templates/basic-rust/server/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-unknown-unknown"
diff --git a/crates/cli/templates/basic-rust/server/.gitignore b/crates/cli/templates/basic-rust/server/.gitignore
deleted file mode 100644
index 264a779a3f8..00000000000
--- a/crates/cli/templates/basic-rust/server/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Generated by Cargo
-# will have compiled files and executables
-debug/
-target/
-
-# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
-# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
-Cargo.lock
-
-# These are backup files generated by rustfmt
-**/*.rs.bk
-
-# MSVC Windows builds of rustc generate these, which store debugging information
-*.pdb
-
-# Spacetime ignore
-/.spacetime
diff --git a/crates/cli/templates/basic-typescript/server/.gitignore b/crates/cli/templates/basic-typescript/server/.gitignore
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/modules/quickstart-chat/.cargo/config.toml b/modules/quickstart-chat/.cargo/config.toml
deleted file mode 100644
index f4e8c002fc2..00000000000
--- a/modules/quickstart-chat/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-unknown-unknown"
diff --git a/modules/quickstart-chat/.gitignore b/modules/quickstart-chat/.gitignore
deleted file mode 100644
index 31b13f058aa..00000000000
--- a/modules/quickstart-chat/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Generated by Cargo
-# will have compiled files and executables
-debug/
-target/
-
-# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
-# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
-Cargo.lock
-
-# These are backup files generated by rustfmt
-**/*.rs.bk
-
-# MSVC Windows builds of rustc generate these, which store debugging information
-*.pdb
-
-# Spacetime ignore
-/.spacetime
\ No newline at end of file
diff --git a/modules/quickstart-chat/LICENSE b/modules/quickstart-chat/LICENSE
deleted file mode 120000
index 8540cf8a991..00000000000
--- a/modules/quickstart-chat/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-../../licenses/BSL.txt
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 773d5cebd69..ad98ec270b9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -127,111 +127,6 @@ importers:
specifier: ^3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(tsx@4.20.4)
- crates/bindings-typescript/examples/basic-react:
- dependencies:
- react:
- specifier: ^18.3.1
- version: 18.3.1
- react-dom:
- specifier: ^18.3.1
- version: 18.3.1(react@18.3.1)
- spacetimedb:
- specifier: workspace:*
- version: link:../..
- devDependencies:
- '@types/react':
- specifier: ^18.3.18
- version: 18.3.23
- '@types/react-dom':
- specifier: ^18.3.5
- version: 18.3.7(@types/react@18.3.23)
- '@vitejs/plugin-react':
- specifier: ^5.0.2
- version: 5.0.2(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4))
- typescript:
- specifier: ~5.6.2
- version: 5.6.3
- vite:
- specifier: ^7.1.5
- version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)
-
- crates/bindings-typescript/examples/empty:
- dependencies:
- spacetimedb:
- specifier: ^1.5.0
- version: 1.6.2(react@19.2.0)(undici@6.21.3)
- devDependencies:
- typescript:
- specifier: ~5.6.2
- version: 5.6.3
- vite:
- specifier: ^7.1.5
- version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)
-
- crates/bindings-typescript/examples/quickstart-chat:
- dependencies:
- react:
- specifier: ^18.3.1
- version: 18.3.1
- react-dom:
- specifier: ^18.3.1
- version: 18.3.1(react@18.3.1)
- spacetimedb:
- specifier: workspace:*
- version: link:../..
- devDependencies:
- '@eslint/js':
- specifier: ^9.17.0
- version: 9.33.0
- '@testing-library/jest-dom':
- specifier: ^6.6.3
- version: 6.7.0
- '@testing-library/react':
- specifier: ^16.2.0
- version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@testing-library/user-event':
- specifier: ^14.6.1
- version: 14.6.1(@testing-library/dom@10.4.1)
- '@types/react':
- specifier: ^18.3.18
- version: 18.3.23
- '@types/react-dom':
- specifier: ^18.3.5
- version: 18.3.7(@types/react@18.3.23)
- '@vitejs/plugin-react':
- specifier: ^5.0.2
- version: 5.0.2(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4))
- eslint:
- specifier: ^9.17.0
- version: 9.33.0(jiti@2.5.1)
- eslint-plugin-react-hooks:
- specifier: ^5.0.0
- version: 5.2.0(eslint@9.33.0(jiti@2.5.1))
- eslint-plugin-react-refresh:
- specifier: ^0.4.16
- version: 0.4.20(eslint@9.33.0(jiti@2.5.1))
- globals:
- specifier: ^15.14.0
- version: 15.15.0
- jsdom:
- specifier: ^26.0.0
- version: 26.1.0
- prettier:
- specifier: ^3.3.3
- version: 3.6.2
- typescript:
- specifier: ~5.6.2
- version: 5.6.3
- typescript-eslint:
- specifier: ^8.18.2
- version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.6.3)
- vite:
- specifier: ^7.1.5
- version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)
- vitest:
- specifier: 3.2.4
- version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(tsx@4.20.4)
-
crates/bindings-typescript/test-app:
dependencies:
react:
@@ -267,7 +162,7 @@ importers:
version: 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-content-docs':
specifier: 3.9.2
- version: 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ version: 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/preset-classic':
specifier: 3.9.2
version: 3.9.2(@algolia/client-search@5.39.0)(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)
@@ -345,29 +240,134 @@ importers:
specifier: workspace:^
version: link:../../crates/bindings-typescript
- modules/quickstart-chat-ts:
+ modules/sdk-test-connect-disconnect-ts:
dependencies:
spacetimedb:
specifier: workspace:^
version: link:../../crates/bindings-typescript
- modules/sdk-test-connect-disconnect-ts:
+ modules/sdk-test-procedure-ts:
dependencies:
spacetimedb:
specifier: workspace:^
version: link:../../crates/bindings-typescript
- modules/sdk-test-procedure-ts:
+ modules/sdk-test-ts:
dependencies:
spacetimedb:
specifier: workspace:^
version: link:../../crates/bindings-typescript
- modules/sdk-test-ts:
+ templates/basic-react:
dependencies:
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
spacetimedb:
- specifier: workspace:^
+ specifier: workspace:*
version: link:../../crates/bindings-typescript
+ devDependencies:
+ '@types/react':
+ specifier: ^18.3.18
+ version: 18.3.23
+ '@types/react-dom':
+ specifier: ^18.3.5
+ version: 18.3.7(@types/react@18.3.23)
+ '@vitejs/plugin-react':
+ specifier: ^5.0.2
+ version: 5.0.2(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4))
+ typescript:
+ specifier: ~5.6.2
+ version: 5.6.3
+ vite:
+ specifier: ^7.1.5
+ version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)
+
+ templates/basic-ts:
+ dependencies:
+ spacetimedb:
+ specifier: workspace:*
+ version: link:../../crates/bindings-typescript
+ devDependencies:
+ typescript:
+ specifier: ~5.6.2
+ version: 5.6.3
+ vite:
+ specifier: ^7.1.5
+ version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)
+
+ templates/quickstart-chat-ts:
+ dependencies:
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ spacetimedb:
+ specifier: workspace:*
+ version: link:../../crates/bindings-typescript
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.17.0
+ version: 9.33.0
+ '@testing-library/jest-dom':
+ specifier: ^6.6.3
+ version: 6.7.0
+ '@testing-library/react':
+ specifier: ^16.2.0
+ version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: ^14.6.1
+ version: 14.6.1(@testing-library/dom@10.4.1)
+ '@types/react':
+ specifier: ^18.3.18
+ version: 18.3.23
+ '@types/react-dom':
+ specifier: ^18.3.5
+ version: 18.3.7(@types/react@18.3.23)
+ '@vitejs/plugin-react':
+ specifier: ^5.0.2
+ version: 5.0.2(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4))
+ eslint:
+ specifier: ^9.17.0
+ version: 9.33.0(jiti@2.5.1)
+ eslint-plugin-react-hooks:
+ specifier: ^5.0.0
+ version: 5.2.0(eslint@9.33.0(jiti@2.5.1))
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.16
+ version: 0.4.20(eslint@9.33.0(jiti@2.5.1))
+ globals:
+ specifier: ^15.14.0
+ version: 15.15.0
+ jsdom:
+ specifier: ^26.0.0
+ version: 26.1.0
+ prettier:
+ specifier: ^3.3.3
+ version: 3.6.2
+ typescript:
+ specifier: ~5.6.2
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.18.2
+ version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.6.3)
+ vite:
+ specifier: ^7.1.5
+ version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)
+ vitest:
+ specifier: 3.2.4
+ version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(tsx@4.20.4)
+
+ templates/quickstart-chat-ts/spacetimedb:
+ dependencies:
+ spacetimedb:
+ specifier: workspace:^
+ version: link:../../../crates/bindings-typescript
packages:
@@ -1126,10 +1126,6 @@ packages:
'@csstools/css-parser-algorithms': ^3.0.5
'@csstools/css-tokenizer': ^3.0.4
- '@csstools/color-helpers@5.0.2':
- resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==}
- engines: {node: '>=18'}
-
'@csstools/color-helpers@5.1.0':
resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==}
engines: {node: '>=18'}
@@ -1141,13 +1137,6 @@ packages:
'@csstools/css-parser-algorithms': ^3.0.5
'@csstools/css-tokenizer': ^3.0.4
- '@csstools/css-color-parser@3.0.10':
- resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==}
- engines: {node: '>=18'}
- peerDependencies:
- '@csstools/css-parser-algorithms': ^3.0.5
- '@csstools/css-tokenizer': ^3.0.4
-
'@csstools/css-color-parser@3.1.0':
resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==}
engines: {node: '>=18'}
@@ -7963,17 +7952,6 @@ packages:
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
- spacetimedb@1.6.2:
- resolution: {integrity: sha512-XOdIgnTT1j2wZNiPdEIiv9uzhpnbqO0Rk/kOxVA9XhMMmrbtS3bXduBf1MzcaS/gJzXFK+Tf27j1HVa5SNbhLQ==}
- peerDependencies:
- react: ^18.0.0 || ^19.0.0-0 || ^19.0.0
- undici: ^6.19.2
- peerDependenciesMeta:
- react:
- optional: true
- undici:
- optional: true
-
spdy-transport@3.0.0:
resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
@@ -9144,7 +9122,7 @@ snapshots:
'@asamuzakjp/css-color@3.2.0':
dependencies:
'@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
- '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
lru-cache: 10.4.3
@@ -9946,8 +9924,6 @@ snapshots:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
- '@csstools/color-helpers@5.0.2': {}
-
'@csstools/color-helpers@5.1.0': {}
'@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
@@ -9955,13 +9931,6 @@ snapshots:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
- '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
- dependencies:
- '@csstools/color-helpers': 5.0.2
- '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
- '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
- '@csstools/css-tokenizer': 3.0.4
-
'@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
dependencies:
'@csstools/color-helpers': 5.1.0
@@ -10496,7 +10465,7 @@ snapshots:
'@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.9.2
'@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -10533,6 +10502,46 @@ snapshots:
- webpack-cli
'@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ dependencies:
+ '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/react-router-config': 5.0.11
+ combine-promises: 1.2.0
+ fs-extra: 11.3.2
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ schema-dts: 1.1.5
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ webpack: 5.102.0
+ transitivePeerDependencies:
+ - '@docusaurus/faster'
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - webpack-cli
+
+ '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.9.2
@@ -10801,7 +10810,7 @@ snapshots:
dependencies:
'@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
@@ -10849,7 +10858,7 @@ snapshots:
'@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/theme-translations': 3.9.2
@@ -10889,7 +10898,7 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -10913,12 +10922,36 @@ snapshots:
- uglify-js
- webpack-cli
+ '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.23
+ '@types/react-router-config': 5.0.11
+ clsx: 2.1.1
+ parse-numeric-range: 1.3.0
+ prism-react-renderer: 2.4.1(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - supports-color
+ - uglify-js
+ - webpack-cli
+
'@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.39.0)(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)':
dependencies:
'@docsearch/react': 4.2.0(@algolia/client-search@5.39.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)
'@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.9.2
- '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(debug@4.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@18.3.23)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/theme-translations': 3.9.2
'@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -19164,15 +19197,6 @@ snapshots:
space-separated-tokens@2.0.2: {}
- spacetimedb@1.6.2(react@19.2.0)(undici@6.21.3):
- dependencies:
- base64-js: 1.5.1
- fast-text-encoding: 1.0.6
- prettier: 3.6.2
- optionalDependencies:
- react: 19.2.0
- undici: 6.21.3
-
spdy-transport@3.0.0:
dependencies:
debug: 4.4.3
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index d8d54dce23a..18f7c2184a3 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,12 +1,12 @@
packages:
- 'crates/bindings-typescript'
- 'crates/bindings-typescript/test-app'
- - 'crates/bindings-typescript/examples/quickstart-chat'
- - 'crates/bindings-typescript/examples/basic-react'
- - 'crates/bindings-typescript/examples/empty'
+ - 'templates/quickstart-chat-ts'
+ - 'templates/basic-react'
+ - 'templates/basic-ts'
- 'modules/benchmarks-ts'
- 'modules/module-test-ts'
- - 'modules/quickstart-chat-ts'
+ - 'templates/quickstart-chat-ts/spacetimedb'
- 'modules/sdk-test-connect-disconnect-ts'
- 'modules/sdk-test-procedure-ts'
- 'modules/sdk-test-ts'
diff --git a/sdks/csharp/DEVELOP.md b/sdks/csharp/DEVELOP.md
index 4d48d4a808e..e1e79c50098 100644
--- a/sdks/csharp/DEVELOP.md
+++ b/sdks/csharp/DEVELOP.md
@@ -29,11 +29,11 @@ The SDK uses multiple layers of code generation:
The code created by `spacetime generate` imports the SpacetimeDB SDK and extends its various classes to create a SpacetimeDB client. It also imports `SpacetimeDB.BSATN.Codegen` for its serialization needs.
-See [`examples~/quickstart-chat/client/module_bindings`](./examples~/quickstart-chat/client/module_bindings/) for an example of what `spacetime generate`d code looks like.
+See [`../../templates/quickstart-chat-cs/module_bindings`](../../templates/quickstart-chat-cs/module_bindings/) for an example of what `spacetime generate`d code looks like.
If you need to debug `SpacetimeDB.BSATN.Codegen`, you can set `true` in the `` in the SDK code, which lives in [`src/SpacetimeDBClient.cs`](./src/SpacetimeDBClient.cs). This is a general pattern. Similar inheritance patterns are used for tables and indexes: the generated code defines a class that inherits most of its behavior from a class in the SDK.
diff --git a/sdks/csharp/SpacetimeDB.ClientSDK.sln b/sdks/csharp/SpacetimeDB.ClientSDK.sln
index 00993d7df3b..6a64910717f 100644
--- a/sdks/csharp/SpacetimeDB.ClientSDK.sln
+++ b/sdks/csharp/SpacetimeDB.ClientSDK.sln
@@ -7,7 +7,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpacetimeDB.ClientSDK", "Sp
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests~\tests.csproj", "{5CD31104-4719-4CE3-8D39-8BAE0B75C085}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "client", "examples~\quickstart-chat\client\client.csproj", "{FE261832-1594-DE21-C8C8-2D525680CBD7}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "client", "..\..\templates\quickstart-chat-cs\client.csproj", "{FE261832-1594-DE21-C8C8-2D525680CBD7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples~", "examples~", "{E0CADA48-79A1-4490-ACEC-698EC7D2AB43}"
EndProject
diff --git a/sdks/csharp/examples~/quickstart-chat/server/.gitignore b/sdks/csharp/examples~/quickstart-chat/server/.gitignore
deleted file mode 100644
index 1746e3269ed..00000000000
--- a/sdks/csharp/examples~/quickstart-chat/server/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-obj
diff --git a/sdks/csharp/examples~/quickstart-chat/server/global.json b/sdks/csharp/examples~/quickstart-chat/server/global.json
deleted file mode 120000
index 09dc3a51884..00000000000
--- a/sdks/csharp/examples~/quickstart-chat/server/global.json
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../global.json
\ No newline at end of file
diff --git a/sdks/csharp/tests~/tests.csproj b/sdks/csharp/tests~/tests.csproj
index 30b5ba54f57..3d02658de96 100644
--- a/sdks/csharp/tests~/tests.csproj
+++ b/sdks/csharp/tests~/tests.csproj
@@ -24,7 +24,7 @@
-
+
diff --git a/sdks/csharp/tools~/gen-quickstart.sh b/sdks/csharp/tools~/gen-quickstart.sh
index fefb84a5bd1..ececf740780 100755
--- a/sdks/csharp/tools~/gen-quickstart.sh
+++ b/sdks/csharp/tools~/gen-quickstart.sh
@@ -7,4 +7,4 @@ SDK_PATH="$(realpath "$SDK_PATH")"
STDB_PATH="$SDK_PATH/../.."
cargo build --manifest-path "$STDB_PATH/crates/standalone/Cargo.toml"
-cargo run --manifest-path "$STDB_PATH/crates/cli/Cargo.toml" -- generate -y -l csharp -o "$SDK_PATH/examples~/quickstart-chat/client/module_bindings" --project-path "$SDK_PATH/examples~/quickstart-chat/server"
+cargo run --manifest-path "$STDB_PATH/crates/cli/Cargo.toml" -- generate -y -l csharp -o "$STDB_PATH/templates/quickstart-chat-cs/module_bindings" --project-path "$STDB_PATH/templates/quickstart-chat-cs/spacetimedb"
diff --git a/sdks/rust/examples/quickstart-chat/.gitignore b/sdks/rust/examples/quickstart-chat/.gitignore
deleted file mode 100644
index 1e7caa9ea89..00000000000
--- a/sdks/rust/examples/quickstart-chat/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Cargo.lock
-target/
diff --git a/smoketests/__init__.py b/smoketests/__init__.py
index 351ca152580..8ec82358a1b 100644
--- a/smoketests/__init__.py
+++ b/smoketests/__init__.py
@@ -25,8 +25,8 @@
BASE_STDB_CONFIG_PATH = TEST_DIR / "config.toml"
# the contents of files for the base smoketest project template
-TEMPLATE_LIB_RS = open(STDB_DIR / "crates/cli/templates/basic-rust/server/src/lib.rs").read()
-TEMPLATE_CARGO_TOML = open(STDB_DIR / "crates/cli/templates/basic-rust/server/Cargo.toml").read()
+TEMPLATE_LIB_RS = open(STDB_DIR / "templates/basic-rs/spacetimedb/src/lib.rs").read()
+TEMPLATE_CARGO_TOML = open(STDB_DIR / "templates/basic-rs/spacetimedb/Cargo.toml").read()
bindings_path = (STDB_DIR / "crates/bindings").absolute()
escaped_bindings_path = str(bindings_path).replace('\\', '\\\\\\\\') # double escape for re.sub + toml
TYPESCRIPT_BINDINGS_PATH = (STDB_DIR / "crates/bindings-typescript").absolute()
diff --git a/crates/cli/templates/basic-c-sharp/client/Program.cs b/templates/basic-cs/Program.cs
similarity index 100%
rename from crates/cli/templates/basic-c-sharp/client/Program.cs
rename to templates/basic-cs/Program.cs
diff --git a/crates/cli/templates/basic-c-sharp/client/client.csproj b/templates/basic-cs/client.csproj
similarity index 100%
rename from crates/cli/templates/basic-c-sharp/client/client.csproj
rename to templates/basic-cs/client.csproj
diff --git a/crates/cli/templates/basic-c-sharp/server/Lib.cs b/templates/basic-cs/spacetimedb/Lib.cs
similarity index 100%
rename from crates/cli/templates/basic-c-sharp/server/Lib.cs
rename to templates/basic-cs/spacetimedb/Lib.cs
diff --git a/crates/cli/templates/basic-c-sharp/server/StdbModule.csproj b/templates/basic-cs/spacetimedb/StdbModule.csproj
similarity index 100%
rename from crates/cli/templates/basic-c-sharp/server/StdbModule.csproj
rename to templates/basic-cs/spacetimedb/StdbModule.csproj
diff --git a/crates/cli/templates/basic-c-sharp/server/global.json b/templates/basic-cs/spacetimedb/global.json
similarity index 100%
rename from crates/cli/templates/basic-c-sharp/server/global.json
rename to templates/basic-cs/spacetimedb/global.json
diff --git a/crates/bindings-typescript/examples/basic-react/index.html b/templates/basic-react/index.html
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/index.html
rename to templates/basic-react/index.html
diff --git a/crates/bindings-typescript/examples/basic-react/package.json b/templates/basic-react/package.json
similarity index 74%
rename from crates/bindings-typescript/examples/basic-react/package.json
rename to templates/basic-react/package.json
index 5f33ad363f1..1f4a68402ec 100644
--- a/crates/bindings-typescript/examples/basic-react/package.json
+++ b/templates/basic-react/package.json
@@ -7,7 +7,7 @@
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview",
- "generate": "pnpm --dir ../../../cli/templates/basic-typescript/server install --ignore-workspace && cargo run -p gen-bindings -- --out-dir src/module_bindings --project-path ../../../cli/templates/basic-typescript/server && prettier --write src/module_bindings",
+ "generate": "pnpm --dir spacetimedb install --ignore-workspace && cargo run -p gen-bindings -- --out-dir src/module_bindings --project-path spacetimedb && prettier --write src/module_bindings",
"spacetime:generate": "spacetime generate --lang typescript --out-dir src/module_bindings --project-path spacetimedb",
"spacetime:publish:local": "spacetime publish --project-path server --server local",
"spacetime:publish": "spacetime publish --project-path server --server maincloud"
diff --git a/crates/cli/templates/basic-typescript/server/package.json b/templates/basic-react/spacetimedb/package.json
similarity index 100%
rename from crates/cli/templates/basic-typescript/server/package.json
rename to templates/basic-react/spacetimedb/package.json
diff --git a/crates/cli/templates/basic-typescript/server/pnpm-lock.yaml b/templates/basic-react/spacetimedb/pnpm-lock.yaml
similarity index 100%
rename from crates/cli/templates/basic-typescript/server/pnpm-lock.yaml
rename to templates/basic-react/spacetimedb/pnpm-lock.yaml
diff --git a/crates/cli/templates/basic-typescript/server/src/index.ts b/templates/basic-react/spacetimedb/src/index.ts
similarity index 100%
rename from crates/cli/templates/basic-typescript/server/src/index.ts
rename to templates/basic-react/spacetimedb/src/index.ts
diff --git a/crates/cli/templates/basic-typescript/server/tsconfig.json b/templates/basic-react/spacetimedb/tsconfig.json
similarity index 100%
rename from crates/cli/templates/basic-typescript/server/tsconfig.json
rename to templates/basic-react/spacetimedb/tsconfig.json
diff --git a/crates/bindings-typescript/examples/basic-react/src/App.tsx b/templates/basic-react/src/App.tsx
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/App.tsx
rename to templates/basic-react/src/App.tsx
diff --git a/crates/bindings-typescript/examples/basic-react/src/main.tsx b/templates/basic-react/src/main.tsx
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/main.tsx
rename to templates/basic-react/src/main.tsx
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/add_reducer.ts b/templates/basic-react/src/module_bindings/add_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/add_reducer.ts
rename to templates/basic-react/src/module_bindings/add_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/add_type.ts b/templates/basic-react/src/module_bindings/add_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/add_type.ts
rename to templates/basic-react/src/module_bindings/add_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/client_connected_reducer.ts b/templates/basic-react/src/module_bindings/client_connected_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/client_connected_reducer.ts
rename to templates/basic-react/src/module_bindings/client_connected_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/client_connected_type.ts b/templates/basic-react/src/module_bindings/client_connected_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/client_connected_type.ts
rename to templates/basic-react/src/module_bindings/client_connected_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/client_disconnected_reducer.ts b/templates/basic-react/src/module_bindings/client_disconnected_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/client_disconnected_reducer.ts
rename to templates/basic-react/src/module_bindings/client_disconnected_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/client_disconnected_type.ts b/templates/basic-react/src/module_bindings/client_disconnected_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/client_disconnected_type.ts
rename to templates/basic-react/src/module_bindings/client_disconnected_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/index.ts b/templates/basic-react/src/module_bindings/index.ts
similarity index 98%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/index.ts
rename to templates/basic-react/src/module_bindings/index.ts
index 6c8ddf2c07c..afaacdde18c 100644
--- a/crates/bindings-typescript/examples/basic-react/src/module_bindings/index.ts
+++ b/templates/basic-react/src/module_bindings/index.ts
@@ -138,7 +138,7 @@ export class DbConnection extends __DbConnectionImpl {
};
/** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */
- override subscriptionBuilder = (): SubscriptionBuilder => {
+ subscriptionBuilder = (): SubscriptionBuilder => {
return new SubscriptionBuilder(this);
};
}
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/init_reducer.ts b/templates/basic-react/src/module_bindings/init_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/init_reducer.ts
rename to templates/basic-react/src/module_bindings/init_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/init_type.ts b/templates/basic-react/src/module_bindings/init_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/init_type.ts
rename to templates/basic-react/src/module_bindings/init_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/on_connect_reducer.ts b/templates/basic-react/src/module_bindings/on_connect_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/on_connect_reducer.ts
rename to templates/basic-react/src/module_bindings/on_connect_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/on_connect_type.ts b/templates/basic-react/src/module_bindings/on_connect_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/on_connect_type.ts
rename to templates/basic-react/src/module_bindings/on_connect_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/on_disconnect_reducer.ts b/templates/basic-react/src/module_bindings/on_disconnect_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/on_disconnect_reducer.ts
rename to templates/basic-react/src/module_bindings/on_disconnect_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/on_disconnect_type.ts b/templates/basic-react/src/module_bindings/on_disconnect_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/on_disconnect_type.ts
rename to templates/basic-react/src/module_bindings/on_disconnect_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/person_table.ts b/templates/basic-react/src/module_bindings/person_table.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/person_table.ts
rename to templates/basic-react/src/module_bindings/person_table.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/person_type.ts b/templates/basic-react/src/module_bindings/person_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/person_type.ts
rename to templates/basic-react/src/module_bindings/person_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/say_hello_reducer.ts b/templates/basic-react/src/module_bindings/say_hello_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/say_hello_reducer.ts
rename to templates/basic-react/src/module_bindings/say_hello_reducer.ts
diff --git a/crates/bindings-typescript/examples/basic-react/src/module_bindings/say_hello_type.ts b/templates/basic-react/src/module_bindings/say_hello_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/src/module_bindings/say_hello_type.ts
rename to templates/basic-react/src/module_bindings/say_hello_type.ts
diff --git a/crates/bindings-typescript/examples/basic-react/tsconfig.json b/templates/basic-react/tsconfig.json
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/tsconfig.json
rename to templates/basic-react/tsconfig.json
diff --git a/crates/bindings-typescript/examples/basic-react/vite.config.ts b/templates/basic-react/vite.config.ts
similarity index 100%
rename from crates/bindings-typescript/examples/basic-react/vite.config.ts
rename to templates/basic-react/vite.config.ts
diff --git a/crates/cli/templates/basic-rust/client/Cargo.toml b/templates/basic-rs/Cargo.toml
similarity index 100%
rename from crates/cli/templates/basic-rust/client/Cargo.toml
rename to templates/basic-rs/Cargo.toml
diff --git a/crates/cli/templates/basic-rust/client/README.md b/templates/basic-rs/README.md
similarity index 100%
rename from crates/cli/templates/basic-rust/client/README.md
rename to templates/basic-rs/README.md
diff --git a/crates/cli/templates/basic-rust/server/Cargo.toml b/templates/basic-rs/spacetimedb/Cargo.toml
similarity index 100%
rename from crates/cli/templates/basic-rust/server/Cargo.toml
rename to templates/basic-rs/spacetimedb/Cargo.toml
diff --git a/crates/cli/templates/basic-rust/server/src/lib.rs b/templates/basic-rs/spacetimedb/src/lib.rs
similarity index 100%
rename from crates/cli/templates/basic-rust/server/src/lib.rs
rename to templates/basic-rs/spacetimedb/src/lib.rs
diff --git a/crates/cli/templates/basic-rust/client/src/main.rs b/templates/basic-rs/src/main.rs
similarity index 100%
rename from crates/cli/templates/basic-rust/client/src/main.rs
rename to templates/basic-rs/src/main.rs
diff --git a/crates/bindings-typescript/examples/empty/index.html b/templates/basic-ts/index.html
similarity index 100%
rename from crates/bindings-typescript/examples/empty/index.html
rename to templates/basic-ts/index.html
diff --git a/crates/bindings-typescript/examples/empty/package.json b/templates/basic-ts/package.json
similarity index 82%
rename from crates/bindings-typescript/examples/empty/package.json
rename to templates/basic-ts/package.json
index daa3b650234..743818e88ad 100644
--- a/crates/bindings-typescript/examples/empty/package.json
+++ b/templates/basic-ts/package.json
@@ -7,13 +7,13 @@
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
- "generate": "cargo run -p gen-bindings -- --out-dir src/module_bindings --project-path ../../../cli/templates/basic-typescript/server && prettier --write src/module_bindings",
+ "generate": "cargo run -p gen-bindings -- --out-dir src/module_bindings --project-path spacetimedb && prettier --write src/module_bindings",
"spacetime:generate": "spacetime generate --lang typescript --out-dir src/module_bindings --project-path spacetimedb",
"spacetime:publish:local": "spacetime publish --project-path server --server local",
"spacetime:publish": "spacetime publish --project-path server --server maincloud"
},
"dependencies": {
- "spacetimedb": "^1.5.0"
+ "spacetimedb": "workspace:*"
},
"devDependencies": {
"typescript": "~5.6.2",
diff --git a/templates/basic-ts/spacetimedb/package.json b/templates/basic-ts/spacetimedb/package.json
new file mode 100644
index 00000000000..06410a60af6
--- /dev/null
+++ b/templates/basic-ts/spacetimedb/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "spacetime-module",
+ "version": "1.0.0",
+ "description": "",
+ "scripts": {
+ "build": "spacetime build",
+ "publish": "spacetime publish"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "spacetimedb": "1.*"
+ }
+}
\ No newline at end of file
diff --git a/templates/basic-ts/spacetimedb/pnpm-lock.yaml b/templates/basic-ts/spacetimedb/pnpm-lock.yaml
new file mode 100644
index 00000000000..b8b7739cda8
--- /dev/null
+++ b/templates/basic-ts/spacetimedb/pnpm-lock.yaml
@@ -0,0 +1,51 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ spacetimedb:
+ specifier: 1.*
+ version: 1.9.0
+
+packages:
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ fast-text-encoding@1.0.6:
+ resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==}
+
+ prettier@3.6.2:
+ resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ spacetimedb@1.9.0:
+ resolution: {integrity: sha512-cl/HeO50A1z6JgUZpA7pJcTspBE4IfH1SJJU8f1DpZ4hYHvQesbbYFHPPIC181s8zexdVAj5NnvFOPwQnSrcXg==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0-0 || ^19.0.0
+ undici: ^6.19.2
+ peerDependenciesMeta:
+ react:
+ optional: true
+ undici:
+ optional: true
+
+snapshots:
+
+ base64-js@1.5.1: {}
+
+ fast-text-encoding@1.0.6: {}
+
+ prettier@3.6.2: {}
+
+ spacetimedb@1.9.0:
+ dependencies:
+ base64-js: 1.5.1
+ fast-text-encoding: 1.0.6
+ prettier: 3.6.2
diff --git a/templates/basic-ts/spacetimedb/src/index.ts b/templates/basic-ts/spacetimedb/src/index.ts
new file mode 100644
index 00000000000..5ee50cb263b
--- /dev/null
+++ b/templates/basic-ts/spacetimedb/src/index.ts
@@ -0,0 +1,33 @@
+import { schema, table, t } from 'spacetimedb/server';
+
+export const spacetimedb = schema(
+ table(
+ { name: 'person' },
+ {
+ name: t.string(),
+ }
+ )
+);
+
+spacetimedb.init((_ctx) => {
+ // Called when the module is initially published
+});
+
+spacetimedb.clientConnected((_ctx) => {
+ // Called every time a new client connects
+});
+
+spacetimedb.clientDisconnected((_ctx) => {
+ // Called every time a client disconnects
+});
+
+spacetimedb.reducer('add', { name: t.string() }, (ctx, { name }) => {
+ ctx.db.person.insert({ name });
+});
+
+spacetimedb.reducer('say_hello', (ctx) => {
+ for (const person of ctx.db.person.iter()) {
+ console.info(`Hello, ${person.name}!`);
+ }
+ console.info('Hello, World!');
+});
\ No newline at end of file
diff --git a/templates/basic-ts/spacetimedb/tsconfig.json b/templates/basic-ts/spacetimedb/tsconfig.json
new file mode 100644
index 00000000000..77c6124cb16
--- /dev/null
+++ b/templates/basic-ts/spacetimedb/tsconfig.json
@@ -0,0 +1,24 @@
+
+/*
+ * This tsconfig is used for TypeScript projects created with `spacetimedb init
+ * --lang typescript`. You can modify it as needed for your project, although
+ * some options are required by SpacetimeDB.
+ */
+{
+ "compilerOptions": {
+ "strict": true,
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "jsx": "react-jsx",
+
+ /* The following options are required by SpacetimeDB
+ * and should not be modified
+ */
+ "target": "ESNext",
+ "lib": ["ES2021", "dom"],
+ "module": "ESNext",
+ "isolatedModules": true,
+ "noEmit": true
+ },
+ "include": ["./**/*"]
+}
\ No newline at end of file
diff --git a/crates/bindings-typescript/examples/empty/src/main.ts b/templates/basic-ts/src/main.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/main.ts
rename to templates/basic-ts/src/main.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/add_reducer.ts b/templates/basic-ts/src/module_bindings/add_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/add_reducer.ts
rename to templates/basic-ts/src/module_bindings/add_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/add_type.ts b/templates/basic-ts/src/module_bindings/add_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/add_type.ts
rename to templates/basic-ts/src/module_bindings/add_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/client_connected_reducer.ts b/templates/basic-ts/src/module_bindings/client_connected_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/client_connected_reducer.ts
rename to templates/basic-ts/src/module_bindings/client_connected_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/client_connected_type.ts b/templates/basic-ts/src/module_bindings/client_connected_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/client_connected_type.ts
rename to templates/basic-ts/src/module_bindings/client_connected_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/client_disconnected_reducer.ts b/templates/basic-ts/src/module_bindings/client_disconnected_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/client_disconnected_reducer.ts
rename to templates/basic-ts/src/module_bindings/client_disconnected_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/client_disconnected_type.ts b/templates/basic-ts/src/module_bindings/client_disconnected_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/client_disconnected_type.ts
rename to templates/basic-ts/src/module_bindings/client_disconnected_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/index.ts b/templates/basic-ts/src/module_bindings/index.ts
similarity index 96%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/index.ts
rename to templates/basic-ts/src/module_bindings/index.ts
index 11f16431785..afaacdde18c 100644
--- a/crates/bindings-typescript/examples/empty/src/module_bindings/index.ts
+++ b/templates/basic-ts/src/module_bindings/index.ts
@@ -1,7 +1,7 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
-// This was generated using spacetimedb cli version 1.11.0 (commit 93c0015f51af4afaf9489b92191d6e6d838af8a9).
+// This was generated using spacetimedb cli version 1.9.0 (commit a4bb137e53d55517e0b3f031be6a7453f7ba2b1e).
/* eslint-disable */
/* tslint:disable */
@@ -84,7 +84,7 @@ const proceduresSchema = __procedures();
/** The remote SpacetimeDB module schema, both runtime and type information. */
const REMOTE_MODULE = {
versionInfo: {
- cliVersion: '1.11.0' as const,
+ cliVersion: '1.9.0' as const,
},
tables: tablesSchema.schemaType.tables,
reducers: reducersSchema.reducersType.reducers,
@@ -138,7 +138,7 @@ export class DbConnection extends __DbConnectionImpl {
};
/** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */
- override subscriptionBuilder = (): SubscriptionBuilder => {
+ subscriptionBuilder = (): SubscriptionBuilder => {
return new SubscriptionBuilder(this);
};
}
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/init_reducer.ts b/templates/basic-ts/src/module_bindings/init_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/init_reducer.ts
rename to templates/basic-ts/src/module_bindings/init_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/init_type.ts b/templates/basic-ts/src/module_bindings/init_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/init_type.ts
rename to templates/basic-ts/src/module_bindings/init_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/on_connect_reducer.ts b/templates/basic-ts/src/module_bindings/on_connect_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/on_connect_reducer.ts
rename to templates/basic-ts/src/module_bindings/on_connect_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/on_connect_type.ts b/templates/basic-ts/src/module_bindings/on_connect_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/on_connect_type.ts
rename to templates/basic-ts/src/module_bindings/on_connect_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/on_disconnect_reducer.ts b/templates/basic-ts/src/module_bindings/on_disconnect_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/on_disconnect_reducer.ts
rename to templates/basic-ts/src/module_bindings/on_disconnect_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/on_disconnect_type.ts b/templates/basic-ts/src/module_bindings/on_disconnect_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/on_disconnect_type.ts
rename to templates/basic-ts/src/module_bindings/on_disconnect_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/person_table.ts b/templates/basic-ts/src/module_bindings/person_table.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/person_table.ts
rename to templates/basic-ts/src/module_bindings/person_table.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/person_type.ts b/templates/basic-ts/src/module_bindings/person_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/person_type.ts
rename to templates/basic-ts/src/module_bindings/person_type.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/say_hello_reducer.ts b/templates/basic-ts/src/module_bindings/say_hello_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/say_hello_reducer.ts
rename to templates/basic-ts/src/module_bindings/say_hello_reducer.ts
diff --git a/crates/bindings-typescript/examples/empty/src/module_bindings/say_hello_type.ts b/templates/basic-ts/src/module_bindings/say_hello_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/src/module_bindings/say_hello_type.ts
rename to templates/basic-ts/src/module_bindings/say_hello_type.ts
diff --git a/crates/bindings-typescript/examples/empty/tsconfig.json b/templates/basic-ts/tsconfig.json
similarity index 100%
rename from crates/bindings-typescript/examples/empty/tsconfig.json
rename to templates/basic-ts/tsconfig.json
diff --git a/crates/bindings-typescript/examples/empty/vite.config.ts b/templates/basic-ts/vite.config.ts
similarity index 100%
rename from crates/bindings-typescript/examples/empty/vite.config.ts
rename to templates/basic-ts/vite.config.ts
diff --git a/sdks/csharp/examples~/quickstart-chat/client/Program.cs b/templates/quickstart-chat-cs/Program.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/Program.cs
rename to templates/quickstart-chat-cs/Program.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/README.md b/templates/quickstart-chat-cs/README.md
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/README.md
rename to templates/quickstart-chat-cs/README.md
diff --git a/sdks/csharp/examples~/quickstart-chat/client/client.csproj b/templates/quickstart-chat-cs/client.csproj
similarity index 85%
rename from sdks/csharp/examples~/quickstart-chat/client/client.csproj
rename to templates/quickstart-chat-cs/client.csproj
index 3e8e9ee8e12..0b2810efaf5 100644
--- a/sdks/csharp/examples~/quickstart-chat/client/client.csproj
+++ b/templates/quickstart-chat-cs/client.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/ClientConnected.g.cs b/templates/quickstart-chat-cs/module_bindings/Reducers/ClientConnected.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/ClientConnected.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Reducers/ClientConnected.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/ClientDisconnected.g.cs b/templates/quickstart-chat-cs/module_bindings/Reducers/ClientDisconnected.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/ClientDisconnected.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Reducers/ClientDisconnected.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/SendMessage.g.cs b/templates/quickstart-chat-cs/module_bindings/Reducers/SendMessage.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/SendMessage.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Reducers/SendMessage.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/SetName.g.cs b/templates/quickstart-chat-cs/module_bindings/Reducers/SetName.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Reducers/SetName.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Reducers/SetName.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/SpacetimeDBClient.g.cs b/templates/quickstart-chat-cs/module_bindings/SpacetimeDBClient.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/SpacetimeDBClient.g.cs
rename to templates/quickstart-chat-cs/module_bindings/SpacetimeDBClient.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Tables/Message.g.cs b/templates/quickstart-chat-cs/module_bindings/Tables/Message.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Tables/Message.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Tables/Message.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Tables/User.g.cs b/templates/quickstart-chat-cs/module_bindings/Tables/User.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Tables/User.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Tables/User.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Types/Message.g.cs b/templates/quickstart-chat-cs/module_bindings/Types/Message.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Types/Message.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Types/Message.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/client/module_bindings/Types/User.g.cs b/templates/quickstart-chat-cs/module_bindings/Types/User.g.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/client/module_bindings/Types/User.g.cs
rename to templates/quickstart-chat-cs/module_bindings/Types/User.g.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/server/Lib.cs b/templates/quickstart-chat-cs/spacetimedb/Lib.cs
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/server/Lib.cs
rename to templates/quickstart-chat-cs/spacetimedb/Lib.cs
diff --git a/sdks/csharp/examples~/quickstart-chat/server/StdbModule.csproj b/templates/quickstart-chat-cs/spacetimedb/StdbModule.csproj
similarity index 100%
rename from sdks/csharp/examples~/quickstart-chat/server/StdbModule.csproj
rename to templates/quickstart-chat-cs/spacetimedb/StdbModule.csproj
diff --git a/templates/quickstart-chat-cs/spacetimedb/global.json b/templates/quickstart-chat-cs/spacetimedb/global.json
new file mode 100644
index 00000000000..c19a2e057c7
--- /dev/null
+++ b/templates/quickstart-chat-cs/spacetimedb/global.json
@@ -0,0 +1,6 @@
+{
+ "sdk": {
+ "version": "8.0.100",
+ "rollForward": "latestMinor"
+ }
+}
diff --git a/sdks/rust/examples/quickstart-chat/Cargo.toml b/templates/quickstart-chat-rs/Cargo.toml
similarity index 71%
rename from sdks/rust/examples/quickstart-chat/Cargo.toml
rename to templates/quickstart-chat-rs/Cargo.toml
index f504f38e058..af92400907a 100644
--- a/sdks/rust/examples/quickstart-chat/Cargo.toml
+++ b/templates/quickstart-chat-rs/Cargo.toml
@@ -7,4 +7,4 @@ edition = "2024"
exclude = ["spacetimedb"]
[dependencies]
-spacetimedb-sdk = { path = "../../../../sdks/rust" }
+spacetimedb-sdk = { path = "../../sdks/rust" }
diff --git a/sdks/rust/examples/quickstart-chat/README.md b/templates/quickstart-chat-rs/README.md
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/README.md
rename to templates/quickstart-chat-rs/README.md
diff --git a/modules/quickstart-chat/Cargo.toml b/templates/quickstart-chat-rs/spacetimedb/Cargo.toml
similarity index 70%
rename from modules/quickstart-chat/Cargo.toml
rename to templates/quickstart-chat-rs/spacetimedb/Cargo.toml
index a8f02a9a98b..3c1f893369a 100644
--- a/modules/quickstart-chat/Cargo.toml
+++ b/templates/quickstart-chat-rs/spacetimedb/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "quickstart-chat-module"
version = "0.1.0"
-edition.workspace = true
+edition = "2021"
license-file = "LICENSE"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -10,5 +10,5 @@ license-file = "LICENSE"
crate-type = ["cdylib"]
[dependencies]
-spacetimedb = { path = "../../crates/bindings" }
-log.workspace = true
+spacetimedb = { path = "../../../crates/bindings" }
+log = "0.4"
diff --git a/templates/quickstart-chat-rs/spacetimedb/LICENSE b/templates/quickstart-chat-rs/spacetimedb/LICENSE
new file mode 100644
index 00000000000..04b51fd16db
--- /dev/null
+++ b/templates/quickstart-chat-rs/spacetimedb/LICENSE
@@ -0,0 +1,731 @@
+SPACETIMEDB BUSINESS SOURCE LICENSE AGREEMENT
+
+Business Source License 1.1
+
+Parameters
+
+Licensor: Clockwork Laboratories, Inc.
+Licensed Work: SpacetimeDB 1.11.0
+ The Licensed Work is
+ (c) 2023 Clockwork Laboratories, Inc.
+
+Additional Use Grant: You may make use of the Licensed Work provided your
+ application or service uses the Licensed Work with no
+ more than one SpacetimeDB instance in production and
+ provided that you do not use the Licensed Work for a
+ Database Service.
+
+ A “Database Service” is a commercial offering that
+ allows third parties (other than your employees and
+ contractors) to access the functionality of the
+ Licensed Work by creating tables whose schemas are
+ controlled by such third parties.
+
+Change Date: 2030-12-02
+
+Change License: GNU Affero General Public License v3.0 with a linking
+ exception
+
+For information about alternative licensing arrangements for the Software,
+please visit: https://spacetimedb.com
+
+Notice
+
+The Business Source License (this document, or the “License”) is not an Open
+Source license. However, the Licensed Work will eventually be made available
+under an Open Source License, as stated in this License.
+
+License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
+“Business Source License” is a trademark of MariaDB Corporation Ab.
+
+-----------------------------------------------------------------------------
+
+Business Source License 1.1
+
+Terms
+
+The Licensor hereby grants you the right to copy, modify, create derivative
+works, redistribute, and make non-production use of the Licensed Work. The
+Licensor may make an Additional Use Grant, above, permitting limited
+production use.
+
+Effective on the Change Date, or the fourth anniversary of the first publicly
+available distribution of a specific version of the Licensed Work under this
+License, whichever comes first, the Licensor hereby grants you rights under
+the terms of the Change License, and the rights granted in the paragraph
+above terminate.
+
+If your use of the Licensed Work does not comply with the requirements
+currently in effect as described in this License, you must purchase a
+commercial license from the Licensor, its affiliated entities, or authorized
+resellers, or you must refrain from using the Licensed Work.
+
+All copies of the original and modified Licensed Work, and derivative works
+of the Licensed Work, are subject to this License. This License applies
+separately for each version of the Licensed Work and the Change Date may vary
+for each version of the Licensed Work released by Licensor.
+
+You must conspicuously display this License on each original or modified copy
+of the Licensed Work. If you receive the Licensed Work in original or
+modified form from a third party, the terms and conditions set forth in this
+License apply to your use of that work.
+
+Any use of the Licensed Work in violation of this License will automatically
+terminate your rights under this License for the current and all other
+versions of the Licensed Work.
+
+This License does not grant you any right in any trademark or logo of
+Licensor or its affiliates (provided that you may use a trademark or logo of
+Licensor as expressly required by this License).
+
+TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
+AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
+EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
+TITLE.
+
+MariaDB hereby grants you permission to use this License’s text to license
+your works, and to refer to it using the trademark “Business Source License”,
+as long as you comply with the Covenants of Licensor below.
+
+Covenants of Licensor
+
+In consideration of the right to use this License’s text and the “Business
+Source License” name and trademark, Licensor covenants to MariaDB, and to all
+other recipients of the licensed work to be provided by Licensor:
+
+1. To specify as the Change License the GPL Version 2.0 or any later version,
+ or a license that is compatible with GPL Version 2.0 or a later version,
+ where “compatible” means that software provided under the Change License can
+ be included in a program with software provided under GPL Version 2.0 or a
+ later version. Licensor may specify additional Change Licenses without
+ limitation.
+
+2. To either: (a) specify an additional grant of rights to use that does not
+ impose any additional restriction on the right granted in this License, as
+ the Additional Use Grant; or (b) insert the text “None”.
+
+3. To specify a Change Date.
+
+4. Not to modify this License in any other way.
+
+-----------------------------------------------------------------------------
+
+Copyright (C) 2023 Clockwork Laboratories, Inc.
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU Affero General Public License, version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program; if not, see .
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this Program, or any covered work, by linking or combining it
+with SpacetimeDB (or a modified version of that library), containing parts
+covered by the terms of the AGPL v3.0, the licensors of this Program grant
+you additional permission to convey the resulting work.
+
+Additional permission under GNU AGPL version 3 section 13
+
+If you modify this Program, or any covered work, by linking or combining it
+with SpacetimeDB (or a modified version of that library), containing parts
+covered by the terms of the AGPL v3.0, the licensors of this Program grant
+you additional permission that, notwithstanding any other provision of this
+License, you need not prominently offer all users interacting with your
+modified version remotely through a computer network an opportunity to
+receive the Corresponding Source of your version from a network server at no
+charge, if your version supports such interaction. This permission does not
+waive or modify any other obligations or terms of the AGPL v3.0, except for
+the specific requirement set forth in section 13.
+
+A copy of the AGPL v3.0 license is reproduced below.
+
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+Copyright © 2007 Free Software Foundation, Inc.
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+The licenses for most software and other practical works are designed to take
+away your freedom to share and change the works. By contrast, our General
+Public Licenses are intended to guarantee your freedom to share and change
+all versions of a program--to make sure it remains free software for all its
+users.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom
+to distribute copies of free software (and charge for them if you wish), that
+you receive source code or can get it if you want it, that you can change the
+software or use pieces of it in new free programs, and that you know you can
+do these things.
+
+Developers that use our General Public Licenses protect your rights with two
+steps: (1) assert copyright on the software, and (2) offer you this License
+which gives you legal permission to copy, distribute and/or modify the
+software.
+
+A secondary benefit of defending all users' freedom is that improvements made
+in alternate versions of the program, if they receive widespread use, become
+available for other developers to incorporate. Many developers of free
+software are heartened and encouraged by the resulting cooperation. However,
+in the case of software used on network servers, this result may fail to come
+about. The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its source
+code to the public.
+
+The GNU Affero General Public License is designed specifically to ensure
+that, in such cases, the modified source code becomes available to the
+community. It requires the operator of a network server to provide the source
+code of the modified version running there to the users of that server.
+Therefore, public use of a modified version, on a publicly accessible server,
+gives the public access to the source code of the modified version.
+
+An older license, called the Affero General Public License and published by
+Affero, was designed to accomplish similar goals. This is a different
+license, not a version of the Affero GPL, but Affero has released a new
+version of the Affero GPL which permits relicensing under this license.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS
+0. Definitions.
+"This License" refers to version 3 of the GNU Affero General Public License.
+
+"Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+"The Program" refers to any copyrightable work licensed under this License.
+Each licensee is addressed as "you". "Licensees" and "recipients" may be
+individuals or organizations.
+
+To "modify" a work means to copy from or adapt all or part of the work in a
+fashion requiring copyright permission, other than the making of an exact
+copy. The resulting work is called a "modified version" of the earlier work
+or a work "based on" the earlier work.
+
+A "covered work" means either the unmodified Program or a work based on the
+Program.
+
+To "propagate" a work means to do anything with it that, without permission,
+would make you directly or secondarily liable for infringement under
+applicable copyright law, except executing it on a computer or modifying a
+private copy. Propagation includes copying, distribution (with or without
+modification), making available to the public, and in some countries other
+activities as well.
+
+To "convey" a work means any kind of propagation that enables other parties
+to make or receive copies. Mere interaction with a user through a computer
+network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays "Appropriate Legal Notices" to the
+extent that it includes a convenient and prominently visible feature that (1)
+displays an appropriate copyright notice, and (2) tells the user that there
+is no warranty for the work (except to the extent that warranties are
+provided), that licensees may convey the work under this License, and how to
+view a copy of this License. If the interface presents a list of user
+commands or options, such as a menu, a prominent item in the list meets this
+criterion.
+
+1. Source Code.
+The "source code" for a work means the preferred form of the work for making
+modifications to it. "Object code" means any non-source form of a work.
+
+A "Standard Interface" means an interface that either is an official standard
+defined by a recognized standards body, or, in the case of interfaces
+specified for a particular programming language, one that is widely used
+among developers working in that language.
+
+The "System Libraries" of an executable work include anything, other than the
+work as a whole, that (a) is included in the normal form of packaging a Major
+Component, but which is not part of that Major Component, and (b) serves only
+to enable use of the work with that Major Component, or to implement a
+Standard Interface for which an implementation is available to the public in
+source code form. A "Major Component", in this context, means a major
+essential component (kernel, window system, and so on) of the specific
+operating system (if any) on which the executable work runs, or a compiler
+used to produce the work, or an object code interpreter used to run it.
+
+The "Corresponding Source" for a work in object code form means all the
+source code needed to generate, install, and (for an executable work) run the
+object code and to modify the work, including scripts to control those
+activities. However, it does not include the work's System Libraries, or
+general-purpose tools or generally available free programs which are used
+unmodified in performing those activities but which are not part of the work.
+For example, Corresponding Source includes interface definition files
+associated with source files for the work, and the source code for shared
+libraries and dynamically linked subprograms that the work is specifically
+designed to require, such as by intimate data communication or control flow
+between those subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can regenerate
+automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same work.
+
+2. Basic Permissions.
+All rights granted under this License are granted for the term of copyright
+on the Program, and are irrevocable provided the stated conditions are met.
+This License explicitly affirms your unlimited permission to run the
+unmodified Program. The output from running a covered work is covered by this
+License only if the output, given its content, constitutes a covered work.
+This License acknowledges your rights of fair use or other equivalent, as
+provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey, without
+conditions so long as your license otherwise remains in force. You may convey
+covered works to others for the sole purpose of having them make
+modifications exclusively for you, or provide you with facilities for running
+those works, provided that you comply with the terms of this License in
+conveying all material for which you do not control copyright. Those thus
+making or running the covered works for you must do so exclusively on your
+behalf, under your direction and control, on terms that prohibit them from
+making any copies of your copyrighted material outside their relationship
+with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10 makes it
+unnecessary.
+
+3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+No covered work shall be deemed part of an effective technological measure
+under any applicable law fulfilling obligations under article 11 of the WIPO
+copyright treaty adopted on 20 December 1996, or similar laws prohibiting or
+restricting circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention is
+effected by exercising rights under this License with respect to the covered
+work, and you disclaim any intention to limit operation or modification of
+the work as a means of enforcing, against the work's users, your or third
+parties' legal rights to forbid circumvention of technological measures.
+
+4. Conveying Verbatim Copies.
+You may convey verbatim copies of the Program's source code as you receive
+it, in any medium, provided that you conspicuously and appropriately publish
+on each copy an appropriate copyright notice; keep intact all notices stating
+that this License and any non-permissive terms added in accord with section 7
+apply to the code; keep intact all notices of the absence of any warranty;
+and give all recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and you
+may offer support or warranty protection for a fee.
+
+5. Conveying Modified Source Versions.
+You may convey a work based on the Program, or the modifications to produce
+it from the Program, in the form of source code under the terms of section 4,
+provided that you also meet all of these conditions:
+
+a) The work must carry prominent notices stating that you modified it, and
+giving a relevant date.
+b) The work must carry prominent notices stating that it is released under
+this License and any conditions added under section 7. This requirement
+modifies the requirement in section 4 to "keep intact all notices".
+c) You must license the entire work, as a whole, under this License to anyone
+who comes into possession of a copy. This License will therefore apply, along
+with any applicable section 7 additional terms, to the whole of the work, and
+all its parts, regardless of how they are packaged. This License gives no
+permission to license the work in any other way, but it does not invalidate
+such permission if you have separately received it.
+d) If the work has interactive user interfaces, each must display Appropriate
+Legal Notices; however, if the Program has interactive interfaces that do not
+display Appropriate Legal Notices, your work need not make them do so.
+A compilation of a covered work with other separate and independent works,
+which are not by their nature extensions of the covered work, and which are
+not combined with it such as to form a larger program, in or on a volume of a
+storage or distribution medium, is called an "aggregate" if the compilation
+and its resulting copyright are not used to limit the access or legal rights
+of the compilation's users beyond what the individual works permit. Inclusion
+of a covered work in an aggregate does not cause this License to apply to the
+other parts of the aggregate.
+
+6. Conveying Non-Source Forms.
+You may convey a covered work in object code form under the terms of sections
+4 and 5, provided that you also convey the machine-readable Corresponding
+Source under the terms of this License, in one of these ways:
+
+a) Convey the object code in, or embodied in, a physical product (including a
+physical distribution medium), accompanied by the Corresponding Source fixed
+on a durable physical medium customarily used for software interchange.
+b) Convey the object code in, or embodied in, a physical product (including a
+physical distribution medium), accompanied by a written offer, valid for at
+least three years and valid for as long as you offer spare parts or customer
+support for that product model, to give anyone who possesses the object code
+either (1) a copy of the Corresponding Source for all the software in the
+product that is covered by this License, on a durable physical medium
+customarily used for software interchange, for a price no more than your
+reasonable cost of physically performing this conveying of source, or (2)
+access to copy the Corresponding Source from a network server at no charge.
+c) Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source. This alternative is allowed only
+occasionally and noncommercially, and only if you received the object code
+with such an offer, in accord with subsection 6b.
+d) Convey the object code by offering access from a designated place (gratis
+or for a charge), and offer equivalent access to the Corresponding Source in
+the same way through the same place at no further charge. You need not
+require recipients to copy the Corresponding Source along with the object
+code. If the place to copy the object code is a network server, the
+Corresponding Source may be on a different server (operated by you or a third
+party) that supports equivalent copying facilities, provided you maintain
+clear directions next to the object code saying where to find the
+Corresponding Source. Regardless of what server hosts the Corresponding
+Source, you remain obligated to ensure that it is available for as long as
+needed to satisfy these requirements.
+e) Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of the work
+are being offered to the general public at no charge under subsection 6d.
+A separable portion of the object code, whose source code is excluded from
+the Corresponding Source as a System Library, need not be included in
+conveying the object code work.
+
+A "User Product" is either (1) a "consumer product", which means any tangible
+personal property which is normally used for personal, family, or household
+purposes, or (2) anything designed or sold for incorporation into a dwelling.
+In determining whether a product is a consumer product, doubtful cases shall
+be resolved in favor of coverage. For a particular product received by a
+particular user, "normally used" refers to a typical or common use of that
+class of product, regardless of the status of the particular user or of the
+way in which the particular user actually uses, or expects or is expected to
+use, the product. A product is a consumer product regardless of whether the
+product has substantial commercial, industrial or non-consumer uses, unless
+such uses represent the only significant mode of use of the product.
+
+"Installation Information" for a User Product means any methods, procedures,
+authorization keys, or other information required to install and execute
+modified versions of a covered work in that User Product from a modified
+version of its Corresponding Source. The information must suffice to ensure
+that the continued functioning of the modified object code is in no case
+prevented or interfered with solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as part of
+a transaction in which the right of possession and use of the User Product is
+transferred to the recipient in perpetuity or for a fixed term (regardless of
+how the transaction is characterized), the Corresponding Source conveyed
+under this section must be accompanied by the Installation Information. But
+this requirement does not apply if neither you nor any third party retains
+the ability to install modified object code on the User Product (for example,
+the work has been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates for
+a work that has been modified or installed by the recipient, or for the User
+Product in which it has been modified or installed. Access to a network may
+be denied when the modification itself materially and adversely affects the
+operation of the network or violates the rules and protocols for
+communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided, in
+accord with this section must be in a format that is publicly documented (and
+with an implementation available to the public in source code form), and must
+require no special password or key for unpacking, reading or copying.
+
+7. Additional Terms.
+"Additional permissions" are terms that supplement the terms of this License
+by making exceptions from one or more of its conditions. Additional
+permissions that are applicable to the entire Program shall be treated as
+though they were included in this License, to the extent that they are valid
+under applicable law. If additional permissions apply only to part of the
+Program, that part may be used separately under those permissions, but the
+entire Program remains governed by this License without regard to the
+additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove any
+additional permissions from that copy, or from any part of it. (Additional
+permissions may be written to require their own removal in certain cases when
+you modify the work.) You may place additional permissions on material, added
+by you to a covered work, for which you have or can give appropriate
+copyright permission.
+
+Notwithstanding any other provision of this License, for material you add to
+a covered work, you may (if authorized by the copyright holders of that
+material) supplement the terms of this License with terms:
+
+a) Disclaiming warranty or limiting liability differently from the terms of
+sections 15 and 16 of this License; or
+b) Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices displayed
+by works containing it; or
+c) Prohibiting misrepresentation of the origin of that material, or requiring
+that modified versions of such material be marked in reasonable ways as
+different from the original version; or
+d) Limiting the use for publicity purposes of names of licensors or authors
+of the material; or
+e) Declining to grant rights under trademark law for use of some trade names,
+trademarks, or service marks; or
+f) Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with contractual
+assumptions of liability to the recipient, for any liability that these
+contractual assumptions directly impose on those licensors and authors.
+All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is governed
+by this License along with a term that is a further restriction, you may
+remove that term. If a license document contains a further restriction but
+permits relicensing or conveying under this License, you may add to a covered
+work material governed by the terms of that license document, provided that
+the further restriction does not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must
+place, in the relevant source files, a statement of the additional terms that
+apply to those files, or a notice indicating where to find the applicable
+terms.
+
+Additional terms, permissive or non-permissive, may be stated in the form of
+a separately written license, or stated as exceptions; the above requirements
+apply either way.
+
+8. Termination.
+You may not propagate or modify a covered work except as expressly provided
+under this License. Any attempt otherwise to propagate or modify it is void,
+and will automatically terminate your rights under this License (including
+any patent licenses granted under the third paragraph of section 11).
+
+However, if you cease all violation of this License, then your license from a
+particular copyright holder is reinstated (a) provisionally, unless and until
+the copyright holder explicitly and finally terminates your license, and (b)
+permanently, if the copyright holder fails to notify you of the violation by
+some reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated
+permanently if the copyright holder notifies you of the violation by some
+reasonable means, this is the first time you have received notice of
+violation of this License (for any work) from that copyright holder, and you
+cure the violation prior to 30 days after your receipt of the notice.
+
+Termination of your rights under this section does not terminate the licenses
+of parties who have received copies or rights from you under this License. If
+your rights have been terminated and not permanently reinstated, you do not
+qualify to receive new licenses for the same material under section 10.
+
+9. Acceptance Not Required for Having Copies.
+You are not required to accept this License in order to receive or run a copy
+of the Program. Ancillary propagation of a covered work occurring solely as a
+consequence of using peer-to-peer transmission to receive a copy likewise
+does not require acceptance. However, nothing other than this License grants
+you permission to propagate or modify any covered work. These actions
+infringe copyright if you do not accept this License. Therefore, by modifying
+or propagating a covered work, you indicate your acceptance of this License
+to do so.
+
+10. Automatic Licensing of Downstream Recipients.
+Each time you convey a covered work, the recipient automatically receives a
+license from the original licensors, to run, modify and propagate that work,
+subject to this License. You are not responsible for enforcing compliance by
+third parties with this License.
+
+An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered work
+results from an entity transaction, each party to that transaction who
+receives a copy of the work also receives whatever licenses to the work the
+party's predecessor in interest had or could give under the previous
+paragraph, plus a right to possession of the Corresponding Source of the work
+from the predecessor in interest, if the predecessor has it or can get it
+with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the rights
+granted or affirmed under this License. For example, you may not impose a
+license fee, royalty, or other charge for exercise of rights granted under
+this License, and you may not initiate litigation (including a cross-claim or
+counterclaim in a lawsuit) alleging that any patent claim is infringed by
+making, using, selling, offering for sale, or importing the Program or any
+portion of it.
+
+11. Patents.
+A "contributor" is a copyright holder who authorizes use under this License
+of the Program or a work on which the Program is based. The work thus
+licensed is called the contributor's "contributor version".
+
+A contributor's "essential patent claims" are all patent claims owned or
+controlled by the contributor, whether already acquired or hereafter
+acquired, that would be infringed by some manner, permitted by this License,
+of making, using, or selling its contributor version, but do not include
+claims that would be infringed only as a consequence of further modification
+of the contributor version. For purposes of this definition, "control"
+includes the right to grant patent sublicenses in a manner consistent with
+the requirements of this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent
+license under the contributor's essential patent claims, to make, use, sell,
+offer for sale, import and otherwise run, modify and propagate the contents
+of its contributor version.
+
+In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent (such
+as an express permission to practice a patent or covenant not to sue for
+patent infringement). To "grant" such a patent license to a party means to
+make such an agreement or commitment not to enforce a patent against the
+party.
+
+If you convey a covered work, knowingly relying on a patent license, and the
+Corresponding Source of the work is not available for anyone to copy, free of
+charge and under the terms of this License, through a publicly available
+network server or other readily accessible means, then you must either (1)
+cause the Corresponding Source to be so available, or (2) arrange to deprive
+yourself of the benefit of the patent license for this particular work, or
+(3) arrange, in a manner consistent with the requirements of this License, to
+extend the patent license to downstream recipients. "Knowingly relying" means
+you have actual knowledge that, but for the patent license, your conveying
+the covered work in a country, or your recipient's use of the covered work in
+a country, would infringe one or more identifiable patents in that country
+that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or arrangement,
+you convey, or propagate by procuring conveyance of, a covered work, and
+grant a patent license to some of the parties receiving the covered work
+authorizing them to use, propagate, modify or convey a specific copy of the
+covered work, then the patent license you grant is automatically extended to
+all recipients of the covered work and works based on it.
+
+A patent license is "discriminatory" if it does not include within the scope
+of its coverage, prohibits the exercise of, or is conditioned on the
+non-exercise of one or more of the rights that are specifically granted under
+this License. You may not convey a covered work if you are a party to an
+arrangement with a third party that is in the business of distributing
+software, under which you make payment to the third party based on the extent
+of your activity of conveying the work, and under which the third party
+grants, to any of the parties who would receive the covered work from you, a
+discriminatory patent license (a) in connection with copies of the covered
+work conveyed by you (or copies made from those copies), or (b) primarily for
+and in connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any
+implied license or other defenses to infringement that may otherwise be
+available to you under applicable patent law.
+
+12. No Surrender of Others' Freedom.
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not excuse
+you from the conditions of this License. If you cannot convey a covered work
+so as to satisfy simultaneously your obligations under this License and any
+other pertinent obligations, then as a consequence you may not convey it at
+all. For example, if you agree to terms that obligate you to collect a
+royalty for further conveying from those to whom you convey the Program, the
+only way you could satisfy both those terms and this License would be to
+refrain entirely from conveying the Program.
+
+13. Remote Network Interaction; Use with the GNU General Public License.
+Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users interacting
+with it remotely through a computer network (if your version supports such
+interaction) an opportunity to receive the Corresponding Source of your
+version by providing access to the Corresponding Source from a network server
+at no charge, through some standard or customary means of facilitating
+copying of software. This Corresponding Source shall include the
+Corresponding Source for any work covered by version 3 of the GNU General
+Public License that is incorporated pursuant to the following paragraph.
+
+Notwithstanding any other provision of this License, you have permission to
+link or combine any covered work with a work licensed under version 3 of the
+GNU General Public License into a single combined work, and to convey the
+resulting work. The terms of this License will continue to apply to the part
+which is the covered work, but the work with which it is combined will remain
+governed by version 3 of the GNU General Public License.
+
+14. Revised Versions of this License.
+The Free Software Foundation may publish revised and/or new versions of the
+GNU Affero General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies that a certain numbered version of the GNU Affero General Public
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that numbered version or of any
+later version published by the Free Software Foundation. If the Program does
+not specify a version number of the GNU Affero General Public License, you
+may choose any version ever published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions of the
+GNU Affero General Public License can be used, that proxy's public statement
+of acceptance of a version permanently authorizes you to choose that version
+for the Program.
+
+Later license versions may give you additional or different permissions.
+However, no additional obligations are imposed on any author or copyright
+holder as a result of your choosing to follow a later version.
+
+15. Disclaimer of Warranty.
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+SERVICING, REPAIR OR CORRECTION.
+
+16. Limitation of Liability.
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
+OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
+DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR
+A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+17. Interpretation of Sections 15 and 16.
+If the disclaimer of warranty and limitation of liability provided above
+cannot be given local legal effect according to their terms, reviewing courts
+shall apply local law that most closely approximates an absolute waiver of
+all civil liability in connection with the Program, unless a warranty or
+assumption of liability accompanies a copy of the Program in return for a
+fee.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively state the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+SpacetimeDB: A database which replaces your server.
+Copyright (C) 2023 Clockwork Laboratories, Inc.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+Also add information on how to contact you by electronic and paper mail.
+
+If your software can interact with users remotely through a computer network,
+you should also make sure that it provides a way for users to get its source.
+For example, if your program is a web application, its interface could
+display a "Source" link that leads users to an archive of the code. There are
+many ways you could offer source, and different solutions will be better for
+different programs; see section 13 for the specific requirements.
+
+You should also get your employer (if you work as a programmer) or school, if
+any, to sign a "copyright disclaimer" for the program, if necessary. For more
+information on this, and how to apply and follow the GNU AGPL, see
+.
diff --git a/modules/quickstart-chat/README.md b/templates/quickstart-chat-rs/spacetimedb/README.md
similarity index 100%
rename from modules/quickstart-chat/README.md
rename to templates/quickstart-chat-rs/spacetimedb/README.md
diff --git a/modules/quickstart-chat/src/lib.rs b/templates/quickstart-chat-rs/spacetimedb/src/lib.rs
similarity index 100%
rename from modules/quickstart-chat/src/lib.rs
rename to templates/quickstart-chat-rs/spacetimedb/src/lib.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/main.rs b/templates/quickstart-chat-rs/src/main.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/main.rs
rename to templates/quickstart-chat-rs/src/main.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/identity_connected_reducer.rs b/templates/quickstart-chat-rs/src/module_bindings/identity_connected_reducer.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/identity_connected_reducer.rs
rename to templates/quickstart-chat-rs/src/module_bindings/identity_connected_reducer.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/identity_disconnected_reducer.rs b/templates/quickstart-chat-rs/src/module_bindings/identity_disconnected_reducer.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/identity_disconnected_reducer.rs
rename to templates/quickstart-chat-rs/src/module_bindings/identity_disconnected_reducer.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/message_table.rs b/templates/quickstart-chat-rs/src/module_bindings/message_table.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/message_table.rs
rename to templates/quickstart-chat-rs/src/module_bindings/message_table.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/message_type.rs b/templates/quickstart-chat-rs/src/module_bindings/message_type.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/message_type.rs
rename to templates/quickstart-chat-rs/src/module_bindings/message_type.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/mod.rs b/templates/quickstart-chat-rs/src/module_bindings/mod.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/mod.rs
rename to templates/quickstart-chat-rs/src/module_bindings/mod.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/send_message_reducer.rs b/templates/quickstart-chat-rs/src/module_bindings/send_message_reducer.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/send_message_reducer.rs
rename to templates/quickstart-chat-rs/src/module_bindings/send_message_reducer.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/set_name_reducer.rs b/templates/quickstart-chat-rs/src/module_bindings/set_name_reducer.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/set_name_reducer.rs
rename to templates/quickstart-chat-rs/src/module_bindings/set_name_reducer.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/user_table.rs b/templates/quickstart-chat-rs/src/module_bindings/user_table.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/user_table.rs
rename to templates/quickstart-chat-rs/src/module_bindings/user_table.rs
diff --git a/sdks/rust/examples/quickstart-chat/src/module_bindings/user_type.rs b/templates/quickstart-chat-rs/src/module_bindings/user_type.rs
similarity index 100%
rename from sdks/rust/examples/quickstart-chat/src/module_bindings/user_type.rs
rename to templates/quickstart-chat-rs/src/module_bindings/user_type.rs
diff --git a/crates/bindings-typescript/examples/quickstart-chat/CHANGELOG.md b/templates/quickstart-chat-ts/CHANGELOG.md
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/CHANGELOG.md
rename to templates/quickstart-chat-ts/CHANGELOG.md
diff --git a/crates/bindings-typescript/examples/quickstart-chat/README.md b/templates/quickstart-chat-ts/README.md
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/README.md
rename to templates/quickstart-chat-ts/README.md
diff --git a/crates/bindings-typescript/examples/quickstart-chat/index.html b/templates/quickstart-chat-ts/index.html
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/index.html
rename to templates/quickstart-chat-ts/index.html
diff --git a/crates/bindings-typescript/examples/quickstart-chat/package.json b/templates/quickstart-chat-ts/package.json
similarity index 86%
rename from crates/bindings-typescript/examples/quickstart-chat/package.json
rename to templates/quickstart-chat-ts/package.json
index 777d14106ec..3001e0c094b 100644
--- a/crates/bindings-typescript/examples/quickstart-chat/package.json
+++ b/templates/quickstart-chat-ts/package.json
@@ -6,11 +6,11 @@
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
- "format": "prettier . --write --ignore-path ../../../../.prettierignore",
- "lint": "eslint . && prettier . --check --ignore-path ../../../../.prettierignore",
+ "format": "prettier . --write --ignore-path ../../.prettierignore",
+ "lint": "eslint . && prettier . --check --ignore-path ../../.prettierignore",
"preview": "vite preview",
"test": "vitest run",
- "generate": "cargo run -p gen-bindings -- --out-dir src/module_bindings --project-path ../../../../modules/quickstart-chat && prettier --write src/module_bindings",
+ "generate": "cargo run -p gen-bindings -- --out-dir src/module_bindings --project-path spacetimedb && prettier --write src/module_bindings",
"spacetime:generate": "spacetime generate --lang typescript --out-dir src/module_bindings --project-path spacetimedb",
"spacetime:publish:local": "spacetime publish --project-path server --server local",
"spacetime:publish": "spacetime publish --project-path server --server maincloud"
diff --git a/crates/bindings-typescript/examples/quickstart-chat/public/vite.svg b/templates/quickstart-chat-ts/public/vite.svg
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/public/vite.svg
rename to templates/quickstart-chat-ts/public/vite.svg
diff --git a/modules/quickstart-chat-ts/package-lock.json b/templates/quickstart-chat-ts/spacetimedb/package-lock.json
similarity index 100%
rename from modules/quickstart-chat-ts/package-lock.json
rename to templates/quickstart-chat-ts/spacetimedb/package-lock.json
diff --git a/modules/quickstart-chat-ts/package.json b/templates/quickstart-chat-ts/spacetimedb/package.json
similarity index 100%
rename from modules/quickstart-chat-ts/package.json
rename to templates/quickstart-chat-ts/spacetimedb/package.json
diff --git a/modules/quickstart-chat-ts/src/index.ts b/templates/quickstart-chat-ts/spacetimedb/src/index.ts
similarity index 100%
rename from modules/quickstart-chat-ts/src/index.ts
rename to templates/quickstart-chat-ts/spacetimedb/src/index.ts
diff --git a/modules/quickstart-chat-ts/tsconfig.json b/templates/quickstart-chat-ts/spacetimedb/tsconfig.json
similarity index 100%
rename from modules/quickstart-chat-ts/tsconfig.json
rename to templates/quickstart-chat-ts/spacetimedb/tsconfig.json
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/.gitattributes b/templates/quickstart-chat-ts/src/.gitattributes
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/.gitattributes
rename to templates/quickstart-chat-ts/src/.gitattributes
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/App.css b/templates/quickstart-chat-ts/src/App.css
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/App.css
rename to templates/quickstart-chat-ts/src/App.css
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/App.integration.test.tsx b/templates/quickstart-chat-ts/src/App.integration.test.tsx
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/App.integration.test.tsx
rename to templates/quickstart-chat-ts/src/App.integration.test.tsx
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/App.tsx b/templates/quickstart-chat-ts/src/App.tsx
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/App.tsx
rename to templates/quickstart-chat-ts/src/App.tsx
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/assets/react.svg b/templates/quickstart-chat-ts/src/assets/react.svg
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/assets/react.svg
rename to templates/quickstart-chat-ts/src/assets/react.svg
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/index.css b/templates/quickstart-chat-ts/src/index.css
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/index.css
rename to templates/quickstart-chat-ts/src/index.css
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/main.tsx b/templates/quickstart-chat-ts/src/main.tsx
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/main.tsx
rename to templates/quickstart-chat-ts/src/main.tsx
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/identity_connected_reducer.ts b/templates/quickstart-chat-ts/src/module_bindings/identity_connected_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/identity_connected_reducer.ts
rename to templates/quickstart-chat-ts/src/module_bindings/identity_connected_reducer.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/identity_disconnected_reducer.ts b/templates/quickstart-chat-ts/src/module_bindings/identity_disconnected_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/identity_disconnected_reducer.ts
rename to templates/quickstart-chat-ts/src/module_bindings/identity_disconnected_reducer.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/index.ts b/templates/quickstart-chat-ts/src/module_bindings/index.ts
similarity index 98%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/index.ts
rename to templates/quickstart-chat-ts/src/module_bindings/index.ts
index 3c58dc8ec21..d96261a002e 100644
--- a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/index.ts
+++ b/templates/quickstart-chat-ts/src/module_bindings/index.ts
@@ -1,7 +1,7 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
-// This was generated using spacetimedb cli version 1.11.0 (commit 93c0015f51af4afaf9489b92191d6e6d838af8a9).
+// This was generated using spacetimedb cli version 1.11.0 (commit 62b00c4e1576f6915fb872c3152d3f79df6fda7d).
/* eslint-disable */
/* tslint:disable */
@@ -148,7 +148,7 @@ export class DbConnection extends __DbConnectionImpl {
};
/** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */
- override subscriptionBuilder = (): SubscriptionBuilder => {
+ subscriptionBuilder = (): SubscriptionBuilder => {
return new SubscriptionBuilder(this);
};
}
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/message_table.ts b/templates/quickstart-chat-ts/src/module_bindings/message_table.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/message_table.ts
rename to templates/quickstart-chat-ts/src/module_bindings/message_table.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/message_type.ts b/templates/quickstart-chat-ts/src/module_bindings/message_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/message_type.ts
rename to templates/quickstart-chat-ts/src/module_bindings/message_type.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/send_message_reducer.ts b/templates/quickstart-chat-ts/src/module_bindings/send_message_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/send_message_reducer.ts
rename to templates/quickstart-chat-ts/src/module_bindings/send_message_reducer.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/set_name_reducer.ts b/templates/quickstart-chat-ts/src/module_bindings/set_name_reducer.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/set_name_reducer.ts
rename to templates/quickstart-chat-ts/src/module_bindings/set_name_reducer.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/user_table.ts b/templates/quickstart-chat-ts/src/module_bindings/user_table.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/user_table.ts
rename to templates/quickstart-chat-ts/src/module_bindings/user_table.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/user_type.ts b/templates/quickstart-chat-ts/src/module_bindings/user_type.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/module_bindings/user_type.ts
rename to templates/quickstart-chat-ts/src/module_bindings/user_type.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/src/setupTests.ts b/templates/quickstart-chat-ts/src/setupTests.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/src/setupTests.ts
rename to templates/quickstart-chat-ts/src/setupTests.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/tsconfig.app.json b/templates/quickstart-chat-ts/tsconfig.app.json
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/tsconfig.app.json
rename to templates/quickstart-chat-ts/tsconfig.app.json
diff --git a/crates/bindings-typescript/examples/quickstart-chat/tsconfig.json b/templates/quickstart-chat-ts/tsconfig.json
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/tsconfig.json
rename to templates/quickstart-chat-ts/tsconfig.json
diff --git a/crates/bindings-typescript/examples/quickstart-chat/tsconfig.node.json b/templates/quickstart-chat-ts/tsconfig.node.json
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/tsconfig.node.json
rename to templates/quickstart-chat-ts/tsconfig.node.json
diff --git a/crates/bindings-typescript/examples/quickstart-chat/vite.config.ts b/templates/quickstart-chat-ts/vite.config.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/vite.config.ts
rename to templates/quickstart-chat-ts/vite.config.ts
diff --git a/crates/bindings-typescript/examples/quickstart-chat/vitest.config.ts b/templates/quickstart-chat-ts/vitest.config.ts
similarity index 100%
rename from crates/bindings-typescript/examples/quickstart-chat/vitest.config.ts
rename to templates/quickstart-chat-ts/vitest.config.ts
diff --git a/crates/cli/templates/templates-list.json b/templates/templates-list.json
similarity index 60%
rename from crates/cli/templates/templates-list.json
rename to templates/templates-list.json
index ab6602744b2..05f8c035e5c 100644
--- a/crates/cli/templates/templates-list.json
+++ b/templates/templates-list.json
@@ -6,56 +6,56 @@
{
"id": "basic-typescript",
"description": "A basic TypeScript client and server template with only stubs for code",
- "server_source": "templates/basic-typescript/server",
- "client_source": "../../crates/bindings-typescript/examples/empty",
+ "server_source": "basic-ts/spacetimedb",
+ "client_source": "basic-ts",
"server_lang": "typescript",
"client_lang": "typescript"
},
{
"id": "basic-c-sharp",
"description": "A basic C# client and server template with only stubs for code",
- "server_source": "templates/basic-c-sharp/server",
- "client_source": "templates/basic-c-sharp/client",
+ "server_source": "basic-cs/spacetimedb",
+ "client_source": "basic-cs",
"server_lang": "csharp",
"client_lang": "csharp"
},
{
"id": "basic-rust",
"description": "A basic Rust client and server template with only stubs for code",
- "server_source": "templates/basic-rust/server",
- "client_source": "templates/basic-rust/client",
+ "server_source": "basic-rs/spacetimedb",
+ "client_source": "basic-rs",
"server_lang": "rust",
"client_lang": "rust"
},
{
"id": "basic-react",
"description": "React web app with TypeScript server",
- "server_source": "templates/basic-typescript/server",
- "client_source": "../../crates/bindings-typescript/examples/basic-react",
+ "server_source": "basic-react/spacetimedb",
+ "client_source": "basic-react",
"server_lang": "typescript",
"client_lang": "typescript"
},
{
"id": "quickstart-chat-rust",
"description": "Rust server/client implementing quickstart chat",
- "server_source": "../../modules/quickstart-chat",
- "client_source": "../../sdks/rust/examples/quickstart-chat",
+ "server_source": "quickstart-chat-rs/spacetimedb",
+ "client_source": "quickstart-chat-rs",
"server_lang": "rust",
"client_lang": "rust"
},
{
"id": "quickstart-chat-c-sharp",
"description": "C# server/client implementing quickstart chat",
- "server_source": "../../sdks/csharp/examples~/quickstart-chat/server",
- "client_source": "../../sdks/csharp/examples~/quickstart-chat/client",
+ "server_source": "quickstart-chat-cs/spacetimedb",
+ "client_source": "quickstart-chat-cs",
"server_lang": "csharp",
"client_lang": "csharp"
},
{
"id": "quickstart-chat-typescript",
"description": "TypeScript server/client implementing quickstart chat",
- "server_source": "../../modules/quickstart-chat-ts",
- "client_source": "../../crates/bindings-typescript/examples/quickstart-chat",
+ "server_source": "quickstart-chat-ts/spacetimedb",
+ "client_source": "quickstart-chat-ts",
"server_lang": "typescript",
"client_lang": "typescript"
}
diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs
index e59bb81a17b..dce4fbf2b92 100644
--- a/tools/upgrade-version/src/main.rs
+++ b/tools/upgrade-version/src/main.rs
@@ -169,7 +169,7 @@ fn main() -> anyhow::Result<()> {
}
})?;
- edit_toml("crates/cli/templates/basic-rust/server/Cargo.toml", |doc| {
+ edit_toml("templates/basic-rs/spacetimedb/Cargo.toml", |doc| {
// Only set major.minor.* for the spacetimedb dependency.
// See https://github.com/clockworklabs/SpacetimeDB/issues/2724.
//
@@ -178,7 +178,7 @@ fn main() -> anyhow::Result<()> {
doc["dependencies"]["spacetimedb"] = toml_edit::value(wildcard_patch.clone());
})?;
- edit_toml("crates/cli/templates/basic-rust/client/Cargo.toml", |doc| {
+ edit_toml("templates/basic-rs/Cargo.toml", |doc| {
doc["dependencies"]["spacetimedb-sdk"] = toml_edit::value(wildcard_patch.clone());
})?;
@@ -287,7 +287,7 @@ fn main() -> anyhow::Result<()> {
// 4) Template StdbModule.csproj: SpacetimeDB.Runtime dependency -> major.minor.*
rewrite_csproj_package_ref_version(
- "crates/cli/templates/basic-c-sharp/server/StdbModule.csproj",
+ "templates/basic-cs/spacetimedb/StdbModule.csproj",
"SpacetimeDB.Runtime",
&wildcard_patch,
)?;