From be97387252b9bc7682ae52c5d8ece485637a52c6 Mon Sep 17 00:00:00 2001 From: Max Richter Date: Mon, 19 Jan 2026 01:29:12 +0100 Subject: [PATCH 1/6] feat: trying to remove wasm-bindgen --- Cargo.lock | 367 ++++-------------- app/package.json | 3 +- app/src/lib/node-registry.ts | 2 +- app/src/lib/runtime/runtime-executor.ts | 5 +- app/src/routes/dev/+layout.svelte | 8 + app/src/routes/dev/+page.svelte | 119 +++++- app/src/routes/dev/Code.svelte | 26 ++ nodes/max/plantarium/.template/Cargo.toml | 10 - nodes/max/plantarium/.template/package.json | 2 +- nodes/max/plantarium/.template/tests/web.rs | 13 - nodes/max/plantarium/box/Cargo.toml | 16 - nodes/max/plantarium/box/package.json | 2 +- nodes/max/plantarium/box/src/lib.rs | 14 +- nodes/max/plantarium/box/tests/web.rs | 13 - nodes/max/plantarium/branch/Cargo.toml | 17 - nodes/max/plantarium/branch/package.json | 2 +- nodes/max/plantarium/branch/src/lib.rs | 13 +- nodes/max/plantarium/branch/tests/web.rs | 13 - nodes/max/plantarium/float/Cargo.toml | 15 - nodes/max/plantarium/float/package.json | 2 +- nodes/max/plantarium/float/src/lib.rs | 8 +- nodes/max/plantarium/float/tests/web.rs | 13 - nodes/max/plantarium/gravity/Cargo.toml | 19 +- nodes/max/plantarium/gravity/package.json | 2 +- nodes/max/plantarium/gravity/src/lib.rs | 12 +- nodes/max/plantarium/gravity/tests/web.rs | 13 - nodes/max/plantarium/instance/Cargo.toml | 20 +- nodes/max/plantarium/instance/package.json | 2 +- nodes/max/plantarium/instance/src/lib.rs | 16 +- nodes/max/plantarium/instance/tests/web.rs | 13 - nodes/max/plantarium/math/Cargo.toml | 11 - nodes/max/plantarium/math/package.json | 2 +- nodes/max/plantarium/math/src/lib.rs | 15 +- nodes/max/plantarium/math/tests/web.rs | 13 - nodes/max/plantarium/noise/Cargo.toml | 18 +- nodes/max/plantarium/noise/package.json | 2 +- nodes/max/plantarium/noise/src/lib.rs | 14 +- nodes/max/plantarium/noise/tests/web.rs | 13 - nodes/max/plantarium/output/Cargo.toml | 18 - nodes/max/plantarium/output/package.json | 2 +- nodes/max/plantarium/output/src/lib.rs | 12 +- nodes/max/plantarium/output/tests/web.rs | 13 - nodes/max/plantarium/random/Cargo.toml | 14 - nodes/max/plantarium/random/package.json | 2 +- nodes/max/plantarium/random/src/lib.rs | 11 +- nodes/max/plantarium/random/tests/web.rs | 13 - nodes/max/plantarium/rotate/Cargo.toml | 17 +- nodes/max/plantarium/rotate/package.json | 2 +- nodes/max/plantarium/rotate/src/lib.rs | 11 +- nodes/max/plantarium/rotate/tests/web.rs | 13 - nodes/max/plantarium/stem/Cargo.toml | 17 - nodes/max/plantarium/stem/package.json | 2 +- nodes/max/plantarium/stem/src/lib.rs | 12 +- nodes/max/plantarium/stem/tests/web.rs | 13 - nodes/max/plantarium/triangle/Cargo.toml | 18 +- nodes/max/plantarium/triangle/package.json | 2 +- nodes/max/plantarium/triangle/src/lib.rs | 16 +- nodes/max/plantarium/triangle/tests/web.rs | 13 - nodes/max/plantarium/vec3/Cargo.toml | 16 +- nodes/max/plantarium/vec3/package.json | 2 +- nodes/max/plantarium/vec3/src/lib.rs | 8 +- nodes/max/plantarium/vec3/tests/web.rs | 13 - packages/macros/Cargo.toml | 2 +- packages/macros/src/lib.rs | 164 +++++--- packages/registry/src/node-registry-client.ts | 1 - packages/types/Cargo.toml | 1 - packages/ui/src/lib/app.css | 24 ++ packages/utils/Cargo.toml | 9 +- packages/utils/src/flatTree.ts | 2 + packages/utils/src/geometry/geometry_data.rs | 2 +- packages/utils/src/geometry/instance_data.rs | 2 +- packages/utils/src/geometry/path_data.rs | 2 +- packages/utils/src/lib.rs | 26 +- packages/utils/src/wasm-wrapper.ts | 291 +++----------- pnpm-lock.yaml | 9 + 75 files changed, 513 insertions(+), 1150 deletions(-) create mode 100644 app/src/routes/dev/+layout.svelte create mode 100644 app/src/routes/dev/Code.svelte delete mode 100644 nodes/max/plantarium/.template/tests/web.rs delete mode 100644 nodes/max/plantarium/box/tests/web.rs delete mode 100644 nodes/max/plantarium/branch/tests/web.rs delete mode 100644 nodes/max/plantarium/float/tests/web.rs delete mode 100644 nodes/max/plantarium/gravity/tests/web.rs delete mode 100644 nodes/max/plantarium/instance/tests/web.rs delete mode 100644 nodes/max/plantarium/math/tests/web.rs delete mode 100644 nodes/max/plantarium/noise/tests/web.rs delete mode 100644 nodes/max/plantarium/output/tests/web.rs delete mode 100644 nodes/max/plantarium/random/tests/web.rs delete mode 100644 nodes/max/plantarium/rotate/tests/web.rs delete mode 100644 nodes/max/plantarium/stem/tests/web.rs delete mode 100644 nodes/max/plantarium/triangle/tests/web.rs delete mode 100644 nodes/max/plantarium/vec3/tests/web.rs diff --git a/Cargo.lock b/Cargo.lock index 886d46d..e11370a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,176 +1,80 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "autocfg" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "box" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "nodarium_macros", "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", ] [[package]] name = "branch" version = "0.1.0" dependencies = [ - "console_error_panic_hook", - "glam", "nodarium_macros", "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", ] [[package]] name = "float" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "nodarium_macros", "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", ] [[package]] name = "glam" -version = "0.27.0" +version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" +checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9" [[package]] name = "gravity" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "glam", "nodarium_macros", "nodarium_utils", - "noise", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", +] + +[[package]] +name = "instance" +version = "0.1.0" +dependencies = [ + "glam", + "nodarium_macros", + "nodarium_utils", ] [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "math" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "nodarium_macros", "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", ] [[package]] -name = "max-plantarium-triangle" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "nodarium_macros", - "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] - -[[package]] -name = "max-plantarium-vec3" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "nodarium_macros", - "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] - -[[package]] -name = "nodarium_instance" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "glam", - "nodarium_macros", - "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "nodarium_macros" @@ -180,7 +84,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 1.0.109", + "syn", ] [[package]] @@ -195,29 +99,19 @@ dependencies = [ name = "nodarium_utils" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "glam", - "noise", + "noise 0.9.0", "serde", "serde_json", - "wasm-bindgen", - "web-sys", ] [[package]] -name = "nodes-noise" +name = "noise" version = "0.1.0" dependencies = [ - "console_error_panic_hook", - "glam", "nodarium_macros", "nodarium_utils", - "noise", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", + "noise 0.9.0", ] [[package]] @@ -233,48 +127,35 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - [[package]] name = "output" version = "0.1.0" dependencies = [ - "console_error_panic_hook", - "glam", "nodarium_macros", "nodarium_utils", - "serde", - "serde_json", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", ] [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -307,103 +188,76 @@ dependencies = [ name = "random" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "nodarium_macros", "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", ] [[package]] name = "rotate" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "glam", "nodarium_macros", "nodarium_utils", "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", ] -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "serde" -version = "1.0.198" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] -[[package]] -name = "serde-wasm-bindgen" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", - "ryu", + "memchr", "serde", + "serde_core", + "zmij", ] [[package]] name = "stem" version = "0.1.0" dependencies = [ - "console_error_panic_hook", "nodarium_macros", "nodarium_utils", - "serde", - "serde-wasm-bindgen", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", ] [[package]] name = "syn" -version = "1.0.109" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -411,119 +265,30 @@ dependencies = [ ] [[package]] -name = "syn" -version = "2.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +name = "triangle" +version = "0.1.0" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "nodarium_macros", + "nodarium_utils", ] [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +name = "vec3" +version = "0.1.0" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "nodarium_macros", + "nodarium_utils", + "serde", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" +name = "zmij" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.60", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b" -dependencies = [ - "console_error_panic_hook", - "js-sys", - "scoped-tls", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] +checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2" diff --git a/app/package.json b/app/package.json index 01464d8..e245de7 100644 --- a/app/package.json +++ b/app/package.json @@ -22,7 +22,8 @@ "idb": "^8.0.3", "jsondiffpatch": "^0.7.3", "tailwindcss": "^4.1.18", - "three": "^0.182.0" + "three": "^0.182.0", + "wabt": "^1.0.39" }, "devDependencies": { "@iconify-json/tabler": "^1.2.26", diff --git a/app/src/lib/node-registry.ts b/app/src/lib/node-registry.ts index 335645d..112818d 100644 --- a/app/src/lib/node-registry.ts +++ b/app/src/lib/node-registry.ts @@ -3,7 +3,7 @@ import fs from "fs/promises"; import path from "path"; export async function getWasm(id: `${string}/${string}/${string}`) { - const filePath = path.resolve(`../nodes/${id}/pkg/index_bg.wasm`); + const filePath = path.resolve(`../nodes/${id}/pkg/node.wasm`); try { await fs.access(filePath); diff --git a/app/src/lib/runtime/runtime-executor.ts b/app/src/lib/runtime/runtime-executor.ts index c7ff8c9..fb2403f 100644 --- a/app/src/lib/runtime/runtime-executor.ts +++ b/app/src/lib/runtime/runtime-executor.ts @@ -244,13 +244,14 @@ export class MemoryRuntimeExecutor implements RuntimeExecutor { } this.perf?.addPoint("cache-hit", 0); - log.group(`executing ${node_type.id || node.id}`); + log.group(`executing ${node_type.id}-${node.id}`); log.log(`Inputs:`, inputs); a = performance.now(); results[node.id] = node_type.execute(encoded_inputs); + log.log("Executed", node.type, node.id) b = performance.now(); - if (this.cache) { + if (this.cache && node.id !== outputNode.id) { this.cache.set(inputHash, results[node.id]); } diff --git a/app/src/routes/dev/+layout.svelte b/app/src/routes/dev/+layout.svelte new file mode 100644 index 0000000..ddf9ccd --- /dev/null +++ b/app/src/routes/dev/+layout.svelte @@ -0,0 +1,8 @@ + + +
+ {@render children()} +
diff --git a/app/src/routes/dev/+page.svelte b/app/src/routes/dev/+page.svelte index 5fc25a1..ebe4081 100644 --- a/app/src/routes/dev/+page.svelte +++ b/app/src/routes/dev/+page.svelte @@ -1,29 +1,120 @@ +
+ {#if nodeInstance} + + {/if} +
+ - - - -
- -
-
-
+
+      
+        {JSON.stringify(nodeInstance?.props)}
+      
+    
+
+ + +
+ {#if nodeWasm} + + {/if} +
+ + +
+ {#await nodeRegistry.fetchCollection("max/plantarium")} +

Loading Nodes...

+ {:then result} + {#each result.nodes as n} + + {/each} + {/await} +
+
+
+ diff --git a/app/src/routes/dev/Code.svelte b/app/src/routes/dev/Code.svelte new file mode 100644 index 0000000..a274614 --- /dev/null +++ b/app/src/routes/dev/Code.svelte @@ -0,0 +1,26 @@ + + +{#await toWat(wasm)} +

Converting to WAT

+{:then c} +
+    {c}
+  
+{/await} diff --git a/nodes/max/plantarium/.template/Cargo.toml b/nodes/max/plantarium/.template/Cargo.toml index 9185f6a..298ff9f 100644 --- a/nodes/max/plantarium/.template/Cargo.toml +++ b/nodes/max/plantarium/.template/Cargo.toml @@ -11,18 +11,8 @@ crate-type = ["cdylib", "rlib"] default = ["console_error_panic_hook"] [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. utils = { version = "0.1.0", path = "../../../../packages/utils" } macros = { version = "0.1.0", path = "../../../../packages/macros" } serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" console_error_panic_hook = { version = "0.1.7", optional = true } web-sys = { version = "0.3.69", features = ["console"] } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/.template/package.json b/nodes/max/plantarium/.template/package.json index 86916c9..c066779 100644 --- a/nodes/max/plantarium/.template/package.json +++ b/nodes/max/plantarium/.template/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/out.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/.template/tests/web.rs b/nodes/max/plantarium/.template/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/.template/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/box/Cargo.toml b/nodes/max/plantarium/box/Cargo.toml index 3fad443..3cf9bdd 100644 --- a/nodes/max/plantarium/box/Cargo.toml +++ b/nodes/max/plantarium/box/Cargo.toml @@ -7,22 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/box/package.json b/nodes/max/plantarium/box/package.json index 86916c9..69679f8 100644 --- a/nodes/max/plantarium/box/package.json +++ b/nodes/max/plantarium/box/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/box.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/box/src/lib.rs b/nodes/max/plantarium/box/src/lib.rs index e550888..e4dc8f4 100644 --- a/nodes/max/plantarium/box/src/lib.rs +++ b/nodes/max/plantarium/box/src/lib.rs @@ -1,18 +1,15 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ - concat_args, encode_float, evaluate_float, geometry::calculate_normals, log, set_panic_hook, + encode_float, evaluate_float, geometry::calculate_normals,log, split_args, wrap_arg, }; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[rustfmt::skip] -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - let args = split_args(input); log!("WASM(cube): input: {:?} -> {:?}", input, args); @@ -22,7 +19,6 @@ pub fn execute(input: &[i32]) -> Vec { let p = encode_float(size); let n = encode_float(-size); - // [[1,3, x, y, z, x, y,z,x,y,z]]; let mut cube_geometry = [ diff --git a/nodes/max/plantarium/box/tests/web.rs b/nodes/max/plantarium/box/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/box/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/branch/Cargo.toml b/nodes/max/plantarium/branch/Cargo.toml index e627cf5..b38ac0e 100644 --- a/nodes/max/plantarium/branch/Cargo.toml +++ b/nodes/max/plantarium/branch/Cargo.toml @@ -7,23 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } -glam = "0.27.0" - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/branch/package.json b/nodes/max/plantarium/branch/package.json index 86916c9..dd1de2c 100644 --- a/nodes/max/plantarium/branch/package.json +++ b/nodes/max/plantarium/branch/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/branch.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/branch/src/lib.rs b/nodes/max/plantarium/branch/src/lib.rs index 9180467..6f9b60d 100644 --- a/nodes/max/plantarium/branch/src/lib.rs +++ b/nodes/max/plantarium/branch/src/lib.rs @@ -1,20 +1,19 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ concat_arg_vecs, evaluate_float, evaluate_int, geometry::{ create_path, interpolate_along_path, rotate_vector_by_angle, wrap_path, wrap_path_mut, }, - log, set_panic_hook, split_args, + log, split_args, }; + use std::f32::consts::PI; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - let args = split_args(input); let paths = split_args(args[0]); diff --git a/nodes/max/plantarium/branch/tests/web.rs b/nodes/max/plantarium/branch/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/branch/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/float/Cargo.toml b/nodes/max/plantarium/float/Cargo.toml index c1762ed..4c570f6 100644 --- a/nodes/max/plantarium/float/Cargo.toml +++ b/nodes/max/plantarium/float/Cargo.toml @@ -7,21 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/float/package.json b/nodes/max/plantarium/float/package.json index 86916c9..e2e1fc5 100644 --- a/nodes/max/plantarium/float/package.json +++ b/nodes/max/plantarium/float/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/float.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/float/src/lib.rs b/nodes/max/plantarium/float/src/lib.rs index 5e6b39d..5d3a67f 100644 --- a/nodes/max/plantarium/float/src/lib.rs +++ b/nodes/max/plantarium/float/src/lib.rs @@ -1,9 +1,9 @@ -use nodarium_macros::include_definition_file; -use wasm_bindgen::prelude::*; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(args: &[i32]) -> Vec { args.into() } diff --git a/nodes/max/plantarium/float/tests/web.rs b/nodes/max/plantarium/float/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/float/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/gravity/Cargo.toml b/nodes/max/plantarium/gravity/Cargo.toml index 332cbff..a38ae47 100644 --- a/nodes/max/plantarium/gravity/Cargo.toml +++ b/nodes/max/plantarium/gravity/Cargo.toml @@ -7,24 +7,7 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } -noise = "0.9.0" -glam = "0.27.0" - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" +glam = "0.30.10" diff --git a/nodes/max/plantarium/gravity/package.json b/nodes/max/plantarium/gravity/package.json index 86916c9..6ca64a2 100644 --- a/nodes/max/plantarium/gravity/package.json +++ b/nodes/max/plantarium/gravity/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/gravity.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/gravity/src/lib.rs b/nodes/max/plantarium/gravity/src/lib.rs index be7f892..4453934 100644 --- a/nodes/max/plantarium/gravity/src/lib.rs +++ b/nodes/max/plantarium/gravity/src/lib.rs @@ -1,22 +1,20 @@ use glam::Vec3; -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ concat_args, evaluate_float, evaluate_int, geometry::{wrap_path, wrap_path_mut}, - log, reset_call_count, set_panic_hook, split_args, + log, reset_call_count, split_args, }; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); fn lerp_vec3(a: Vec3, b: Vec3, t: f32) -> Vec3 { a + (b - a) * t } -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - reset_call_count(); let args = split_args(input); diff --git a/nodes/max/plantarium/gravity/tests/web.rs b/nodes/max/plantarium/gravity/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/gravity/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/instance/Cargo.toml b/nodes/max/plantarium/instance/Cargo.toml index 69ea1b8..474eeab 100644 --- a/nodes/max/plantarium/instance/Cargo.toml +++ b/nodes/max/plantarium/instance/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nodarium_instance" +name = "instance" version = "0.1.0" authors = ["Max Richter "] edition = "2018" @@ -7,23 +7,7 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } -glam = "0.27.0" - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" +glam = "0.30.10" diff --git a/nodes/max/plantarium/instance/package.json b/nodes/max/plantarium/instance/package.json index 86916c9..061b805 100644 --- a/nodes/max/plantarium/instance/package.json +++ b/nodes/max/plantarium/instance/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/instance.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/instance/src/lib.rs b/nodes/max/plantarium/instance/src/lib.rs index 3b7891c..ca98ac9 100644 --- a/nodes/max/plantarium/instance/src/lib.rs +++ b/nodes/max/plantarium/instance/src/lib.rs @@ -1,20 +1,18 @@ use glam::{Mat4, Quat, Vec3}; -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_execute; +use nodarium_macros::nodarium_definition_file; use nodarium_utils::{ - concat_args, encode_float, evaluate_float, evaluate_int, + concat_args, evaluate_float, evaluate_int, geometry::{ - calculate_normals, create_instance_data, wrap_geometry_data, wrap_instance_data, wrap_path, + create_instance_data, wrap_geometry_data, wrap_instance_data, wrap_path, }, - log, set_panic_hook, split_args, wrap_arg, + log, split_args, }; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - let args = split_args(input); let mut inputs = split_args(args[0]); log!("WASM(instance): inputs: {:?}", inputs); diff --git a/nodes/max/plantarium/instance/tests/web.rs b/nodes/max/plantarium/instance/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/instance/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/math/Cargo.toml b/nodes/max/plantarium/math/Cargo.toml index aac8ae4..7424c08 100644 --- a/nodes/max/plantarium/math/Cargo.toml +++ b/nodes/max/plantarium/math/Cargo.toml @@ -7,17 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -web-sys = { version = "0.3.69", features = ["console"] } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/math/package.json b/nodes/max/plantarium/math/package.json index 86916c9..e63975b 100644 --- a/nodes/max/plantarium/math/package.json +++ b/nodes/max/plantarium/math/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/math.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/math/src/lib.rs b/nodes/max/plantarium/math/src/lib.rs index c97015f..09b36ac 100644 --- a/nodes/max/plantarium/math/src/lib.rs +++ b/nodes/max/plantarium/math/src/lib.rs @@ -1,12 +1,13 @@ -use nodarium_macros::include_definition_file; -use nodarium_utils::{concat_args, set_panic_hook, split_args}; -use wasm_bindgen::prelude::*; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; +use nodarium_utils::{ + concat_args, split_args +}; -include_definition_file!("src/input.json"); - -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(args: &[i32]) -> Vec { - set_panic_hook(); let args = split_args(args); concat_args(vec![&[0], args[0], args[1], args[2]]) } + +nodarium_definition_file!("src/input.json"); diff --git a/nodes/max/plantarium/math/tests/web.rs b/nodes/max/plantarium/math/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/math/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/noise/Cargo.toml b/nodes/max/plantarium/noise/Cargo.toml index 5ddf492..478cb3c 100644 --- a/nodes/max/plantarium/noise/Cargo.toml +++ b/nodes/max/plantarium/noise/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nodes-noise" +name = "noise" version = "0.1.0" authors = ["Max Richter "] edition = "2018" @@ -7,24 +7,8 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } noise = "0.9.0" -glam = "0.27.0" -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/noise/package.json b/nodes/max/plantarium/noise/package.json index 86916c9..30b7618 100644 --- a/nodes/max/plantarium/noise/package.json +++ b/nodes/max/plantarium/noise/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/noise.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/noise/src/lib.rs b/nodes/max/plantarium/noise/src/lib.rs index b405c83..b54f684 100644 --- a/nodes/max/plantarium/noise/src/lib.rs +++ b/nodes/max/plantarium/noise/src/lib.rs @@ -1,21 +1,19 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ - concat_args, evaluate_float, evaluate_int, evaluate_vec3, geometry::wrap_path_mut, log, - reset_call_count, set_panic_hook, split_args, + concat_args, evaluate_float, evaluate_int, evaluate_vec3, geometry::wrap_path_mut, + reset_call_count, split_args, }; use noise::{HybridMulti, MultiFractal, NoiseFn, OpenSimplex}; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); fn lerp(a: f32, b: f32, t: f32) -> f32 { a + t * (b - a) } -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - reset_call_count(); let args = split_args(input); diff --git a/nodes/max/plantarium/noise/tests/web.rs b/nodes/max/plantarium/noise/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/noise/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/output/Cargo.toml b/nodes/max/plantarium/output/Cargo.toml index 2b8546d..010948f 100644 --- a/nodes/max/plantarium/output/Cargo.toml +++ b/nodes/max/plantarium/output/Cargo.toml @@ -7,24 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] -console_error_panic_hook = ["dep:console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. -serde = { version = "1.0", features = ["derive"] } -serde_json = { version = "1.0", default-features = false, features = ["alloc"] } nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } -glam = "0.27.0" - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/output/package.json b/nodes/max/plantarium/output/package.json index 86916c9..4cc2020 100644 --- a/nodes/max/plantarium/output/package.json +++ b/nodes/max/plantarium/output/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/output.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/output/src/lib.rs b/nodes/max/plantarium/output/src/lib.rs index 402195e..e05828d 100644 --- a/nodes/max/plantarium/output/src/lib.rs +++ b/nodes/max/plantarium/output/src/lib.rs @@ -1,17 +1,15 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ concat_args, evaluate_int, geometry::{extrude_path, wrap_path}, - log, set_panic_hook, split_args, + log, split_args, }; -use wasm_bindgen::prelude::*; -include_definition_file!("src/inputs.json"); +nodarium_definition_file!("src/inputs.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - log!("WASM(output): input: {:?}", input); let args = split_args(input); diff --git a/nodes/max/plantarium/output/tests/web.rs b/nodes/max/plantarium/output/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/output/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/random/Cargo.toml b/nodes/max/plantarium/random/Cargo.toml index 219ed0a..7edb88d 100644 --- a/nodes/max/plantarium/random/Cargo.toml +++ b/nodes/max/plantarium/random/Cargo.toml @@ -7,21 +7,7 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/random/package.json b/nodes/max/plantarium/random/package.json index 86916c9..4fecf10 100644 --- a/nodes/max/plantarium/random/package.json +++ b/nodes/max/plantarium/random/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/random.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/random/src/lib.rs b/nodes/max/plantarium/random/src/lib.rs index 1d77a36..3937c50 100644 --- a/nodes/max/plantarium/random/src/lib.rs +++ b/nodes/max/plantarium/random/src/lib.rs @@ -1,12 +1,11 @@ -use nodarium_macros::include_definition_file; -use nodarium_utils::{concat_args, set_panic_hook, split_args}; -use wasm_bindgen::prelude::*; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; +use nodarium_utils::{concat_args, split_args}; -include_definition_file!("src/definition.json"); +nodarium_definition_file!("src/definition.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(args: &[i32]) -> Vec { - set_panic_hook(); let args = split_args(args); concat_args(vec![&[1], args[0], args[1], args[2]]) } diff --git a/nodes/max/plantarium/random/tests/web.rs b/nodes/max/plantarium/random/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/random/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/rotate/Cargo.toml b/nodes/max/plantarium/rotate/Cargo.toml index ab87fb1..9b7a219 100644 --- a/nodes/max/plantarium/rotate/Cargo.toml +++ b/nodes/max/plantarium/rotate/Cargo.toml @@ -7,23 +7,8 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } -glam = "0.27.0" - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" +glam = "0.30.10" diff --git a/nodes/max/plantarium/rotate/package.json b/nodes/max/plantarium/rotate/package.json index 86916c9..fc6a577 100644 --- a/nodes/max/plantarium/rotate/package.json +++ b/nodes/max/plantarium/rotate/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/rotate.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/rotate/src/lib.rs b/nodes/max/plantarium/rotate/src/lib.rs index f9ca31f..ad2bd70 100644 --- a/nodes/max/plantarium/rotate/src/lib.rs +++ b/nodes/max/plantarium/rotate/src/lib.rs @@ -1,16 +1,15 @@ use glam::{Mat4, Vec3}; -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ - concat_args, evaluate_float, evaluate_int, geometry::wrap_path_mut, log, set_panic_hook, + concat_args, evaluate_float, evaluate_int, geometry::wrap_path_mut, log, split_args, }; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); log!("DEBUG args: {:?}", input); diff --git a/nodes/max/plantarium/rotate/tests/web.rs b/nodes/max/plantarium/rotate/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/rotate/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/stem/Cargo.toml b/nodes/max/plantarium/stem/Cargo.toml index 93d8989..6556dc9 100644 --- a/nodes/max/plantarium/stem/Cargo.toml +++ b/nodes/max/plantarium/stem/Cargo.toml @@ -7,23 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -web-sys = { version = "0.3.69", features = ["console"] } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" - -[package.metadata.wasm-pack.profile.release.wasm-bindgen] -debug-js-glue = true -demangle-name-section = true -dwarf-debug-info = false -omit-default-module-path = true diff --git a/nodes/max/plantarium/stem/package.json b/nodes/max/plantarium/stem/package.json index 86916c9..e22c7b9 100644 --- a/nodes/max/plantarium/stem/package.json +++ b/nodes/max/plantarium/stem/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/stem.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/stem/src/lib.rs b/nodes/max/plantarium/stem/src/lib.rs index 4838b92..32e57e6 100644 --- a/nodes/max/plantarium/stem/src/lib.rs +++ b/nodes/max/plantarium/stem/src/lib.rs @@ -1,17 +1,15 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ evaluate_float, evaluate_int, evaluate_vec3, geometry::{create_multiple_paths, wrap_multiple_paths}, - log, reset_call_count, set_panic_hook, split_args, + log, reset_call_count, split_args, }; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - reset_call_count(); let args = split_args(input); diff --git a/nodes/max/plantarium/stem/tests/web.rs b/nodes/max/plantarium/stem/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/stem/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/triangle/Cargo.toml b/nodes/max/plantarium/triangle/Cargo.toml index b554ba6..07f78a9 100644 --- a/nodes/max/plantarium/triangle/Cargo.toml +++ b/nodes/max/plantarium/triangle/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "max-plantarium-triangle" +name = "triangle" version = "0.1.0" authors = ["Max Richter "] edition = "2018" @@ -7,22 +7,6 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/triangle/package.json b/nodes/max/plantarium/triangle/package.json index 86916c9..77e9f04 100644 --- a/nodes/max/plantarium/triangle/package.json +++ b/nodes/max/plantarium/triangle/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/triangle.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/triangle/src/lib.rs b/nodes/max/plantarium/triangle/src/lib.rs index 818b4f7..e14533c 100644 --- a/nodes/max/plantarium/triangle/src/lib.rs +++ b/nodes/max/plantarium/triangle/src/lib.rs @@ -1,25 +1,21 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{ - decode_float, encode_float, evaluate_int, set_panic_hook, split_args, wrap_arg, + decode_float, encode_float, evaluate_int, split_args, wrap_arg, log }; -use wasm_bindgen::prelude::*; -use web_sys::console; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[rustfmt::skip] -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { - set_panic_hook(); - let args = split_args(input); let size = evaluate_int(args[0]); let decoded = decode_float(size); let negative_size = encode_float(-decoded); - console::log_1(&format!("WASM(triangle): input: {:?} -> {}", args[0],decoded).into()); + log!("WASM(triangle): input: {:?} -> {}", args[0],decoded); // [[1,3, x, y, z, x, y,z,x,y,z]]; wrap_arg(&[ diff --git a/nodes/max/plantarium/triangle/tests/web.rs b/nodes/max/plantarium/triangle/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/triangle/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/nodes/max/plantarium/vec3/Cargo.toml b/nodes/max/plantarium/vec3/Cargo.toml index bb6287d..ef8535e 100644 --- a/nodes/max/plantarium/vec3/Cargo.toml +++ b/nodes/max/plantarium/vec3/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "max-plantarium-vec3" +name = "vec3" version = "0.1.0" authors = ["Max Richter "] edition = "2018" @@ -7,22 +7,8 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] -[features] -default = ["console_error_panic_hook"] - [dependencies] -wasm-bindgen = "0.2.84" - -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.4" -console_error_panic_hook = { version = "0.1.7", optional = true } -web-sys = { version = "0.3.69", features = ["console"] } -[dev-dependencies] -wasm-bindgen-test = "0.3.34" diff --git a/nodes/max/plantarium/vec3/package.json b/nodes/max/plantarium/vec3/package.json index 86916c9..d99c173 100644 --- a/nodes/max/plantarium/vec3/package.json +++ b/nodes/max/plantarium/vec3/package.json @@ -1,6 +1,6 @@ { "scripts": { - "build": "wasm-pack build --release --out-name index --no-default-features", + "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/vec3.wasm ./pkg/node.wasm", "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/vec3/src/lib.rs b/nodes/max/plantarium/vec3/src/lib.rs index c0ab226..118fd29 100644 --- a/nodes/max/plantarium/vec3/src/lib.rs +++ b/nodes/max/plantarium/vec3/src/lib.rs @@ -1,10 +1,10 @@ -use nodarium_macros::include_definition_file; +use nodarium_macros::nodarium_definition_file; +use nodarium_macros::nodarium_execute; use nodarium_utils::{concat_args, log, split_args}; -use wasm_bindgen::prelude::*; -include_definition_file!("src/input.json"); +nodarium_definition_file!("src/input.json"); -#[wasm_bindgen] +#[nodarium_execute] pub fn execute(input: &[i32]) -> Vec { let args = split_args(input); log!("vec3 input: {:?}", input); diff --git a/nodes/max/plantarium/vec3/tests/web.rs b/nodes/max/plantarium/vec3/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/nodes/max/plantarium/vec3/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/packages/macros/Cargo.toml b/packages/macros/Cargo.toml index 6ed39ac..f37b0b9 100644 --- a/packages/macros/Cargo.toml +++ b/packages/macros/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/jim-fx/nodes" proc-macro = true [dependencies] -syn = { version = "1.0", features = ["full"] } +syn = { version = "2.0", features = ["full"] } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } quote = "1.0" diff --git a/packages/macros/src/lib.rs b/packages/macros/src/lib.rs index 344a1c0..fb4ef10 100644 --- a/packages/macros/src/lib.rs +++ b/packages/macros/src/lib.rs @@ -5,32 +5,7 @@ use quote::quote; use std::env; use std::fs; use std::path::Path; -use syn::{parse_macro_input, LitStr}; - -#[proc_macro] -pub fn node_definition(input: TokenStream) -> TokenStream { - let input_string = parse_macro_input!(input as LitStr).value(); - - // Validate JSON format - let json: NodeDefinition = match serde_json::from_str(&input_string) { - Ok(json) => json, - Err(e) => panic!("Invalid JSON input: {}", e), - }; - - // Convert the validated JSON back to a pretty-printed string - let formatted_json = serde_json::to_string_pretty(&json).expect("Failed to serialize JSON"); - - // Generate the output function - let expanded = quote! { - #[wasm_bindgen] - pub fn get_definition() -> String { - String::from(#formatted_json) - } - }; - - // Convert the generated code back to a TokenStream - TokenStream::from(expanded) -} +use syn::parse_macro_input; fn add_line_numbers(input: String) -> String { return input @@ -41,39 +16,120 @@ fn add_line_numbers(input: String) -> String { .join("\n"); } -#[proc_macro] -pub fn include_definition_file(input: TokenStream) -> TokenStream { - let file_path = syn::parse_macro_input!(input as syn::LitStr).value(); +#[proc_macro_attribute] +pub fn nodarium_execute(_attr: TokenStream, item: TokenStream) -> TokenStream { + let input_fn = parse_macro_input!(item as syn::ItemFn); + let _fn_name = &input_fn.sig.ident; + let _fn_vis = &input_fn.vis; + let fn_body = &input_fn.block; - // Retrieve the directory containing the Cargo.toml file - let project_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); - let full_path = Path::new(&project_dir).join(&file_path); + let first_arg_ident = if let Some(syn::FnArg::Typed(pat_type)) = input_fn.sig.inputs.first() { + if let syn::Pat::Ident(pat_ident) = &*pat_type.pat { + &pat_ident.ident + } else { + panic!("Expected a simple identifier for the first argument"); + } + } else { + panic!("The execute function must have at least one argument (the input slice)"); + }; - // Read the JSON file content - let json_content = fs::read_to_string(full_path).unwrap_or_else(|err| { - panic!( - "Failed to read JSON file at '{}/{}': {}", - project_dir, file_path, err - ) - }); - - // Optionally, validate that the content is valid JSON - let _: NodeDefinition = serde_json::from_str(&json_content).unwrap_or_else(|err| { - panic!( - "JSON file contains invalid JSON: \n{} \n{}", - err, - add_line_numbers(json_content.clone()) - ) - }); - - // Generate the function that returns the JSON string + // We create a wrapper that handles the C ABI and pointer math let expanded = quote! { - #[wasm_bindgen] - pub fn get_definition() -> String { - String::from(#json_content) + extern "C" { + fn host_log_panic(ptr: *const u8, len: usize); + fn host_log(ptr: *const u8, len: usize); + } + + fn setup_panic_hook() { + static SET_HOOK: std::sync::Once = std::sync::Once::new(); + SET_HOOK.call_once(|| { + std::panic::set_hook(Box::new(|info| { + let msg = info.to_string(); + unsafe { host_log_panic(msg.as_ptr(), msg.len()); } + })); + }); + } + + #[no_mangle] + pub extern "C" fn __alloc(len: usize) -> *mut i32 { + let mut buf = Vec::with_capacity(len); + let ptr = buf.as_mut_ptr(); + std::mem::forget(buf); + ptr + } + + #[no_mangle] + pub extern "C" fn __free(ptr: *mut i32, len: usize) { + unsafe { + let _ = Vec::from_raw_parts(ptr, 0, len); + } + } + + static mut OUTPUT_BUFFER: Vec = Vec::new(); + + #[no_mangle] + pub extern "C" fn execute(ptr: *const i32, len: usize) -> *mut i32 { + setup_panic_hook(); + // 1. Convert raw pointer to slice + let input = unsafe { core::slice::from_raw_parts(ptr, len) }; + + // 2. Call the logic (which we define below) + let result_data: Vec = internal_logic(input); + + // 3. Use the static buffer for the result + let result_len = result_data.len(); + unsafe { + OUTPUT_BUFFER.clear(); + OUTPUT_BUFFER.reserve(result_len + 1); + OUTPUT_BUFFER.push(result_len as i32); + OUTPUT_BUFFER.extend(result_data); + + OUTPUT_BUFFER.as_mut_ptr() + } + } + + fn internal_logic(#first_arg_ident: &[i32]) -> Vec { + #fn_body + } + }; + + TokenStream::from(expanded) +} + +#[proc_macro] +pub fn nodarium_definition_file(input: TokenStream) -> TokenStream { + let path_lit = syn::parse_macro_input!(input as syn::LitStr); + let file_path = path_lit.value(); + + let project_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let full_path = Path::new(&project_dir).join(&file_path); + + let json_content = fs::read_to_string(&full_path).unwrap_or_else(|err| { + panic!("Failed to read JSON file at '{}/{}': {}", project_dir, file_path, err) + }); + + let _: NodeDefinition = serde_json::from_str(&json_content).unwrap_or_else(|err| { + panic!("JSON file contains invalid JSON: \n{} \n{}", err, add_line_numbers(json_content.clone())) + }); + + // We use the span from the input path literal + let bytes = syn::LitByteStr::new(json_content.as_bytes(), path_lit.span()); + let len = json_content.len(); + + let expanded = quote! { + #[link_section = "nodarium_definition"] + static DEFINITION_DATA: [u8; #len] = *#bytes; + + #[no_mangle] + pub extern "C" fn get_definition_ptr() -> *const u8 { + DEFINITION_DATA.as_ptr() + } + + #[no_mangle] + pub extern "C" fn get_definition_len() -> usize { + DEFINITION_DATA.len() } }; - // Convert the generated code back to a TokenStream TokenStream::from(expanded) } diff --git a/packages/registry/src/node-registry-client.ts b/packages/registry/src/node-registry-client.ts index e10d9ce..c034c94 100644 --- a/packages/registry/src/node-registry-client.ts +++ b/packages/registry/src/node-registry-client.ts @@ -13,7 +13,6 @@ export class RemoteNodeRegistry implements NodeRegistry { status: "loading" | "ready" | "error" = "loading"; private nodes: Map = new Map(); - constructor( private url: string, private cache?: AsyncCache, diff --git a/packages/types/Cargo.toml b/packages/types/Cargo.toml index 518d8d0..b8141f2 100644 --- a/packages/types/Cargo.toml +++ b/packages/types/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition = "2021" license = "MIT" description = "Types for Nodarium" -website = "https://nodes.max-richter.dev" repository = "https://github.com/jim-fx/nodes" [dependencies] diff --git a/packages/ui/src/lib/app.css b/packages/ui/src/lib/app.css index e96ef2e..ac2b426 100644 --- a/packages/ui/src/lib/app.css +++ b/packages/ui/src/lib/app.css @@ -40,6 +40,30 @@ } +@theme { + --color-neutral-100: #E7E7E7; + --color-neutral-200: #CECECE; + --color-neutral-300: #7C7C7C; + --color-neutral-400: #2D2D2D; + --color-neutral-500: #171717; + --color-neutral-800: #111111; + --color-neutral-900: #060606; + + --color-layer-0: var(--neutral-900); + --color-layer-1: var(--neutral-500); + --color-layer-2: var(--neutral-400); + --color-layer-3: var(--neutral-200); + + --color-active: #ffffff; + --color-selected: #c65a19; + + --color-outline: var(--neutral-400); + --color-connection: #333333; + --color-edge: var(--connection, var(--outline)); + + --color-text-color: var(--neutral-200); +} + html { --neutral-100: #E7E7E7; --neutral-200: #CECECE; diff --git a/packages/utils/Cargo.toml b/packages/utils/Cargo.toml index 5816536..776a455 100644 --- a/packages/utils/Cargo.toml +++ b/packages/utils/Cargo.toml @@ -6,14 +6,11 @@ description = "A collection of utilities for Nodarium" license = "MIT" repository = "https://github.com/jim-fx/nodes" -[features] -default = ["console_error_panic_hook"] +[lib] +crate-type = ["rlib"] [dependencies] -wasm-bindgen = "0.2.92" -web-sys = { version = "0.3.69", features = ["console"] } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } -console_error_panic_hook = { version = "0.1.7", optional = true } -glam = "0.27.0" +glam = "0.30.10" noise = "0.9.0" diff --git a/packages/utils/src/flatTree.ts b/packages/utils/src/flatTree.ts index ac47194..f99cf45 100644 --- a/packages/utils/src/flatTree.ts +++ b/packages/utils/src/flatTree.ts @@ -109,10 +109,12 @@ export function decodeNestedArray(dense: number[] | Int32Array) { } export function splitNestedArray(input: Int32Array) { + let index = 0; const length = input.length; let res: Int32Array[] = []; + let nextBracketIndex = 0; let argStartIndex = 0; let depth = -1; diff --git a/packages/utils/src/geometry/geometry_data.rs b/packages/utils/src/geometry/geometry_data.rs index 3edc965..6ea6324 100644 --- a/packages/utils/src/geometry/geometry_data.rs +++ b/packages/utils/src/geometry/geometry_data.rs @@ -61,7 +61,7 @@ pub fn create_geometry_data(vertex_amount: usize, face_amount: usize) -> Vec GeometryData { +pub fn wrap_geometry_data(geometry: &mut [i32]) -> GeometryData<'_> { // Basic validity checks assert!( geometry.len() > GEOMETRY_HEADER_SIZE, diff --git a/packages/utils/src/geometry/instance_data.rs b/packages/utils/src/geometry/instance_data.rs index ed92519..eaa720a 100644 --- a/packages/utils/src/geometry/instance_data.rs +++ b/packages/utils/src/geometry/instance_data.rs @@ -73,7 +73,7 @@ pub fn create_instance_data( geo } -pub fn wrap_instance_data(instances: &mut [i32]) -> InstanceData { +pub fn wrap_instance_data(instances: &mut [i32]) -> InstanceData<'_> { assert!( instances.len() > INSTANCE_HEADER_SIZE, "Instance vector does not contain enough data for a header." diff --git a/packages/utils/src/geometry/path_data.rs b/packages/utils/src/geometry/path_data.rs index f3de7e9..795c96a 100644 --- a/packages/utils/src/geometry/path_data.rs +++ b/packages/utils/src/geometry/path_data.rs @@ -130,7 +130,7 @@ pub fn create_path(point_amount: usize, depth: i32) -> Vec { path } -pub fn wrap_path(input: &[i32]) -> PathData { +pub fn wrap_path(input: &[i32]) -> PathData<'_> { // Basic validity checks assert!( input.len() > PATH_HEADER_SIZE, diff --git a/packages/utils/src/lib.rs b/packages/utils/src/lib.rs index 90dca23..0bcf629 100644 --- a/packages/utils/src/lib.rs +++ b/packages/utils/src/lib.rs @@ -6,12 +6,22 @@ pub use nodes::reset_call_count; pub use tree::*; pub mod geometry; +extern "C" { + #[cfg(target_arch = "wasm32")] + pub fn host_log(ptr: *const u8, len: usize); +} + #[cfg(debug_assertions)] #[macro_export] macro_rules! log { - ($($arg:tt)*) => {{ - use web_sys::console; - console::log_1(&format!($($arg)*).into()); + ($($t:tt)*) => {{ + let msg = std::format!($($t)*); + #[cfg(target_arch = "wasm32")] + unsafe { + $crate::host_log(msg.as_ptr(), msg.len()); + } + #[cfg(not(target_arch = "wasm32"))] + println!("{}", msg); }} } @@ -23,13 +33,3 @@ macro_rules! log { }}; } -pub fn set_panic_hook() { - // When the `console_error_panic_hook` feature is enabled, we can call the - // `set_panic_hook` function at least once during initialization, and then - // we will get better error messages if our code ever panics. - // - // For more details see - // https://github.com/rustwasm/console_error_panic_hook#readme - #[cfg(feature = "console_error_panic_hook")] - console_error_panic_hook::set_once(); -} diff --git a/packages/utils/src/wasm-wrapper.ts b/packages/utils/src/wasm-wrapper.ts index 0f53e19..6327d73 100644 --- a/packages/utils/src/wasm-wrapper.ts +++ b/packages/utils/src/wasm-wrapper.ts @@ -1,256 +1,55 @@ -//@ts-nocheck -import { NodeDefinition } from "@nodarium/types"; +interface NodariumExports extends WebAssembly.Exports { + memory: WebAssembly.Memory; + execute: (ptr: number, len: number) => number; + __free: (ptr: number, len: number) => void; + __alloc: (len: number) => number; +} -const cachedTextDecoder = new TextDecoder("utf-8", { - ignoreBOM: true, - fatal: true, -}); -const cachedTextEncoder = new TextEncoder(); +export function createWasmWrapper(buffer: ArrayBuffer) { + let exports: NodariumExports; -const encodeString = - typeof cachedTextEncoder.encodeInto === "function" - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); + const importObject = { + env: { + host_log_panic: (ptr: number, len: number) => { + if (!exports) return; + const view = new Uint8Array(exports.memory.buffer, ptr, len); + console.error("RUST PANIC:", new TextDecoder().decode(view)); + }, + host_log: (ptr: number, len: number) => { + if (!exports) return; + const view = new Uint8Array(exports.memory.buffer, ptr, len); + console.log("RUST:", new TextDecoder().decode(view)); + } } - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length, - }; - }; + }; -function createWrapper() { - let wasm: any; - - let cachedUint8Memory0: Uint8Array | null = null; - let cachedInt32Memory0: Int32Array | null = null; - let cachedUint32Memory0: Uint32Array | null = null; - - const heap = new Array(128).fill(undefined); - heap.push(undefined, null, true, false); - let heap_next = heap.length; - - function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; - } - - function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; - } - - function getUint32Memory0() { - if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { - cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); - } - return cachedUint32Memory0; - } - - function getStringFromWasm0(ptr: number, len: number) { - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); - } - - function getObject(idx: number) { - return heap[idx]; - } - - function addHeapObject(obj: any) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - heap[idx] = obj; - return idx; - } - - let WASM_VECTOR_LEN = 0; - function passArray32ToWasm0( - arg: ArrayLike, - malloc: (arg0: number, arg1: number) => number, - ) { - const ptr = malloc(arg.length * 4, 4) >>> 0; - getUint32Memory0().set(arg, ptr / 4); - WASM_VECTOR_LEN = arg.length; - return ptr; - } - - function getArrayI32FromWasm0(ptr: number, len: number) { - ptr = ptr >>> 0; - return getInt32Memory0().subarray(ptr / 4, ptr / 4 + len); - } - - function dropObject(idx: number) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; - } - - function takeObject(idx: number) { - const ret = getObject(idx); - dropObject(idx); - return ret; - } - - function __wbindgen_string_new(arg0: number, arg1: number) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - } - - // Additional methods and their internal helpers can also be refactored in a similar manner. - function get_definition() { - let deferred1_0: number; - let deferred1_1: number; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.get_definition(retptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - const rawDefinition = getStringFromWasm0(r0, r1); - return JSON.parse(rawDefinition) as NodeDefinition; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } + const module = new WebAssembly.Module(buffer); + const instance = new WebAssembly.Instance(module, importObject); + exports = instance.exports as NodariumExports; function execute(args: Int32Array) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passArray32ToWasm0(args, wasm.__wbindgen_malloc); - const len0 = WASM_VECTOR_LEN; - wasm.execute(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v2 = getArrayI32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 4, 4); - return v2; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + const inPtr = exports.__alloc(args.length); + new Int32Array(exports.memory.buffer).set(args, inPtr / 4); + + const outPtr = exports.execute(inPtr, args.length); + + const i32Result = new Int32Array(exports.memory.buffer); + const outLen = i32Result[outPtr / 4]; + const out = i32Result.slice(outPtr / 4 + 1, outPtr / 4 + 1 + outLen); + + exports.__free(inPtr, args.length); + + return out; + } + + function get_definition() { + const sections = WebAssembly.Module.customSections(module, "nodarium_definition"); + if (sections.length > 0) { + const decoder = new TextDecoder(); + const jsonString = decoder.decode(sections[0]); + return JSON.parse(jsonString); } } - function passStringToWasm0( - arg: string, - malloc: (arg0: any, arg1: number) => number, - realloc: - | ((arg0: number, arg1: any, arg2: number, arg3: number) => number) - | undefined, - ) { - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0() - .subarray(ptr, ptr + buf.length) - .set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7f) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; - } - - function __wbg_new_abda76e883ba8a5f() { - const ret = new Error(); - return addHeapObject(ret); - } - - function __wbg_stack_658279fe44541cf6(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0( - ret, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - } - - function __wbg_error_f851667af71bcfc6(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } - } - - function __wbindgen_object_drop_ref(arg0) { - takeObject(arg0); - } - - function __wbg_log_5bb5f88f245d7762(arg0) { - console.log(getObject(arg0)); - } - - function __wbindgen_throw(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - } - - return { - setInstance(instance: WebAssembly.Instance) { - wasm = instance.exports; - }, - - exports: { - // Expose other methods that interact with the wasm instance - execute, - get_definition, - }, - - __wbindgen_string_new, - __wbindgen_object_drop_ref, - __wbg_new_abda76e883ba8a5f, - __wbg_error_f851667af71bcfc6, - __wbg_stack_658279fe44541cf6, - __wbg_log_5bb5f88f245d7762, - __wbindgen_throw, - }; -} - -export function createWasmWrapper(wasmBuffer: ArrayBuffer | Uint8Array) { - const wrapper = createWrapper(); - const module = new WebAssembly.Module(wasmBuffer); - const instance = new WebAssembly.Instance(module, { - ["./index_bg.js"]: wrapper, - }); - wrapper.setInstance(instance); - return wrapper.exports; + return { execute, get_definition }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dbc3f1e..c818d8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ importers: three: specifier: ^0.182.0 version: 0.182.0 + wabt: + specifier: ^1.0.39 + version: 1.0.39 devDependencies: '@iconify-json/tabler': specifier: ^1.2.26 @@ -2574,6 +2577,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wabt@1.0.39: + resolution: {integrity: sha512-ba+dRL/75VQQY7RkU/CgriGbkoWAfS8TDyUlJfJhJ8KhtXgMl5dhNvoPNUcQ9IWRhW8u41glMSuZeTvsYq2rRg==} + hasBin: true + webgl-sdf-generator@1.1.1: resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} @@ -4930,6 +4937,8 @@ snapshots: xml-name-validator: 5.0.0 optional: true + wabt@1.0.39: {} + webgl-sdf-generator@1.1.1: {} webidl-conversions@7.0.0: -- 2.49.1 From ecbcc814edfe0bf9ecfc64a3adf4ffc6b2b5ceef Mon Sep 17 00:00:00 2001 From: Max Richter Date: Mon, 19 Jan 2026 01:29:28 +0100 Subject: [PATCH 2/6] chore: remove store code --- store/.env | 1 - store/Dockerfile | 13 - store/bin/upload.ts | 65 -- store/compose.yml | 29 - store/deno.json | 22 - store/deno.lock | 883 -------------------- store/drizzle.config.ts | 11 - store/drizzle/0000_known_kid_colt.sql | 25 - store/drizzle/meta/0000_snapshot.json | 217 ----- store/drizzle/meta/_journal.json | 13 - store/openapi.json | 1 - store/src/db/db.ts | 22 - store/src/db/schema.ts | 2 - store/src/routes/node/errors.ts | 33 - store/src/routes/node/node.controller.ts | 352 -------- store/src/routes/node/node.schema.ts | 43 - store/src/routes/node/node.service.ts | 241 ------ store/src/routes/node/node.test.ts | 11 - store/src/routes/node/validations/inputs.ts | 81 -- store/src/routes/node/validations/types.ts | 31 - store/src/routes/node/worker/index.ts | 36 - store/src/routes/node/worker/messages.ts | 21 - store/src/routes/node/worker/node.worker.ts | 40 - store/src/routes/node/worker/utils.ts | 255 ------ store/src/routes/user/user.controller.ts | 55 -- store/src/routes/user/user.schema.ts | 6 - store/src/routes/user/user.service.ts | 28 - store/src/routes/user/user.validation.ts | 8 - store/src/server.ts | 37 - store/vitest.config.ts | 7 - 30 files changed, 2589 deletions(-) delete mode 100644 store/.env delete mode 100644 store/Dockerfile delete mode 100644 store/bin/upload.ts delete mode 100644 store/compose.yml delete mode 100644 store/deno.json delete mode 100644 store/deno.lock delete mode 100644 store/drizzle.config.ts delete mode 100644 store/drizzle/0000_known_kid_colt.sql delete mode 100644 store/drizzle/meta/0000_snapshot.json delete mode 100644 store/drizzle/meta/_journal.json delete mode 100644 store/openapi.json delete mode 100644 store/src/db/db.ts delete mode 100644 store/src/db/schema.ts delete mode 100644 store/src/routes/node/errors.ts delete mode 100644 store/src/routes/node/node.controller.ts delete mode 100644 store/src/routes/node/node.schema.ts delete mode 100644 store/src/routes/node/node.service.ts delete mode 100644 store/src/routes/node/node.test.ts delete mode 100644 store/src/routes/node/validations/inputs.ts delete mode 100644 store/src/routes/node/validations/types.ts delete mode 100644 store/src/routes/node/worker/index.ts delete mode 100644 store/src/routes/node/worker/messages.ts delete mode 100644 store/src/routes/node/worker/node.worker.ts delete mode 100644 store/src/routes/node/worker/utils.ts delete mode 100644 store/src/routes/user/user.controller.ts delete mode 100644 store/src/routes/user/user.schema.ts delete mode 100644 store/src/routes/user/user.service.ts delete mode 100644 store/src/routes/user/user.validation.ts delete mode 100644 store/src/server.ts delete mode 100644 store/vitest.config.ts diff --git a/store/.env b/store/.env deleted file mode 100644 index a183732..0000000 --- a/store/.env +++ /dev/null @@ -1 +0,0 @@ -DATABASE_URL=postgres://nodarium:nodarium@postgres-db:5432/nodarium diff --git a/store/Dockerfile b/store/Dockerfile deleted file mode 100644 index 79a2305..0000000 --- a/store/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM denoland/deno:alpine - -ARG GIT_REVISION -ENV DENO_DEPLOYMENT_ID=${GIT_REVISION} - -WORKDIR /app - -COPY . . -RUN deno cache src/server.ts - -EXPOSE 8000 - -CMD ["task", "run"] diff --git a/store/bin/upload.ts b/store/bin/upload.ts deleted file mode 100644 index dc91e11..0000000 --- a/store/bin/upload.ts +++ /dev/null @@ -1,65 +0,0 @@ -import * as path from "jsr:@std/path"; -const arg = Deno.args[0]; - -const base = arg.startsWith("/") ? arg : path.join(Deno.cwd(), arg); - -const dirs = Deno.readDir(base); - -type Node = { - user: string; - system: string; - id: string; - path: string; -}; - -const nodes: Node[] = []; - -for await (const dir of dirs) { - if (dir.isDirectory) { - const userDir = path.join(base, dir.name); - for await (const userName of Deno.readDir(userDir)) { - if (userName.isDirectory) { - const nodeSystemDir = path.join(userDir, userName.name); - for await (const nodeDir of Deno.readDir(nodeSystemDir)) { - if (nodeDir.isDirectory && !nodeDir.name.startsWith(".")) { - const wasmFilePath = path.join( - nodeSystemDir, - nodeDir.name, - "pkg", - "index_bg.wasm", - ); - nodes.push({ - user: dir.name, - system: userName.name, - id: nodeDir.name, - path: wasmFilePath, - }); - } - } - } - } - } -} - -async function postNode(node: Node) { - const wasmContent = await Deno.readFile(node.path); - - const url = `http://localhost:8000/nodes`; - // const url = "https://node-store.app.max-richter.dev/nodes"; - - const res = await fetch(url, { - method: "POST", - body: wasmContent, - }); - - if (res.ok) { - console.log(`Uploaded ${node.id}`); - } else { - const text = await res.text(); - console.log(`Failed to upload ${node.id}: ${res.status} ${text}`); - } -} - -for (const node of nodes) { - await postNode(node); -} diff --git a/store/compose.yml b/store/compose.yml deleted file mode 100644 index 7f287f9..0000000 --- a/store/compose.yml +++ /dev/null @@ -1,29 +0,0 @@ -services: - app: - image: denoland/deno:latest - working_dir: /app - ports: - - 8000:8000 - environment: - DATABASE_URL: postgres://nodarium:nodarium@db:5432/nodarium - volumes: - - .:/app - - deno-cache:/deno-dir/ - command: task dev - depends_on: - - db - - db: - image: postgres:latest - environment: - POSTGRES_USER: nodarium - POSTGRES_PASSWORD: nodarium - POSTGRES_DB: nodarium - ports: - - "5432:5432" - volumes: - - postgres-data:/var/lib/postgresql/data - -volumes: - postgres-data: - deno-cache: diff --git a/store/deno.json b/store/deno.json deleted file mode 100644 index 0249790..0000000 --- a/store/deno.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "tasks": { - "dev": "deno run -A --watch src/server.ts", - "run": "deno run -A src/server.ts", - "test": "deno run vitest", - "drizzle": "podman-compose exec app deno --env -A --node-modules-dir npm:drizzle-kit", - "upload": "deno run --allow-read --allow-net bin/upload.ts" - }, - "imports": { - "@asteasolutions/zod-to-openapi": "npm:@asteasolutions/zod-to-openapi@^7.3.0", - "@hono/swagger-ui": "npm:@hono/swagger-ui@^0.5.0", - "@hono/zod-openapi": "npm:@hono/zod-openapi@^0.18.3", - "@std/assert": "jsr:@std/assert@1", - "@types/pg": "npm:@types/pg@^8.11.10", - "drizzle-kit": "npm:drizzle-kit@^0.30.1", - "drizzle-orm": "npm:drizzle-orm@^0.38.2", - "hono": "npm:hono@^4.6.14", - "pg": "npm:pg@^8.13.1", - "vitest": "npm:vitest@^2.1.8", - "zod": "npm:zod@^3.24.1" - } -} diff --git a/store/deno.lock b/store/deno.lock deleted file mode 100644 index 4a82646..0000000 --- a/store/deno.lock +++ /dev/null @@ -1,883 +0,0 @@ -{ - "version": "4", - "specifiers": { - "jsr:@std/assert@1": "1.0.9", - "jsr:@std/assert@^1.0.9": "1.0.9", - "jsr:@std/bytes@^1.0.2": "1.0.4", - "jsr:@std/crypto@^1.0.3": "1.0.3", - "jsr:@std/expect@*": "1.0.9", - "jsr:@std/internal@^1.0.5": "1.0.5", - "jsr:@std/path@*": "1.0.8", - "jsr:@std/uuid@*": "1.0.4", - "npm:@asteasolutions/zod-to-openapi@^7.3.0": "7.3.0_zod@3.24.1", - "npm:@hono/swagger-ui@0.5": "0.5.0_hono@4.6.14", - "npm:@hono/zod-openapi@~0.18.3": "0.18.3_hono@4.6.14_zod@3.24.1", - "npm:@types/node@*": "22.5.4", - "npm:@types/pg@^8.11.10": "8.11.10", - "npm:drizzle-kit@*": "0.30.1_esbuild@0.19.12", - "npm:drizzle-kit@~0.30.1": "0.30.1_esbuild@0.19.12", - "npm:drizzle-orm@~0.38.2": "0.38.2_@types+pg@8.11.10_pg@8.13.1", - "npm:hono@^4.6.14": "4.6.14", - "npm:pg@^8.13.1": "8.13.1", - "npm:vitest@^2.1.8": "2.1.8_vite@5.4.11", - "npm:zod@^3.24.1": "3.24.1" - }, - "jsr": { - "@std/assert@1.0.9": { - "integrity": "a9f0c611a869cc791b26f523eec54c7e187aab7932c2c8e8bea0622d13680dcd", - "dependencies": [ - "jsr:@std/internal" - ] - }, - "@std/bytes@1.0.4": { - "integrity": "11a0debe522707c95c7b7ef89b478c13fb1583a7cfb9a85674cd2cc2e3a28abc" - }, - "@std/crypto@1.0.3": { - "integrity": "a2a32f51ddef632d299e3879cd027c630dcd4d1d9a5285d6e6788072f4e51e7f" - }, - "@std/expect@1.0.9": { - "integrity": "108bb428f17492ac40439479e1dc55fbaae581530e905a8603f97305842a5a01", - "dependencies": [ - "jsr:@std/assert@^1.0.9", - "jsr:@std/internal" - ] - }, - "@std/internal@1.0.5": { - "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" - }, - "@std/path@1.0.8": { - "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" - }, - "@std/uuid@1.0.4": { - "integrity": "f4233149cc8b4753cc3763fd83a7c4101699491f55c7be78dc7b30281946d7a0", - "dependencies": [ - "jsr:@std/bytes", - "jsr:@std/crypto" - ] - } - }, - "npm": { - "@asteasolutions/zod-to-openapi@7.3.0_zod@3.24.1": { - "integrity": "sha512-7tE/r1gXwMIvGnXVUdIqUhCU1RevEFC4Jk6Bussa0fk1ecbnnINkZzj1EOAJyE/M3AI25DnHT/zKQL1/FPFi8Q==", - "dependencies": [ - "openapi3-ts", - "zod" - ] - }, - "@drizzle-team/brocli@0.10.2": { - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==" - }, - "@esbuild-kit/core-utils@3.3.2": { - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "dependencies": [ - "esbuild@0.18.20", - "source-map-support" - ] - }, - "@esbuild-kit/esm-loader@2.6.5": { - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "dependencies": [ - "@esbuild-kit/core-utils", - "get-tsconfig" - ] - }, - "@esbuild/aix-ppc64@0.19.12": { - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==" - }, - "@esbuild/aix-ppc64@0.21.5": { - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==" - }, - "@esbuild/android-arm64@0.18.20": { - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==" - }, - "@esbuild/android-arm64@0.19.12": { - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==" - }, - "@esbuild/android-arm64@0.21.5": { - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==" - }, - "@esbuild/android-arm@0.18.20": { - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==" - }, - "@esbuild/android-arm@0.19.12": { - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==" - }, - "@esbuild/android-arm@0.21.5": { - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==" - }, - "@esbuild/android-x64@0.18.20": { - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==" - }, - "@esbuild/android-x64@0.19.12": { - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==" - }, - "@esbuild/android-x64@0.21.5": { - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==" - }, - "@esbuild/darwin-arm64@0.18.20": { - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==" - }, - "@esbuild/darwin-arm64@0.19.12": { - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==" - }, - "@esbuild/darwin-arm64@0.21.5": { - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==" - }, - "@esbuild/darwin-x64@0.18.20": { - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==" - }, - "@esbuild/darwin-x64@0.19.12": { - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==" - }, - "@esbuild/darwin-x64@0.21.5": { - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==" - }, - "@esbuild/freebsd-arm64@0.18.20": { - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==" - }, - "@esbuild/freebsd-arm64@0.19.12": { - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==" - }, - "@esbuild/freebsd-arm64@0.21.5": { - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==" - }, - "@esbuild/freebsd-x64@0.18.20": { - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==" - }, - "@esbuild/freebsd-x64@0.19.12": { - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==" - }, - "@esbuild/freebsd-x64@0.21.5": { - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==" - }, - "@esbuild/linux-arm64@0.18.20": { - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==" - }, - "@esbuild/linux-arm64@0.19.12": { - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==" - }, - "@esbuild/linux-arm64@0.21.5": { - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==" - }, - "@esbuild/linux-arm@0.18.20": { - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==" - }, - "@esbuild/linux-arm@0.19.12": { - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==" - }, - "@esbuild/linux-arm@0.21.5": { - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==" - }, - "@esbuild/linux-ia32@0.18.20": { - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==" - }, - "@esbuild/linux-ia32@0.19.12": { - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==" - }, - "@esbuild/linux-ia32@0.21.5": { - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==" - }, - "@esbuild/linux-loong64@0.18.20": { - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==" - }, - "@esbuild/linux-loong64@0.19.12": { - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==" - }, - "@esbuild/linux-loong64@0.21.5": { - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==" - }, - "@esbuild/linux-mips64el@0.18.20": { - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==" - }, - "@esbuild/linux-mips64el@0.19.12": { - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==" - }, - "@esbuild/linux-mips64el@0.21.5": { - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==" - }, - "@esbuild/linux-ppc64@0.18.20": { - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==" - }, - "@esbuild/linux-ppc64@0.19.12": { - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==" - }, - "@esbuild/linux-ppc64@0.21.5": { - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==" - }, - "@esbuild/linux-riscv64@0.18.20": { - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==" - }, - "@esbuild/linux-riscv64@0.19.12": { - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==" - }, - "@esbuild/linux-riscv64@0.21.5": { - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==" - }, - "@esbuild/linux-s390x@0.18.20": { - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==" - }, - "@esbuild/linux-s390x@0.19.12": { - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==" - }, - "@esbuild/linux-s390x@0.21.5": { - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==" - }, - "@esbuild/linux-x64@0.18.20": { - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==" - }, - "@esbuild/linux-x64@0.19.12": { - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==" - }, - "@esbuild/linux-x64@0.21.5": { - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==" - }, - "@esbuild/netbsd-x64@0.18.20": { - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==" - }, - "@esbuild/netbsd-x64@0.19.12": { - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==" - }, - "@esbuild/netbsd-x64@0.21.5": { - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==" - }, - "@esbuild/openbsd-x64@0.18.20": { - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==" - }, - "@esbuild/openbsd-x64@0.19.12": { - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==" - }, - "@esbuild/openbsd-x64@0.21.5": { - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==" - }, - "@esbuild/sunos-x64@0.18.20": { - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==" - }, - "@esbuild/sunos-x64@0.19.12": { - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==" - }, - "@esbuild/sunos-x64@0.21.5": { - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==" - }, - "@esbuild/win32-arm64@0.18.20": { - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==" - }, - "@esbuild/win32-arm64@0.19.12": { - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==" - }, - "@esbuild/win32-arm64@0.21.5": { - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==" - }, - "@esbuild/win32-ia32@0.18.20": { - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==" - }, - "@esbuild/win32-ia32@0.19.12": { - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==" - }, - "@esbuild/win32-ia32@0.21.5": { - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==" - }, - "@esbuild/win32-x64@0.18.20": { - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==" - }, - "@esbuild/win32-x64@0.19.12": { - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==" - }, - "@esbuild/win32-x64@0.21.5": { - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==" - }, - "@hono/swagger-ui@0.5.0_hono@4.6.14": { - "integrity": "sha512-MWYYSv9kC8IwFBLZdwgZZMT9zUq2C/4/ekuyEYOkHEgUMqu+FG3eebtBZ4ofMh60xYRxRR2BgQGoNIILys/PFg==", - "dependencies": [ - "hono" - ] - }, - "@hono/zod-openapi@0.18.3_hono@4.6.14_zod@3.24.1": { - "integrity": "sha512-bNlRDODnp7P9Fs13ZPajEOt13G0XwXKfKRHMEFCphQsFiD1Y+twzHaglpNAhNcflzR1DQwHY92ZS06b4LTPbIQ==", - "dependencies": [ - "@asteasolutions/zod-to-openapi", - "@hono/zod-validator", - "hono", - "zod" - ] - }, - "@hono/zod-validator@0.4.2_hono@4.6.14_zod@3.24.1": { - "integrity": "sha512-1rrlBg+EpDPhzOV4hT9pxr5+xDVmKuz6YJl+la7VCwK6ass5ldyKm5fD+umJdV2zhHD6jROoCCv8NbTwyfhT0g==", - "dependencies": [ - "hono", - "zod" - ] - }, - "@jridgewell/sourcemap-codec@1.5.0": { - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "@rollup/rollup-android-arm-eabi@4.28.1": { - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==" - }, - "@rollup/rollup-android-arm64@4.28.1": { - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==" - }, - "@rollup/rollup-darwin-arm64@4.28.1": { - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==" - }, - "@rollup/rollup-darwin-x64@4.28.1": { - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==" - }, - "@rollup/rollup-freebsd-arm64@4.28.1": { - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==" - }, - "@rollup/rollup-freebsd-x64@4.28.1": { - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==" - }, - "@rollup/rollup-linux-arm-gnueabihf@4.28.1": { - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==" - }, - "@rollup/rollup-linux-arm-musleabihf@4.28.1": { - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==" - }, - "@rollup/rollup-linux-arm64-gnu@4.28.1": { - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==" - }, - "@rollup/rollup-linux-arm64-musl@4.28.1": { - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==" - }, - "@rollup/rollup-linux-loongarch64-gnu@4.28.1": { - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==" - }, - "@rollup/rollup-linux-powerpc64le-gnu@4.28.1": { - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==" - }, - "@rollup/rollup-linux-riscv64-gnu@4.28.1": { - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==" - }, - "@rollup/rollup-linux-s390x-gnu@4.28.1": { - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==" - }, - "@rollup/rollup-linux-x64-gnu@4.28.1": { - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==" - }, - "@rollup/rollup-linux-x64-musl@4.28.1": { - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==" - }, - "@rollup/rollup-win32-arm64-msvc@4.28.1": { - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==" - }, - "@rollup/rollup-win32-ia32-msvc@4.28.1": { - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==" - }, - "@rollup/rollup-win32-x64-msvc@4.28.1": { - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==" - }, - "@types/estree@1.0.6": { - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "@types/node@22.5.4": { - "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", - "dependencies": [ - "undici-types" - ] - }, - "@types/pg@8.11.10": { - "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", - "dependencies": [ - "@types/node", - "pg-protocol", - "pg-types@4.0.2" - ] - }, - "@vitest/expect@2.1.8": { - "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", - "dependencies": [ - "@vitest/spy", - "@vitest/utils", - "chai", - "tinyrainbow" - ] - }, - "@vitest/mocker@2.1.8_vite@5.4.11": { - "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", - "dependencies": [ - "@vitest/spy", - "estree-walker", - "magic-string", - "vite" - ] - }, - "@vitest/pretty-format@2.1.8": { - "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", - "dependencies": [ - "tinyrainbow" - ] - }, - "@vitest/runner@2.1.8": { - "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", - "dependencies": [ - "@vitest/utils", - "pathe" - ] - }, - "@vitest/snapshot@2.1.8": { - "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", - "dependencies": [ - "@vitest/pretty-format", - "magic-string", - "pathe" - ] - }, - "@vitest/spy@2.1.8": { - "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", - "dependencies": [ - "tinyspy" - ] - }, - "@vitest/utils@2.1.8": { - "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", - "dependencies": [ - "@vitest/pretty-format", - "loupe", - "tinyrainbow" - ] - }, - "assertion-error@2.0.1": { - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" - }, - "buffer-from@1.1.2": { - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "cac@6.7.14": { - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" - }, - "chai@5.1.2": { - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "dependencies": [ - "assertion-error", - "check-error", - "deep-eql", - "loupe", - "pathval" - ] - }, - "check-error@2.1.1": { - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==" - }, - "debug@4.4.0": { - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": [ - "ms" - ] - }, - "deep-eql@5.0.2": { - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" - }, - "drizzle-kit@0.30.1_esbuild@0.19.12": { - "integrity": "sha512-HmA/NeewvHywhJ2ENXD3KvOuM/+K2dGLJfxVfIHsGwaqKICJnS+Ke2L6UcSrSrtMJLJaT0Im1Qv4TFXfaZShyw==", - "dependencies": [ - "@drizzle-team/brocli", - "@esbuild-kit/esm-loader", - "esbuild@0.19.12", - "esbuild-register" - ] - }, - "drizzle-orm@0.38.2_@types+pg@8.11.10_pg@8.13.1": { - "integrity": "sha512-eCE3yPRAskLo1WpM9OHpFaM70tBEDsWhwR/0M3CKyztAXKR9Qs3asZlcJOEliIcUSg8GuwrlY0dmYDgmm6y5GQ==", - "dependencies": [ - "@types/pg", - "pg" - ] - }, - "es-module-lexer@1.5.4": { - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" - }, - "esbuild-register@3.6.0_esbuild@0.19.12": { - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dependencies": [ - "debug", - "esbuild@0.19.12" - ] - }, - "esbuild@0.18.20": { - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dependencies": [ - "@esbuild/android-arm@0.18.20", - "@esbuild/android-arm64@0.18.20", - "@esbuild/android-x64@0.18.20", - "@esbuild/darwin-arm64@0.18.20", - "@esbuild/darwin-x64@0.18.20", - "@esbuild/freebsd-arm64@0.18.20", - "@esbuild/freebsd-x64@0.18.20", - "@esbuild/linux-arm@0.18.20", - "@esbuild/linux-arm64@0.18.20", - "@esbuild/linux-ia32@0.18.20", - "@esbuild/linux-loong64@0.18.20", - "@esbuild/linux-mips64el@0.18.20", - "@esbuild/linux-ppc64@0.18.20", - "@esbuild/linux-riscv64@0.18.20", - "@esbuild/linux-s390x@0.18.20", - "@esbuild/linux-x64@0.18.20", - "@esbuild/netbsd-x64@0.18.20", - "@esbuild/openbsd-x64@0.18.20", - "@esbuild/sunos-x64@0.18.20", - "@esbuild/win32-arm64@0.18.20", - "@esbuild/win32-ia32@0.18.20", - "@esbuild/win32-x64@0.18.20" - ] - }, - "esbuild@0.19.12": { - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dependencies": [ - "@esbuild/aix-ppc64@0.19.12", - "@esbuild/android-arm@0.19.12", - "@esbuild/android-arm64@0.19.12", - "@esbuild/android-x64@0.19.12", - "@esbuild/darwin-arm64@0.19.12", - "@esbuild/darwin-x64@0.19.12", - "@esbuild/freebsd-arm64@0.19.12", - "@esbuild/freebsd-x64@0.19.12", - "@esbuild/linux-arm@0.19.12", - "@esbuild/linux-arm64@0.19.12", - "@esbuild/linux-ia32@0.19.12", - "@esbuild/linux-loong64@0.19.12", - "@esbuild/linux-mips64el@0.19.12", - "@esbuild/linux-ppc64@0.19.12", - "@esbuild/linux-riscv64@0.19.12", - "@esbuild/linux-s390x@0.19.12", - "@esbuild/linux-x64@0.19.12", - "@esbuild/netbsd-x64@0.19.12", - "@esbuild/openbsd-x64@0.19.12", - "@esbuild/sunos-x64@0.19.12", - "@esbuild/win32-arm64@0.19.12", - "@esbuild/win32-ia32@0.19.12", - "@esbuild/win32-x64@0.19.12" - ] - }, - "esbuild@0.21.5": { - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dependencies": [ - "@esbuild/aix-ppc64@0.21.5", - "@esbuild/android-arm@0.21.5", - "@esbuild/android-arm64@0.21.5", - "@esbuild/android-x64@0.21.5", - "@esbuild/darwin-arm64@0.21.5", - "@esbuild/darwin-x64@0.21.5", - "@esbuild/freebsd-arm64@0.21.5", - "@esbuild/freebsd-x64@0.21.5", - "@esbuild/linux-arm@0.21.5", - "@esbuild/linux-arm64@0.21.5", - "@esbuild/linux-ia32@0.21.5", - "@esbuild/linux-loong64@0.21.5", - "@esbuild/linux-mips64el@0.21.5", - "@esbuild/linux-ppc64@0.21.5", - "@esbuild/linux-riscv64@0.21.5", - "@esbuild/linux-s390x@0.21.5", - "@esbuild/linux-x64@0.21.5", - "@esbuild/netbsd-x64@0.21.5", - "@esbuild/openbsd-x64@0.21.5", - "@esbuild/sunos-x64@0.21.5", - "@esbuild/win32-arm64@0.21.5", - "@esbuild/win32-ia32@0.21.5", - "@esbuild/win32-x64@0.21.5" - ] - }, - "estree-walker@3.0.3": { - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": [ - "@types/estree" - ] - }, - "expect-type@1.1.0": { - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==" - }, - "fsevents@2.3.3": { - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" - }, - "get-tsconfig@4.8.1": { - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dependencies": [ - "resolve-pkg-maps" - ] - }, - "hono@4.6.14": { - "integrity": "sha512-j4VkyUp2xazGJ8eCCLN1Vm/bxdvm/j5ZuU9AIjLu9vapn2M44p9L3Ktr9Vnb2RN2QtcR/wVjZVMlT5k7GJQgPw==" - }, - "loupe@3.1.2": { - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==" - }, - "magic-string@0.30.17": { - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": [ - "@jridgewell/sourcemap-codec" - ] - }, - "ms@2.1.3": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "nanoid@3.3.8": { - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" - }, - "obuf@1.1.2": { - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "openapi3-ts@4.4.0": { - "integrity": "sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==", - "dependencies": [ - "yaml" - ] - }, - "pathe@1.1.2": { - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "pathval@2.0.0": { - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==" - }, - "pg-cloudflare@1.1.1": { - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==" - }, - "pg-connection-string@2.7.0": { - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" - }, - "pg-int8@1.0.1": { - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" - }, - "pg-numeric@1.0.2": { - "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==" - }, - "pg-pool@3.7.0_pg@8.13.1": { - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", - "dependencies": [ - "pg" - ] - }, - "pg-protocol@1.7.0": { - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" - }, - "pg-types@2.2.0": { - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": [ - "pg-int8", - "postgres-array@2.0.0", - "postgres-bytea@1.0.0", - "postgres-date@1.0.7", - "postgres-interval@1.2.0" - ] - }, - "pg-types@4.0.2": { - "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", - "dependencies": [ - "pg-int8", - "pg-numeric", - "postgres-array@3.0.2", - "postgres-bytea@3.0.0", - "postgres-date@2.1.0", - "postgres-interval@3.0.0", - "postgres-range" - ] - }, - "pg@8.13.1": { - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", - "dependencies": [ - "pg-cloudflare", - "pg-connection-string", - "pg-pool", - "pg-protocol", - "pg-types@2.2.0", - "pgpass" - ] - }, - "pgpass@1.0.5": { - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": [ - "split2" - ] - }, - "picocolors@1.1.1": { - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "postcss@8.4.49": { - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dependencies": [ - "nanoid", - "picocolors", - "source-map-js" - ] - }, - "postgres-array@2.0.0": { - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" - }, - "postgres-array@3.0.2": { - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==" - }, - "postgres-bytea@1.0.0": { - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" - }, - "postgres-bytea@3.0.0": { - "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", - "dependencies": [ - "obuf" - ] - }, - "postgres-date@1.0.7": { - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" - }, - "postgres-date@2.1.0": { - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==" - }, - "postgres-interval@1.2.0": { - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": [ - "xtend" - ] - }, - "postgres-interval@3.0.0": { - "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==" - }, - "postgres-range@1.1.4": { - "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==" - }, - "resolve-pkg-maps@1.0.0": { - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" - }, - "rollup@4.28.1": { - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", - "dependencies": [ - "@rollup/rollup-android-arm-eabi", - "@rollup/rollup-android-arm64", - "@rollup/rollup-darwin-arm64", - "@rollup/rollup-darwin-x64", - "@rollup/rollup-freebsd-arm64", - "@rollup/rollup-freebsd-x64", - "@rollup/rollup-linux-arm-gnueabihf", - "@rollup/rollup-linux-arm-musleabihf", - "@rollup/rollup-linux-arm64-gnu", - "@rollup/rollup-linux-arm64-musl", - "@rollup/rollup-linux-loongarch64-gnu", - "@rollup/rollup-linux-powerpc64le-gnu", - "@rollup/rollup-linux-riscv64-gnu", - "@rollup/rollup-linux-s390x-gnu", - "@rollup/rollup-linux-x64-gnu", - "@rollup/rollup-linux-x64-musl", - "@rollup/rollup-win32-arm64-msvc", - "@rollup/rollup-win32-ia32-msvc", - "@rollup/rollup-win32-x64-msvc", - "@types/estree", - "fsevents" - ] - }, - "siginfo@2.0.0": { - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "source-map-js@1.2.1": { - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "source-map-support@0.5.21": { - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": [ - "buffer-from", - "source-map" - ] - }, - "source-map@0.6.1": { - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "split2@4.2.0": { - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" - }, - "stackback@0.0.2": { - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "std-env@3.8.0": { - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" - }, - "tinybench@2.9.0": { - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - }, - "tinyexec@0.3.1": { - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" - }, - "tinypool@1.0.2": { - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==" - }, - "tinyrainbow@1.2.0": { - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==" - }, - "tinyspy@3.0.2": { - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==" - }, - "undici-types@6.19.8": { - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "vite-node@2.1.8": { - "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", - "dependencies": [ - "cac", - "debug", - "es-module-lexer", - "pathe", - "vite" - ] - }, - "vite@5.4.11": { - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dependencies": [ - "esbuild@0.21.5", - "fsevents", - "postcss", - "rollup" - ] - }, - "vitest@2.1.8_vite@5.4.11": { - "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", - "dependencies": [ - "@vitest/expect", - "@vitest/mocker", - "@vitest/pretty-format", - "@vitest/runner", - "@vitest/snapshot", - "@vitest/spy", - "@vitest/utils", - "chai", - "debug", - "expect-type", - "magic-string", - "pathe", - "std-env", - "tinybench", - "tinyexec", - "tinypool", - "tinyrainbow", - "vite", - "vite-node", - "why-is-node-running" - ] - }, - "why-is-node-running@2.3.0": { - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": [ - "siginfo", - "stackback" - ] - }, - "xtend@4.0.2": { - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yaml@2.6.1": { - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==" - }, - "zod@3.24.1": { - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" - } - }, - "workspace": { - "dependencies": [ - "jsr:@std/assert@1", - "npm:@asteasolutions/zod-to-openapi@^7.3.0", - "npm:@hono/swagger-ui@0.5", - "npm:@hono/zod-openapi@~0.18.3", - "npm:@types/pg@^8.11.10", - "npm:drizzle-kit@~0.30.1", - "npm:drizzle-orm@~0.38.2", - "npm:hono@^4.6.14", - "npm:pg@^8.13.1", - "npm:vitest@^2.1.8", - "npm:zod@^3.24.1" - ] - } -} diff --git a/store/drizzle.config.ts b/store/drizzle.config.ts deleted file mode 100644 index 9281193..0000000 --- a/store/drizzle.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - out: "./drizzle", - schema: "./src/db/schema.ts", - dialect: "postgresql", - dbCredentials: { - url: Deno.env.get("DATABASE_URL")!, - }, -}); - diff --git a/store/drizzle/0000_known_kid_colt.sql b/store/drizzle/0000_known_kid_colt.sql deleted file mode 100644 index 79e4a3c..0000000 --- a/store/drizzle/0000_known_kid_colt.sql +++ /dev/null @@ -1,25 +0,0 @@ -CREATE TABLE "users" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "name" text NOT NULL, - CONSTRAINT "users_name_unique" UNIQUE("name") -); ---> statement-breakpoint -CREATE TABLE "nodes" ( - "id" serial PRIMARY KEY NOT NULL, - "userId" varchar NOT NULL, - "createdAt" timestamp DEFAULT now(), - "systemId" varchar NOT NULL, - "nodeId" varchar NOT NULL, - "content" "bytea" NOT NULL, - "definition" json NOT NULL, - "hash" varchar(16) NOT NULL, - "previous" varchar(16), - CONSTRAINT "nodes_hash_unique" UNIQUE("hash") -); ---> statement-breakpoint -ALTER TABLE "nodes" ADD CONSTRAINT "nodes_userId_users_name_fk" FOREIGN KEY ("userId") REFERENCES "public"."users"("name") ON DELETE no action ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "nodes" ADD CONSTRAINT "node_previous_fk" FOREIGN KEY ("previous") REFERENCES "public"."nodes"("hash") ON DELETE no action ON UPDATE no action;--> statement-breakpoint -CREATE INDEX "user_id_idx" ON "nodes" USING btree ("userId");--> statement-breakpoint -CREATE INDEX "system_id_idx" ON "nodes" USING btree ("systemId");--> statement-breakpoint -CREATE INDEX "node_id_idx" ON "nodes" USING btree ("nodeId");--> statement-breakpoint -CREATE INDEX "hash_idx" ON "nodes" USING btree ("hash"); \ No newline at end of file diff --git a/store/drizzle/meta/0000_snapshot.json b/store/drizzle/meta/0000_snapshot.json deleted file mode 100644 index a433496..0000000 --- a/store/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "id": "15ad729d-5756-4c06-87ed-cb8b721201f9", - "prevId": "00000000-0000-0000-0000-000000000000", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_name_unique": { - "name": "users_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.nodes": { - "name": "nodes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "userId": { - "name": "userId", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "systemId": { - "name": "systemId", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "nodeId": { - "name": "nodeId", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "content": { - "name": "content", - "type": "bytea", - "primaryKey": false, - "notNull": true - }, - "definition": { - "name": "definition", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "hash": { - "name": "hash", - "type": "varchar(16)", - "primaryKey": false, - "notNull": true - }, - "previous": { - "name": "previous", - "type": "varchar(16)", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - { - "expression": "userId", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "system_id_idx": { - "name": "system_id_idx", - "columns": [ - { - "expression": "systemId", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "node_id_idx": { - "name": "node_id_idx", - "columns": [ - { - "expression": "nodeId", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "hash_idx": { - "name": "hash_idx", - "columns": [ - { - "expression": "hash", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "nodes_userId_users_name_fk": { - "name": "nodes_userId_users_name_fk", - "tableFrom": "nodes", - "tableTo": "users", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "name" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "node_previous_fk": { - "name": "node_previous_fk", - "tableFrom": "nodes", - "tableTo": "nodes", - "columnsFrom": [ - "previous" - ], - "columnsTo": [ - "hash" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "nodes_hash_unique": { - "name": "nodes_hash_unique", - "nullsNotDistinct": false, - "columns": [ - "hash" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - } - }, - "enums": {}, - "schemas": {}, - "sequences": {}, - "roles": {}, - "policies": {}, - "views": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/store/drizzle/meta/_journal.json b/store/drizzle/meta/_journal.json deleted file mode 100644 index a9ab8d0..0000000 --- a/store/drizzle/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1734703963242, - "tag": "0000_known_kid_colt", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/store/openapi.json b/store/openapi.json deleted file mode 100644 index d4ee70d..0000000 --- a/store/openapi.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.0.0","info":{"version":"1.0.0","title":"Nodarium API"},"components":{"schemas":{"NodeInput":{"anyOf":[{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["seed"]},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["boolean"]},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["float"]},"element":{"type":"string","enum":["slider"]},"value":{"type":"number"},"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["integer"]},"element":{"type":"string","enum":["slider"]},"value":{"type":"number"},"min":{"type":"number"},"max":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["select"]},"options":{"type":"array","items":{"type":"string"}},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["seed"]},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["vec3"]},"value":{"type":"array","items":{"type":"number"}}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["geometry"]}},"required":["type"]},{"type":"object","properties":{"internal":{"type":"boolean"},"external":{"type":"boolean"},"setting":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"accepts":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean"},"type":{"type":"string","enum":["path"]}},"required":["type"]}]},"NodeDefinition":{"type":"object","properties":{"id":{"type":"string","pattern":"^([a-z0-9-]+)\\/([a-z0-9-]+)\\/([a-z0-9-]+)$"},"inputs":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/NodeInput"}},"outputs":{"type":"array","items":{"type":"string"}},"meta":{"type":"object","properties":{"description":{"type":"string"},"title":{"type":"string"}}}},"required":["id"]},"User":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1}},"required":["id","name"]}},"parameters":{}},"paths":{"/nodes":{"post":{"responses":{"200":{"description":"Create a single node","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeDefinition"}}}}}}},"/nodes/{user}.json":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":false,"name":"user","in":"path"}],"responses":{"200":{"description":"Retrieve nodes for a user","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NodeDefinition"}}}}}}}},"/nodes/{user}/{system}.json":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"user","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":false,"name":"system","in":"path"}],"responses":{"200":{"description":"Retrieve nodes for a system","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NodeDefinition"}}}}}}}},"/nodes/{user}/{system}/{nodeId}.json":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"user","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"system","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":false,"name":"nodeId","in":"path"}],"responses":{"200":{"description":"Retrieve a single node definition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeDefinition"}}}}}}},"/nodes/{user}/{system}/{nodeId}@{version}.json":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"user","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"system","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"nodeId","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":false,"name":"version","in":"path"}],"responses":{"200":{"description":"Retrieve a single node definition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeDefinition"}}}}}}},"/nodes/{user}/{system}/{nodeId}/versions.json":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"user","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"system","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"nodeId","in":"path"}],"responses":{"200":{"description":"Retrieve a single node definition","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NodeDefinition"}}}}}}}},"/nodes/{user}/{system}/{nodeId}.wasm":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"user","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"system","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":false,"name":"nodeId","in":"path"}],"responses":{"200":{"description":"Retrieve a node's WASM file","content":{"application/wasm":{"schema":{"nullable":true}}}}}}},"/nodes/{user}/{system}/{nodeId}@{version}.wasm":{"get":{"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"user","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"system","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":true,"name":"nodeId","in":"path"},{"schema":{"type":"string","minLength":3,"maxLength":20},"required":false,"name":"version","in":"path"}],"responses":{"200":{"description":"Retrieve a node's WASM file","content":{"application/wasm":{"schema":{"nullable":true}}}}}}},"/users/users.json":{"get":{"responses":{"200":{"description":"Retrieve a single node definition","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}}}}},"/users/{userId}.json":{"get":{"parameters":[{"schema":{"type":"string"},"required":false,"name":"userId","in":"path"}],"responses":{"200":{"description":"Retrieve a single node definition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}}}}}} \ No newline at end of file diff --git a/store/src/db/db.ts b/store/src/db/db.ts deleted file mode 100644 index 5fb68b6..0000000 --- a/store/src/db/db.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { drizzle } from "drizzle-orm/node-postgres"; -import pg from "pg"; -import * as schema from "./schema.ts"; - -import { migrate } from "drizzle-orm/node-postgres/migrator"; - -// Use pg driver. -const { Pool } = pg; - -// Instantiate Drizzle client with pg driver and schema. -export const db = drizzle({ - client: new Pool({ - max: 20, - connectionString: Deno.env.get("DATABASE_URL"), - }), - schema, -}); - -export async function migrateDb() { - await migrate(db, { migrationsFolder: "drizzle" }); - console.log("Database migrated"); -} diff --git a/store/src/db/schema.ts b/store/src/db/schema.ts deleted file mode 100644 index b1953cc..0000000 --- a/store/src/db/schema.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "../routes/user/user.schema.ts"; -export * from "../routes/node/node.schema.ts"; diff --git a/store/src/routes/node/errors.ts b/store/src/routes/node/errors.ts deleted file mode 100644 index 24a7d55..0000000 --- a/store/src/routes/node/errors.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { StatusCode } from "hono"; - -export class CustomError extends Error { - constructor(public status: StatusCode, message: string) { - super(message); - this.name = this.constructor.name; - Error.captureStackTrace(this, this.constructor); - } -} - -export class NodeNotFoundError extends CustomError { - constructor() { - super(404, "Node not found"); - } -} - -export class InvalidNodeDefinitionError extends CustomError { - constructor() { - super(400, "Invalid node definition"); - } -} - -export class WorkerTimeoutError extends CustomError { - constructor() { - super(500, "Worker timed out"); - } -} - -export class UnknownWorkerResponseError extends CustomError { - constructor() { - super(500, "Unknown worker response"); - } -} diff --git a/store/src/routes/node/node.controller.ts b/store/src/routes/node/node.controller.ts deleted file mode 100644 index d17eec7..0000000 --- a/store/src/routes/node/node.controller.ts +++ /dev/null @@ -1,352 +0,0 @@ -import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; -import { HTTPException } from "hono/http-exception"; -import { idRegex, NodeDefinitionSchema } from "./validations/types.ts"; -import * as service from "./node.service.ts"; -import { bodyLimit } from "hono/body-limit"; -import { ZodSchema } from "zod"; -import { CustomError } from "./errors.ts"; - -const nodeRouter = new OpenAPIHono(); - -const createParamSchema = (name: string) => - z - .string() - .min(3) - .max(20) - .refine( - (value) => idRegex.test(value), - `${name} must contain only letters, numbers, "-", or "_"`, - ) - .openapi({ param: { name, in: "path" } }); - -const createResponseSchema = ( - description: string, - schema: T, -) => ({ - 200: { - content: { "application/json": { schema } }, - description, - }, -}); - -async function getNodeByVersion( - user: string, - system: string, - nodeId: string, - hash?: string, -) { - console.log("Get Node by Version", { user, system, nodeId, hash }); - if (hash) { - if (nodeId.includes("wasm")) { - return await service.getNodeVersionWasm( - user, - system, - nodeId.replace(".wasm", ""), - hash, - ); - } else { - const wasmContent = await service.getNodeVersion( - user, - system, - nodeId, - hash, - ); - return wasmContent; - } - } else { - if (nodeId.includes(".wasm")) { - const [id, version] = nodeId.replace(/\.wasm$/, "").split("@"); - console.log({ user, system, id, version }); - if (version) { - return service.getNodeVersionWasm(user, system, id, version); - } else { - return service.getNodeWasmById(user, system, id); - } - } else { - const [id, version] = nodeId.replace(/\.json$/, "").split("@"); - if (!version) { - return service.getNodeDefinitionById(user, system, id); - } else { - return await service.getNodeVersion(user, system, id, version); - } - } - } -} - -nodeRouter.openapi( - createRoute({ - method: "post", - path: "/", - responses: createResponseSchema( - "Create a single node", - NodeDefinitionSchema, - ), - middleware: [ - bodyLimit({ - maxSize: 128 * 1024, // 128 KB - onError: (c) => c.text("Node content too large", 413), - }), - ], - }), - async (c) => { - const buffer = await c.req.arrayBuffer(); - const bytes = new Uint8Array(buffer); - try { - const node = await service.createNode(buffer, bytes); - return c.json(node); - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}.json", - request: { - params: z.object({ - user: createParamSchema("user").optional(), - }), - }, - responses: createResponseSchema( - "Retrieve nodes for a user", - z.array(NodeDefinitionSchema), - ), - }), - async (c) => { - const user = c.req.param("user.json").replace(/\.json$/, ""); - try { - const nodes = await service.getNodeDefinitionsByUser(user); - return c.json(nodes); - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}/{system}.json", - request: { - params: z.object({ - user: createParamSchema("user"), - system: createParamSchema("system").optional(), - }), - }, - responses: createResponseSchema( - "Retrieve nodes for a system", - z.array(NodeDefinitionSchema), - ), - }), - async (c) => { - const { user } = c.req.valid("param"); - const system = c.req.param("system.json").replace(/\.json$/, ""); - console.log("Get Nodes by System", { user, system }); - try { - const nodes = await service.getNodesBySystem(user, system); - return c.json({ - id: `${user}/${system}`, - nodes: nodes.map((n) => ({ id: n.id.split("@")[0] })), - }); - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}/{system}/{nodeId}.json", - request: { - params: z.object({ - user: createParamSchema("user"), - system: createParamSchema("system"), - nodeId: createParamSchema("nodeId").optional(), - }), - }, - responses: createResponseSchema( - "Retrieve a single node definition", - NodeDefinitionSchema, - ), - }), - async (c) => { - const { user, system } = c.req.valid("param"); - const nodeId = c.req.param("nodeId.json").replace(/\.json$/, ""); - console.log("Get Node by Id", { user, system, nodeId }); - try { - const res = await getNodeByVersion(user, system, nodeId); - if (res instanceof ArrayBuffer) { - c.header("Content-Type", "application/wasm"); - return c.body(res); - } else { - return c.json(res); - } - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}/{system}/{nodeId}@{version}.json", - request: { - params: z.object({ - user: createParamSchema("user"), - system: createParamSchema("system"), - nodeId: createParamSchema("nodeId"), - version: createParamSchema("version").optional(), - }), - }, - responses: createResponseSchema( - "Retrieve a single node definition", - NodeDefinitionSchema, - ), - }), - async (c) => { - const { user, system, nodeId } = c.req.valid("param"); - const hash = c.req.param("version.json"); - try { - const res = await getNodeByVersion(user, system, nodeId, hash); - if (res instanceof ArrayBuffer) { - c.header("Content-Type", "application/wasm"); - return c.body(res); - } else { - return c.json(res); - } - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}/{system}/{nodeId}/versions.json", - request: { - params: z.object({ - user: createParamSchema("user"), - system: createParamSchema("system"), - nodeId: createParamSchema("nodeId"), - }), - }, - responses: createResponseSchema( - "Retrieve a single node definition", - z.array(NodeDefinitionSchema), - ), - }), - async (c) => { - const { user, system, nodeId } = c.req.valid("param"); - - try { - const node = await service.getNodeVersions(user, system, nodeId); - - return c.json(node); - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}/{system}/{nodeId}.wasm", - request: { - params: z.object({ - user: createParamSchema("user"), - system: createParamSchema("system"), - nodeId: createParamSchema("nodeId").optional(), - }), - }, - responses: { - 200: { - content: { "application/wasm": { schema: z.any() } }, - description: "Retrieve a node's WASM file", - }, - }, - }), - async (c) => { - const { user, system } = c.req.valid("param"); - const nodeId = c.req.param("nodeId.wasm"); - console.log("Get NodeWasm by Id", { user, system, nodeId }); - try { - const res = await getNodeByVersion(user, system, nodeId); - if (res instanceof ArrayBuffer) { - c.header("Content-Type", "application/wasm"); - return c.body(res); - } else { - return c.json(res); - } - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -nodeRouter.openapi( - createRoute({ - method: "get", - path: "/{user}/{system}/{nodeId}@{version}.wasm", - request: { - params: z.object({ - user: createParamSchema("user"), - system: createParamSchema("system"), - nodeId: createParamSchema("nodeId"), - version: createParamSchema("version").optional(), - }), - }, - responses: { - 200: { - content: { "application/wasm": { schema: z.any() } }, - description: "Retrieve a node's WASM file", - }, - }, - }), - async (c) => { - const { user, system, nodeId } = c.req.valid("param"); - const hash = c.req.param("version.wasm"); - try { - const res = await getNodeByVersion(user, system, nodeId, hash); - if (res instanceof ArrayBuffer) { - c.header("Content-Type", "application/wasm"); - return c.body(res); - } else { - return c.json(res); - } - } catch (error) { - if (error instanceof CustomError) { - throw new HTTPException(error.status, { message: error.message }); - } - throw new HTTPException(500, { message: "Internal server error" }); - } - }, -); - -export { nodeRouter }; diff --git a/store/src/routes/node/node.schema.ts b/store/src/routes/node/node.schema.ts deleted file mode 100644 index 4d8dac6..0000000 --- a/store/src/routes/node/node.schema.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - customType, - foreignKey, - index, - json, - pgTable, - serial, - timestamp, - varchar, -} from "drizzle-orm/pg-core"; -import { usersTable } from "../user/user.schema.ts"; -import { NodeDefinition } from "./validations/types.ts"; - -const bytea = customType<{ - data: ArrayBuffer; - default: false; -}>({ - dataType() { - return "bytea"; - }, -}); - -export const nodeTable = pgTable("nodes", { - id: serial().primaryKey(), - userId: varchar().notNull().references(() => usersTable.name), - createdAt: timestamp().defaultNow(), - systemId: varchar().notNull(), - nodeId: varchar().notNull(), - content: bytea().notNull(), - definition: json().notNull().$type(), - hash: varchar({ length: 16 }).notNull().unique(), - previous: varchar({ length: 16 }), -}, (table) => [ - foreignKey({ - columns: [table.previous], - foreignColumns: [table.hash], - name: "node_previous_fk", - }), - index("user_id_idx").on(table.userId), - index("system_id_idx").on(table.systemId), - index("node_id_idx").on(table.nodeId), - index("hash_idx").on(table.hash), -]); diff --git a/store/src/routes/node/node.service.ts b/store/src/routes/node/node.service.ts deleted file mode 100644 index be1dc5b..0000000 --- a/store/src/routes/node/node.service.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { db } from "../../db/db.ts"; -import { nodeTable } from "./node.schema.ts"; -import { NodeDefinition, NodeDefinitionSchema } from "./validations/types.ts"; -import { and, asc, eq } from "drizzle-orm"; -import { createHash } from "node:crypto"; -import { extractDefinition } from "./worker/index.ts"; -import { InvalidNodeDefinitionError, NodeNotFoundError } from "./errors.ts"; - -export type CreateNodeDTO = { - id: string; - system: string; - user: string; - content: ArrayBuffer; -}; - -function getNodeHash(content: Uint8Array) { - const hash = createHash("sha256"); - hash.update(content); - return hash.digest("hex").slice(0, 16); -} - -export async function createNode( - wasmBuffer: ArrayBuffer, - content: Uint8Array, -): Promise { - const def = await extractDefinition(wasmBuffer); - - const [userId, systemId, nodeId] = def.id.split("/"); - - const hash = getNodeHash(content); - - const node: typeof nodeTable.$inferInsert = { - userId, - systemId, - nodeId, - definition: def, - hash, - content: content, - }; - - const previousNode = await db - .select({ hash: nodeTable.hash }) - .from(nodeTable) - .orderBy(asc(nodeTable.createdAt)) - .limit(1); - - if (previousNode[0]) { - node.previous = previousNode[0].hash; - } - - await db.insert(nodeTable).values(node); - return def; -} - -export async function getNodeDefinitionsByUser(userName: string) { - const nodes = await db - .select({ - definition: nodeTable.definition, - hash: nodeTable.hash, - }) - .from(nodeTable) - .where(and(eq(nodeTable.userId, userName))); - - return nodes.map((n) => ({ - ...n.definition, - // id: n.definition.id + "@" + n.hash, - })); -} - -export async function getNodesBySystem( - username: string, - systemId: string, -): Promise { - const nodes = await db - .selectDistinctOn( - [nodeTable.userId, nodeTable.systemId, nodeTable.nodeId], - { definition: nodeTable.definition, hash: nodeTable.hash }, - ) - .from(nodeTable) - .where( - and(eq(nodeTable.systemId, systemId), eq(nodeTable.userId, username)), - ) - .orderBy(nodeTable.userId, nodeTable.systemId, nodeTable.nodeId); - - const definitions = nodes - .map( - (node) => - [NodeDefinitionSchema.safeParse(node.definition), node.hash] as const, - ) - .filter(([v]) => v.success) - .map(([v, hash]) => ({ - ...v.data, - // id: v?.data?.id + "@" + hash, - })); - - return definitions; -} - -export async function getNodeWasmById( - userName: string, - systemId: string, - nodeId: string, -) { - const node = await db - .select({ content: nodeTable.content }) - .from(nodeTable) - .where( - and( - eq(nodeTable.userId, userName), - eq(nodeTable.systemId, systemId), - eq(nodeTable.nodeId, nodeId), - ), - ) - .orderBy(asc(nodeTable.createdAt)) - .limit(1); - - if (!node[0]) { - throw new NodeNotFoundError(); - } - - return node[0].content; -} - -export async function getNodeDefinitionById( - userName: string, - systemId: string, - nodeId: string, -) { - const node = await db - .select({ - definition: nodeTable.definition, - hash: nodeTable.hash, - }) - .from(nodeTable) - .where( - and( - eq(nodeTable.userId, userName), - eq(nodeTable.systemId, systemId), - eq(nodeTable.nodeId, nodeId), - ), - ) - .orderBy(asc(nodeTable.createdAt)) - .limit(1); - - if (!node[0]) { - throw new NodeNotFoundError(); - } - - const definition = NodeDefinitionSchema.safeParse(node[0]?.definition); - - if (!definition.success) { - throw new InvalidNodeDefinitionError(); - } - - return { - ...definition.data, - // id: definition.data.id + "@" + node[0].hash - }; -} - -export async function getNodeVersions( - user: string, - system: string, - nodeId: string, -) { - const nodes = await db - .select({ - definition: nodeTable.definition, - hash: nodeTable.hash, - }) - .from(nodeTable) - .where( - and( - eq(nodeTable.userId, user), - eq(nodeTable.systemId, system), - eq(nodeTable.nodeId, nodeId), - ), - ) - .orderBy(asc(nodeTable.createdAt)); - - return nodes.map((node) => ({ - ...node.definition, - // id: node.definition.id + "@" + node.hash, - })); -} - -export async function getNodeVersion( - user: string, - system: string, - nodeId: string, - hash: string, -) { - const nodes = await db - .select({ - definition: nodeTable.definition, - }) - .from(nodeTable) - .where( - and( - eq(nodeTable.userId, user), - eq(nodeTable.systemId, system), - eq(nodeTable.nodeId, nodeId), - eq(nodeTable.hash, hash), - ), - ) - .limit(1); - - if (nodes.length === 0) { - throw new NodeNotFoundError(); - } - - return nodes[0].definition; -} - -export async function getNodeVersionWasm( - user: string, - system: string, - nodeId: string, - hash: string, -) { - const node = await db - .select({ - content: nodeTable.content, - }) - .from(nodeTable) - .where( - and( - eq(nodeTable.userId, user), - eq(nodeTable.systemId, system), - eq(nodeTable.nodeId, nodeId), - eq(nodeTable.hash, hash), - ), - ) - .limit(1); - - if (node.length === 0) { - throw new NodeNotFoundError(); - } - - return node[0].content; -} diff --git a/store/src/routes/node/node.test.ts b/store/src/routes/node/node.test.ts deleted file mode 100644 index bfd4522..0000000 --- a/store/src/routes/node/node.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { expect } from "jsr:@std/expect"; -import { router } from "../router.ts"; - -Deno.test("simple test", async () => { - const res = await router.request("/max/plants/test.json"); - const json = await res.text(); - - expect(true).toEqual(true); - - expect(json).toEqual({ hello: "world" }); -}); diff --git a/store/src/routes/node/validations/inputs.ts b/store/src/routes/node/validations/inputs.ts deleted file mode 100644 index 6e21773..0000000 --- a/store/src/routes/node/validations/inputs.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { z } from "@hono/zod-openapi"; - -const DefaultOptionsSchema = z.object({ - internal: z.boolean().optional(), - external: z.boolean().optional(), - setting: z.string().optional(), - label: z.string().optional(), - description: z.string().optional(), - accepts: z.array(z.string()).optional(), - hidden: z.boolean().optional(), -}); - -const NodeInputFloatSchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("float"), - element: z.literal("slider").optional(), - value: z.number().optional(), - min: z.number().optional(), - max: z.number().optional(), - step: z.number().optional(), -}); - -const NodeInputIntegerSchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("integer"), - element: z.literal("slider").optional(), - value: z.number().optional(), - min: z.number().optional(), - max: z.number().optional(), -}); - -const NodeInputBooleanSchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("boolean"), - value: z.boolean().optional(), -}); - -const NodeInputSelectSchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("select"), - options: z.array(z.string()).optional(), - value: z.number().optional(), -}); - -const NodeInputSeedSchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("seed"), - value: z.number().optional(), -}); - -const NodeInputVec3Schema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("vec3"), - value: z.array(z.number()).optional(), -}); - -const NodeInputGeometrySchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("geometry"), -}); - -const NodeInputPathSchema = z.object({ - ...DefaultOptionsSchema.shape, - type: z.literal("path"), -}); - -export const NodeInputSchema = z - .union([ - NodeInputSeedSchema, - NodeInputBooleanSchema, - NodeInputFloatSchema, - NodeInputIntegerSchema, - NodeInputSelectSchema, - NodeInputSeedSchema, - NodeInputVec3Schema, - NodeInputGeometrySchema, - NodeInputPathSchema, - ]) - .openapi("NodeInput"); - -export type NodeInput = z.infer; diff --git a/store/src/routes/node/validations/types.ts b/store/src/routes/node/validations/types.ts deleted file mode 100644 index 3281e15..0000000 --- a/store/src/routes/node/validations/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { z } from "zod"; -import { NodeInputSchema } from "./inputs.ts"; - -export type NodeId = `${string}/${string}/${string}`; - -export const idRegex = /[a-z0-9-]+/i; - -const idSchema = z - .string() - .regex( - new RegExp( - `^(${idRegex.source})/(${idRegex.source})/(${idRegex.source})$`, - ), - "Invalid id format", - ); - -export const NodeDefinitionSchema = z - .object({ - id: idSchema, - inputs: z.record(NodeInputSchema).optional(), - outputs: z.array(z.string()).optional(), - meta: z - .object({ - description: z.string().optional(), - title: z.string().optional(), - }) - .optional(), - }) - .openapi("NodeDefinition"); - -export type NodeDefinition = z.infer; diff --git a/store/src/routes/node/worker/index.ts b/store/src/routes/node/worker/index.ts deleted file mode 100644 index 84ecc89..0000000 --- a/store/src/routes/node/worker/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { UnknownWorkerResponseError, WorkerTimeoutError } from "../errors.ts"; -import { NodeDefinition } from "../validations/types.ts"; -import { WorkerMessage } from "./messages.ts"; - -export function extractDefinition( - content: ArrayBuffer, -): Promise { - const worker = new Worker( - new URL("./node.worker.ts", import.meta.url).href, - { - type: "module", - }, - ) as Worker & { - postMessage: (message: WorkerMessage) => void; - }; - - return new Promise((res, rej) => { - worker.postMessage({ action: "extract-definition", content }); - setTimeout(() => { - worker.terminate(); - rej(new WorkerTimeoutError()); - }, 100); - worker.onmessage = function (e) { - switch (e.data.action) { - case "result": - res(e.data.result); - break; - case "error": - rej(e.data.error); - break; - default: - rej(new UnknownWorkerResponseError()); - } - }; - }); -} diff --git a/store/src/routes/node/worker/messages.ts b/store/src/routes/node/worker/messages.ts deleted file mode 100644 index 8042567..0000000 --- a/store/src/routes/node/worker/messages.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NodeDefinition } from "../validations/types.ts"; - -type ExtractDefinitionMessage = { - action: "extract-definition"; - content: ArrayBuffer; -}; - -type ErrorMessage = { - action: "error"; - error: Error; -}; - -type ResultMessage = { - action: "result"; - result: NodeDefinition; -}; - -export type WorkerMessage = - | ErrorMessage - | ResultMessage - | ExtractDefinitionMessage; diff --git a/store/src/routes/node/worker/node.worker.ts b/store/src/routes/node/worker/node.worker.ts deleted file mode 100644 index e2277d1..0000000 --- a/store/src/routes/node/worker/node.worker.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -import { NodeDefinitionSchema } from "../validations/types.ts"; -import { WorkerMessage } from "./messages.ts"; -import { createWasmWrapper } from "./utils.ts"; - -const workerSelf = self as DedicatedWorkerGlobalScope & { - postMessage: (message: WorkerMessage) => void; -}; - -function extractDefinition(wasmCode: ArrayBuffer) { - try { - const wasm = createWasmWrapper(wasmCode); - - const definition = wasm.get_definition(); - - const p = NodeDefinitionSchema.safeParse(definition); - - if (!p.success) { - workerSelf.postMessage({ action: "error", error: p.error }); - return; - } - - workerSelf.postMessage({ action: "result", result: p.data }); - } catch (e) { - console.log("HEEERE", e); - workerSelf.postMessage({ action: "error", error: e }); - } -} - -self.onmessage = (e: MessageEvent) => { - switch (e.data.action) { - case "extract-definition": - extractDefinition(e.data.content); - self.close(); - break; - default: - throw new Error("Unknown action: " + e.data.action); - } -}; diff --git a/store/src/routes/node/worker/utils.ts b/store/src/routes/node/worker/utils.ts deleted file mode 100644 index 12131c3..0000000 --- a/store/src/routes/node/worker/utils.ts +++ /dev/null @@ -1,255 +0,0 @@ -// @ts-nocheck: Nocheck -import { NodeDefinition } from "../validations/types.ts"; - -const cachedTextDecoder = new TextDecoder("utf-8", { - ignoreBOM: true, - fatal: true, -}); -const cachedTextEncoder = new TextEncoder(); - -const encodeString = typeof cachedTextEncoder.encodeInto === "function" - ? function (arg: string, view: Uint8Array) { - return cachedTextEncoder.encodeInto(arg, view); - } - : function (arg: string, view: Uint8Array) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length, - }; - }; - -function createWrapper() { - let wasm: WebAssembly.Exports & { memory: { buffer: Iterable } }; - - let cachedUint8Memory0: Uint8Array | null = null; - let cachedInt32Memory0: Int32Array | null = null; - let cachedUint32Memory0: Uint32Array | null = null; - - const heap = new Array(128).fill(undefined); - heap.push(undefined, null, true, false); - let heap_next = heap.length; - - function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; - } - - function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; - } - - function getUint32Memory0() { - if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { - cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); - } - return cachedUint32Memory0; - } - - function getStringFromWasm0(ptr: number, len: number) { - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); - } - - function getObject(idx: number) { - return heap[idx]; - } - - function addHeapObject(obj: unknown) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - heap[idx] = obj; - return idx; - } - - let WASM_VECTOR_LEN = 0; - function passArray32ToWasm0( - arg: ArrayLike, - malloc: (arg0: number, arg1: number) => number, - ) { - const ptr = malloc(arg.length * 4, 4) >>> 0; - getUint32Memory0().set(arg, ptr / 4); - WASM_VECTOR_LEN = arg.length; - return ptr; - } - - function getArrayI32FromWasm0(ptr: number, len: number) { - ptr = ptr >>> 0; - return getInt32Memory0().subarray(ptr / 4, ptr / 4 + len); - } - - function dropObject(idx: number) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; - } - - function takeObject(idx: number) { - const ret = getObject(idx); - dropObject(idx); - return ret; - } - - function __wbindgen_string_new(arg0: number, arg1: number) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - } - - // Additional methods and their internal helpers can also be refactored in a similar manner. - function get_definition() { - let deferred1_0: number; - let deferred1_1: number; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.get_definition(retptr); - const r0 = getInt32Memory0()[retptr / 4 + 0]; - const r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - const rawDefinition = getStringFromWasm0(r0, r1); - return JSON.parse(rawDefinition) as NodeDefinition; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - - function execute(args: Int32Array) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passArray32ToWasm0(args, wasm.__wbindgen_malloc); - const len0 = WASM_VECTOR_LEN; - wasm.execute(retptr, ptr0, len0); - const r0 = getInt32Memory0()[retptr / 4 + 0]; - const r1 = getInt32Memory0()[retptr / 4 + 1]; - const v2 = getArrayI32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 4, 4); - return v2; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - - function passStringToWasm0( - arg: string, - malloc: (arg0: number, arg1: number) => number, - realloc: - | ((arg0: number, arg1: number, arg2: number, arg3: number) => number) - | undefined, - ) { - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0() - .subarray(ptr, ptr + buf.length) - .set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7f) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; - } - - function __wbg_new_abda76e883ba8a5f() { - const ret = new Error(); - return addHeapObject(ret); - } - - function __wbg_stack_658279fe44541cf6(arg0: number, arg1: number) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0( - ret, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - } - - function __wbg_error_f851667af71bcfc6(arg0: number, arg1: number) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } - } - - function __wbindgen_object_drop_ref(arg0: number) { - takeObject(arg0); - } - - function __wbg_log_5bb5f88f245d7762(arg0: number) { - console.log(getObject(arg0)); - } - - function __wbindgen_throw(arg0: number, arg1: number) { - throw new Error(getStringFromWasm0(arg0, arg1)); - } - - return { - setInstance(instance: WebAssembly.Instance) { - wasm = instance.exports; - }, - - exports: { - // Expose other methods that interact with the wasm instance - execute, - get_definition, - }, - - __wbindgen_string_new, - __wbindgen_object_drop_ref, - __wbg_new_abda76e883ba8a5f, - __wbg_error_f851667af71bcfc6, - __wbg_stack_658279fe44541cf6, - __wbg_log_5bb5f88f245d7762, - __wbindgen_throw, - }; -} - -export function createWasmWrapper(wasmBuffer: ArrayBuffer) { - const wrapper = createWrapper(); - const module = new WebAssembly.Module(wasmBuffer); - const instance = new WebAssembly.Instance(module, { - ["./index_bg.js"]: wrapper, - }); - wrapper.setInstance(instance); - return wrapper.exports; -} diff --git a/store/src/routes/user/user.controller.ts b/store/src/routes/user/user.controller.ts deleted file mode 100644 index 7c8f9c9..0000000 --- a/store/src/routes/user/user.controller.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; -import { usersTable } from "./user.schema.ts"; -import { db } from "../../db/db.ts"; -import { findUserByName } from "./user.service.ts"; -import { UserSchema } from "./user.validation.ts"; - -const userRouter = new OpenAPIHono(); - -const getAllUsersRoute = createRoute({ - method: "get", - path: "/users.json", - responses: { - 200: { - content: { - "application/json": { - schema: z.array(UserSchema), - }, - }, - description: "Retrieve a single node definition", - }, - }, -}); - -userRouter.openapi(getAllUsersRoute, async (c) => { - const users = await db.select().from(usersTable); - return c.json(users); -}); - -const getSingleUserRoute = createRoute({ - method: "get", - path: "/{userId}.json", - request: { - params: z.object({ userId: z.string().optional() }), - }, - responses: { - 200: { - content: { - "application/json": { - schema: UserSchema, - }, - }, - description: "Retrieve a single node definition", - }, - }, -}); - -userRouter.openapi(getSingleUserRoute, async (c) => { - const userId = c.req.param("userId.json"); - - const user = await findUserByName(userId.replace(/\.json$/, "")); - - return c.json(user); -}); - -export { userRouter }; diff --git a/store/src/routes/user/user.schema.ts b/store/src/routes/user/user.schema.ts deleted file mode 100644 index 7345341..0000000 --- a/store/src/routes/user/user.schema.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { pgTable, text, uuid } from "drizzle-orm/pg-core"; - -export const usersTable = pgTable("users", { - id: uuid().primaryKey().defaultRandom(), - name: text().unique().notNull(), -}); diff --git a/store/src/routes/user/user.service.ts b/store/src/routes/user/user.service.ts deleted file mode 100644 index 55fe6df..0000000 --- a/store/src/routes/user/user.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { eq } from "drizzle-orm"; -import { db } from "../../db/db.ts"; -import { usersTable } from "./user.schema.ts"; -import * as uuid from "jsr:@std/uuid"; - -export async function createUser(userName: string) { - const user = await db - .select() - .from(usersTable) - .where(eq(usersTable.name, userName)); - - if (user.length) { - return; - } - - return await db - .insert(usersTable) - .values({ id: uuid.v1.generate(), name: userName }); -} - -export async function findUserByName(userName: string) { - const users = await db - .select() - .from(usersTable) - .where(eq(usersTable.name, userName)).limit(1); - - return users[0]; -} diff --git a/store/src/routes/user/user.validation.ts b/store/src/routes/user/user.validation.ts deleted file mode 100644 index 822617d..0000000 --- a/store/src/routes/user/user.validation.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { z } from "@hono/zod-openapi"; - -export const UserSchema = z - .object({ - id: z.string().uuid(), - name: z.string().min(1), - }) - .openapi("User"); diff --git a/store/src/server.ts b/store/src/server.ts deleted file mode 100644 index da042ea..0000000 --- a/store/src/server.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { createUser } from "./routes/user/user.service.ts"; -import { swaggerUI } from "@hono/swagger-ui"; -import { logger } from "hono/logger"; -import { cors } from "hono/cors"; -import { OpenAPIHono } from "@hono/zod-openapi"; -import { nodeRouter } from "./routes/node/node.controller.ts"; -import { userRouter } from "./routes/user/user.controller.ts"; -import { migrateDb } from "./db/db.ts"; - -const router = new OpenAPIHono(); - -router.use(logger()); -router.use(cors()); -router.route("nodes", nodeRouter); -router.route("users", userRouter); - -router.doc("/openapi.json", { - openapi: "3.0.0", - info: { - version: "1.0.0", - title: "Nodarium API", - }, -}); - -router.get("/ui", swaggerUI({ url: "/openapi.json" })); - -Deno.serve(router.fetch); - -async function init() { - await migrateDb(); - await createUser("max"); - - const openapi = await router.request("/openapi.json"); - const json = await openapi.text(); - Deno.writeTextFile("openapi.json", json); -} -await init(); diff --git a/store/vitest.config.ts b/store/vitest.config.ts deleted file mode 100644 index e2ec332..0000000 --- a/store/vitest.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - globals: true, - }, -}); -- 2.49.1 From e84c715f4c1a1fcfd23311d3011beaf1f1c4643b Mon Sep 17 00:00:00 2001 From: Niklas Koll Date: Mon, 19 Jan 2026 12:50:12 +0100 Subject: [PATCH 3/6] chore: Add flake and direnv stuff --- .envrc | 1 + .gitignore | 1 + flake.lock | 27 +++++++++++++++++++++++++++ flake.nix | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 8b9576a..e500d05 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules/ # Added by cargo /target +.direnv/ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..69125b4 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1768564909, + "narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b8d7bcc --- /dev/null +++ b/flake.nix @@ -0,0 +1,40 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + + outputs = {nixpkgs, ...}: let + systems = ["aarch64-darwin" "x86_64-linux"]; + eachSystem = function: + nixpkgs.lib.genAttrs systems (system: + function { + inherit system; + pkgs = nixpkgs.legacyPackages.${system}; + }); + in { + devShells = eachSystem ({pkgs, ...}: { + default = pkgs.mkShellNoCC { + packages = [ + # general deps + pkgs.nodejs_24 + pkgs.pnpm_10 + + # wasm/rust stuff + pkgs.rustc + pkgs.cargo + pkgs.rust-analyzer + pkgs.rustfmt + pkgs.wasm-bindgen-cli + pkgs.wasm-pack + pkgs.lld + + # frontend + pkgs.vscode-langservers-extracted + pkgs.typescript-language-server + pkgs.prettier + pkgs.tailwindcss-language-server + ]; + }; + }); + }; +} -- 2.49.1 From 617dfb0c9d25b057ea055550646b0db5fed2a3c2 Mon Sep 17 00:00:00 2001 From: Max Richter Date: Tue, 20 Jan 2026 14:08:45 +0100 Subject: [PATCH 4/6] feat: add Dockerfile for app to deploy preview --- app/Dockerfile | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 app/Dockerfile diff --git a/app/Dockerfile b/app/Dockerfile new file mode 100644 index 0000000..d171c39 --- /dev/null +++ b/app/Dockerfile @@ -0,0 +1,70 @@ +# --- Builder Stage --- +FROM node:24-alpine AS builder + +# Install system dependencies +RUN apk add --no-cache curl g++ gcc make libc-dev + +# Optimized Rust Installation +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal \ + && rustup target add wasm32-unknown-unknown + +WORKDIR /app + +# 1. Copy Manifests for Caching +# Copy root manifests +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json Cargo.lock Cargo.toml ./ + +# Copy all sub-package package.json and Cargo.toml files to cache dependency installation +# This "wildcard" approach in Alpine/sh can be tricky, so we copy the specific directories +# that define the workspace structure. +COPY packages/ ./packages/ +COPY nodes/ ./nodes/ +COPY app/package.json ./app/ + +# 2. Install & Cache Dependencies +# We mount the Cargo registry (crates) and the target folder (compiled artifacts) +RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ + --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/app/target \ + npm install -g pnpm@latest && \ + pnpm install --frozen-lockfile + +# 3. Full Source Copy & Build +COPY . . + +# We apply the cache mounts again during the build. +# pnpm build:nodes will now find its Rust artifacts in /app/target from the previous run. +RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ + --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/app/target \ + pnpm build:nodes && \ + pnpm --filter @nodarium/app... build + +# --- Static Runner Stage --- +FROM nginx:alpine AS runner + +# Remove default nginx config +RUN rm /etc/nginx/conf.d/default.conf + +# Minimal static file config +COPY < Date: Tue, 20 Jan 2026 14:44:20 +0100 Subject: [PATCH 5/6] chore: remove ai comments from dockerfile --- app/Dockerfile | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/app/Dockerfile b/app/Dockerfile index d171c39..756b976 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,10 +1,8 @@ -# --- Builder Stage --- FROM node:24-alpine AS builder # Install system dependencies RUN apk add --no-cache curl g++ gcc make libc-dev -# Optimized Rust Installation ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH @@ -14,43 +12,30 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no WORKDIR /app -# 1. Copy Manifests for Caching -# Copy root manifests COPY pnpm-lock.yaml pnpm-workspace.yaml package.json Cargo.lock Cargo.toml ./ -# Copy all sub-package package.json and Cargo.toml files to cache dependency installation -# This "wildcard" approach in Alpine/sh can be tricky, so we copy the specific directories -# that define the workspace structure. COPY packages/ ./packages/ COPY nodes/ ./nodes/ COPY app/package.json ./app/ -# 2. Install & Cache Dependencies -# We mount the Cargo registry (crates) and the target folder (compiled artifacts) RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ npm install -g pnpm@latest && \ pnpm install --frozen-lockfile -# 3. Full Source Copy & Build COPY . . -# We apply the cache mounts again during the build. -# pnpm build:nodes will now find its Rust artifacts in /app/target from the previous run. RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ pnpm build:nodes && \ pnpm --filter @nodarium/app... build -# --- Static Runner Stage --- FROM nginx:alpine AS runner -# Remove default nginx config RUN rm /etc/nginx/conf.d/default.conf -# Minimal static file config COPY < Date: Tue, 20 Jan 2026 18:26:48 +0100 Subject: [PATCH 6/6] chore: cleanup node buildscripts --- app/src/lib/node-registry.ts | 31 +++++++++++---------- app/static/.gitignore | 1 + nodes/max/plantarium/.template/package.json | 6 ---- nodes/max/plantarium/box/Cargo.toml | 2 +- nodes/max/plantarium/box/package.json | 6 ---- nodes/max/plantarium/branch/package.json | 6 ---- nodes/max/plantarium/float/package.json | 6 ---- nodes/max/plantarium/gravity/package.json | 6 ---- nodes/max/plantarium/instance/package.json | 6 ---- nodes/max/plantarium/math/package.json | 6 ---- nodes/max/plantarium/noise/package.json | 6 ---- nodes/max/plantarium/output/package.json | 6 ---- nodes/max/plantarium/random/package.json | 6 ---- nodes/max/plantarium/rotate/package.json | 6 ---- nodes/max/plantarium/stem/package.json | 6 ---- nodes/max/plantarium/triangle/package.json | 6 ---- nodes/max/plantarium/vec3/package.json | 6 ---- package.json | 2 +- packages/utils/src/main.rs | 2 +- 19 files changed, 20 insertions(+), 102 deletions(-) create mode 100644 app/static/.gitignore delete mode 100644 nodes/max/plantarium/.template/package.json delete mode 100644 nodes/max/plantarium/box/package.json delete mode 100644 nodes/max/plantarium/branch/package.json delete mode 100644 nodes/max/plantarium/float/package.json delete mode 100644 nodes/max/plantarium/gravity/package.json delete mode 100644 nodes/max/plantarium/instance/package.json delete mode 100644 nodes/max/plantarium/math/package.json delete mode 100644 nodes/max/plantarium/noise/package.json delete mode 100644 nodes/max/plantarium/output/package.json delete mode 100644 nodes/max/plantarium/random/package.json delete mode 100644 nodes/max/plantarium/rotate/package.json delete mode 100644 nodes/max/plantarium/stem/package.json delete mode 100644 nodes/max/plantarium/triangle/package.json delete mode 100644 nodes/max/plantarium/vec3/package.json diff --git a/app/src/lib/node-registry.ts b/app/src/lib/node-registry.ts index 112818d..9594c61 100644 --- a/app/src/lib/node-registry.ts +++ b/app/src/lib/node-registry.ts @@ -1,9 +1,10 @@ -import { createWasmWrapper } from "@nodarium/utils"; -import fs from "fs/promises"; -import path from "path"; +import { createWasmWrapper } from '@nodarium/utils'; +import fs from 'fs/promises'; +import path from 'path'; export async function getWasm(id: `${string}/${string}/${string}`) { - const filePath = path.resolve(`../nodes/${id}/pkg/node.wasm`); + const filePath = path.resolve(`./static/nodes/${id}`); + console.log({ filePath }); try { await fs.access(filePath); @@ -36,12 +37,12 @@ export async function getNode(id: `${string}/${string}/${string}`) { } export async function getCollectionNodes(userId: `${string}/${string}`) { - const nodes = await fs.readdir(path.resolve(`../nodes/${userId}`)); + const nodes = await fs.readdir(path.resolve(`./static/nodes/${userId}`)); return nodes - .filter((n) => n !== "pkg" && n !== ".template") + .filter((n) => n !== 'pkg' && n !== '.template') .map((n) => { return { - id: `${userId}/${n}`, + id: `${userId}/${n}` }; }); } @@ -50,20 +51,20 @@ export async function getCollection(userId: `${string}/${string}`) { const nodes = await getCollectionNodes(userId); return { id: userId, - nodes, + nodes }; } export async function getUserCollections(userId: string) { - const collections = await fs.readdir(path.resolve(`../nodes/${userId}`)); + const collections = await fs.readdir(path.resolve(`./static/nodes/${userId}`)); return Promise.all( collections.map(async (n) => { const nodes = await getCollectionNodes(`${userId}/${n}`); return { id: `${userId}/${n}`, - nodes, + nodes }; - }), + }) ); } @@ -71,20 +72,20 @@ export async function getUser(userId: string) { const collections = await getUserCollections(userId); return { id: userId, - collections, + collections }; } export async function getUsers() { - const nodes = await fs.readdir(path.resolve("../nodes")); + const nodes = await fs.readdir(path.resolve('./static/nodes')); const users = await Promise.all( nodes.map(async (n) => { const collections = await getUserCollections(n); return { id: n, - collections, + collections }; - }), + }) ); return users; } diff --git a/app/static/.gitignore b/app/static/.gitignore new file mode 100644 index 0000000..f54b6b9 --- /dev/null +++ b/app/static/.gitignore @@ -0,0 +1 @@ +nodes/ diff --git a/nodes/max/plantarium/.template/package.json b/nodes/max/plantarium/.template/package.json deleted file mode 100644 index c066779..0000000 --- a/nodes/max/plantarium/.template/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/out.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/box/Cargo.toml b/nodes/max/plantarium/box/Cargo.toml index 3cf9bdd..8889289 100644 --- a/nodes/max/plantarium/box/Cargo.toml +++ b/nodes/max/plantarium/box/Cargo.toml @@ -8,5 +8,5 @@ edition = "2018" crate-type = ["cdylib", "rlib"] [dependencies] -nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" } +nodarium_utils = { version = "0.1.0", path = "../../../../packages/utils" } diff --git a/nodes/max/plantarium/box/package.json b/nodes/max/plantarium/box/package.json deleted file mode 100644 index 69679f8..0000000 --- a/nodes/max/plantarium/box/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/box.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/branch/package.json b/nodes/max/plantarium/branch/package.json deleted file mode 100644 index dd1de2c..0000000 --- a/nodes/max/plantarium/branch/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/branch.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/float/package.json b/nodes/max/plantarium/float/package.json deleted file mode 100644 index e2e1fc5..0000000 --- a/nodes/max/plantarium/float/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/float.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/gravity/package.json b/nodes/max/plantarium/gravity/package.json deleted file mode 100644 index 6ca64a2..0000000 --- a/nodes/max/plantarium/gravity/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/gravity.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/instance/package.json b/nodes/max/plantarium/instance/package.json deleted file mode 100644 index 061b805..0000000 --- a/nodes/max/plantarium/instance/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/instance.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/math/package.json b/nodes/max/plantarium/math/package.json deleted file mode 100644 index e63975b..0000000 --- a/nodes/max/plantarium/math/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/math.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/noise/package.json b/nodes/max/plantarium/noise/package.json deleted file mode 100644 index 30b7618..0000000 --- a/nodes/max/plantarium/noise/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/noise.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/output/package.json b/nodes/max/plantarium/output/package.json deleted file mode 100644 index 4cc2020..0000000 --- a/nodes/max/plantarium/output/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/output.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/random/package.json b/nodes/max/plantarium/random/package.json deleted file mode 100644 index 4fecf10..0000000 --- a/nodes/max/plantarium/random/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/random.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/rotate/package.json b/nodes/max/plantarium/rotate/package.json deleted file mode 100644 index fc6a577..0000000 --- a/nodes/max/plantarium/rotate/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/rotate.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/stem/package.json b/nodes/max/plantarium/stem/package.json deleted file mode 100644 index e22c7b9..0000000 --- a/nodes/max/plantarium/stem/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/stem.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/triangle/package.json b/nodes/max/plantarium/triangle/package.json deleted file mode 100644 index 77e9f04..0000000 --- a/nodes/max/plantarium/triangle/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/triangle.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/nodes/max/plantarium/vec3/package.json b/nodes/max/plantarium/vec3/package.json deleted file mode 100644 index d99c173..0000000 --- a/nodes/max/plantarium/vec3/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "cargo build --target wasm32-unknown-unknown --release && mkdir -p pkg && cp ../../../../target/wasm32-unknown-unknown/release/vec3.wasm ./pkg/node.wasm", - "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" - } -} diff --git a/package.json b/package.json index 11efdcd..16b4813 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "build": "pnpm build:nodes && pnpm build:app", "build:story": "pnpm -r --filter 'ui' story:build", "build:app": "BASE_PATH=/ui pnpm -r --filter 'ui' build && pnpm -r --filter 'app' build", - "build:nodes": "pnpm -r --filter './nodes/**' build", + "build:nodes": "cargo build --workspace --target wasm32-unknown-unknown --release && rm -rf ./app/static/nodes/max/plantarium/ && mkdir -p ./app/static/nodes/max/plantarium/ && cp -R ./target/wasm32-unknown-unknown/release/*.wasm ./app/static/nodes/max/plantarium/", "build:deploy": "pnpm build", "dev:all": "pnpm -r dev", "dev:nodes": "pnpm -r --parallel --filter './nodes/**' dev", diff --git a/packages/utils/src/main.rs b/packages/utils/src/main.rs index f7015ac..b628469 100644 --- a/packages/utils/src/main.rs +++ b/packages/utils/src/main.rs @@ -1,5 +1,5 @@ use nodarium_utils::{ - geometry::{create_multiple_paths, create_path, wrap_multiple_paths}, + geometry::{create_multiple_paths, wrap_multiple_paths}, split_args, }; -- 2.49.1