From 6eb3ce98e3500b7a35e2663b71f66e641adfc6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Istv=C3=A1n=20B=C3=ADr=C3=B3?= Date: Tue, 14 Jan 2025 12:03:55 +0100 Subject: [PATCH] updates --- Cargo.lock | 6 +- Cargo.toml | 2 +- examples/c/INSTRUCTIONS | 6 +- examples/c/c-default-minimal/Makefile | 2 +- examples/go/go-default/main.go | 2 +- examples/go/go-multi-rpc/.gitignore | 2 - examples/go/go-multi-rpc/README.md | 188 - .../component-generator/generator.go | 142 - .../go-multi-rpc/component-generator/main.go | 5 - .../component-template/component/main.go | 29 - .../component/wit/component.wit | 41 - .../components/component-one/main.go | 62 - .../component-one/wit/component-one.wit | 42 - .../pack-ns_component-three-stub/_stub.wit | 23 - .../component-three.wit | 41 - .../deps/pack-ns_component-two-stub/_stub.wit | 23 - .../pack-ns_component-two/component-two.wit | 41 - .../components/component-three/main.go | 29 - .../component-three/wit/component-three.wit | 41 - .../components/component-two/main.go | 49 - .../component-two/wit/component-two.wit | 41 - .../pack-ns_component-three-stub/_stub.wit | 23 - .../component-three.wit | 41 - examples/go/go-multi-rpc/go.mod | 15 - examples/go/go-multi-rpc/go.sum | 12 - .../go/go-multi-rpc/integration/config.go | 3 - .../integration/integration_test.go | 201 - examples/go/go-multi-rpc/lib/cfg/cfg.go | 68 - examples/go/go-multi-rpc/mage.go | 14 - examples/go/go-multi-rpc/magefiles/config.go | 13 - .../go/go-multi-rpc/magefiles/magefile.go | 411 --- examples/go/go-multi-rpc/metadata.json | 22 - examples/go/go-multi-rpc/tools/tools.go | 6 - examples/js/js-default-minimal/package.json | 2 +- examples/js/js-default/package.json | 2 +- examples/js/js-example-fetch/package.json | 2 +- examples/python/python-default/golem.yaml | 2 + examples/rust/INSTRUCTIONS | 2 +- .../rust/rust-default-minimal/Cargo.toml._ | 2 +- examples/rust/rust-default/Cargo.toml._ | 2 +- examples/rust/rust-default/golem.yaml | 8 +- examples/rust/rust-default/src/lib.rs | 2 +- .../rust-example-shopping-cart/Cargo.toml._ | 2 +- .../wit/component-name.wit | 4 +- .../rust/rust-example-test-module/README.md | 2 +- .../wasm/Cargo.toml._ | 2 +- .../rust/rust-example-todo-list/Cargo.toml._ | 2 +- examples/ts/ts-default/golem.yaml | 4 + examples/ts/ts-default/package.json | 2 +- examples/ts/ts-example-fetch/package.json | 2 +- examples/ts/ts-multi-rpc/.gitignore | 5 - examples/ts/ts-multi-rpc/.prettierrc | 3 - examples/ts/ts-multi-rpc/README.md | 205 -- examples/ts/ts-multi-rpc/build-config.ts | 8 - examples/ts/ts-multi-rpc/build.ts | 177 - .../component/golem.yaml.template | 8 - .../component/main.ts.template | 13 - .../component/wit/main.wit.template | 34 - examples/ts/ts-multi-rpc/eslint.config.js | 21 - examples/ts/ts-multi-rpc/golem.yaml | 43 - examples/ts/ts-multi-rpc/metadata.json | 22 - examples/ts/ts-multi-rpc/package-lock.json | 3269 ----------------- examples/ts/ts-multi-rpc/package.json | 35 - .../src/build-tools/build-tools.ts | 98 - .../src/components/component-one/golem.yaml | 14 - .../src/components/component-one/main.ts | 30 - .../src/components/component-one/wit/main.wit | 35 - .../src/components/component-three/golem.yaml | 8 - .../src/components/component-three/main.ts | 13 - .../components/component-three/wit/main.wit | 35 - .../src/components/component-two/golem.yaml | 12 - .../src/components/component-two/main.ts | 24 - .../src/components/component-two/wit/main.wit | 35 - examples/ts/ts-multi-rpc/src/lib/cfg.ts | 54 - examples/ts/ts-multi-rpc/src/lib/process.ts | 50 - .../ts/ts-multi-rpc/test/integration.test.ts | 172 - examples/ts/ts-multi-rpc/tsconfig.json | 19 - examples/ts/ts-multi-rpc/wit-deps/README.md | 1 - 78 files changed, 34 insertions(+), 6099 deletions(-) delete mode 100644 examples/go/go-multi-rpc/.gitignore delete mode 100644 examples/go/go-multi-rpc/README.md delete mode 100644 examples/go/go-multi-rpc/component-generator/generator.go delete mode 100644 examples/go/go-multi-rpc/component-generator/main.go delete mode 100644 examples/go/go-multi-rpc/component-template/component/main.go delete mode 100644 examples/go/go-multi-rpc/component-template/component/wit/component.wit delete mode 100644 examples/go/go-multi-rpc/components/component-one/main.go delete mode 100644 examples/go/go-multi-rpc/components/component-one/wit/component-one.wit delete mode 100644 examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three-stub/_stub.wit delete mode 100644 examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three/component-three.wit delete mode 100644 examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two-stub/_stub.wit delete mode 100644 examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two/component-two.wit delete mode 100644 examples/go/go-multi-rpc/components/component-three/main.go delete mode 100644 examples/go/go-multi-rpc/components/component-three/wit/component-three.wit delete mode 100644 examples/go/go-multi-rpc/components/component-two/main.go delete mode 100644 examples/go/go-multi-rpc/components/component-two/wit/component-two.wit delete mode 100644 examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three-stub/_stub.wit delete mode 100644 examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three/component-three.wit delete mode 100644 examples/go/go-multi-rpc/go.mod delete mode 100644 examples/go/go-multi-rpc/go.sum delete mode 100644 examples/go/go-multi-rpc/integration/config.go delete mode 100644 examples/go/go-multi-rpc/integration/integration_test.go delete mode 100644 examples/go/go-multi-rpc/lib/cfg/cfg.go delete mode 100644 examples/go/go-multi-rpc/mage.go delete mode 100644 examples/go/go-multi-rpc/magefiles/config.go delete mode 100644 examples/go/go-multi-rpc/magefiles/magefile.go delete mode 100644 examples/go/go-multi-rpc/metadata.json delete mode 100644 examples/go/go-multi-rpc/tools/tools.go delete mode 100644 examples/ts/ts-multi-rpc/.gitignore delete mode 100644 examples/ts/ts-multi-rpc/.prettierrc delete mode 100644 examples/ts/ts-multi-rpc/README.md delete mode 100644 examples/ts/ts-multi-rpc/build-config.ts delete mode 100644 examples/ts/ts-multi-rpc/build.ts delete mode 100644 examples/ts/ts-multi-rpc/component-template/component/golem.yaml.template delete mode 100644 examples/ts/ts-multi-rpc/component-template/component/main.ts.template delete mode 100644 examples/ts/ts-multi-rpc/component-template/component/wit/main.wit.template delete mode 100644 examples/ts/ts-multi-rpc/eslint.config.js delete mode 100644 examples/ts/ts-multi-rpc/golem.yaml delete mode 100644 examples/ts/ts-multi-rpc/metadata.json delete mode 100644 examples/ts/ts-multi-rpc/package-lock.json delete mode 100644 examples/ts/ts-multi-rpc/package.json delete mode 100644 examples/ts/ts-multi-rpc/src/build-tools/build-tools.ts delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-one/golem.yaml delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-one/main.ts delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-one/wit/main.wit delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-three/golem.yaml delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-three/main.ts delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-three/wit/main.wit delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-two/golem.yaml delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-two/main.ts delete mode 100644 examples/ts/ts-multi-rpc/src/components/component-two/wit/main.wit delete mode 100644 examples/ts/ts-multi-rpc/src/lib/cfg.ts delete mode 100644 examples/ts/ts-multi-rpc/src/lib/process.ts delete mode 100644 examples/ts/ts-multi-rpc/test/integration.test.ts delete mode 100644 examples/ts/ts-multi-rpc/tsconfig.json delete mode 100644 examples/ts/ts-multi-rpc/wit-deps/README.md diff --git a/Cargo.lock b/Cargo.lock index 12a131e..96c21ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,9 +246,9 @@ dependencies = [ [[package]] name = "golem-wit" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ea2d892fbe54de5ca2083ce2dc635015a177e89d3a7c872e44c59b8ff6b88e" +checksum = "52c54c03d2a2c3b54e1bc733115000c69cc027b0a0dd269917b9a7acab37beff" [[package]] name = "heck" @@ -498,7 +498,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4556e9d..98a5cf5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ default-run = "golem-examples-cli" clap = { version = "4.5.23", features = ["derive"], optional = true } colored = "2.1.0" derive_more = { version = "1.0.0", features = ["from_str"] } -golem-wit = { version = "1.1.0" } +golem-wit = { version = "1.1.1" } include_dir = { version = "0.7.4" } Inflector = { version = "0.11.4" } once_cell = { version = "1.20.2" } diff --git a/examples/c/INSTRUCTIONS b/examples/c/INSTRUCTIONS index 8b7bf91..eb37209 100644 --- a/examples/c/INSTRUCTIONS +++ b/examples/c/INSTRUCTIONS @@ -2,11 +2,11 @@ See the documentation about installing tooling: https://learn.golem.cloud/docs/c Generate bindings from WIT: wit-bindgen c --autodrop-borrows yes --out-dir component_name ./wit -Compile the C code with WASI SDK: - ~/wasi-sdk-23.0/bin/clang --sysroot ~/wasi-sdk-23.0/share/wasi-sysroot main.c component_name/component_name.c component_name/component_name_component_type.o -o component_name.module.wasm +Compile the C code with WASI SDK (set WASI_SDK_PATH where wasi-sdk-25.0 is installed): + $WASI_SDK_PATH/bin/clang --sysroot $WASI_SDK_PATH/share/wasi-sysroot main.c component_name/component_name.c component_name/component_name_component_type.o -o component_name.module.wasm Convert the result into a Component: wasm-tools component new component_name.module.wasm -o component_name.wasm --adapt adapters/tier1/wasi_snapshot_preview1.wasm A Makefile is provided to automate the process: - export WASI_SDK=... + export WASI_SDK_PATH=... make build diff --git a/examples/c/c-default-minimal/Makefile b/examples/c/c-default-minimal/Makefile index e29c70a..e9ad8ee 100644 --- a/examples/c/c-default-minimal/Makefile +++ b/examples/c/c-default-minimal/Makefile @@ -7,7 +7,7 @@ bindings: wit-bindgen c --autodrop-borrows yes --out-dir component_name ./wit compile: bindings - ${WASI_SDK}/bin/clang --sysroot ${WASI_SDK}/share/wasi-sysroot main.c component_name/component_name.c component_name/component_name_component_type.o -o component_name.module.wasm + ${WASI_SDK_PATH}/bin/clang --sysroot ${WASI_SDK_PATH}/share/wasi-sysroot main.c component_name/component_name.c component_name/component_name_component_type.o -o component_name.module.wasm clean: rm -rf component_name diff --git a/examples/go/go-default/main.go b/examples/go/go-default/main.go index 6ec990b..dc521a6 100644 --- a/examples/go/go-default/main.go +++ b/examples/go/go-default/main.go @@ -15,7 +15,7 @@ type ResponseBody struct { } func init() { - binding.SetExportsPackNameInterfaceApi(&ComponentNameImpl{}) + binding.SetExportsPackNameExportsApi(&ComponentNameImpl{}) } // total State can be stored in global variables diff --git a/examples/go/go-multi-rpc/.gitignore b/examples/go/go-multi-rpc/.gitignore deleted file mode 100644 index c149d44..0000000 --- a/examples/go/go-multi-rpc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -binding -/target/ diff --git a/examples/go/go-multi-rpc/README.md b/examples/go/go-multi-rpc/README.md deleted file mode 100644 index 73a084f..0000000 --- a/examples/go/go-multi-rpc/README.md +++ /dev/null @@ -1,188 +0,0 @@ -# Golem Go Example with Multiple Components and Worker to Worker RPC Communication - -## Building -The project uses [magefile](https://magefile.org/) for building. Either install the tool binary `mage`, -or use the __zero install option__: `go run mage.go`. This readme will use the latter. - -To see the available commands use: - -```shell -go run mage.go -Targets: - addStubDependency adds generated and built stub dependency to componentGolemCliAddStubDependency - build alias for BuildAllComponents - buildAllComponents builds all components - buildComponent builds component by name - buildStubComponent builds RPC stub for component - clean cleans the projects - deploy adds or updates all the components with golem-cli\'s default profile - generateBinding generates go binding from WIT - generateNewComponent generates a new component based on the component-template - stubCompose composes dependencies - testIntegration tests the deployed components - tinyGoBuildComponentBinary build wasm component binary with tiny go - updateRpcStubs builds rpc stub components and adds them as dependency - wasmToolsComponentEmbed embeds type info into wasm component with wasm-tools - wasmToolsComponentNew create golem component with wasm-tools -``` - -For building the project for the first time (or after `clean`) use the following commands: - -```shell -go run mage.go updateRpcStubs -go run mage.go build -``` - -After this, using the `build` command is enough, unless there are changes in the RPC dependencies, -in that case `updateRpcStubs` is needed again. - -The final components that are usable by golem are placed in the `target/components` folder. - -## Deploying and testing the example - -In the example 3 simple counter components are defined, which can be familiar from the smaller examples. To showcase the remote calls, the counters `add` functions are connected, apart from increasing their own counter: - - **component one** delegates the add call to **component two** and **three** too, - - and **component two** delegates to **component three**. - -In both cases the _current worker name_ will be used as _target worker name_ too. - -Apart from _worker name_, remote calls also require the **target components' deployed ID**. For this the example uses environment variables, and uses the `lib/cfg` subpackage (which is shared between the components) to extract it. - -The examples assume a configured default `golem-cli` profile, and will use that. - -To test, first we have to build the project as seen in the above: - -```shell -go run mage.go updateRpcStubs -go run mage.go build -``` - -Then we can deploy our components with `golem-cli`, for which a wrapper magefile command is provided: - -```shell -go run mage.go deploy -``` - -Once the components are deployed, a simple example integration test suite can be used to test the components. -The tests are in the [/integration/integration_test.go](/integration/integration_test.go) test file, and can be run with: - -```shell -go run mage.go testIntegration -``` - -The `TestDeployed` simply tests if our components metadata is available through `golem-cli component get`. - -The `TestCallingAddOnComponentOneCallsToOtherComponents` will: - - get the _component URNs_ with `golem-cli component get` - - generates a _random worker name_, so our tests are starting from a clean state - - adds 1 - 1 worker for component one and component two with the required _environment variables_ containing the other workers' _component ids_ - - then makes various component invocations with `golem-cli worker invoke-and-await` and tests if the counters - after increments - are holding the right value according to the delegated `add` function calls. - -## Adding Components - -Use the `generateNewComponent` command to add new components to the project: - -```shell -go run mage.go generateNewComponent component-four -``` - -The above will create a new component in the `components/component-four` directory based on the template at [/component-template/component](/component-template/component). - -After adding a new component the `build` command will also include it. - -## Using Worker to Worker RPC calls - -### Under the hood - -Under the hood the _magefile_ commands below (and for build) use generic `golem-cli stubgen` subcommands: - - `golem-cli stubgen build` for creating remote call _stub WIT_ definitions and _WASM components_ for the stubs - - `golem-cli stubgen add-stub-dependency` for adding the _stub WIT_ definitions to a _component's WIT_ dependencies - - `golem-cli stubgen compose` for _composing_ components with the stub components - -### Magefile commands and required manual steps - -The dependencies between components are defined in the [/magefiles/config.go](/magefiles/config.go) build script: - -```go -// componentDeps defines the Worker to Worker RPC dependencies -var componentDeps = map[string][]string{ - "component-one": {"component-two", "component-three"}, - "component-two": {"component-three"}, -} -``` - -After changing dependencies the `updateRpcStubs` command can be used to create the necessary stubs: - -```shell -go run mage.go updateRpcStubs -``` - -The command will create stubs for the dependency projects in the ``/target/stub`` directory and will also place the required stub _WIT_ interfaces on the dependant component's `wit/deps` directory. - -To actually use the dependencies in a project it also has to be manually imported in the component's world. - -E.g. with the above definitions the following import has to be __manually__ added to `/components/component-one/wit/component-one.wit`: - -```wit -import pack-ns:component-two-stub; -import pack-ns:component-three-stub; -``` - -So the component definition should like similar to this: - -```wit -package pack-ns:component-one; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-one-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-one { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - // . - // . - // . - // other dependencies - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - import pack-ns:component-two-stub; - import pack-ns:component-three-stub; - - export component-one-api; -} -``` - -After this `build` (or the `generateBinding`) command can be used to update bindings, which now should include the -required functions for calling other components. - -Here's an example that delegates the `Add` call to another component and waits for the result: - -```go -import ( - "github.com/golemcloud/golem-go/std" - - "golem-go-project/components/component-one/binding" -) - - -func (i *Impl) Add(value uint64) { - std.Init(std.Packages{Os: true, NetHttp: true}) - - componentTwo := binding.NewComponentTwoApi(binding.GolemRpc0_1_0_TypesUri{Value: "uri"}) - defer componentTwo.Drop() - componentTwo.BlockingAdd(value) - - i.counter += value -} -``` - -Once a remote call is in place, the `build` command will also compose the stub components into the caller component. diff --git a/examples/go/go-multi-rpc/component-generator/generator.go b/examples/go/go-multi-rpc/component-generator/generator.go deleted file mode 100644 index cc0d35e..0000000 --- a/examples/go/go-multi-rpc/component-generator/generator.go +++ /dev/null @@ -1,142 +0,0 @@ -package main - -import ( - "fmt" - "io" - "io/fs" - "os" - "path/filepath" - "strings" -) - -func generate() { - if len(os.Args) != 3 { - exit(0, fmt.Sprintf("Usage: %s ", os.Args[0])) - } - - componentTemplateRoot := "component-template/component" - pkgNs := os.Args[1] - componentName := os.Args[2] - componentDir := filepath.Join("components", componentName) - - _, err := os.Stat(componentDir) - if err == nil { - exit(1, fmt.Sprintf("Target component directory already exists: %s", componentDir)) - } - if err != nil && !os.IsNotExist(err) { - exit(1, err.Error()) - } - - err = os.MkdirAll(componentDir, 0755) - if err != nil { - exit(1, err.Error()) - } - - err = fs.WalkDir( - os.DirFS(componentTemplateRoot), - ".", - func(path string, d fs.DirEntry, err error) error { - srcFilePath := filepath.Join(componentTemplateRoot, path) - fileInfo, err := os.Stat(srcFilePath) - if err != nil { - return fmt.Errorf("stat failed for template %s, %w", srcFilePath, err) - } - - if fileInfo.IsDir() { - return nil - } - - switch path { - case "main.go": - err = generateFile(pkgNs, componentName, srcFilePath, filepath.Join(componentDir, path)) - case "wit/component.wit": - err = generateFile(pkgNs, componentName, srcFilePath, filepath.Join(componentDir, "wit", componentName+".wit")) - default: - err = copyFile(srcFilePath, filepath.Join(componentDir, path)) - } - if err != nil { - return fmt.Errorf("template generation failed for %s, %w", srcFilePath, err) - } - - return nil - }) - if err != nil { - exit(1, err.Error()) - } -} - -func generateFile(pkgOrg, componentName, srcFileName, dstFileName string) error { - pascalPkgOrg := dashToPascal(pkgOrg) - pascalComponentName := dashToPascal(componentName) - - fmt.Printf("Generating from %s to %s\n", srcFileName, dstFileName) - - contentsBs, err := os.ReadFile(srcFileName) - if err != nil { - return fmt.Errorf("generateFile: read file failed for %s, %w", srcFileName, err) - } - - contents := string(contentsBs) - - contents = strings.ReplaceAll(contents, "comp-name", componentName) - contents = strings.ReplaceAll(contents, "pck-ns", pkgOrg) - contents = strings.ReplaceAll(contents, "CompName", pascalComponentName) - contents = strings.ReplaceAll(contents, "PckNs", pascalPkgOrg) - - dstDir := filepath.Dir(dstFileName) - err = os.MkdirAll(dstDir, 0755) - if err != nil { - return fmt.Errorf("generateFile: mkdir failed for %s, %w", dstDir, err) - } - - err = os.WriteFile(dstFileName, []byte(contents), 0644) - if err != nil { - return fmt.Errorf("generateFile: write file failed for %s, %w", dstFileName, err) - } - - return nil -} - -func dashToPascal(s string) string { - parts := strings.Split(s, "-") - for i, part := range parts { - if len(part) > 0 { - parts[i] = strings.ToUpper(string(part[0])) + part[1:] - } - } - return strings.Join(parts, "") -} - -func copyFile(srcFileName, dstFileName string) error { - fmt.Printf("Copy %s to %s\n", srcFileName, dstFileName) - - src, err := os.Open(srcFileName) - if err != nil { - return fmt.Errorf("copyFile: open failed for %s, %w", srcFileName, err) - } - defer func() { _ = src.Close() }() - - dstDir := filepath.Dir(dstFileName) - err = os.MkdirAll(dstDir, 0755) - if err != nil { - return fmt.Errorf("copyFile: mkdir failed for %s, %w", dstDir, err) - } - - dst, err := os.Create(dstFileName) - if err != nil { - return fmt.Errorf("copyFile: create file failed for %s, %w", dstFileName, err) - } - defer func() { _ = dst.Close() }() - - _, err = io.Copy(dst, src) - if err != nil { - return fmt.Errorf("copyFile: copy failed from %s to %s, %w", srcFileName, dstFileName, err) - } - - return nil -} - -func exit(code int, message string) { - fmt.Println(message) - os.Exit(code) -} diff --git a/examples/go/go-multi-rpc/component-generator/main.go b/examples/go/go-multi-rpc/component-generator/main.go deleted file mode 100644 index 5316531..0000000 --- a/examples/go/go-multi-rpc/component-generator/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -func main() { - generate() -} diff --git a/examples/go/go-multi-rpc/component-template/component/main.go b/examples/go/go-multi-rpc/component-template/component/main.go deleted file mode 100644 index 99b55da..0000000 --- a/examples/go/go-multi-rpc/component-template/component/main.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "github.com/golemcloud/golem-go/std" - - "golem-go-project/components/comp-name/binding" -) - -func init() { - binding.SetExportsPckNsCompNameCompNameApi(&Impl{}) -} - -type Impl struct { - counter uint64 -} - -func (i *Impl) Add(value uint64) { - std.Init(std.Packages{Os: true, NetHttp: true}) - - i.counter += value -} - -func (i *Impl) Get() uint64 { - std.Init(std.Packages{Os: true, NetHttp: true}) - - return i.counter -} - -func main() {} diff --git a/examples/go/go-multi-rpc/component-template/component/wit/component.wit b/examples/go/go-multi-rpc/component-template/component/wit/component.wit deleted file mode 100644 index 8346aa4..0000000 --- a/examples/go/go-multi-rpc/component-template/component/wit/component.wit +++ /dev/null @@ -1,41 +0,0 @@ -package pck-ns:comp-name; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface comp-name-api { - add: func(value: u64); - get: func() -> u64; -} - -world comp-name { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - // import pck-ns:name-stub/stub-name; - - export comp-name-api; -} diff --git a/examples/go/go-multi-rpc/components/component-one/main.go b/examples/go/go-multi-rpc/components/component-one/main.go deleted file mode 100644 index 02658fe..0000000 --- a/examples/go/go-multi-rpc/components/component-one/main.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/golemcloud/golem-go/golemhost" - "github.com/golemcloud/golem-go/std" - - "golem-go-project/components/component-one/binding" - // NOTE: use the lib folder to create common packages used by multiple components - "golem-go-project/lib/cfg" -) - -func init() { - binding.SetExportsPackNsComponentOneComponentOneApi(&Impl{}) -} - -type Impl struct { - counter uint64 -} - -func (i *Impl) Add(value uint64) { - std.Init(std.Packages{Os: true, NetHttp: true}) - - selfWorkerName := golemhost.GetSelfMetadata().WorkerId.WorkerName - - { - componentTwoWorkerURI, err := cfg.ComponentTwoWorkerURI(selfWorkerName) - if err != nil { - fmt.Printf("%+v\n", err) - return - } - - fmt.Printf("Calling %s...\n", componentTwoWorkerURI.Value) - componentTwo := binding.NewComponentTwoApi(binding.GolemRpc0_1_0_TypesUri(componentTwoWorkerURI)) - defer componentTwo.Drop() - componentTwo.BlockingAdd(value) - } - - { - componentThreeWorkerURI, err := cfg.ComponentThreeWorkerURI(selfWorkerName) - if err != nil { - fmt.Printf("%+v\n", err) - return - } - - fmt.Printf("Calling %s...\n", componentThreeWorkerURI.Value) - componentThree := binding.NewComponentThreeApi(binding.GolemRpc0_1_0_TypesUri(componentThreeWorkerURI)) - defer componentThree.Drop() - componentThree.BlockingAdd(value) - } - - i.counter += value -} - -func (i *Impl) Get() uint64 { - std.Init(std.Packages{Os: true, NetHttp: true}) - - return i.counter -} - -func main() {} diff --git a/examples/go/go-multi-rpc/components/component-one/wit/component-one.wit b/examples/go/go-multi-rpc/components/component-one/wit/component-one.wit deleted file mode 100644 index e12ba38..0000000 --- a/examples/go/go-multi-rpc/components/component-one/wit/component-one.wit +++ /dev/null @@ -1,42 +0,0 @@ -package pack-ns:component-one; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-one-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-one { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - import pack-ns:component-two-stub/stub-component-two; - import pack-ns:component-three-stub/stub-component-three; - - export component-one-api; -} diff --git a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three-stub/_stub.wit b/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three-stub/_stub.wit deleted file mode 100644 index ab3de6b..0000000 --- a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three-stub/_stub.wit +++ /dev/null @@ -1,23 +0,0 @@ -package pack-ns:component-three-stub; - -interface stub-component-three { - use golem:rpc/types@0.1.0.{uri as golem-rpc-uri}; - use wasi:io/poll@0.2.0.{pollable as wasi-io-pollable}; - - resource future-get-result { - subscribe: func() -> wasi-io-pollable; - get: func() -> option; - } - resource component-three-api { - constructor(location: golem-rpc-uri); - blocking-add: func(value: u64); - add: func(value: u64); - blocking-get: func() -> u64; - get: func() -> future-get-result; - } - -} - -world wasm-rpc-stub-component-three { - export stub-component-three; -} diff --git a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three/component-three.wit b/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three/component-three.wit deleted file mode 100644 index afa68e9..0000000 --- a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-three/component-three.wit +++ /dev/null @@ -1,41 +0,0 @@ -package pack-ns:component-three; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-three-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-three { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - // e.g: import pack-ns:name-stub/stub-name; - - export component-three-api; -} diff --git a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two-stub/_stub.wit b/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two-stub/_stub.wit deleted file mode 100644 index f83aa85..0000000 --- a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two-stub/_stub.wit +++ /dev/null @@ -1,23 +0,0 @@ -package pack-ns:component-two-stub; - -interface stub-component-two { - use golem:rpc/types@0.1.0.{uri as golem-rpc-uri}; - use wasi:io/poll@0.2.0.{pollable as wasi-io-pollable}; - - resource future-get-result { - subscribe: func() -> wasi-io-pollable; - get: func() -> option; - } - resource component-two-api { - constructor(location: golem-rpc-uri); - blocking-add: func(value: u64); - add: func(value: u64); - blocking-get: func() -> u64; - get: func() -> future-get-result; - } - -} - -world wasm-rpc-stub-component-two { - export stub-component-two; -} diff --git a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two/component-two.wit b/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two/component-two.wit deleted file mode 100644 index 906a02a..0000000 --- a/examples/go/go-multi-rpc/components/component-one/wit/deps/pack-ns_component-two/component-two.wit +++ /dev/null @@ -1,41 +0,0 @@ -package pack-ns:component-two; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-two-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-two { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - //import pack-ns:component-three-stub/stub-component-three; - - export component-two-api; -} diff --git a/examples/go/go-multi-rpc/components/component-three/main.go b/examples/go/go-multi-rpc/components/component-three/main.go deleted file mode 100644 index 646e5f1..0000000 --- a/examples/go/go-multi-rpc/components/component-three/main.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "github.com/golemcloud/golem-go/std" - - "golem-go-project/components/component-three/binding" -) - -func init() { - binding.SetExportsPackNsComponentThreeComponentThreeApi(&Impl{}) -} - -type Impl struct { - counter uint64 -} - -func (i *Impl) Add(value uint64) { - std.Init(std.Packages{Os: true, NetHttp: true}) - - i.counter += value -} - -func (i *Impl) Get() uint64 { - std.Init(std.Packages{Os: true, NetHttp: true}) - - return i.counter -} - -func main() {} diff --git a/examples/go/go-multi-rpc/components/component-three/wit/component-three.wit b/examples/go/go-multi-rpc/components/component-three/wit/component-three.wit deleted file mode 100644 index afa68e9..0000000 --- a/examples/go/go-multi-rpc/components/component-three/wit/component-three.wit +++ /dev/null @@ -1,41 +0,0 @@ -package pack-ns:component-three; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-three-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-three { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - // e.g: import pack-ns:name-stub/stub-name; - - export component-three-api; -} diff --git a/examples/go/go-multi-rpc/components/component-two/main.go b/examples/go/go-multi-rpc/components/component-two/main.go deleted file mode 100644 index 8614a27..0000000 --- a/examples/go/go-multi-rpc/components/component-two/main.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/golemcloud/golem-go/golemhost" - "github.com/golemcloud/golem-go/std" - - "golem-go-project/components/component-two/binding" - // NOTE: use the lib folder to create common packages used by multiple components - "golem-go-project/lib/cfg" -) - -func init() { - binding.SetExportsPackNsComponentTwoComponentTwoApi(&Impl{}) -} - -type Impl struct { - counter uint64 -} - -func (i *Impl) Add(value uint64) { - std.Init(std.Packages{Os: true, NetHttp: true}) - - selfWorkerName := golemhost.GetSelfMetadata().WorkerId.WorkerName - - { - componentThreeWorkerURI, err := cfg.ComponentThreeWorkerURI(selfWorkerName) - if err != nil { - fmt.Printf("%+v\n", err) - return - } - - fmt.Printf("Calling %s...\n", componentThreeWorkerURI.Value) - componentThree := binding.NewComponentThreeApi(binding.GolemRpc0_1_0_TypesUri(componentThreeWorkerURI)) - defer componentThree.Drop() - componentThree.BlockingAdd(value) - } - - i.counter += value -} - -func (i *Impl) Get() uint64 { - std.Init(std.Packages{Os: true, NetHttp: true}) - - return i.counter -} - -func main() {} diff --git a/examples/go/go-multi-rpc/components/component-two/wit/component-two.wit b/examples/go/go-multi-rpc/components/component-two/wit/component-two.wit deleted file mode 100644 index 19cb60c..0000000 --- a/examples/go/go-multi-rpc/components/component-two/wit/component-two.wit +++ /dev/null @@ -1,41 +0,0 @@ -package pack-ns:component-two; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-two-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-two { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - import pack-ns:component-three-stub/stub-component-three; - - export component-two-api; -} diff --git a/examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three-stub/_stub.wit b/examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three-stub/_stub.wit deleted file mode 100644 index ab3de6b..0000000 --- a/examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three-stub/_stub.wit +++ /dev/null @@ -1,23 +0,0 @@ -package pack-ns:component-three-stub; - -interface stub-component-three { - use golem:rpc/types@0.1.0.{uri as golem-rpc-uri}; - use wasi:io/poll@0.2.0.{pollable as wasi-io-pollable}; - - resource future-get-result { - subscribe: func() -> wasi-io-pollable; - get: func() -> option; - } - resource component-three-api { - constructor(location: golem-rpc-uri); - blocking-add: func(value: u64); - add: func(value: u64); - blocking-get: func() -> u64; - get: func() -> future-get-result; - } - -} - -world wasm-rpc-stub-component-three { - export stub-component-three; -} diff --git a/examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three/component-three.wit b/examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three/component-three.wit deleted file mode 100644 index afa68e9..0000000 --- a/examples/go/go-multi-rpc/components/component-two/wit/deps/pack-ns_component-three/component-three.wit +++ /dev/null @@ -1,41 +0,0 @@ -package pack-ns:component-three; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-three-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-three { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - // import wasi:keyvalue/eventual-batch@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - // import wasi:keyvalue/eventual@0.1.0; // NOTE: cannot include it because the bindings collide with blobstore - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - // e.g: import pack-ns:name-stub/stub-name; - - export component-three-api; -} diff --git a/examples/go/go-multi-rpc/go.mod b/examples/go/go-multi-rpc/go.mod deleted file mode 100644 index 04de95d..0000000 --- a/examples/go/go-multi-rpc/go.mod +++ /dev/null @@ -1,15 +0,0 @@ -module golem-go-project - -go 1.20.0 - -require ( - github.com/golemcloud/golem-go v1.1.0 - github.com/google/uuid v1.6.0 - github.com/magefile/mage v1.15.0 - github.com/tidwall/gjson v1.17.3 -) - -require ( - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect -) diff --git a/examples/go/go-multi-rpc/go.sum b/examples/go/go-multi-rpc/go.sum deleted file mode 100644 index 6c84d28..0000000 --- a/examples/go/go-multi-rpc/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -github.com/golemcloud/golem-go v1.1.0 h1:By+OBuRu4c3WTuf2OKh71yY7rgOyLXzUgr7Y+98BjGk= -github.com/golemcloud/golem-go v1.1.0/go.mod h1:VLL22qVo5R2+jGLO43tLPpPjf2WrA6B7GQoqXKnSODo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= -github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= -github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= diff --git a/examples/go/go-multi-rpc/integration/config.go b/examples/go/go-multi-rpc/integration/config.go deleted file mode 100644 index 7c8b9fa..0000000 --- a/examples/go/go-multi-rpc/integration/config.go +++ /dev/null @@ -1,3 +0,0 @@ -package integration - -var pkgNs = "pack-ns" \ No newline at end of file diff --git a/examples/go/go-multi-rpc/integration/integration_test.go b/examples/go/go-multi-rpc/integration/integration_test.go deleted file mode 100644 index bf7523e..0000000 --- a/examples/go/go-multi-rpc/integration/integration_test.go +++ /dev/null @@ -1,201 +0,0 @@ -package integration - -import ( - "fmt" - "strings" - "testing" - - "github.com/google/uuid" - "github.com/magefile/mage/sh" - "github.com/tidwall/gjson" -) - -func TestDeployed(t *testing.T) { - componentOneURN := mustGetComponentURNByName(t, "component-one") - fmt.Printf("component-one: %s\n", componentOneURN) - - componentTwoURN := mustGetComponentURNByName(t, "component-two") - fmt.Printf("component-two: %s\n", componentTwoURN) - - componentThreeURN := mustGetComponentURNByName(t, "component-three") - fmt.Printf("component-three: %s\n", componentThreeURN) -} - -func TestCallingAddOnComponentOneCallsToOtherComponents(t *testing.T) { - workerName := uuid.New().String() - fmt.Printf("random worker name for test: %s\n", workerName) - - // Setup - { - // Get all component URNs - componentURNs := mustGetComponentURNs(t) - fmt.Printf("component urns: %#v\n", componentURNs) - - // Preparing workers with env vars for RPC, so they know the other component IDs - mustAddComponent(t, "component-one", workerName, componentURNs) - mustAddComponent(t, "component-two", workerName, componentURNs) - } - - // Call get on all component and check the counters are 0 - { - expectCounter(t, "component-one", workerName, 0) - expectCounter(t, "component-two", workerName, 0) - expectCounter(t, "component-three", workerName, 0) - } - - // Invoke add on component-one - { - mustInvokeAndAwaitWorker(t, "component-one", workerName, fmt.Sprintf("%s:component-one/component-one-api.{add}", pkgNs), []string{"3"}) - } - - // Call get on all component and check the counters are accumulated on component two and three - { - expectCounter(t, "component-one", workerName, 3) - expectCounter(t, "component-two", workerName, 3) - expectCounter(t, "component-three", workerName, 6) - } - - // Invoke add on component-two - { - mustInvokeAndAwaitWorker(t, "component-two", workerName, fmt.Sprintf("%s:component-two/component-two-api.{add}", pkgNs), []string{"2"}) - } - - // Call get on all component and check the counters are accumulated on component three - { - expectCounter(t, "component-one", workerName, 3) - expectCounter(t, "component-two", workerName, 5) - expectCounter(t, "component-three", workerName, 8) - } - - // Invoke add on component-one again - { - mustInvokeAndAwaitWorker(t, "component-one", workerName, fmt.Sprintf("%s:component-one/component-one-api.{add}", pkgNs), []string{"1"}) - } - - // Call get on all component and check the counters are accumulated on component two and three - { - expectCounter(t, "component-one", workerName, 4) - expectCounter(t, "component-two", workerName, 6) - expectCounter(t, "component-three", workerName, 10) - } -} - -func getComponentURNByName(componentName string) (string, error) { - output, err := sh.Output( - "golem-cli", "--format", "json", "component", "get", "--component-name", componentName, - ) - if err != nil { - return "", fmt.Errorf("getComponentURNByName for %s: golem-cli failed: %w\n", componentName, err) - } - - componentURN := gjson.Get(output, "componentUrn").String() - if componentURN == "" { - return "", fmt.Errorf("missing componentURN in response:\n%s\n", output) - } - - return componentURN, nil -} - -func mustGetComponentURNByName(t *testing.T, componentName string) string { - name, err := getComponentURNByName(componentName) - if err != nil { - t.Fatalf("%+v", err) - } - return name -} - -type ComponentURNs struct { - ComponentOne string - ComponentTwo string - ComponentThree string -} - -func mustGetComponentURNs(t *testing.T) ComponentURNs { - return ComponentURNs{ - ComponentOne: mustGetComponentURNByName(t, "component-one"), - ComponentTwo: mustGetComponentURNByName(t, "component-two"), - ComponentThree: mustGetComponentURNByName(t, "component-three"), - } -} - -func addComponent(componentName, workerName string, componentURNs ComponentURNs) error { - fmt.Printf("adding component: %s, %s\n", componentName, workerName) - output, err := sh.Output( - "golem-cli", "worker", - "--format", "json", - "add", - "--component-name", componentName, - "--worker-name", workerName, - "--env", fmt.Sprintf("COMPONENT_ONE_ID=%s", componentIDFromURN(componentURNs.ComponentOne)), - "--env", fmt.Sprintf("COMPONENT_TWO_ID=%s", componentIDFromURN(componentURNs.ComponentTwo)), - "--env", fmt.Sprintf("COMPONENT_THREE_ID=%s", componentIDFromURN(componentURNs.ComponentThree)), - ) - if err != nil { - return fmt.Errorf("addComponent for %s, %s: golem-cli failed: %w\n%s", componentName, workerName, err, output) - } - return nil -} - -func mustAddComponent(t *testing.T, componentName, workerName string, componentURNs ComponentURNs) { - err := addComponent(componentName, workerName, componentURNs) - if err != nil { - t.Fatalf("%+v", err) - } -} - -func invokeAndAwaitWorker(componentName, workerName, function string, functionArgs []string) (string, error) { - fmt.Printf("invoking component: %s, %s, %s, %+v\n", componentName, workerName, function, functionArgs) - - cliArgs := []string{ - "--format", "json", - "worker", - "invoke-and-await", - "--component" + "-name", componentName, - "--worker-name", workerName, - "--function", function, - } - - for _, arg := range functionArgs { - cliArgs = append(cliArgs, []string{"--arg", arg}...) - } - - output, err := sh.Output("golem-cli", cliArgs...) - if err != nil { - return "", fmt.Errorf("invokeAndAwaitWorker failed: %w", err) - } - - fmt.Println(output) - - return output, nil -} - -func mustInvokeAndAwaitWorker(t *testing.T, componentURN, workerName, function string, functionArgs []string) string { - output, err := invokeAndAwaitWorker(componentURN, workerName, function, functionArgs) - if err != nil { - t.Fatalf("%+v", err) - } - return output -} - -func componentIDFromURN(urn string) string { - return strings.Split(urn, ":")[2] -} - -func expectCounter(t *testing.T, componentName, workerName string, expected int64) { - output := mustInvokeAndAwaitWorker(t, componentName, workerName, fmt.Sprintf("%s:%s/%s-api.{get}", pkgNs, componentName, componentName), nil) - - actualValue := gjson.Get(output, "value") - if !actualValue.Exists() { - t.Fatalf("Expected counter for %s, %s: %d, actual value is missing", componentName, workerName, expected) - } - - actualArray := actualValue.Array() - if len(actualArray) != 1 { - t.Fatalf("Expected counter for %s, %s: %d, actual value tuple has bad number of elements: %s", componentName, workerName, expected, actualValue) - } - - actual := actualArray[0].Int() - if expected != actual { - t.Fatalf("Expected counter for %s, %s: %d, actual: %d", componentName, workerName, expected, actual) - } -} diff --git a/examples/go/go-multi-rpc/lib/cfg/cfg.go b/examples/go/go-multi-rpc/lib/cfg/cfg.go deleted file mode 100644 index f6bc382..0000000 --- a/examples/go/go-multi-rpc/lib/cfg/cfg.go +++ /dev/null @@ -1,68 +0,0 @@ -package cfg - -import ( - "fmt" - "os" - "strings" - - "github.com/google/uuid" - - "github.com/golemcloud/golem-go/binding" - "github.com/golemcloud/golem-go/golemhost" -) - -func ComponentIDFromEnv(key string) (golemhost.ComponentID, error) { - value := os.Getenv(key) - if value == "" { - return [16]byte{}, fmt.Errorf("missing environment variable for component id: %s", key) - } - componentID, err := uuid.Parse(strings.ToLower(value)) - if err != nil { - return [16]byte{}, fmt.Errorf("component id parse failed for %s=%s, %w", key, value, err) - } - return golemhost.ComponentID(componentID), nil -} - -func ComponentOneID() (golemhost.ComponentID, error) { - return ComponentIDFromEnv("COMPONENT_ONE_ID") -} - -func ComponentTwoID() (golemhost.ComponentID, error) { - return ComponentIDFromEnv("COMPONENT_TWO_ID") -} - -func ComponentThreeID() (golemhost.ComponentID, error) { - return ComponentIDFromEnv("COMPONENT_THREE_ID") -} - -func ComponentOneWorkerURI(workerName string) (binding.GolemRpc0_1_0_TypesUri, error) { - uri, err := workerURIF(ComponentOneID, workerName) - return uri, err -} - -func ComponentTwoWorkerURI(workerName string) (binding.GolemRpc0_1_0_TypesUri, error) { - uri, err := workerURIF(ComponentTwoID, workerName) - return uri, err -} - -func ComponentThreeWorkerURI(workerName string) (binding.GolemRpc0_1_0_TypesUri, error) { - uri, err := workerURIF(ComponentThreeID, workerName) - return uri, err -} - -func WorkerURI[T binding.GolemRpc0_1_0_TypesUri](workerID golemhost.WorkerID) T { - return T(binding.GolemRpc0_1_0_TypesUri{ - Value: fmt.Sprintf("urn:worker:%s/%s", (uuid.UUID(workerID.ComponentID)).URN(), workerID.WorkerName), - }) -} - -func workerURIF(getComponentID func() (golemhost.ComponentID, error), workerName string) (binding.GolemRpc0_1_0_TypesUri, error) { - componentID, err := getComponentID() - if err != nil { - return binding.GolemRpc0_1_0_TypesUri{}, err - } - return WorkerURI(golemhost.WorkerID{ - ComponentID: componentID, - WorkerName: workerName, - }), nil -} diff --git a/examples/go/go-multi-rpc/mage.go b/examples/go/go-multi-rpc/mage.go deleted file mode 100644 index 53c564a..0000000 --- a/examples/go/go-multi-rpc/mage.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build ignore -// +build ignore - -package main - -import ( - "os" - - "github.com/magefile/mage/mage" -) - -func main() { - os.Exit(mage.Main()) -} diff --git a/examples/go/go-multi-rpc/magefiles/config.go b/examples/go/go-multi-rpc/magefiles/config.go deleted file mode 100644 index 03e9964..0000000 --- a/examples/go/go-multi-rpc/magefiles/config.go +++ /dev/null @@ -1,13 +0,0 @@ -package main - -// componentDeps defines the Worker to Worker RPC dependencies -var componentDeps = map[string][]string{ - "component-one": {"component-two", "component-three"}, - "component-two": {"component-three"}, -} - -var pkgNs = "pack-ns" -var targetDir = "target" -var componentsDir = "components" -var libDir = "lib" -var wasiSnapshotPreview1Adapter = "adapters/tier1/wasi_snapshot_preview1.wasm" diff --git a/examples/go/go-multi-rpc/magefiles/magefile.go b/examples/go/go-multi-rpc/magefiles/magefile.go deleted file mode 100644 index ee04ca2..0000000 --- a/examples/go/go-multi-rpc/magefiles/magefile.go +++ /dev/null @@ -1,411 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/magefile/mage/sh" - "github.com/magefile/mage/target" -) - -// Build alias for BuildAllComponents -func Build() error { - return BuildAllComponents() -} - -// BuildAllComponents builds all components -func BuildAllComponents() error { - for _, componentName := range componentNames() { - err := BuildComponent(componentName) - if err != nil { - return fmt.Errorf("build all components: build component failed for %s, %w", componentName, err) - } - } - - return nil -} - -// UpdateRpcStubs builds rpc stub components and adds them as dependency -func UpdateRpcStubs() error { - for _, componentName := range stubComponentNames() { - err := BuildStubComponent(componentName) - if err != nil { - return fmt.Errorf("update RPC stubs: build stub component failed for %s, %w", componentName, err) - } - } - - for _, componentName := range componentNames() { - for _, dependency := range componentDeps[componentName] { - err := AddStubDependency(componentName, dependency) - if err != nil { - return fmt.Errorf("update RPC stubs: add stub dependecy failed for %s to %s, %w", dependency, componentName, err) - } - } - } - - return nil -} - -// BuildStubComponent builds RPC stub for component -func BuildStubComponent(componentName string) error { - componentDir := filepath.Join(componentsDir, componentName) - srcWitDir := filepath.Join(componentDir, "wit") - stubTargetDir := filepath.Join(targetDir, "stub", componentName) - destWasm := filepath.Join(stubTargetDir, "stub.wasm") - destWitDir := filepath.Join(stubTargetDir, "wit") - - return opRun(op{ - RunMessage: fmt.Sprintf("Building stub component for %s", componentName), - SkipMessage: "stub component build", - Targets: []string{destWasm, destWitDir}, - SourcePaths: []string{srcWitDir}, - Run: func() error { - return sh.RunV( - "golem-cli", "stubgen", "build", - "--source-wit-root", srcWitDir, - "--dest-wasm", destWasm, - "--dest-wit-root", destWitDir, - ) - }, - }) -} - -// AddStubDependency adds generated and built stub dependency to componentGolemCliAddStubDependency -func AddStubDependency(componentName, depComponentName string) error { - stubTargetDir := filepath.Join(targetDir, "stub", depComponentName) - srcWitDir := filepath.Join(stubTargetDir, "wit") - dstComponentDir := filepath.Join(componentsDir, componentName) - dstWitDir := filepath.Join(dstComponentDir, "wit") - dstWitDepDir := filepath.Join(dstComponentDir, dstWitDir, "deps", fmt.Sprintf("%s_%s", pkgNs, componentName)) - dstWitDepStubDir := filepath.Join(dstComponentDir, dstWitDir, "deps", fmt.Sprintf("%s_%s-stub", pkgNs, componentName)) - - return opRun(op{ - RunMessage: fmt.Sprintf("Adding stub dependecy for %s to %s", depComponentName, componentName), - SkipMessage: "add stub dependency", - Targets: []string{dstWitDepDir, dstWitDepStubDir}, - SourcePaths: []string{srcWitDir}, - Run: func() error { - return sh.RunV( - "golem-cli", "stubgen", "add-stub-dependency", - "--overwrite", - "--stub-wit-root", srcWitDir, - "--dest-wit-root", dstWitDir, - ) - }, - }) -} - -// StubCompose composes dependencies -func StubCompose(componentName, componentWasm, targetWasm string) error { - buildTargetDir := filepath.Dir(componentWasm) - dependencies := componentDeps[componentName] - - stubWasms := make([]string, len(dependencies)) - for i, componentName := range dependencies { - stubTargetDir := filepath.Join(targetDir, "stub", componentName) - stubWasms[i] = filepath.Join(stubTargetDir, "stub.wasm") - } - - return opRun(op{ - RunMessage: fmt.Sprintf("Composing %s into %s", fmt.Sprintf("[%s]", strings.Join(stubWasms, ", ")), componentName), - SkipMessage: "composing", - Targets: []string{targetWasm}, - SourcePaths: append(stubWasms, componentWasm), - Run: func() error { - composeWasm := componentWasm - if len(stubWasms) > 0 { - srcWasm := componentWasm - for i, stubWasm := range stubWasms { - prevComposeWasm := composeWasm - composeWasm = filepath.Join( - buildTargetDir, - fmt.Sprintf("compose-%d-%s.wasm", i+1, filepath.Base(dependencies[i])), - ) - - outBuf := &bytes.Buffer{} - errBuff := &bytes.Buffer{} - - _, err := sh.Exec( - nil, outBuf, errBuff, - "golem-cli", "stubgen", "compose", - "--source-wasm", srcWasm, - "--stub-wasm", stubWasm, - "--dest-wasm", composeWasm, - ) - if err != nil { - errString := errBuff.String() - if strings.Contains(errString, "Error: no dependencies of component") && - strings.Contains(errString, "were found") { - fmt.Printf("Skipping composing %s, not used\n", stubWasm) - composeWasm = prevComposeWasm - continue - } - - fmt.Print(outBuf) - fmt.Print(errBuff) - - return fmt.Errorf("StubCompose failed: %w", err) - } - srcWasm = composeWasm - } - } - - return copyFile(composeWasm, targetWasm) - }, - }) -} - -// BuildComponent builds component by name -func BuildComponent(componentName string) error { - componentDir := filepath.Join(componentsDir, componentName) - witDir := filepath.Join(componentDir, "wit") - bindingDir := filepath.Join(componentDir, "binding") - buildTargetDir := filepath.Join(targetDir, "build", componentName) - componentsTargetDir := filepath.Join(targetDir, "components") - moduleWasm := filepath.Join(buildTargetDir, "module.wasm") - embedWasm := filepath.Join(buildTargetDir, "embed.wasm") - componentWasm := filepath.Join(buildTargetDir, "component.wasm") - composedComponentWasm := filepath.Join(componentsTargetDir, fmt.Sprintf("%s.wasm", componentName)) - - return serialRun( - func() error { return os.MkdirAll(buildTargetDir, 0755) }, - func() error { return os.MkdirAll(componentsTargetDir, 0755) }, - func() error { return GenerateBinding(witDir, bindingDir) }, - func() error { return TinyGoBuildComponentBinary(componentDir, moduleWasm) }, - func() error { return WASMToolsComponentEmbed(witDir, moduleWasm, embedWasm) }, - func() error { return WASMToolsComponentNew(embedWasm, componentWasm) }, - func() error { - return StubCompose(componentName, componentWasm, composedComponentWasm) - }, - ) -} - -// GenerateBinding generates go binding from WIT -func GenerateBinding(witDir, bindingDir string) error { - return opRun(op{ - RunMessage: fmt.Sprintf("Generating bindings from %s into %s", witDir, bindingDir), - SkipMessage: "binding generation", - Targets: []string{bindingDir}, - SourcePaths: []string{witDir}, - Run: func() error { - return sh.RunV("wit-bindgen", "tiny-go", "--rename-package", "binding", "--out-dir", bindingDir, witDir) - }, - }) -} - -// TinyGoBuildComponentBinary build wasm component binary with tiny go -func TinyGoBuildComponentBinary(componentDir, moduleWasm string) error { - return opRun(op{ - RunMessage: fmt.Sprintf("Building component binary with tiny go: %s", moduleWasm), - SkipMessage: "tinygo component binary build", - Targets: []string{moduleWasm}, - SourcePaths: []string{componentsDir, libDir}, - Run: func() error { - return sh.RunV( - "tinygo", "build", "-target=wasi", "-tags=purego", - "-o", moduleWasm, - filepath.Join(componentDir, "main.go"), - ) - }, - }) -} - -// WASMToolsComponentEmbed embeds type info into wasm component with wasm-tools -func WASMToolsComponentEmbed(witDir, moduleWasm, embedWasm string) error { - return opRun(op{ - RunMessage: fmt.Sprintf("Embedding component type info (%s, %s) -> %s", moduleWasm, witDir, embedWasm), - SkipMessage: "wasm-tools component embed", - Targets: []string{embedWasm}, - SourcePaths: []string{witDir, moduleWasm}, - Run: func() error { - return sh.RunV( - "wasm-tools", "component", "embed", - witDir, moduleWasm, - "--output", embedWasm, - ) - }, - }) -} - -// WASMToolsComponentNew create golem component with wasm-tools -func WASMToolsComponentNew(embedWasm, componentWasm string) error { - return opRun(op{ - RunMessage: fmt.Sprintf("Creating new component: %s", embedWasm), - SkipMessage: "wasm-tools component new", - Targets: []string{componentWasm}, - SourcePaths: []string{embedWasm}, - Run: func() error { - return sh.RunV( - "wasm-tools", "component", "new", - embedWasm, - "-o", componentWasm, - "--adapt", wasiSnapshotPreview1Adapter, - ) - }, - }) -} - -// GenerateNewComponent generates a new component based on the component-template -func GenerateNewComponent(componentName string) error { - err := sh.RunV("go", "run", "component-generator/main.go", pkgNs, componentName) - if err != nil { - return fmt.Errorf("generate new component failed for %s, %w", componentName, err) - } - - return nil -} - -// Clean cleans the projects -func Clean() error { - fmt.Println("Cleaning...") - - paths := []string{targetDir} - for _, componentName := range componentNames() { - paths = append(paths, filepath.Join(componentsDir, componentName, "binding")) - } - - for _, path := range paths { - fmt.Printf("Deleting %s\n", path) - err := os.RemoveAll(path) - if err != nil { - return fmt.Errorf("clean: remove all failed for %s, %w", path, err) - } - } - - return nil -} - -// Deploy adds or updates all the components with golem-cli's default profile -func Deploy() error { - componentsTargetDir := filepath.Join(targetDir, "components") - for _, componentName := range componentNames() { - wasm := filepath.Join(componentsTargetDir, fmt.Sprintf("%s.wasm", componentName)) - err := sh.RunV( - "golem-cli", "component", "add", - "--non-interactive", - "--component-name", componentName, - wasm, - ) - if err != nil { - return fmt.Errorf("deploy: failed for %s, %w", componentName, err) - } - } - return nil -} - -// TestIntegration tests the deployed components -func TestIntegration() error { - err := sh.RunV("go", "test", "./integration", "-v") - if err != nil { - return fmt.Errorf("test integration failed: %w", err) - } - - return nil -} - -// componentNames returns component names based on directories found in the components directory -func componentNames() []string { - var componentNames []string - dirs, err := os.ReadDir(componentsDir) - if err != nil { - return nil - } - for _, dir := range dirs { - componentNames = append(componentNames, dir.Name()) - } - return componentNames -} - -// stubComponentNames returns component names that need stubs based on the dependencies defined in componentDeps -func stubComponentNames() []string { - componentNamesSet := make(map[string]struct{}) - for _, deps := range componentDeps { - for _, dep := range deps { - componentNamesSet[dep] = struct{}{} - } - } - - var componentNames []string - for comp := range componentNamesSet { - componentNames = append(componentNames, comp) - } - sort.Strings(componentNames) - return componentNames -} - -func copyFile(srcFileName, dstFileName string) error { - src, err := os.Open(srcFileName) - if err != nil { - return fmt.Errorf("copyFile: open failed for %s, %w", srcFileName, err) - } - defer func() { _ = src.Close() }() - - dst, err := os.Create(dstFileName) - if err != nil { - return fmt.Errorf("copyFile: create failed for %s, %w", srcFileName, err) - } - defer func() { _ = dst.Close() }() - - _, err = io.Copy(dst, src) - if err != nil { - return fmt.Errorf("copyFile: copy failed from %s to %s, %w", srcFileName, dstFileName, err) - } - - return nil -} - -func serialRun(fs ...func() error) error { - for i, f := range fs { - err := f() - if err != nil { - return fmt.Errorf("serialRun: step %d failed: %w", i+1, err) - } - } - return nil -} - -type op struct { - RunMessage string - SkipMessage string - Targets []string - SourcePaths []string - Run func() error -} - -func opRun(op op) error { - var run bool - if len(op.Targets) == 0 { - run = true - } else { - run = false - for _, t := range op.Targets { - var err error - run, err = target.Dir(t, op.SourcePaths...) - if err != nil { - return err - } - if run { - break - } - } - } - - if !run { - var targets string - if len(op.Targets) == 1 { - targets = op.Targets[0] - } else { - targets = fmt.Sprintf("(%s)", strings.Join(op.Targets, ", ")) - } - fmt.Printf("%s is up to date, skipping %s\n", targets, op.SkipMessage) - return nil - } - - fmt.Println(op.RunMessage) - return op.Run() -} diff --git a/examples/go/go-multi-rpc/metadata.json b/examples/go/go-multi-rpc/metadata.json deleted file mode 100644 index bd8c382..0000000 --- a/examples/go/go-multi-rpc/metadata.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "description": "Golem Go project with multiple components and worker-to-worker RPC calls, using magefile for managing the project", - "requiresAdapter": true, - "requiresGolemHostWIT": true, - "requiresWASI": true, - "witDepsPaths": [ - "component-template/component/wit/deps", - "components/component-one/wit/deps", - "components/component-two/wit/deps", - "components/component-three/wit/deps" - ], - "exclude": [ - "binding", - "target" - ], - "transformExclude": [ - "generator.go", - "integration_test.go", - "magefile.go" - ], - "instructions": "INSTRUCTIONS-mage" -} \ No newline at end of file diff --git a/examples/go/go-multi-rpc/tools/tools.go b/examples/go/go-multi-rpc/tools/tools.go deleted file mode 100644 index 6d969b3..0000000 --- a/examples/go/go-multi-rpc/tools/tools.go +++ /dev/null @@ -1,6 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import _ "github.com/magefile/mage/mg" diff --git a/examples/js/js-default-minimal/package.json b/examples/js/js-default-minimal/package.json index e6ba274..228fb2a 100644 --- a/examples/js/js-default-minimal/package.json +++ b/examples/js/js-default-minimal/package.json @@ -6,7 +6,7 @@ }, "devDependencies": { "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/golem-ts": "1.1.0", + "@golemcloud/golem-ts": "1.1.1", "@golemcloud/jco": "1.4.4-golem.1", "@rollup/plugin-node-resolve": "^15.2.3", "rollup": "^4.18.0" diff --git a/examples/js/js-default/package.json b/examples/js/js-default/package.json index 71cc5fb..2f607f3 100644 --- a/examples/js/js-default/package.json +++ b/examples/js/js-default/package.json @@ -1,7 +1,7 @@ { "devDependencies": { "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/golem-ts": "1.1.0", + "@golemcloud/golem-ts": "1.1.1", "@golemcloud/jco": "1.4.4-golem.1", "@rollup/plugin-node-resolve": "^15.2.3", "rollup": "^4.18.0" diff --git a/examples/js/js-example-fetch/package.json b/examples/js/js-example-fetch/package.json index e6ba274..228fb2a 100644 --- a/examples/js/js-example-fetch/package.json +++ b/examples/js/js-example-fetch/package.json @@ -6,7 +6,7 @@ }, "devDependencies": { "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/golem-ts": "1.1.0", + "@golemcloud/golem-ts": "1.1.1", "@golemcloud/jco": "1.4.4-golem.1", "@rollup/plugin-node-resolve": "^15.2.3", "rollup": "^4.18.0" diff --git a/examples/python/python-default/golem.yaml b/examples/python/python-default/golem.yaml index 83ca484..d2070cc 100644 --- a/examples/python/python-default/golem.yaml +++ b/examples/python/python-default/golem.yaml @@ -12,6 +12,8 @@ components: linkedWasm: build/linked-components/component_name_linked.wasm build: - command: componentize-py bindings bindings + rmdirs: + - bindings sources: - wit-generated targets: diff --git a/examples/rust/INSTRUCTIONS b/examples/rust/INSTRUCTIONS index 430de50..d244de6 100644 --- a/examples/rust/INSTRUCTIONS +++ b/examples/rust/INSTRUCTIONS @@ -2,4 +2,4 @@ See the documentation about installing common tooling: https://learn.golem.cloud Compile the Rust component with cargo-component: cargo component build --release -The result in target/wasm32-wasi/release/component_name.wasm is ready to be used with Golem! +The result in target/wasm32-wasip1/release/component_name.wasm is ready to be used with Golem! diff --git a/examples/rust/rust-default-minimal/Cargo.toml._ b/examples/rust/rust-default-minimal/Cargo.toml._ index c72d241..019cae7 100644 --- a/examples/rust/rust-default-minimal/Cargo.toml._ +++ b/examples/rust/rust-default-minimal/Cargo.toml._ @@ -12,7 +12,7 @@ lto = true opt-level = 's' [dependencies] -wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } +wit-bindgen-rt = { version = "0.37.0", features = ["bitflags"] } [package.metadata.component.target] path = "wit" diff --git a/examples/rust/rust-default/Cargo.toml._ b/examples/rust/rust-default/Cargo.toml._ index d7dbeb0..c66f839 100644 --- a/examples/rust/rust-default/Cargo.toml._ +++ b/examples/rust/rust-default/Cargo.toml._ @@ -12,7 +12,7 @@ lto = true opt-level = 's' [dependencies] -wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } +wit-bindgen-rt = { version = "0.37.0", features = ["bitflags"] } golem-rust = { version = "1.2.1" } reqwest = { git = "https://github.com/zivergetech/reqwest", branch = "update-jun-2024", features = ["json"] } diff --git a/examples/rust/rust-default/golem.yaml b/examples/rust/rust-default/golem.yaml index 5a762cb..62180a3 100644 --- a/examples/rust/rust-default/golem.yaml +++ b/examples/rust/rust-default/golem.yaml @@ -14,10 +14,10 @@ components: - src - wit targets: - - target/wasm32-wasi/debug/component_name.wasm + - target/wasm32-wasip1/debug/component_name.wasm sourceWit: wit generatedWit: wit-generated - componentWasm: target/wasm32-wasi/debug/component_name.wasm + componentWasm: target/wasm32-wasip1/debug/component_name.wasm linkedWasm: target/golem-components/debug/component_name.wasm clean: - src/bindings.rs @@ -28,10 +28,10 @@ components: - src - wit targets: - - target/wasm32-wasi/release/component_name.wasm + - target/wasm32-wasip1/release/component_name.wasm sourceWit: wit generatedWit: wit-generated - componentWasm: target/wasm32-wasi/release/component_name.wasm + componentWasm: target/wasm32-wasip1/release/component_name.wasm linkedWasm: target/golem-components/release/component_name.wasm clean: - src/bindings.rs diff --git a/examples/rust/rust-default/src/lib.rs b/examples/rust/rust-default/src/lib.rs index 9b93cbb..323982c 100644 --- a/examples/rust/rust-default/src/lib.rs +++ b/examples/rust/rust-default/src/lib.rs @@ -1,6 +1,6 @@ mod bindings; -use crate::bindings::exports::golemx::componentx_interface::api::*; +use crate::bindings::exports::pack::name_exports::api::*; use std::cell::RefCell; /// This is one of any number of data types that our application diff --git a/examples/rust/rust-example-shopping-cart/Cargo.toml._ b/examples/rust/rust-example-shopping-cart/Cargo.toml._ index ee8aa4b..b4b22b5 100644 --- a/examples/rust/rust-example-shopping-cart/Cargo.toml._ +++ b/examples/rust/rust-example-shopping-cart/Cargo.toml._ @@ -14,7 +14,7 @@ opt-level = 's' [dependencies] once_cell = "1.17.1" rand = "0.8.5" -wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } +wit-bindgen-rt = { version = "0.37.0", features = ["bitflags"] } [package.metadata.component.target] path = "wit" diff --git a/examples/rust/rust-example-shopping-cart/wit/component-name.wit b/examples/rust/rust-example-shopping-cart/wit/component-name.wit index 93fed57..778ec35 100644 --- a/examples/rust/rust-example-shopping-cart/wit/component-name.wit +++ b/examples/rust/rust-example-shopping-cart/wit/component-name.wit @@ -4,14 +4,14 @@ interface api { record product-item { product-id: string, name: string, - price: float32, + price: f32, quantity: u32, } record order { order-id: string, items: list, - total: float32, + total: f32, timestamp: u64, } diff --git a/examples/rust/rust-example-test-module/README.md b/examples/rust/rust-example-test-module/README.md index 1c9fa70..7f3e693 100644 --- a/examples/rust/rust-example-test-module/README.md +++ b/examples/rust/rust-example-test-module/README.md @@ -36,4 +36,4 @@ To run the console app at the project root, do `cargo run -p app`. Again, we wi Now that we have tests and the console app to guide the implementation, we should have a very good idea of how our APIs will look like. Thereby, we shall express our APIs in the `wit` file. Next, we will add some boilerplate code in the `wasm` module to glue the Rust bindings to our Wasm implementation. Please refer to the code in `wasm\lib.rs` as well as Golem's documentation. The implementation in the Wasm module should be fairly trivial and quite similar to that of the console app. -To build the Wasm assembly, run `cargo component build --release -p wasm` at the root of our project directory. This will produce the `target/wasm32-wasi/release/lib.wasm` file in this case. +To build the Wasm assembly, run `cargo component build --release -p wasm` at the root of our project directory. This will produce the `target/wasm32-wasip1/release/lib.wasm` file in this case. diff --git a/examples/rust/rust-example-test-module/wasm/Cargo.toml._ b/examples/rust/rust-example-test-module/wasm/Cargo.toml._ index 6f41718..415a25a 100644 --- a/examples/rust/rust-example-test-module/wasm/Cargo.toml._ +++ b/examples/rust/rust-example-test-module/wasm/Cargo.toml._ @@ -18,4 +18,4 @@ path = "wit" [dependencies] lib = { path = "../lib" } -wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } +wit-bindgen-rt = { version = "0.37.0", features = ["bitflags"] } diff --git a/examples/rust/rust-example-todo-list/Cargo.toml._ b/examples/rust/rust-example-todo-list/Cargo.toml._ index a5aec44..f6b4791 100644 --- a/examples/rust/rust-example-todo-list/Cargo.toml._ +++ b/examples/rust/rust-example-todo-list/Cargo.toml._ @@ -15,7 +15,7 @@ opt-level = 's' chrono = "~0.4.26" once_cell = "~1.18.0" rand = "0.8.5" -wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } +wit-bindgen-rt = { version = "0.37.0", features = ["bitflags"] } [dependencies.uuid] version = "~1.4.0" diff --git a/examples/ts/ts-default/golem.yaml b/examples/ts/ts-default/golem.yaml index 3bdb08b..2d85ea9 100644 --- a/examples/ts/ts-default/golem.yaml +++ b/examples/ts/ts-default/golem.yaml @@ -12,6 +12,10 @@ components: linkedWasm: out/linked-components/component_name_linked.wasm build: - command: npx jco stubgen wit-generated -o src/binding + rmdirs: + - src/binding + mkdirs: + - src/binding sources: - wit-generated targets: diff --git a/examples/ts/ts-default/package.json b/examples/ts/ts-default/package.json index 04336de..478ccf2 100644 --- a/examples/ts/ts-default/package.json +++ b/examples/ts/ts-default/package.json @@ -1,7 +1,7 @@ { "devDependencies": { "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/golem-ts": "1.1.0", + "@golemcloud/golem-ts": "1.1.1", "@golemcloud/jco": "1.4.4-golem.1", "@rollup/plugin-node-resolve": "^15.2.3", "rollup-plugin-typescript2": "^0.36.0", diff --git a/examples/ts/ts-example-fetch/package.json b/examples/ts/ts-example-fetch/package.json index 59547a3..3fb3801 100644 --- a/examples/ts/ts-example-fetch/package.json +++ b/examples/ts/ts-example-fetch/package.json @@ -7,7 +7,7 @@ }, "devDependencies": { "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/golem-ts": "1.1.0", + "@golemcloud/golem-ts": "1.1.1", "@golemcloud/jco": "1.4.4-golem.1", "@rollup/plugin-node-resolve": "^15.2.3", "rollup-plugin-typescript2": "^0.36.0", diff --git a/examples/ts/ts-multi-rpc/.gitignore b/examples/ts/ts-multi-rpc/.gitignore deleted file mode 100644 index 49c372f..0000000 --- a/examples/ts/ts-multi-rpc/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -binding -generated -node_modules -out -wit-generated \ No newline at end of file diff --git a/examples/ts/ts-multi-rpc/.prettierrc b/examples/ts/ts-multi-rpc/.prettierrc deleted file mode 100644 index 963354f..0000000 --- a/examples/ts/ts-multi-rpc/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "printWidth": 120 -} diff --git a/examples/ts/ts-multi-rpc/README.md b/examples/ts/ts-multi-rpc/README.md deleted file mode 100644 index 5ae8cb8..0000000 --- a/examples/ts/ts-multi-rpc/README.md +++ /dev/null @@ -1,205 +0,0 @@ -# Golem TypeScript Example with Multiple Components and Worker to Worker RPC Communication - -## Building - -The project uses a custom Typescript build file: [build.ts](build.ts), ran through [tsx](https://nodejs.org/en/learn/getting-started/nodejs-with-typescript#running-typescript-code-with-tsx). The `build.ts` file handles **generating stubs**, **building**, **deploying** and **testing**; and also handles _"up to date" checks_ based on _modification times_. Build commands can be run using `npx tsx build.ts ` (or without _npx_, if _tsx_ is available globally), but all commands have `npm run ` wrappers, in the examples we will use the latter. - -To see the available commands use: - -```shell -npm run help - -> help -> npx tsx build.ts - -Available commands: - fmt: format using prettier - lint: lint project using eslint - fix: format, lint and fix project using prettier and eslint - build: build all components - updateRpcStubs: update stubs based on componentDependencies - generateNewComponent: generates new component from template, expects - deploy: deploy (create or update) all components - deployComponent: deploy (create or update) the specified component, expects - test: run tests - clean: clean outputs and generated code -``` - -For building the project for the first time (or after `clean`) use the following commands: - -```shell -npm install -npm run updateRpcStubs -npm run build -``` - -After this, using the `build` command is enough, unless there are changes in the RPC dependencies, -in that case `updateRpcStubs` is needed again. - -Note that multiple commands can be used in one invocation (if they do not have parameters), e.g.: - -```shell -npm run updateRpcStubs build -``` - -The final components that are usable by golem are placed in the `out/components` folder. - -## Deploying and testing the example - -In the example 3 simple counter components are defined, which can be familiar from the smaller examples. To showcase the remote calls, the counters `add` functions are connected, apart from increasing their own counter: - -- **component one** delegates the add call to **component two** and **three** too, -- and **component two** delegates to **component three**. - -In both cases the _current worker name_ will be used as _target worker name_ too. - -Apart from _worker name_, remote calls also require the **target components' deployed ID**. For this the example uses environment variables, and uses the `lib/cfg` subpackage (which is shared between the components) to extract it. - -The examples assume a configured default `golem-cli` profile, and will use that. - -To test, first we have to build the project as seen in the above: - -```shell -npm run updateRpcStubs build -``` - -Then we can deploy our components with `golem-cli`, for which a wrapper command is provided: - -```shell -npm run deploy -``` - -Note that `npm run deployComponent ` can be used to deploy (or update) only one component. - -Once the components are deployed, a simple example integration test suite can be used to test the components. - -Note that after deploy it might still take some time for the components to be prepared inside golem, which for TypeScript can take about 30-50 seconds, so invoking workers or running the tests immediately after deploy might have to wait for this preparation. - -Once the components are deployed, a simple example integration test suite can be used to test the components. -The tests are in the [/test/integration.test.ts](/test/integration.test.ts) test file, and can be run with: - -```shell -npm run test -``` - -The first test simply tests if our components metadata is available through `golem-cli component get`. - -The second test will: - -- get the _component URNs_ with `golem-cli component get` -- generates a _random worker name_, so our tests are starting from a clean state -- adds 1 - 1 worker for component one and component two with the required _environment variables_ containing the other workers' _component ids_ -- then makes various component invocations with `golem-cli worker invoke-and-await` and tests if the counters - after increments - are holding the right value according to the delegated `add` function calls. - -## Adding Components - -Use the `generateNewComponent` command to add new components to the project: - -```shell -npm run generateNewComponent component-four -``` - -The above will create a new component in the `src/components/component-four` directory based on the template at [/component-template/component](/component-template/component). - -After adding a new component the `build` command will also include it. - -## Using Worker to Worker RPC calls - -### Under the hood - -Under the hood the `build.ts` commands below use generic `golem-cli stubgen` subcommands: - -- `golem-cli stubgen build` for creating remote call _stub WIT_ definitions and _WASM components_ for the stubs -- `golem-cli stubgen add-stub-dependency` for adding the _stub WIT_ definitions to a _component's WIT_ dependencies -- `golem-cli stubgen compose` for _composing_ components with the stub components - -### Commands and required manual steps - -The dependencies between components are defined in the [build-config.ts](build-config.ts) build script: - -```typescript -// Defines worker to worker RPC dependencies -const componentDependencies: Dependencies = { - "component-one": ["component-two", "component-three"], - "component-two": ["component-three"], -}; -``` - -After changing dependencies the `updateRpcStubs` command can be used to create the necessary stubs: - -```shell -npm run updateRpcStubs -``` - -The command will create stubs for the dependency projects in the `/out/stub` directory and will also place the required stub _WIT_ interfaces on the dependant component's `wit/deps` directory. - -To actually use the dependencies in a project it also has to be manually imported in the component's world. - -E.g. with the above definitions the following import has to be **manually** added to `/components/component-one/wit/component-one.wit`: - -```wit -import pack-ns:component-two-stub; -import pack-ns:component-three-stub; -``` - -So the component definition should like similar to this: - -```wit -package pack-ns:component-one; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-one-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-one { - // Golem dependencies - import golem:api/host@1.1.0; - import golem:rpc/types@0.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - // . - // . - // . - // other dependencies - import wasi:sockets/instance-network@0.2.0; - - // Project Component dependencies - import pack-ns:component-two-stub; - import pack-ns:component-three-stub; - - export component-one-api; -} -``` - -After this `build` command can be used to update bindings, which now should include the -required functions for calling other components. - -Here's an example that delegates the `Add` call to another component and waits for the result: - -```go -import {ComponentTwoApi} from "./generated/component-two"; -import {ComponentThreeApi} from "golem:component-three-stub/stub-component-three"; - -let state = BigInt(0); - -export const componentTwoApi: ComponentTwoApi = { - add(value: bigint) { - console.log(`Adding ${value} to the counter`); - - console.log("Calling component three"); - const componentThree = new ComponentThreeApi({value: "urn"}); - componentThree.blockingAdd(value); - - state += value; - }, - get() { - return state; - } -}; -``` - -Once a remote call is in place, the `build` command will also compose the stub components into the caller component. diff --git a/examples/ts/ts-multi-rpc/build-config.ts b/examples/ts/ts-multi-rpc/build-config.ts deleted file mode 100644 index 88657bb..0000000 --- a/examples/ts/ts-multi-rpc/build-config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as path from "node:path"; - -export const pckNs = "pack-ns"; -export const outDir = "out"; -export const componentsDir = path.join("src", "components"); -export const libDir = path.join("src", "lib"); -export const generatedDir = "generated"; -export const componentTemplateDir = path.join("component-template", "component"); diff --git a/examples/ts/ts-multi-rpc/build.ts b/examples/ts/ts-multi-rpc/build.ts deleted file mode 100644 index 7bbd0ee..0000000 --- a/examples/ts/ts-multi-rpc/build.ts +++ /dev/null @@ -1,177 +0,0 @@ -import * as path from "node:path"; -import fs from "node:fs"; - -import {InputOptions, OutputOptions, rollup} from "rollup"; - -import rollupPluginNodeResolve from "@rollup/plugin-node-resolve"; -import rollupPluginTypeScript, {RollupTypescriptOptions} from "@rollup/plugin-typescript"; - -import {cmd, cmdArg, Commands, fsMatch, getComponentNameFromArgs, main} from "./src/build-tools/build-tools"; -import {run, runCapture} from "./src/lib/process"; - -import * as cfg from "./build-config"; - -const commands: Commands = { - fmt: cmd(prettierWrite, "format using prettier"), - lint: cmd(() => eslint(false), "lint project using eslint"), - fix: cmd(fix, "format, lint and fix project using prettier and eslint"), - generateNewComponent: cmdArg( - generateNewComponents, - "generates new component from template, expects ", - ), - rollupComponent: cmdArg( - rollupComponentCmd, - "Runs rollup for the specified component, expects ", - ), - deploy: cmd(deploy, "deploy (create or update) all components"), - deployComponent: cmdArg( - deployComponentCmd, - "deploy (create or update) the specified component, expects ", - ), - test: cmd(test, "run tests"), -}; - -const componentNames: string[] = fs - .readdirSync(cfg.componentsDir, {withFileTypes: true}) - .filter((entry) => entry.isDirectory()) - .map((entry) => entry.name); - -async function prettierWrite() { - return run("npx", ["prettier", ".", "--write"]); -} - -async function eslint(fix: boolean) { - const args = ["eslint", "--color"]; - if (fix) args.push("--fix"); - return run("npx", args); -} - -async function fix() { - await prettierWrite(); - await eslint(true); -} - -async function rollupComponentCmd(args: string[]) { - return rollupComponent(getComponentNameFromArgs(args)); -} - -async function rollupComponent(componentName: string) { - const componentDir = path.join(cfg.componentsDir, componentName); - const mainTs = path.join(cfg.componentsDir, componentName, "main.ts"); - const componentBuildDir = path.join(cfg.outDir, "build", componentName); - const mainJs = path.join(componentBuildDir, "main.js"); - const generatedInterfacesDir = path.join(componentDir, cfg.generatedDir, "interfaces"); - - const moduleRegex = /declare\s+module\s+"([^"]+)"/g; - const externalInterfaces: string[] = fsMatch({ - includePaths: [generatedInterfacesDir], - picoPattern: "**/*.d.ts", - }).flatMap((path) => - [...fs.readFileSync(path).toString().matchAll(moduleRegex)].map((match) => { - const moduleName = match[1]; - if (moduleName === undefined) { - throw new Error(`Missing match for module name`); - } - return moduleName; - }), - ); - - const tsOptions: RollupTypescriptOptions = { - include: ["src/lib/**/*.ts", componentDir + "/**/*.ts"], - }; - - const input: InputOptions = { - input: mainTs, - external: externalInterfaces, - plugins: [rollupPluginNodeResolve(), rollupPluginTypeScript(tsOptions)], - }; - - const output: OutputOptions = { - file: mainJs, - format: "esm", - }; - - const bundle = await rollup(input); - await bundle.write(output); - await bundle.close(); -} - -async function generateNewComponents(args: string[]) { - const componentName = getComponentNameFromArgs(args); - const componentDir = path.join(cfg.componentsDir, componentName); - - if (fs.existsSync(componentDir)) { - throw new Error(`${componentDir} already exists!`); - } - - console.log(`Creating directory ${componentDir}`); - fs.mkdirSync(componentDir, {recursive: true}); - - const entries = fs.readdirSync(cfg.componentTemplateDir, { - recursive: true, - withFileTypes: true, - }); - - for (const entry of entries) { - const relEntryPath = path.relative(cfg.componentTemplateDir, entry.parentPath); - if (entry.isDirectory()) { - const targetPath = path.join(componentDir, relEntryPath, entry.name); - console.log(`Creating directory ${targetPath}`); - fs.mkdirSync(targetPath); - - continue; - } - - if (entry.name.endsWith(".template")) { - const sourcePath = path.join(entry.parentPath, entry.name); - const targetPath = path.join(componentDir, relEntryPath, entry.name.replaceAll(".template", "")); - console.log(`Generating ${targetPath} from ${sourcePath}`); - - const dashToPascal = (str: string): string => - str - .split("-") - .map((s) => s.substring(0, 1).toUpperCase() + s.substring(1)) - .join(""); - const componentNamePascal = dashToPascal(componentName); - const componentNameCamel = componentNamePascal.substring(0, 1).toLowerCase() + componentNamePascal.substring(1); - - let template = fs.readFileSync(sourcePath).toString(); - template = template.replaceAll("pck-ns", cfg.pckNs); - template = template.replaceAll("comp-name", componentName); - template = template.replaceAll("compName", componentNameCamel); - template = template.replaceAll("CompName", componentNamePascal); - - fs.writeFileSync(targetPath, new Uint8Array(Buffer.from(template))); - - continue; - } - - const sourcePath = path.join(entry.parentPath, entry.name); - const targetPath = path.join(componentDir, relEntryPath, entry.name); - console.log(`Copying ${sourcePath} to ${targetPath}`); - fs.copyFileSync(sourcePath, targetPath); - } -} - -async function deploy() { - for (const componentName of componentNames) { - await deployComponent(componentName); - } -} - -async function deployComponentCmd(args: string[]) { - return deployComponent(getComponentNameFromArgs(args)); -} - -async function deployComponent(componentName: string) { - console.log(`Deploying ${componentName}`); - const linkedComponentsDir = path.join(cfg.outDir, "linked-components"); - const wasm = path.join(linkedComponentsDir, componentName + "-linked.wasm"); - return run("golem-cli", ["component", "add", "--non-interactive", "--component-name", componentName, wasm]); -} - -async function test() { - return run("npx", ["tsx", ...fsMatch({includePaths: ["test"], picoPattern: "test/**.test.ts"})]); -} - -await main(commands); diff --git a/examples/ts/ts-multi-rpc/component-template/component/golem.yaml.template b/examples/ts/ts-multi-rpc/component-template/component/golem.yaml.template deleted file mode 100644 index b542fd7..0000000 --- a/examples/ts/ts-multi-rpc/component-template/component/golem.yaml.template +++ /dev/null @@ -1,8 +0,0 @@ -# Schema for IDEA: -# $schema: https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json -# Schema for vscode-yaml -# yaml-language-server: $schema=https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json - -components: - comp-name: - template: ts diff --git a/examples/ts/ts-multi-rpc/component-template/component/main.ts.template b/examples/ts/ts-multi-rpc/component-template/component/main.ts.template deleted file mode 100644 index 4db024b..0000000 --- a/examples/ts/ts-multi-rpc/component-template/component/main.ts.template +++ /dev/null @@ -1,13 +0,0 @@ -import {CompNameApi} from "./binding/comp-name"; - -let state = BigInt(0); - -export const compNameApi: CompNameApi = { - add(value: bigint) { - console.log(`Adding ${value} to the counter`); - state += value; - }, - get() { - return state; - } -}; diff --git a/examples/ts/ts-multi-rpc/component-template/component/wit/main.wit.template b/examples/ts/ts-multi-rpc/component-template/component/wit/main.wit.template deleted file mode 100644 index 65888dd..0000000 --- a/examples/ts/ts-multi-rpc/component-template/component/wit/main.wit.template +++ /dev/null @@ -1,34 +0,0 @@ -package pck-ns:comp-name; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface comp-name-api { - add: func(value: u64); - get: func() -> u64; -} - -world comp-name { - import golem:api/host@1.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - export comp-name-api; -} diff --git a/examples/ts/ts-multi-rpc/eslint.config.js b/examples/ts/ts-multi-rpc/eslint.config.js deleted file mode 100644 index 5dcba04..0000000 --- a/examples/ts/ts-multi-rpc/eslint.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import eslintConfigPrettier from "eslint-config-prettier"; -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; - -export default [ - { - files: ["**/*.{js,mjs,cjs,ts}"], - }, - { - ignores: ["**/generated"], - }, - { - languageOptions: { - globals: globals.browser, - }, - }, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, - eslintConfigPrettier, -]; diff --git a/examples/ts/ts-multi-rpc/golem.yaml b/examples/ts/ts-multi-rpc/golem.yaml deleted file mode 100644 index 4951861..0000000 --- a/examples/ts/ts-multi-rpc/golem.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# Schema for IDEA: -# $schema: https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json -# Schema for vscode-yaml -# yaml-language-server: $schema=https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json - -tempDir: out/golem-temp -includes: -- src/components/*/golem.yaml -witDeps: -- wit-deps -templates: - ts: - sourceWit: wit - generatedWit: wit-generated - componentWasm: ../../../out/components/{{ componentName }}.wasm - linkedWasm: ../../../out/linked-components/{{ componentName }}-linked.wasm - build: - - command: npx jco stubgen src/components/{{ componentName }}/wit-generated -o src/components/{{ componentName }}/binding - dir: ../../.. - sources: - - src/components/{{ componentName }}/wit-generated - targets: - - src/components/{{ componentName }}/binding - - command: npx tsx build.ts rollupComponent {{ componentName }} - dir: ../../.. - sources: - - src/components/{{ componentName }} - targets: - - out/build/{{ componentName }}/main.js - - command: npx jco componentize -w src/components/{{ componentName }}/wit-generated -o out/components/{{ componentName }}.wasm out/build/{{ componentName }}/main.js - dir: ../../.. - mkdirs: - - out/components/{{ componentName }} - sources: - - out/build/{{ componentName }}/main.js - targets: - - out/components/{{ componentName }}.wasm - clean: - - binding - - wit-generated - customCommands: - install: - - command: npm install diff --git a/examples/ts/ts-multi-rpc/metadata.json b/examples/ts/ts-multi-rpc/metadata.json deleted file mode 100644 index c6cbd21..0000000 --- a/examples/ts/ts-multi-rpc/metadata.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "description": "Golem TypeScript project with multiple components and worker-to-worker RPC calls", - "requiresAdapter": false, - "requiresGolemHostWIT": true, - "requiresWASI": true, - "witDepsPaths": [ - "wit-deps" - ], - "exclude": [ - "binding", - "generated", - "wit-generated", - "out" - ], - "transformExclude": [ - "build.ts", - "build-tools.ts", - "integration.test.ts", - "golem.yaml" - ], - "instructions": "INSTRUCTIONS-buildts" -} \ No newline at end of file diff --git a/examples/ts/ts-multi-rpc/package-lock.json b/examples/ts/ts-multi-rpc/package-lock.json deleted file mode 100644 index 6e36e1a..0000000 --- a/examples/ts/ts-multi-rpc/package-lock.json +++ /dev/null @@ -1,3269 +0,0 @@ -{ - "name": "ts-multi-rpc", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@golemcloud/golem-ts": "0.2.0" - }, - "devDependencies": { - "@eslint/js": "^9.9.1", - "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/jco": "1.4.4-golem.1", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-typescript": "^11.1.6", - "@types/node": "^20.14.2", - "@types/picomatch": "^3.0.1", - "eslint": "^9.9.1", - "eslint-config-prettier": "^9.1.0", - "globals": "^15.9.0", - "picomatch": "^4.0.2", - "prettier": "3.3.3", - "rollup": "^4.21.2", - "tslib": "^2.7.0", - "tsx": "^4.19.0", - "typescript-eslint": "^8.3.0" - } - }, - "node_modules/@bytecodealliance/preview2-shim": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.16.5.tgz", - "integrity": "sha512-1YThPyZ/gWZBgmJ3nEsnBXLxgSV3VOW3vLfyxe/RTKk9fWkTKaUouuZHWBvP0aFN7Hnat733rUeSYAUjEUNONQ==", - "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)" - }, - "node_modules/@bytecodealliance/wizer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer/-/wizer-7.0.4.tgz", - "integrity": "sha512-DaEoFCNxS4srJa9hqVkC2twvQqvvMWv4R+mEmTRtOB0Rt4d1hDcKJmjy/lIcrJHmzJu/dSZtTNaRpBwoCD/yLg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "wizer": "wizer.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@bytecodealliance/wizer-darwin-arm64": "7.0.4", - "@bytecodealliance/wizer-darwin-x64": "7.0.4", - "@bytecodealliance/wizer-linux-arm64": "7.0.4", - "@bytecodealliance/wizer-linux-s390x": "7.0.4", - "@bytecodealliance/wizer-linux-x64": "7.0.4", - "@bytecodealliance/wizer-win32-x64": "7.0.4" - } - }, - "node_modules/@bytecodealliance/wizer-darwin-arm64": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-arm64/-/wizer-darwin-arm64-7.0.4.tgz", - "integrity": "sha512-9HO2k49riA+35i/av6pR3APdkCr6MSLZedmw4/106NPg6HTASoCx6pInNibUvVPah3ALMZAl4adjKUAOFdYuLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "bin": { - "wizer-darwin-arm64": "wizer" - } - }, - "node_modules/@bytecodealliance/wizer-darwin-x64": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-x64/-/wizer-darwin-x64-7.0.4.tgz", - "integrity": "sha512-/9QNAQ8/DCWpdb+S/gGMXdq/nw3Q/XUMvvn85T4N55lMj59XLgGE220cqWDueW1iiAFH/cNtJKjsy/Y3BSlP7g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "bin": { - "wizer-darwin-x64": "wizer" - } - }, - "node_modules/@bytecodealliance/wizer-linux-arm64": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-arm64/-/wizer-linux-arm64-7.0.4.tgz", - "integrity": "sha512-EAIyuHR2EO/z2ecAMdBvtL3+fopOO2LZ9rTDaRX1MMJUv8D7lXYTSOksOiOnrMwsguRDIVbC1Z/ot5gw5LwoTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "bin": { - "wizer-linux-arm64": "wizer" - } - }, - "node_modules/@bytecodealliance/wizer-linux-s390x": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-s390x/-/wizer-linux-s390x-7.0.4.tgz", - "integrity": "sha512-otkIzM8H3ouub4ug1Y3ZhzywSiaHLiJzTLFm8tdK0l2397ygPmFKQycQxAM36+qFx58R8zDA63GZXOORbrYWeA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "bin": { - "wizer-linux-s390x": "wizer" - } - }, - "node_modules/@bytecodealliance/wizer-linux-x64": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-x64/-/wizer-linux-x64-7.0.4.tgz", - "integrity": "sha512-SEBfjvl5S4eYEZOdyPs13TYX7873Ir1ZFS4mAM9b8dbAmx8p3hOITg2jBstCrIu7qSu3TrhOfv96tEMZDGoSKA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "bin": { - "wizer-linux-x64": "wizer" - } - }, - "node_modules/@bytecodealliance/wizer-win32-x64": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-win32-x64/-/wizer-win32-x64-7.0.4.tgz", - "integrity": "sha512-Jp+/iOcvUuewGJr8aLozb1xVcIOCyv3/AL54Ir+mziWec6IA5hXwa6NZ5MY4GiQXcOryKfatzllP1JbqtYD4yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "bin": { - "wizer-win32-x64": "wizer" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.9.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", - "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@golemcloud/componentize-js": { - "version": "0.10.5-golem.3", - "resolved": "https://registry.npmjs.org/@golemcloud/componentize-js/-/componentize-js-0.10.5-golem.3.tgz", - "integrity": "sha512-ujI/2sUAgc8EBx/35G+5qcXRN2pIHXXVwNmogxQ20a/qP7Xy09Mz2nkSCMl4oMdQ3AgR7s4JITudQUdW/4MbKA==", - "dev": true, - "workspaces": [ - "." - ], - "dependencies": { - "@bytecodealliance/wizer": "^7.0.4", - "@golemcloud/jco": "1.4.4-golem.1", - "es-module-lexer": "^1.5.4" - } - }, - "node_modules/@golemcloud/golem-ts": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@golemcloud/golem-ts/-/golem-ts-0.2.0.tgz", - "integrity": "sha512-/15BBatWKYXczG7NPd2jK1/xwEFNmFwfw1kL3DBCcoL3IXTriAz1W99J+Phkf5F+ztceDguZlFMpM+B7TtJ1QA==", - "license": "Apache-2.0" - }, - "node_modules/@golemcloud/jco": { - "version": "1.4.4-golem.1", - "resolved": "https://registry.npmjs.org/@golemcloud/jco/-/jco-1.4.4-golem.1.tgz", - "integrity": "sha512-UPLlI7vVoLcoM1h69OQ1HwciSD2r2SuXqBwlCj6pAtfUfC2HdN+S2CTviSMMqsW0c5+ruf+0L6/rkbjNeI0MAQ==", - "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", - "workspaces": [ - "packages/preview2-shim" - ], - "dependencies": { - "@bytecodealliance/preview2-shim": "^0.16.5", - "binaryen": "^118.0.0", - "chalk-template": "^1", - "commander": "^12", - "mkdirp": "^3", - "ora": "^8", - "terser": "^5" - }, - "bin": { - "jco": "src/jco.js" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.16.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.2.tgz", - "integrity": "sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", - "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.3.0", - "@typescript-eslint/type-utils": "8.3.0", - "@typescript-eslint/utils": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", - "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.3.0", - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/typescript-estree": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", - "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", - "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.3.0", - "@typescript-eslint/utils": "8.3.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", - "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", - "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", - "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.3.0", - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/typescript-estree": "8.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", - "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.3.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binaryen": { - "version": "118.0.0", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-118.0.0.tgz", - "integrity": "sha512-KzekjPjpLE1zk29BKQSHNWLSHPYAfa80lcsIi5bDnev8vyfDyiMCVFPjaplhfXIKs7LI3r1RPyhoAj4qsRQwwg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "wasm-as": "bin/wasm-as", - "wasm-ctor-eval": "bin/wasm-ctor-eval", - "wasm-dis": "bin/wasm-dis", - "wasm-merge": "bin/wasm-merge", - "wasm-metadce": "bin/wasm-metadce", - "wasm-opt": "bin/wasm-opt", - "wasm-reduce": "bin/wasm-reduce", - "wasm-shell": "bin/wasm-shell", - "wasm2js": "bin/wasm2js" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.9.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", - "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.9.1", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", - "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", - "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz", - "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.3.0.tgz", - "integrity": "sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.3.0", - "@typescript-eslint/parser": "8.3.0", - "@typescript-eslint/utils": "8.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/examples/ts/ts-multi-rpc/package.json b/examples/ts/ts-multi-rpc/package.json deleted file mode 100644 index ff6e72c..0000000 --- a/examples/ts/ts-multi-rpc/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "module", - "scripts": { - "fmt": "npx tsx build.ts fmt", - "lint": "npx tsx build.ts lint", - "fix": "npx tsx build.ts fix", - "generateNewComponent": "npx tsx build.ts generateNewComponent", - "rollupComponent": "npx tsx build.ts rollupComponent", - "deploy": "npx tsx build.ts deploy", - "deployComponent": "npx tsx build.ts deployComponent", - "test": "npx tsx build.ts test", - "help": "npx tsx build.ts" - }, - "dependencies": { - "@golemcloud/golem-ts": "1.1.0" - }, - "devDependencies": { - "@eslint/js": "^9.9.1", - "@golemcloud/componentize-js": "0.10.5-golem.3", - "@golemcloud/jco": "1.4.4-golem.1", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-typescript": "^11.1.6", - "@types/node": "^20.14.2", - "@types/picomatch": "^3.0.1", - "eslint": "^9.9.1", - "eslint-config-prettier": "^9.1.0", - "globals": "^15.9.0", - "picomatch": "^4.0.2", - "prettier": "3.3.3", - "rollup": "^4.28.1", - "tslib": "^2.7.0", - "tsx": "^4.19.0", - "typescript-eslint": "^8.3.0" - } -} diff --git a/examples/ts/ts-multi-rpc/src/build-tools/build-tools.ts b/examples/ts/ts-multi-rpc/src/build-tools/build-tools.ts deleted file mode 100644 index e020726..0000000 --- a/examples/ts/ts-multi-rpc/src/build-tools/build-tools.ts +++ /dev/null @@ -1,98 +0,0 @@ -import fs, { Dirent } from "node:fs"; -import path from "node:path"; -import picomatch from "picomatch"; - -export class Command { - private constructor( - description: string, - run: (() => Promise) | undefined, - runArgs: ((args: string[]) => Promise) | undefined, - ) { - this.description = description; - this.run = run; - this.runArgs = runArgs; - } - - static cmd(run: () => Promise, description: string): Command { - return new Command(description, run, undefined); - } - - static cmdArgs(runArgs: (args: string[]) => Promise, description: string): Command { - return new Command(description, undefined, runArgs); - } - - readonly description: string; - readonly run?: () => Promise; - readonly runArgs?: (args: string[]) => Promise; -} - -export const cmd = Command.cmd; -export const cmdArg = Command.cmdArgs; - -export type Commands = { [key: string]: Command }; - -export function getComponentNameFromArgs(args: string[]) { - if (args.length != 1) { - throw new Error(`expected exactly one argument (component-name), got: [${args.join(", ")}]`); - } - - const componentName = args[0]; - if (componentName === undefined) { - throw new Error("Undefined component name"); - } - - return componentName; -} - -export async function main(commands: Commands) { - const args = process.argv.splice(2); - - if (args.length == 0) { - const maxCmdLen = Math.max(...Object.keys(commands).map((cmd) => cmd.length)) + 1; - console.log("Available commands:"); - for (const [name, cmd] of Object.entries(commands)) { - console.log(` ${(name + ":").padEnd(maxCmdLen)} ${cmd.description}`); - } - return; - } - - for (const cmd of args) { - const command = commands[cmd]; - if (command === undefined) { - throw new Error(`Command not found: ${cmd}`); - } - if (command.run !== undefined) { - await command.run(); - } else if (command.runArgs != undefined) { - await command.runArgs(args.splice(1)); - return; - } else { - throw new Error( - `Illegal state: both command.run and command.runArgs is undefined, description: ${command.description}`, - ); - } - } -} - -interface FsMatchOptions { - includePaths?: string[]; - picoPattern?: string; - direntFilter?: (dirent: Dirent) => boolean; -} - -export function fsMatch(options: FsMatchOptions): string[] { - const includePaths = options.includePaths ?? ["."]; - return includePaths.flatMap((includePath) => { - if (!fs.existsSync(includePath)) return []; - const picoMatcher = options.picoPattern !== undefined ? picomatch(options.picoPattern) : undefined; - return fs - .readdirSync(includePath, { withFileTypes: true, recursive: true }) - .map((entry): [Dirent, string] => [entry, path.join(entry.parentPath, entry.name)]) - .filter(([dirent, path]) => { - if (options.direntFilter !== undefined && !options.direntFilter(dirent)) return false; - if (picoMatcher !== undefined && !picoMatcher(path)) return false; - return true; - }) - .map(([, path]) => path); - }); -} diff --git a/examples/ts/ts-multi-rpc/src/components/component-one/golem.yaml b/examples/ts/ts-multi-rpc/src/components/component-one/golem.yaml deleted file mode 100644 index fbe9d9c..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-one/golem.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# Schema for IDEA: -# $schema: https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json -# Schema for vscode-yaml -# yaml-language-server: $schema=https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json - -components: - component-one: - template: ts -dependencies: - component-one: - - target: component-two - type: wasm-rpc - - target: component-three - type: wasm-rpc \ No newline at end of file diff --git a/examples/ts/ts-multi-rpc/src/components/component-one/main.ts b/examples/ts/ts-multi-rpc/src/components/component-one/main.ts deleted file mode 100644 index ff04584..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-one/main.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ComponentOneApi } from "./binding/component-one"; -import { ComponentTwoApi } from "pack-ns:component-two-stub/stub-component-two"; -import { ComponentThreeApi } from "pack-ns:component-three-stub/stub-component-three"; -import * as cfg from "../../lib/cfg"; -import { getSelfMetadata } from "golem:api/host@1.1.0"; - -let state = BigInt(0); - -export const componentOneApi: ComponentOneApi = { - add(value: bigint) { - console.log(`Adding ${value} to the counter`); - - const workerName = getSelfMetadata().workerId.workerName; - - const componentTwoWorkerURN = cfg.getComponentTwoWorkerURN(workerName); - console.log(`Calling component two: ${componentTwoWorkerURN}`); - const componentTwo = new ComponentTwoApi(componentTwoWorkerURN); - componentTwo.blockingAdd(value); - - const componentThreeWorkerURN = cfg.getComponentThreeWorkerURN(workerName); - console.log(`Calling component three: ${componentThreeWorkerURN}`); - const componentThree = new ComponentThreeApi(componentThreeWorkerURN); - componentThree.blockingAdd(value); - - state += value; - }, - get() { - return state; - }, -}; diff --git a/examples/ts/ts-multi-rpc/src/components/component-one/wit/main.wit b/examples/ts/ts-multi-rpc/src/components/component-one/wit/main.wit deleted file mode 100644 index 65c30a8..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-one/wit/main.wit +++ /dev/null @@ -1,35 +0,0 @@ -package pack-ns:component-one; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-one-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-one { - // Golem dependencies - import golem:api/host@1.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - export component-one-api; -} diff --git a/examples/ts/ts-multi-rpc/src/components/component-three/golem.yaml b/examples/ts/ts-multi-rpc/src/components/component-three/golem.yaml deleted file mode 100644 index 2e6835d..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-three/golem.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Schema for IDEA: -# $schema: https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json -# Schema for vscode-yaml -# yaml-language-server: $schema=https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json - -components: - component-three: - template: ts diff --git a/examples/ts/ts-multi-rpc/src/components/component-three/main.ts b/examples/ts/ts-multi-rpc/src/components/component-three/main.ts deleted file mode 100644 index 55e456e..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-three/main.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ComponentThreeApi } from "./binding/component-three"; - -let state = BigInt(0); - -export const componentThreeApi: ComponentThreeApi = { - add(value: bigint) { - console.log(`Adding ${value} to the counter`); - state += value; - }, - get() { - return state; - }, -}; diff --git a/examples/ts/ts-multi-rpc/src/components/component-three/wit/main.wit b/examples/ts/ts-multi-rpc/src/components/component-three/wit/main.wit deleted file mode 100644 index 9f9016e..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-three/wit/main.wit +++ /dev/null @@ -1,35 +0,0 @@ -package pack-ns:component-three; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-three-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-three { - // Golem dependencies - import golem:api/host@0.2.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - export component-three-api; -} diff --git a/examples/ts/ts-multi-rpc/src/components/component-two/golem.yaml b/examples/ts/ts-multi-rpc/src/components/component-two/golem.yaml deleted file mode 100644 index 70186b7..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-two/golem.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# Schema for IDEA: -# $schema: https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json -# Schema for vscode-yaml -# yaml-language-server: $schema=https://schema.golem.cloud/app/golem/1.1.0/golem.schema.json - -components: - component-two: - template: ts -dependencies: - component-two: - - target: component-three - type: wasm-rpc diff --git a/examples/ts/ts-multi-rpc/src/components/component-two/main.ts b/examples/ts/ts-multi-rpc/src/components/component-two/main.ts deleted file mode 100644 index 353fb3b..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-two/main.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentTwoApi } from "./binding/component-two"; -import { ComponentThreeApi } from "pack-ns:component-three-stub/stub-component-three"; -import * as cfg from "../../lib/cfg"; -import { getSelfMetadata } from "golem:api/host@1.1.0"; - -let state = BigInt(0); - -export const componentTwoApi: ComponentTwoApi = { - add(value: bigint) { - console.log(`Adding ${value} to the counter`); - - const workerName = getSelfMetadata().workerId.workerName; - - const componentThreeWorkerURN = cfg.getComponentThreeWorkerURN(workerName); - console.log(`Calling component three: ${componentThreeWorkerURN}`); - const componentThree = new ComponentThreeApi(componentThreeWorkerURN); - componentThree.blockingAdd(value); - - state += value; - }, - get() { - return state; - }, -}; diff --git a/examples/ts/ts-multi-rpc/src/components/component-two/wit/main.wit b/examples/ts/ts-multi-rpc/src/components/component-two/wit/main.wit deleted file mode 100644 index 512b7ec..0000000 --- a/examples/ts/ts-multi-rpc/src/components/component-two/wit/main.wit +++ /dev/null @@ -1,35 +0,0 @@ -package pack-ns:component-two; - -// See https://component-model.bytecodealliance.org/design/wit.html for more details about the WIT syntax - -interface component-two-api { - add: func(value: u64); - get: func() -> u64; -} - -world component-two { - // Golem dependencies - import golem:api/host@1.1.0; - - // WASI dependencies - import wasi:blobstore/blobstore; - import wasi:blobstore/container; - import wasi:cli/environment@0.2.0; - import wasi:clocks/wall-clock@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import wasi:filesystem/preopens@0.2.0; - import wasi:filesystem/types@0.2.0; - import wasi:http/types@0.2.0; - import wasi:http/outgoing-handler@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - import wasi:logging/logging; - import wasi:random/random@0.2.0; - import wasi:random/insecure@0.2.0; - import wasi:random/insecure-seed@0.2.0; - import wasi:sockets/ip-name-lookup@0.2.0; - import wasi:sockets/instance-network@0.2.0; - - export component-two-api; -} diff --git a/examples/ts/ts-multi-rpc/src/lib/cfg.ts b/examples/ts/ts-multi-rpc/src/lib/cfg.ts deleted file mode 100644 index 33acd74..0000000 --- a/examples/ts/ts-multi-rpc/src/lib/cfg.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { getEnvironment } from "wasi:cli/environment@0.2.0"; - -let env: Map | undefined = undefined; - -export const envVarKeys = { - COMPONENT_ONE_ID: "COMPONENT_ONE_ID", - COMPONENT_TWO_ID: "COMPONENT_TWO_ID", - COMPONENT_THREE_ID: "COMPONENT_THREE_ID", -}; - -function getEnv(key: string): string | undefined { - if (env === undefined) { - env = new Map(); - for (const [key, value] of getEnvironment()) { - env.set(key, value); - } - } - - return env.get(key); -} - -function mustGetEnv(key: string): string { - const value = getEnv(key); - if (value == undefined) { - throw new Error(`Expected environment variable is missing: ${key}`); - } - return value; -} - -export interface Uri { - value: string; -} - -function getComponentWorkerURN(componentID: string, workerName: string): string { - return `urn:worker:${componentID}/${workerName}`; -} - -export function getComponentOneWorkerURN(workerName: string): Uri { - return { - value: getComponentWorkerURN(mustGetEnv(envVarKeys.COMPONENT_ONE_ID), workerName), - }; -} - -export function getComponentTwoWorkerURN(workerName: string): Uri { - return { - value: getComponentWorkerURN(mustGetEnv(envVarKeys.COMPONENT_TWO_ID), workerName), - }; -} - -export function getComponentThreeWorkerURN(workerName: string): Uri { - return { - value: getComponentWorkerURN(mustGetEnv(envVarKeys.COMPONENT_THREE_ID), workerName), - }; -} diff --git a/examples/ts/ts-multi-rpc/src/lib/process.ts b/examples/ts/ts-multi-rpc/src/lib/process.ts deleted file mode 100644 index 1314f77..0000000 --- a/examples/ts/ts-multi-rpc/src/lib/process.ts +++ /dev/null @@ -1,50 +0,0 @@ -import child_process from "node:child_process"; - -export function run(command: string, args: string[]): Promise { - return new Promise((resolve, reject) => { - const child = child_process.spawn(command, args); - - child.stdout.on("data", (data) => process.stdout.write(data)); - child.stderr.on("data", (data) => process.stderr.write(data)); - - child.on("close", (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`Command [${command} ${args.join(" ")}] failed with exit code ${code}`)); - } - }); - - child.on("error", (error) => reject(error)); - }); -} - -export interface RunResult { - code: number | null; - stdout: string; - stderr: string; - cmd: string; -} - -export function runCapture(command: string, args: string[]): Promise { - return new Promise((resolve, reject) => { - const child = child_process.spawn(command, args); - - let stderr: string = ""; - let stdout: string = ""; - - child.stdout.on("data", (data) => (stdout += data)); - child.stderr.on("data", (data) => (stderr += data)); - - child.on("close", (code) => { - resolve({ - code: code, - stdout: stdout, - stderr: stderr, - cmd: `${command} ${args.join(" ")}`, - }); - }); - - child.on("error", (error) => reject(error)); - }); -} diff --git a/examples/ts/ts-multi-rpc/test/integration.test.ts b/examples/ts/ts-multi-rpc/test/integration.test.ts deleted file mode 100644 index 0363cc0..0000000 --- a/examples/ts/ts-multi-rpc/test/integration.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { test } from "node:test"; -import * as assert from "node:assert"; -import { run, runCapture } from "../src/lib/process"; -import { randomUUID } from "node:crypto"; -import * as buildCfg from "../build-config"; - -test("Project is deployed", async () => { - const componentOneMeta = await getComponentMeta("component-one"); - console.log(componentOneMeta); - assert.ok(componentOneMeta); - assert.ok(componentOneMeta["componentUrn"]); - - const componentTwoMeta = await getComponentMeta("component-two"); - console.log(componentTwoMeta); - assert.ok(componentTwoMeta); - assert.ok(componentTwoMeta["componentUrn"]); - - const componentThreeMeta = await getComponentMeta("component-three"); - console.log(componentThreeMeta); - assert.ok(componentThreeMeta); - assert.ok(componentThreeMeta["componentUrn"]); -}); - -test("Calling add on component one calls other components", async () => { - // Setup - const workerName = randomUUID(); - console.log(`Random worker name: ${workerName}`); - - const componentURNs = await getComponentURNs(); - console.log("Component URNs:", componentURNs); - - await addWorker("component-one", workerName, componentURNs); - await addWorker("component-two", workerName, componentURNs); - - // Check initial counter values - assert.equal(await invokeWorkerGet("component-one", workerName), 0); - assert.equal(await invokeWorkerGet("component-two", workerName), 0); - assert.equal(await invokeWorkerGet("component-three", workerName), 0); - - // Call add on component-one and check counter values - await invokeWorkerAdd("component-one", workerName, 2); - assert.equal(await invokeWorkerGet("component-one", workerName), 2); - assert.equal(await invokeWorkerGet("component-two", workerName), 2); - assert.equal(await invokeWorkerGet("component-three", workerName), 4); - - // Call add on component-two and check counter values - await invokeWorkerAdd("component-two", workerName, 3); - assert.equal(await invokeWorkerGet("component-one", workerName), 2); - assert.equal(await invokeWorkerGet("component-two", workerName), 5); - assert.equal(await invokeWorkerGet("component-three", workerName), 7); - - // Call add on component-three and check counter values - await invokeWorkerAdd("component-three", workerName, 1); - assert.equal(await invokeWorkerGet("component-one", workerName), 2); - assert.equal(await invokeWorkerGet("component-two", workerName), 5); - assert.equal(await invokeWorkerGet("component-three", workerName), 8); - - // Call add on component-one and check counter values - await invokeWorkerAdd("component-one", workerName, 1); - assert.equal(await invokeWorkerGet("component-one", workerName), 3); - assert.equal(await invokeWorkerGet("component-two", workerName), 6); - assert.equal(await invokeWorkerGet("component-three", workerName), 10); -}); - -async function getComponentMeta(componentName: string) { - const result = await runCapture("golem-cli", [ - "--format", - "json", - "component", - "get", - "--component-name", - componentName, - ]); - - if (result.code !== 0) { - process.stdout.write(result.stdout); - process.stderr.write(result.stderr); - throw new Error(`component get for ${componentName} failed with code ${result.code}`); - } - - return JSON.parse(result.stdout); -} - -interface ComponentURNs { - componentOne: string; - componentTwo: string; - componentThree: string; -} - -async function getComponentURNs(): Promise { - return { - componentOne: (await getComponentMeta("component-one"))["componentUrn"], - componentTwo: (await getComponentMeta("component-two"))["componentUrn"], - componentThree: (await getComponentMeta("component-three"))["componentUrn"], - }; -} - -function componentIdFromURN(compURN: string) { - return compURN.split(":")[2] as string; -} - -async function addWorker(componentName: string, workerName: string, componentURNs: ComponentURNs) { - console.log(`Adding worker: ${componentName}, ${workerName}`); - return run("golem-cli", [ - "worker", - "--format", - "json", - "add", - "--component-name", - componentName, - "--worker-name", - workerName, - "--env", - `COMPONENT_ONE_ID=${componentIdFromURN(componentURNs.componentOne)}`, - "--env", - `COMPONENT_TWO_ID=${componentIdFromURN(componentURNs.componentTwo)}`, - "--env", - `COMPONENT_THREE_ID=${componentIdFromURN(componentURNs.componentThree)}`, - ]); -} - -async function invokeAndAwaitWorker( - componentName: string, - workerName: string, - functionName: string, - functionArgs: string[], -) { - console.log(`Invoking worker: ${componentName}, ${workerName}, ${functionName}, ${functionArgs}`); - - const result = await runCapture("golem-cli", [ - "--format", - "json", - "worker", - "invoke-and-await", - "--component-name", - componentName, - "--worker-name", - workerName, - "--function", - functionName, - ...functionArgs.flatMap((arg) => ["--arg", arg]), - ]); - - if (result.code !== 0) { - process.stdout.write(result.stdout); - process.stderr.write(result.stderr); - throw new Error(`invoke and await worker failed with code ${result.code}`); - } - - console.log(result.stdout); - - return JSON.parse(result.stdout); -} - -async function invokeWorkerGet(componentName: string, workerName: string) { - const result = await invokeAndAwaitWorker( - componentName, - workerName, - `${buildCfg.pckNs}:${componentName}-interface/${componentName}-api.{get}`, - [], - ); - return result["value"][0] as number; -} - -async function invokeWorkerAdd(componentName: string, workerName: string, value: number) { - await invokeAndAwaitWorker( - componentName, - workerName, - `${buildCfg.pckNs}:${componentName}-interface/${componentName}-api.{add}`, - [value.toString()], - ); -} diff --git a/examples/ts/ts-multi-rpc/tsconfig.json b/examples/ts/ts-multi-rpc/tsconfig.json deleted file mode 100644 index ed7d8f4..0000000 --- a/examples/ts/ts-multi-rpc/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "skipLibCheck": true, - "module": "ES2022", - "target": "ES2022", - "noEmit": true, - "lib": ["ES2022"], - "types": ["node"], - "moduleResolution": "bundler", - "checkJs": false, - "strict": true, - "noUncheckedIndexedAccess": true, - "noImplicitOverride": true, - "noEmitOnError": true - }, - "exclude": ["node_modules"], - "include": ["src/**/*.ts", "test/**/*.ts", "build.ts"] -} diff --git a/examples/ts/ts-multi-rpc/wit-deps/README.md b/examples/ts/ts-multi-rpc/wit-deps/README.md deleted file mode 100644 index dabb173..0000000 --- a/examples/ts/ts-multi-rpc/wit-deps/README.md +++ /dev/null @@ -1 +0,0 @@ -Place your wit dependencies here. \ No newline at end of file