Compare commits
3 Commits
main
...
feat/remov
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e84c715f4c | ||
|
|
ecbcc814ed
|
||
|
|
be97387252
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@ node_modules/
|
|||||||
# Added by cargo
|
# Added by cargo
|
||||||
|
|
||||||
/target
|
/target
|
||||||
|
.direnv/
|
||||||
|
|||||||
367
Cargo.lock
generated
367
Cargo.lock
generated
@@ -1,176 +1,80 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 4
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.2.0"
|
version = "1.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
|
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "box"
|
name = "box"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
"web-sys",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "branch"
|
name = "branch"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"glam",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"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]]
|
[[package]]
|
||||||
name = "float"
|
name = "float"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glam"
|
name = "glam"
|
||||||
version = "0.27.0"
|
version = "0.30.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9"
|
checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gravity"
|
name = "gravity"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"glam",
|
"glam",
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"noise",
|
]
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
[[package]]
|
||||||
"wasm-bindgen",
|
name = "instance"
|
||||||
"wasm-bindgen-test",
|
version = "0.1.0"
|
||||||
"web-sys",
|
dependencies = [
|
||||||
|
"glam",
|
||||||
|
"nodarium_macros",
|
||||||
|
"nodarium_utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.11"
|
version = "1.0.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
|
||||||
|
|
||||||
[[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"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "math"
|
name = "math"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
"web-sys",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "max-plantarium-triangle"
|
name = "memchr"
|
||||||
version = "0.1.0"
|
version = "2.7.6"
|
||||||
dependencies = [
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"console_error_panic_hook",
|
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
|
||||||
"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",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nodarium_macros"
|
name = "nodarium_macros"
|
||||||
@@ -180,7 +84,7 @@ dependencies = [
|
|||||||
"quote",
|
"quote",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"syn 1.0.109",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -195,29 +99,19 @@ dependencies = [
|
|||||||
name = "nodarium_utils"
|
name = "nodarium_utils"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"glam",
|
"glam",
|
||||||
"noise",
|
"noise 0.9.0",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"wasm-bindgen",
|
|
||||||
"web-sys",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nodes-noise"
|
name = "noise"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"glam",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"noise",
|
"noise 0.9.0",
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
"web-sys",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -233,48 +127,35 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-traits"
|
name = "num-traits"
|
||||||
version = "0.2.18"
|
version = "0.2.19"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
|
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "once_cell"
|
|
||||||
version = "1.19.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "output"
|
name = "output"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"glam",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
"web-sys",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.81"
|
version = "1.0.105"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
|
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.36"
|
version = "1.0.43"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -307,103 +188,76 @@ dependencies = [
|
|||||||
name = "random"
|
name = "random"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rotate"
|
name = "rotate"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"glam",
|
"glam",
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
"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]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.198"
|
version = "1.0.228"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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 = [
|
dependencies = [
|
||||||
"serde_derive",
|
"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]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.198"
|
version = "1.0.228"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
|
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.60",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.116"
|
version = "1.0.149"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
|
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"ryu",
|
"memchr",
|
||||||
"serde",
|
"serde",
|
||||||
|
"serde_core",
|
||||||
|
"zmij",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "stem"
|
name = "stem"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
|
||||||
"nodarium_macros",
|
"nodarium_macros",
|
||||||
"nodarium_utils",
|
"nodarium_utils",
|
||||||
"serde",
|
|
||||||
"serde-wasm-bindgen",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"wasm-bindgen-test",
|
|
||||||
"web-sys",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.109"
|
version = "2.0.114"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -411,119 +265,30 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "triangle"
|
||||||
version = "2.0.60"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"nodarium_macros",
|
||||||
"quote",
|
"nodarium_utils",
|
||||||
"unicode-ident",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.12"
|
version = "1.0.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen"
|
name = "vec3"
|
||||||
version = "0.2.92"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"nodarium_macros",
|
||||||
"wasm-bindgen-macro",
|
"nodarium_utils",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-backend"
|
name = "zmij"
|
||||||
version = "0.2.92"
|
version = "1.0.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
|
checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2"
|
||||||
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",
|
|
||||||
]
|
|
||||||
|
|||||||
@@ -22,7 +22,8 @@
|
|||||||
"idb": "^8.0.3",
|
"idb": "^8.0.3",
|
||||||
"jsondiffpatch": "^0.7.3",
|
"jsondiffpatch": "^0.7.3",
|
||||||
"tailwindcss": "^4.1.18",
|
"tailwindcss": "^4.1.18",
|
||||||
"three": "^0.182.0"
|
"three": "^0.182.0",
|
||||||
|
"wabt": "^1.0.39"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@iconify-json/tabler": "^1.2.26",
|
"@iconify-json/tabler": "^1.2.26",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import fs from "fs/promises";
|
|||||||
import path from "path";
|
import path from "path";
|
||||||
|
|
||||||
export async function getWasm(id: `${string}/${string}/${string}`) {
|
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 {
|
try {
|
||||||
await fs.access(filePath);
|
await fs.access(filePath);
|
||||||
|
|||||||
@@ -244,13 +244,14 @@ export class MemoryRuntimeExecutor implements RuntimeExecutor {
|
|||||||
}
|
}
|
||||||
this.perf?.addPoint("cache-hit", 0);
|
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);
|
log.log(`Inputs:`, inputs);
|
||||||
a = performance.now();
|
a = performance.now();
|
||||||
results[node.id] = node_type.execute(encoded_inputs);
|
results[node.id] = node_type.execute(encoded_inputs);
|
||||||
|
log.log("Executed", node.type, node.id)
|
||||||
b = performance.now();
|
b = performance.now();
|
||||||
|
|
||||||
if (this.cache) {
|
if (this.cache && node.id !== outputNode.id) {
|
||||||
this.cache.set(inputHash, results[node.id]);
|
this.cache.set(inputHash, results[node.id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
app/src/routes/dev/+layout.svelte
Normal file
8
app/src/routes/dev/+layout.svelte
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import type { Snippet } from "svelte";
|
||||||
|
const { children } = $props<{ children?: Snippet }>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main class="w-screen overflow-x-hidden">
|
||||||
|
{@render children()}
|
||||||
|
</main>
|
||||||
@@ -1,29 +1,120 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Grid from "$lib/grid";
|
import NodeHTML from "$lib/graph-interface/node/NodeHTML.svelte";
|
||||||
|
import { localState } from "$lib/helpers/localState.svelte";
|
||||||
import Panel from "$lib/sidebar/Panel.svelte";
|
import Panel from "$lib/sidebar/Panel.svelte";
|
||||||
import Sidebar from "$lib/sidebar/Sidebar.svelte";
|
import Sidebar from "$lib/sidebar/Sidebar.svelte";
|
||||||
|
import { IndexDBCache, RemoteNodeRegistry } from "@nodarium/registry";
|
||||||
|
import { type NodeId, type NodeInstance } from "@nodarium/types";
|
||||||
|
import Code from "./Code.svelte";
|
||||||
|
import Grid from "$lib/grid";
|
||||||
|
import {
|
||||||
|
concatEncodedArrays,
|
||||||
|
createWasmWrapper,
|
||||||
|
encodeNestedArray,
|
||||||
|
} from "@nodarium/utils";
|
||||||
|
|
||||||
|
const registryCache = new IndexDBCache("node-registry");
|
||||||
|
const nodeRegistry = new RemoteNodeRegistry("", registryCache);
|
||||||
|
|
||||||
|
let activeNode = localState<NodeId | undefined>(
|
||||||
|
"node.dev.activeNode",
|
||||||
|
undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
let nodeWasm = $state<ArrayBuffer>();
|
||||||
|
let nodeInstance = $state<NodeInstance>();
|
||||||
|
let nodeWasmWrapper = $state<ReturnType<typeof createWasmWrapper>>();
|
||||||
|
|
||||||
|
async function fetchNodeData(nodeId?: NodeId) {
|
||||||
|
console.log("FETCHING", { nodeId });
|
||||||
|
nodeWasm = undefined;
|
||||||
|
nodeInstance = undefined;
|
||||||
|
|
||||||
|
if (!nodeId) return;
|
||||||
|
|
||||||
|
const data = await nodeRegistry.fetchNodeDefinition(nodeId);
|
||||||
|
nodeWasm = await nodeRegistry.fetchArrayBuffer("nodes/" + nodeId + ".wasm");
|
||||||
|
nodeInstance = {
|
||||||
|
id: 0,
|
||||||
|
type: nodeId,
|
||||||
|
position: [0, 0] as [number, number],
|
||||||
|
props: {},
|
||||||
|
state: {
|
||||||
|
type: data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
nodeWasmWrapper = createWasmWrapper(nodeWasm);
|
||||||
|
}
|
||||||
|
|
||||||
|
$effect(() => {
|
||||||
|
fetchNodeData(activeNode.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
$effect(() => {
|
||||||
|
if (nodeInstance?.props && nodeWasmWrapper) {
|
||||||
|
const keys = Object.keys(nodeInstance.state.type?.inputs || {});
|
||||||
|
let ins = Object.values(nodeInstance.props) as number[];
|
||||||
|
if (keys[0] === "plant") {
|
||||||
|
ins = [[0, 0, 0, 0, 0, 0, 0, 0], ...ins];
|
||||||
|
}
|
||||||
|
const inputs = concatEncodedArrays(encodeNestedArray(ins));
|
||||||
|
nodeWasmWrapper?.execute(inputs);
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<div class="node-wrapper absolute bottom-8 left-8">
|
||||||
|
{#if nodeInstance}
|
||||||
|
<NodeHTML inView position="relative" z={5} bind:node={nodeInstance} />
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
<Grid.Row>
|
<Grid.Row>
|
||||||
<Grid.Cell></Grid.Cell>
|
|
||||||
<Grid.Cell>
|
<Grid.Cell>
|
||||||
<Sidebar>
|
<pre>
|
||||||
<Panel
|
<code>
|
||||||
id="node-store"
|
{JSON.stringify(nodeInstance?.props)}
|
||||||
classes="text-green-400"
|
</code>
|
||||||
title="Node Store"
|
</pre>
|
||||||
icon="i-[tabler--database]"
|
</Grid.Cell>
|
||||||
>
|
|
||||||
<div class="p-4">
|
<Grid.Cell>
|
||||||
<input type="text" class="bg-red rounded-sm p-2" />
|
<div class="h-screen w-[80vw] overflow-y-auto">
|
||||||
</div>
|
{#if nodeWasm}
|
||||||
</Panel>
|
<Code wasm={nodeWasm} />
|
||||||
</Sidebar>
|
{/if}
|
||||||
|
</div>
|
||||||
</Grid.Cell>
|
</Grid.Cell>
|
||||||
</Grid.Row>
|
</Grid.Row>
|
||||||
|
|
||||||
|
<Sidebar>
|
||||||
|
<Panel
|
||||||
|
id="node-store"
|
||||||
|
classes="text-green-400"
|
||||||
|
title="Node Store"
|
||||||
|
icon="i-[tabler--database]"
|
||||||
|
>
|
||||||
|
<div class="p-4 flex flex-col gap-2">
|
||||||
|
{#await nodeRegistry.fetchCollection("max/plantarium")}
|
||||||
|
<p>Loading Nodes...</p>
|
||||||
|
{:then result}
|
||||||
|
{#each result.nodes as n}
|
||||||
|
<button
|
||||||
|
class="cursor-pointer p-2 bg-layer-1 {activeNode.value === n.id
|
||||||
|
? 'outline outline-offset-1'
|
||||||
|
: ''}"
|
||||||
|
onclick={() => (activeNode.value = n.id)}>{n.id}</button
|
||||||
|
>
|
||||||
|
{/each}
|
||||||
|
{/await}
|
||||||
|
</div>
|
||||||
|
</Panel>
|
||||||
|
</Sidebar>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
:global body {
|
:global body {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
26
app/src/routes/dev/Code.svelte
Normal file
26
app/src/routes/dev/Code.svelte
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import wabtInit from "wabt";
|
||||||
|
|
||||||
|
const { wasm } = $props<{ wasm: ArrayBuffer }>();
|
||||||
|
|
||||||
|
async function toWat(arrayBuffer: ArrayBuffer) {
|
||||||
|
const wabt = await wabtInit();
|
||||||
|
|
||||||
|
const module = wabt.readWasm(new Uint8Array(arrayBuffer), {
|
||||||
|
readDebugNames: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
module.generateNames();
|
||||||
|
module.applyNames();
|
||||||
|
|
||||||
|
return module.toText({ foldExprs: false, inlineExport: false });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#await toWat(wasm)}
|
||||||
|
<p>Converting to WAT</p>
|
||||||
|
{:then c}
|
||||||
|
<pre>
|
||||||
|
<code class="text-gray-50">{c}</code>
|
||||||
|
</pre>
|
||||||
|
{/await}
|
||||||
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
@@ -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
|
||||||
|
}
|
||||||
40
flake.nix
Normal file
40
flake.nix
Normal file
@@ -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
|
||||||
|
];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -11,18 +11,8 @@ crate-type = ["cdylib", "rlib"]
|
|||||||
default = ["console_error_panic_hook"]
|
default = ["console_error_panic_hook"]
|
||||||
|
|
||||||
[dependencies]
|
[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" }
|
utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde-wasm-bindgen = "0.4"
|
|
||||||
console_error_panic_hook = { version = "0.1.7", optional = true }
|
console_error_panic_hook = { version = "0.1.7", optional = true }
|
||||||
web-sys = { version = "0.3.69", features = ["console"] }
|
web-sys = { version = "0.3.69", features = ["console"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
wasm-bindgen-test = "0.3.34"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,22 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
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,
|
split_args, wrap_arg,
|
||||||
};
|
};
|
||||||
use wasm_bindgen::prelude::*;
|
|
||||||
|
|
||||||
include_definition_file!("src/input.json");
|
nodarium_definition_file!("src/input.json");
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[nodarium_execute]
|
||||||
#[wasm_bindgen]
|
|
||||||
pub fn execute(input: &[i32]) -> Vec<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
|
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|
||||||
log!("WASM(cube): input: {:?} -> {:?}", input, args);
|
log!("WASM(cube): input: {:?} -> {:?}", input, args);
|
||||||
@@ -22,7 +19,6 @@ pub fn execute(input: &[i32]) -> Vec<i32> {
|
|||||||
let p = encode_float(size);
|
let p = encode_float(size);
|
||||||
let n = encode_float(-size);
|
let n = encode_float(-size);
|
||||||
|
|
||||||
|
|
||||||
// [[1,3, x, y, z, x, y,z,x,y,z]];
|
// [[1,3, x, y, z, x, y,z,x,y,z]];
|
||||||
let mut cube_geometry = [
|
let mut cube_geometry = [
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,23 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
use nodarium_utils::{
|
||||||
concat_arg_vecs, evaluate_float, evaluate_int,
|
concat_arg_vecs, evaluate_float, evaluate_int,
|
||||||
geometry::{
|
geometry::{
|
||||||
create_path, interpolate_along_path, rotate_vector_by_angle, wrap_path, wrap_path_mut,
|
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 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<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|
||||||
let paths = split_args(args[0]);
|
let paths = split_args(args[0]);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,21 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
use wasm_bindgen::prelude::*;
|
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<i32> {
|
pub fn execute(args: &[i32]) -> Vec<i32> {
|
||||||
args.into()
|
args.into()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,24 +7,7 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
glam = "0.30.10"
|
||||||
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,20 @@
|
|||||||
use glam::Vec3;
|
use glam::Vec3;
|
||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
use nodarium_utils::{
|
||||||
concat_args, evaluate_float, evaluate_int,
|
concat_args, evaluate_float, evaluate_int,
|
||||||
geometry::{wrap_path, wrap_path_mut},
|
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 {
|
fn lerp_vec3(a: Vec3, b: Vec3, t: f32) -> Vec3 {
|
||||||
a + (b - a) * t
|
a + (b - a) * t
|
||||||
}
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[nodarium_execute]
|
||||||
pub fn execute(input: &[i32]) -> Vec<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
reset_call_count();
|
reset_call_count();
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nodarium_instance"
|
name = "instance"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Max Richter <jim-x@web.de>"]
|
authors = ["Max Richter <jim-x@web.de>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
@@ -7,23 +7,7 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
glam = "0.30.10"
|
||||||
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,18 @@
|
|||||||
use glam::{Mat4, Quat, Vec3};
|
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::{
|
use nodarium_utils::{
|
||||||
concat_args, encode_float, evaluate_float, evaluate_int,
|
concat_args, evaluate_float, evaluate_int,
|
||||||
geometry::{
|
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<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
let mut inputs = split_args(args[0]);
|
let mut inputs = split_args(args[0]);
|
||||||
log!("WASM(instance): inputs: {:?}", inputs);
|
log!("WASM(instance): inputs: {:?}", inputs);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,17 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
use nodarium_utils::{concat_args, set_panic_hook, split_args};
|
use nodarium_macros::nodarium_execute;
|
||||||
use wasm_bindgen::prelude::*;
|
use nodarium_utils::{
|
||||||
|
concat_args, split_args
|
||||||
|
};
|
||||||
|
|
||||||
include_definition_file!("src/input.json");
|
#[nodarium_execute]
|
||||||
|
|
||||||
#[wasm_bindgen]
|
|
||||||
pub fn execute(args: &[i32]) -> Vec<i32> {
|
pub fn execute(args: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
let args = split_args(args);
|
let args = split_args(args);
|
||||||
concat_args(vec![&[0], args[0], args[1], args[2]])
|
concat_args(vec![&[0], args[0], args[1], args[2]])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nodarium_definition_file!("src/input.json");
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nodes-noise"
|
name = "noise"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Max Richter <jim-x@web.de>"]
|
authors = ["Max Richter <jim-x@web.de>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
@@ -7,24 +7,8 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
noise = "0.9.0"
|
||||||
glam = "0.27.0"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
wasm-bindgen-test = "0.3.34"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,19 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
use nodarium_utils::{
|
||||||
concat_args, evaluate_float, evaluate_int, evaluate_vec3, geometry::wrap_path_mut, log,
|
concat_args, evaluate_float, evaluate_int, evaluate_vec3, geometry::wrap_path_mut,
|
||||||
reset_call_count, set_panic_hook, split_args,
|
reset_call_count, split_args,
|
||||||
};
|
};
|
||||||
use noise::{HybridMulti, MultiFractal, NoiseFn, OpenSimplex};
|
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 {
|
fn lerp(a: f32, b: f32, t: f32) -> f32 {
|
||||||
a + t * (b - a)
|
a + t * (b - a)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[nodarium_execute]
|
||||||
pub fn execute(input: &[i32]) -> Vec<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
reset_call_count();
|
reset_call_count();
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,24 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
console_error_panic_hook = ["dep:console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
use nodarium_utils::{
|
||||||
concat_args, evaluate_int,
|
concat_args, evaluate_int,
|
||||||
geometry::{extrude_path, wrap_path},
|
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<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
log!("WASM(output): input: {:?}", input);
|
log!("WASM(output): input: {:?}", input);
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,21 +7,7 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
use nodarium_utils::{concat_args, set_panic_hook, split_args};
|
use nodarium_macros::nodarium_execute;
|
||||||
use wasm_bindgen::prelude::*;
|
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<i32> {
|
pub fn execute(args: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
let args = split_args(args);
|
let args = split_args(args);
|
||||||
concat_args(vec![&[1], args[0], args[1], args[2]])
|
concat_args(vec![&[1], args[0], args[1], args[2]])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,23 +7,8 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde-wasm-bindgen = "0.4"
|
glam = "0.30.10"
|
||||||
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
use glam::{Mat4, Vec3};
|
use glam::{Mat4, Vec3};
|
||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
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,
|
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<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
log!("DEBUG args: {:?}", input);
|
log!("DEBUG args: {:?}", input);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -7,23 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
use nodarium_utils::{
|
||||||
evaluate_float, evaluate_int, evaluate_vec3,
|
evaluate_float, evaluate_int, evaluate_vec3,
|
||||||
geometry::{create_multiple_paths, wrap_multiple_paths},
|
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<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
reset_call_count();
|
reset_call_count();
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "max-plantarium-triangle"
|
name = "triangle"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Max Richter <jim-x@web.de>"]
|
authors = ["Max Richter <jim-x@web.de>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
@@ -7,22 +7,6 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,21 @@
|
|||||||
use nodarium_macros::include_definition_file;
|
use nodarium_macros::nodarium_definition_file;
|
||||||
|
use nodarium_macros::nodarium_execute;
|
||||||
use nodarium_utils::{
|
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]
|
#[nodarium_execute]
|
||||||
#[wasm_bindgen]
|
|
||||||
pub fn execute(input: &[i32]) -> Vec<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
|
|
||||||
set_panic_hook();
|
|
||||||
|
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
|
|
||||||
let size = evaluate_int(args[0]);
|
let size = evaluate_int(args[0]);
|
||||||
let decoded = decode_float(size);
|
let decoded = decode_float(size);
|
||||||
let negative_size = encode_float(-decoded);
|
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]];
|
// [[1,3, x, y, z, x, y,z,x,y,z]];
|
||||||
wrap_arg(&[
|
wrap_arg(&[
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "max-plantarium-vec3"
|
name = "vec3"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Max Richter <jim-x@web.de>"]
|
authors = ["Max Richter <jim-x@web.de>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
@@ -7,22 +7,8 @@ edition = "2018"
|
|||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook"]
|
|
||||||
|
|
||||||
[dependencies]
|
[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_utils = { version = "0.1.0", path = "../../../../packages/utils" }
|
||||||
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
nodarium_macros = { version = "0.1.0", path = "../../../../packages/macros" }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
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"
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"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'"
|
"dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 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<i32> {
|
pub fn execute(input: &[i32]) -> Vec<i32> {
|
||||||
let args = split_args(input);
|
let args = split_args(input);
|
||||||
log!("vec3 input: {:?}", input);
|
log!("vec3 input: {:?}", input);
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,7 @@ repository = "https://github.com/jim-fx/nodes"
|
|||||||
proc-macro = true
|
proc-macro = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
syn = { version = "1.0", features = ["full"] }
|
syn = { version = "2.0", features = ["full"] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
|
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
|
||||||
quote = "1.0"
|
quote = "1.0"
|
||||||
|
|||||||
@@ -5,32 +5,7 @@ use quote::quote;
|
|||||||
use std::env;
|
use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use syn::{parse_macro_input, LitStr};
|
use syn::parse_macro_input;
|
||||||
|
|
||||||
#[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)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_line_numbers(input: String) -> String {
|
fn add_line_numbers(input: String) -> String {
|
||||||
return input
|
return input
|
||||||
@@ -41,39 +16,120 @@ fn add_line_numbers(input: String) -> String {
|
|||||||
.join("\n");
|
.join("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[proc_macro]
|
#[proc_macro_attribute]
|
||||||
pub fn include_definition_file(input: TokenStream) -> TokenStream {
|
pub fn nodarium_execute(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
let file_path = syn::parse_macro_input!(input as syn::LitStr).value();
|
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 first_arg_ident = if let Some(syn::FnArg::Typed(pat_type)) = input_fn.sig.inputs.first() {
|
||||||
let project_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
if let syn::Pat::Ident(pat_ident) = &*pat_type.pat {
|
||||||
let full_path = Path::new(&project_dir).join(&file_path);
|
&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
|
// We create a wrapper that handles the C ABI and pointer math
|
||||||
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
|
|
||||||
let expanded = quote! {
|
let expanded = quote! {
|
||||||
#[wasm_bindgen]
|
extern "C" {
|
||||||
pub fn get_definition() -> String {
|
fn host_log_panic(ptr: *const u8, len: usize);
|
||||||
String::from(#json_content)
|
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<i32> = 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<i32> = 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<i32> {
|
||||||
|
#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)
|
TokenStream::from(expanded)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ export class RemoteNodeRegistry implements NodeRegistry {
|
|||||||
status: "loading" | "ready" | "error" = "loading";
|
status: "loading" | "ready" | "error" = "loading";
|
||||||
private nodes: Map<string, NodeDefinition> = new Map();
|
private nodes: Map<string, NodeDefinition> = new Map();
|
||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private url: string,
|
private url: string,
|
||||||
private cache?: AsyncCache<ArrayBuffer | string>,
|
private cache?: AsyncCache<ArrayBuffer | string>,
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
description = "Types for Nodarium"
|
description = "Types for Nodarium"
|
||||||
website = "https://nodes.max-richter.dev"
|
|
||||||
repository = "https://github.com/jim-fx/nodes"
|
repository = "https://github.com/jim-fx/nodes"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -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 {
|
html {
|
||||||
--neutral-100: #E7E7E7;
|
--neutral-100: #E7E7E7;
|
||||||
--neutral-200: #CECECE;
|
--neutral-200: #CECECE;
|
||||||
|
|||||||
@@ -6,14 +6,11 @@ description = "A collection of utilities for Nodarium"
|
|||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://github.com/jim-fx/nodes"
|
repository = "https://github.com/jim-fx/nodes"
|
||||||
|
|
||||||
[features]
|
[lib]
|
||||||
default = ["console_error_panic_hook"]
|
crate-type = ["rlib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasm-bindgen = "0.2.92"
|
|
||||||
web-sys = { version = "0.3.69", features = ["console"] }
|
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
|
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
|
||||||
console_error_panic_hook = { version = "0.1.7", optional = true }
|
glam = "0.30.10"
|
||||||
glam = "0.27.0"
|
|
||||||
noise = "0.9.0"
|
noise = "0.9.0"
|
||||||
|
|||||||
@@ -109,10 +109,12 @@ export function decodeNestedArray(dense: number[] | Int32Array) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function splitNestedArray(input: Int32Array) {
|
export function splitNestedArray(input: Int32Array) {
|
||||||
|
|
||||||
let index = 0;
|
let index = 0;
|
||||||
const length = input.length;
|
const length = input.length;
|
||||||
let res: Int32Array[] = [];
|
let res: Int32Array[] = [];
|
||||||
|
|
||||||
|
|
||||||
let nextBracketIndex = 0;
|
let nextBracketIndex = 0;
|
||||||
let argStartIndex = 0;
|
let argStartIndex = 0;
|
||||||
let depth = -1;
|
let depth = -1;
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ pub fn create_geometry_data(vertex_amount: usize, face_amount: usize) -> Vec<i32
|
|||||||
geo
|
geo
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wrap_geometry_data(geometry: &mut [i32]) -> GeometryData {
|
pub fn wrap_geometry_data(geometry: &mut [i32]) -> GeometryData<'_> {
|
||||||
// Basic validity checks
|
// Basic validity checks
|
||||||
assert!(
|
assert!(
|
||||||
geometry.len() > GEOMETRY_HEADER_SIZE,
|
geometry.len() > GEOMETRY_HEADER_SIZE,
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ pub fn create_instance_data(
|
|||||||
geo
|
geo
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wrap_instance_data(instances: &mut [i32]) -> InstanceData {
|
pub fn wrap_instance_data(instances: &mut [i32]) -> InstanceData<'_> {
|
||||||
assert!(
|
assert!(
|
||||||
instances.len() > INSTANCE_HEADER_SIZE,
|
instances.len() > INSTANCE_HEADER_SIZE,
|
||||||
"Instance vector does not contain enough data for a header."
|
"Instance vector does not contain enough data for a header."
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ pub fn create_path(point_amount: usize, depth: i32) -> Vec<i32> {
|
|||||||
path
|
path
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wrap_path(input: &[i32]) -> PathData {
|
pub fn wrap_path(input: &[i32]) -> PathData<'_> {
|
||||||
// Basic validity checks
|
// Basic validity checks
|
||||||
assert!(
|
assert!(
|
||||||
input.len() > PATH_HEADER_SIZE,
|
input.len() > PATH_HEADER_SIZE,
|
||||||
|
|||||||
@@ -6,12 +6,22 @@ pub use nodes::reset_call_count;
|
|||||||
pub use tree::*;
|
pub use tree::*;
|
||||||
pub mod geometry;
|
pub mod geometry;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
pub fn host_log(ptr: *const u8, len: usize);
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! log {
|
macro_rules! log {
|
||||||
($($arg:tt)*) => {{
|
($($t:tt)*) => {{
|
||||||
use web_sys::console;
|
let msg = std::format!($($t)*);
|
||||||
console::log_1(&format!($($arg)*).into());
|
#[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();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,256 +1,55 @@
|
|||||||
//@ts-nocheck
|
interface NodariumExports extends WebAssembly.Exports {
|
||||||
import { NodeDefinition } from "@nodarium/types";
|
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", {
|
export function createWasmWrapper(buffer: ArrayBuffer) {
|
||||||
ignoreBOM: true,
|
let exports: NodariumExports;
|
||||||
fatal: true,
|
|
||||||
});
|
|
||||||
const cachedTextEncoder = new TextEncoder();
|
|
||||||
|
|
||||||
const encodeString =
|
const importObject = {
|
||||||
typeof cachedTextEncoder.encodeInto === "function"
|
env: {
|
||||||
? function (arg, view) {
|
host_log_panic: (ptr: number, len: number) => {
|
||||||
return cachedTextEncoder.encodeInto(arg, view);
|
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() {
|
const module = new WebAssembly.Module(buffer);
|
||||||
let wasm: any;
|
const instance = new WebAssembly.Instance(module, importObject);
|
||||||
|
exports = instance.exports as NodariumExports;
|
||||||
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<number>,
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function execute(args: Int32Array) {
|
function execute(args: Int32Array) {
|
||||||
try {
|
const inPtr = exports.__alloc(args.length);
|
||||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
new Int32Array(exports.memory.buffer).set(args, inPtr / 4);
|
||||||
const ptr0 = passArray32ToWasm0(args, wasm.__wbindgen_malloc);
|
|
||||||
const len0 = WASM_VECTOR_LEN;
|
const outPtr = exports.execute(inPtr, args.length);
|
||||||
wasm.execute(retptr, ptr0, len0);
|
|
||||||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
const i32Result = new Int32Array(exports.memory.buffer);
|
||||||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
const outLen = i32Result[outPtr / 4];
|
||||||
var v2 = getArrayI32FromWasm0(r0, r1).slice();
|
const out = i32Result.slice(outPtr / 4 + 1, outPtr / 4 + 1 + outLen);
|
||||||
wasm.__wbindgen_free(r0, r1 * 4, 4);
|
|
||||||
return v2;
|
exports.__free(inPtr, args.length);
|
||||||
} finally {
|
|
||||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
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(
|
return { execute, get_definition };
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
9
pnpm-lock.yaml
generated
9
pnpm-lock.yaml
generated
@@ -49,6 +49,9 @@ importers:
|
|||||||
three:
|
three:
|
||||||
specifier: ^0.182.0
|
specifier: ^0.182.0
|
||||||
version: 0.182.0
|
version: 0.182.0
|
||||||
|
wabt:
|
||||||
|
specifier: ^1.0.39
|
||||||
|
version: 1.0.39
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@iconify-json/tabler':
|
'@iconify-json/tabler':
|
||||||
specifier: ^1.2.26
|
specifier: ^1.2.26
|
||||||
@@ -2574,6 +2577,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
|
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
wabt@1.0.39:
|
||||||
|
resolution: {integrity: sha512-ba+dRL/75VQQY7RkU/CgriGbkoWAfS8TDyUlJfJhJ8KhtXgMl5dhNvoPNUcQ9IWRhW8u41glMSuZeTvsYq2rRg==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
webgl-sdf-generator@1.1.1:
|
webgl-sdf-generator@1.1.1:
|
||||||
resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==}
|
resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==}
|
||||||
|
|
||||||
@@ -4930,6 +4937,8 @@ snapshots:
|
|||||||
xml-name-validator: 5.0.0
|
xml-name-validator: 5.0.0
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
wabt@1.0.39: {}
|
||||||
|
|
||||||
webgl-sdf-generator@1.1.1: {}
|
webgl-sdf-generator@1.1.1: {}
|
||||||
|
|
||||||
webidl-conversions@7.0.0:
|
webidl-conversions@7.0.0:
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
DATABASE_URL=postgres://nodarium:nodarium@postgres-db:5432/nodarium
|
|
||||||
@@ -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"]
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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:
|
|
||||||
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
883
store/deno.lock
generated
883
store/deno.lock
generated
@@ -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"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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")!,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -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");
|
|
||||||
@@ -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": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "7",
|
|
||||||
"dialect": "postgresql",
|
|
||||||
"entries": [
|
|
||||||
{
|
|
||||||
"idx": 0,
|
|
||||||
"version": "7",
|
|
||||||
"when": 1734703963242,
|
|
||||||
"tag": "0000_known_kid_colt",
|
|
||||||
"breakpoints": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -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");
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
export * from "../routes/user/user.schema.ts";
|
|
||||||
export * from "../routes/node/node.schema.ts";
|
|
||||||
@@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 = <T extends ZodSchema>(
|
|
||||||
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 };
|
|
||||||
@@ -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<NodeDefinition>(),
|
|
||||||
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),
|
|
||||||
]);
|
|
||||||
@@ -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<NodeDefinition> {
|
|
||||||
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<NodeDefinition[]> {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
@@ -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" });
|
|
||||||
});
|
|
||||||
@@ -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<typeof NodeInputSchema>;
|
|
||||||
@@ -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<typeof NodeDefinitionSchema>;
|
|
||||||
@@ -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<NodeDefinition> {
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user