commit ef5362cc258bf5f383cd85a5b175ad182f36ed71 Author: Madeleine Sydney Ĺšlaga Date: Sun Jun 21 23:55:17 2026 -0600 init diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7e90f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.direnv/ +.shake/ +*.out +*.wasm \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c7b07bf --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ + +https://jsdw.me/posts/wasm-components/ diff --git a/examples/addcomponent/adder.wat b/examples/addcomponent/adder.wat new file mode 100644 index 0000000..2654a7e --- /dev/null +++ b/examples/addcomponent/adder.wat @@ -0,0 +1,7 @@ +(module + (func $add (param $a i32) (param $b i32) (result i32) + local.get $a + local.get $b + i32.add) + + (export "demo:addcomponent/adder@0.1.0#add" (func $add))) diff --git a/examples/addcomponent/adder.wit b/examples/addcomponent/adder.wit new file mode 100644 index 0000000..954fe9f --- /dev/null +++ b/examples/addcomponent/adder.wit @@ -0,0 +1,9 @@ +package demo:addcomponent@0.1.0; + +interface adder { + add: func (a: u32, b: u32) -> u32; +} + +world example { + export adder; +} \ No newline at end of file diff --git a/examples/providecomponent/Shakefile.hs b/examples/providecomponent/Shakefile.hs new file mode 100644 index 0000000..b21d88f --- /dev/null +++ b/examples/providecomponent/Shakefile.hs @@ -0,0 +1,37 @@ +import Development.Shake +import Development.Shake.Command +import Development.Shake.FilePath +import Development.Shake.Util + +main = shakeArgs shakeOptions $ do + -- action $ do + -- sourceFiles <- getDirectoryFiles "" ["//*.luasm"] + -- need $ (-<.> "luac") <$> sourceFiles + want ["complete.component.wasm"] + alternatives $ do + "complete.component.wasm" %> \out -> do + need ["provider.component.wasm","importing.component.wasm"] + cmd_ + "wac plug --plug" + "provider.component.wasm" "importing.component.wasm" + "-o" "complete.component.wasm" + "*.component.wasm" %> \out -> do + let wasm = out `replaceExtensions` "wasm" + need [wasm] + cmd_ + "wasm-tools component new" + [wasm] + "-o" [out] + "*.wasm" %> \out -> do + let wit = out -<.> "wit" + let wat = out -<.> "wat" + need [wit,wat] + cmd_ + "wasm-tools component embed" + [wit] [wat] "-o" [out] + phony "run" $ do + need ["complete.component.wasm"] + cmd_ "wasmtime run --invoke add(1) complete.component.wasm" + phony "clean" $ do + removeFilesAfter ".shake" ["//*"] + liftIO $ removeFiles "." ["*.wasm"] diff --git a/examples/providecomponent/importing.wat b/examples/providecomponent/importing.wat new file mode 100644 index 0000000..06d26e7 --- /dev/null +++ b/examples/providecomponent/importing.wat @@ -0,0 +1,12 @@ +(module + (import "demo:importing/provider@0.1.0" "get" (func $get (result i32))) + (func $add (param $other i32) (result i32) + call $get + local.get $other + i32.add) + (func $mul (param $other i32) (result i32) + call $get + local.get $other + i32.mul) + (export "demo:importing/adder@0.1.0#add" (func $add)) + (export "demo:importing/adder@0.1.0#mul" (func $mul))) diff --git a/examples/providecomponent/importing.wit b/examples/providecomponent/importing.wit new file mode 100644 index 0000000..f4f473d --- /dev/null +++ b/examples/providecomponent/importing.wit @@ -0,0 +1,15 @@ +package demo:importing@0.1.0; + +interface provider { + get: func () -> u32; +} + +interface adder { + add: func (other: u32) -> u32; + mul: func (other: u32) -> u32; +} + +world example { +import provider; +export adder; +} \ No newline at end of file diff --git a/examples/providecomponent/provider.wat b/examples/providecomponent/provider.wat new file mode 100644 index 0000000..b11593e --- /dev/null +++ b/examples/providecomponent/provider.wat @@ -0,0 +1,5 @@ +(module + (func $get (result i32) + i32.const 123) + + (export "demo:importing/provider@0.1.0#get" (func $get))) diff --git a/examples/providecomponent/provider.wit b/examples/providecomponent/provider.wit new file mode 100644 index 0000000..5c2e26f --- /dev/null +++ b/examples/providecomponent/provider.wit @@ -0,0 +1,9 @@ +package demo:importing@0.1.0; + +interface provider { + get: func() -> u32; +} + +world example { + export provider; +} \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..d212ee9 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1781607440, + "narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e41b24abd260e8f71dbe2f5737d24122f972158", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..11c5fac --- /dev/null +++ b/flake.nix @@ -0,0 +1,25 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + }; + + outputs = inputs: + let + system = "x86_64-linux"; + pkgs = import inputs.nixpkgs { + inherit system; + }; + shake = pkgs.callPackage ./shake-wrapper.nix {}; + in { + devShells.${system}.default = pkgs.mkShell { + packages = [ + shake + pkgs.wabt + pkgs.nodejs + pkgs.wasmtime + pkgs.wasm-tools + pkgs.wac-cli + ]; + }; + }; +} diff --git a/shake-wrapper.nix b/shake-wrapper.nix new file mode 100644 index 0000000..9b39443 --- /dev/null +++ b/shake-wrapper.nix @@ -0,0 +1,14 @@ +{ runCommandLocal, makeWrapper, lib, haskellPackages }: + +let + our-ghc = haskellPackages.ghc.withPackages (ps: [ + ps.shake + ]); +in runCommandLocal + "shake-wrapper" + { nativeBuildInputs = [ makeWrapper ]; } + '' + mkdir -p $out/bin + makeWrapper ${lib.getExe haskellPackages.shake} $out/bin/shake \ + --prefix PATH : ${lib.makeBinPath [our-ghc]} + ''