From 618eee781989c39069d42a3fe98cd1afc479f686 Mon Sep 17 00:00:00 2001 From: Caleb Schoepp Date: Tue, 12 Mar 2024 10:07:05 -0600 Subject: [PATCH] Update 04-front-end for magic 8 ball workshop Signed-off-by: Caleb Schoepp --- magic-8-ball/04-frontend.md | 15 +- .../magic-eight-ball-ts/src/index.ts | 2 + .../04-front-end/magic-8-ball-rust/Cargo.lock | 376 --- .../04-front-end/magic-8-ball-rust/Cargo.toml | 25 - .../04-front-end/magic-8-ball-rust/spin.toml | 23 - .../04-front-end/magic-8-ball-rust/src/lib.rs | 26 - .../magic-8-ball-ts/fileserver/.gitignore | 1 - .../magic-8-ball-ts/package-lock.json | 2714 ----------------- .../04-front-end/magic-8-ball-ts/spin.toml | 23 - .../04-front-end/magic-8-ball-ts/src/index.ts | 23 - .../.gitignore | 0 .../magic-eight-ball-rust/Cargo.lock | 675 ++++ .../magic-eight-ball-rust/Cargo.toml | 19 + .../assets/icon/favicon-16x16.png | Bin 0 -> 833 bytes .../assets/icon/favicon-32x32.png | Bin 0 -> 2045 bytes .../assets/icon/favicon.ico | Bin 0 -> 15406 bytes .../assets/icon/magic-eight-ball.png | Bin 0 -> 54237 bytes .../magic-eight-ball-rust/assets/index.html | 40 + .../magic-eight-ball-rust/assets/style.css | 78 + .../magic-eight-ball-rust/install-model.sh | 5 + .../magic-eight-ball-rust/spin.toml | 27 + .../magic-eight-ball-rust/src/lib.rs | 61 + .../.gitignore | 0 .../README.md | 0 .../assets/icon/favicon-16x16.png | Bin 0 -> 833 bytes .../assets/icon/favicon-32x32.png | Bin 0 -> 2045 bytes .../assets/icon/favicon.ico | Bin 0 -> 15406 bytes .../assets/icon/magic-eight-ball.png | Bin 0 -> 54237 bytes .../magic-eight-ball-ts/assets/index.html | 40 + .../magic-eight-ball-ts/assets/style.css | 78 + .../magic-eight-ball-ts/install-model.sh | 5 + .../magic-eight-ball-ts/package-lock.json | 1615 ++++++++++ .../package.json | 10 +- .../magic-eight-ball-ts/spin.toml | 27 + .../magic-eight-ball-ts/src/index.ts | 56 + .../tsconfig.json | 0 .../webpack.config.js | 0 37 files changed, 2742 insertions(+), 3222 deletions(-) delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.lock delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.toml delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-rust/spin.toml delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-rust/src/lib.rs delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-ts/fileserver/.gitignore delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-ts/package-lock.json delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-ts/spin.toml delete mode 100644 magic-8-ball/apps/04-front-end/magic-8-ball-ts/src/index.ts rename magic-8-ball/apps/04-front-end/{magic-8-ball-rust => magic-eight-ball-rust}/.gitignore (100%) create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.lock create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.toml create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon-16x16.png create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon-32x32.png create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon.ico create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/magic-eight-ball.png create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/index.html create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/style.css create mode 100755 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/install-model.sh create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/spin.toml create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-rust/src/lib.rs rename magic-8-ball/apps/04-front-end/{magic-8-ball-ts => magic-eight-ball-ts}/.gitignore (100%) rename magic-8-ball/apps/04-front-end/{magic-8-ball-ts => magic-eight-ball-ts}/README.md (100%) create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon-16x16.png create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon-32x32.png create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon.ico create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/magic-eight-ball.png create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/index.html create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/style.css create mode 100755 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/install-model.sh create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package-lock.json rename magic-8-ball/apps/04-front-end/{magic-8-ball-ts => magic-eight-ball-ts}/package.json (66%) create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/spin.toml create mode 100644 magic-8-ball/apps/04-front-end/magic-eight-ball-ts/src/index.ts rename magic-8-ball/apps/04-front-end/{magic-8-ball-ts => magic-eight-ball-ts}/tsconfig.json (100%) rename magic-8-ball/apps/04-front-end/{magic-8-ball-ts => magic-eight-ball-ts}/webpack.config.js (100%) diff --git a/magic-8-ball/04-frontend.md b/magic-8-ball/04-frontend.md index 81675f1..f7998e1 100644 --- a/magic-8-ball/04-frontend.md +++ b/magic-8-ball/04-frontend.md @@ -1,12 +1,12 @@ # Magic 8 Ball Frontend Let's make our Magic 8 Ball application more interactive by adding a frontend where you can submit your question to the omniscient 8 ball! To do this, we want to add a new component to our Spin application that can serve the frontend of our application. -Fortunately, Spin has a [static file server component](https://github.com/fermyon/spin-fileserver) that can be added to any Spin application using `spin add`. Since this will be the base of our application, overwrite the default component trigger with the wildcard `/...` to match all routes. +Fortunately, Spin has a [static file server component](https://github.com/fermyon/spin-fileserver) that can be added to any Spin application using `spin add`. Since this will be the base of our application, we must overwrite the default component trigger with the wildcard `/...` to match all routes. We also need to tell the fileserver which frontend files to serve. Choose the default `assets` when asked for the 'Directory containing the files to serve'. In your Spin app's directory create a folder named `assets`. For the purposes of this workshop, we've already prepared an HTML, CSS and JS [frontend](apps/frontend/) that you can reuse. Download these files into the `assets` folder. ```bash -$ spin add static-fileserver fileserver +$ spin add fileserver -t static-fileserver HTTP path: /... Directory containing the files to serve: assets ``` @@ -14,12 +14,13 @@ Directory containing the files to serve: assets Let's take a look at the `fileserver` component that has now been added to the application manifest (`spin.toml`). In the component there is a [`files` field](https://developer.fermyon.com/spin/writing-apps#including-files-with-components). Since Wasm has a [capability-based](https://github.com/WebAssembly/WASI/blob/ddfe3d1dda5d1473f37ecebc552ae20ce5fd319a/README.md#capability-based-security) security model, a module can only access files that have been explicitly allowed by the Wasm runtime (wasmtime). This tells Spin to enable the module to read those files at runtime. We set the destination for the files to be the root directory as this is where the [`fileserver`](https://github.com/fermyon/spin-fileserver/blob/main/src/lib.rs#L81) module is configured to look for them. ```toml -[[component]] -source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.0.3/spin_static_fs.wasm", digest = "sha256:38bf971900228222f7f6b2ccee5051f399adca58d71692cdfdea98997965fd0d" } -id = "fileserver" -files = [ { source = "assets", destination = "/" } ] -[component.trigger] +[[trigger.http]] route = "/..." +component = "fileserver" + +[component.fileserver] +source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.2.1/spin_static_fs.wasm", digest = "sha256:5f05b15f0f7cd353d390bc5ebffec7fe25c6a6d7a05b9366c86dcb1a346e9f0f" } +files = [{ source = "assets", destination = "/" }] ``` Let's look at the frontend implementation. The user asks a question and calls our Magic 8 Ball `magic-8` component to get the response. This is done in the `fetch('../magic-8')` call in the JS portion of the snippet below. You can see that we are also passing the question in the body of the request. We will use this in a later step of the workshop. Don't worry about copying the code snippet below. This is just for illustrative purposes. diff --git a/magic-8-ball/apps/03-spin-ai/magic-eight-ball-ts/src/index.ts b/magic-8-ball/apps/03-spin-ai/magic-eight-ball-ts/src/index.ts index 1f3ce69..bb342b1 100644 --- a/magic-8-ball/apps/03-spin-ai/magic-eight-ball-ts/src/index.ts +++ b/magic-8-ball/apps/03-spin-ai/magic-eight-ball-ts/src/index.ts @@ -29,6 +29,7 @@ export const handleRequest: HandleRequest = async function ( }; function answer(question: string): string { + console.log(`Question: ${question}`); const prompt = `[INST] <> You are acting as a Magic 8 Ball that predicts the answer to a questions about events now or in the future. Your tone should be expressive yet polite. @@ -50,5 +51,6 @@ function answer(question: string): string { if (response.startsWith(answerPrefix)) { response = response.substring(answerPrefix.length); } + console.log(`Answer: ${response}`); return response; } diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.lock b/magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.lock deleted file mode 100644 index 8beaf44..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.lock +++ /dev/null @@ -1,376 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "anyhow" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" - -[[package]] -name = "async-trait" -version = "0.1.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "itoa" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" - -[[package]] -name = "libc" -version = "0.2.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" - -[[package]] -name = "magic-8-ball" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes", - "http", - "rand", - "spin-sdk", - "wit-bindgen-rust", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] - -[[package]] -name = "quote" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "spin-macro" -version = "0.1.0" -source = "git+https://github.com/fermyon/spin?tag=v1.0.0-rc.1#2076c9797db7e14da36bcd9d5c264fafb1afcb3b" -dependencies = [ - "anyhow", - "bytes", - "http", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-gen-core", - "wit-bindgen-gen-rust-wasm", - "wit-bindgen-rust", -] - -[[package]] -name = "spin-sdk" -version = "1.0.0-rc.1" -source = "git+https://github.com/fermyon/spin?tag=v1.0.0-rc.1#2076c9797db7e14da36bcd9d5c264fafb1afcb3b" -dependencies = [ - "anyhow", - "bytes", - "form_urlencoded", - "http", - "spin-macro", - "thiserror", - "wit-bindgen-rust", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-ident" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wit-bindgen-gen-core" -version = "0.2.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" -dependencies = [ - "anyhow", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-gen-rust" -version = "0.2.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" -dependencies = [ - "heck", - "wit-bindgen-gen-core", -] - -[[package]] -name = "wit-bindgen-gen-rust-wasm" -version = "0.2.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" -dependencies = [ - "heck", - "wit-bindgen-gen-core", - "wit-bindgen-gen-rust", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.2.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" -dependencies = [ - "async-trait", - "bitflags", - "wit-bindgen-rust-impl", -] - -[[package]] -name = "wit-bindgen-rust-impl" -version = "0.2.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" -dependencies = [ - "proc-macro2", - "syn", - "wit-bindgen-gen-core", - "wit-bindgen-gen-rust-wasm", -] - -[[package]] -name = "wit-parser" -version = "0.2.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" -dependencies = [ - "anyhow", - "id-arena", - "pulldown-cmark", - "unicode-normalization", - "unicode-xid", -] diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.toml b/magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.toml deleted file mode 100644 index d5bf7c3..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "magic-8-ball" -authors = ["Fermyon Engineering "] -description = "" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = [ "cdylib" ] - -[dependencies] -# Useful crate to handle errors. -anyhow = "1" -# Crate to simplify working with bytes. -bytes = "1" -# General-purpose crate with common HTTP types. -http = "0.2" -rand = "0.8.5" -# serde_json = "1.0" -# The Spin SDK. -spin-sdk = { git = "https://github.com/fermyon/spin", tag = "v1.0.0-rc.1" } -# Crate that generates Rust Wasm bindings from a WebAssembly interface. -wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "cb871cfa1ee460b51eb1d144b175b9aab9c50aba" } - -[workspace] \ No newline at end of file diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/spin.toml b/magic-8-ball/apps/04-front-end/magic-8-ball-rust/spin.toml deleted file mode 100644 index cf7af33..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/spin.toml +++ /dev/null @@ -1,23 +0,0 @@ -spin_manifest_version = "1" -authors = ["Fermyon Engineering "] -description = "A Magic 8 Ball" -name = "magic-8-ball" -trigger = { type = "http", base = "/" } -version = "0.1.0" - -[[component]] -source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.0.3/spin_static_fs.wasm", digest = "sha256:38bf971900228222f7f6b2ccee5051f399adca58d71692cdfdea98997965fd0d" } -id = "fileserver" -files = [ { source = "../../frontend/", destination = "/" } ] -[component.trigger] -route = "/..." - -[[component]] -id = "magic-8-ball" -source = "target/wasm32-wasi/release/magic_8_ball.wasm" -allowed_http_hosts = [] -[component.trigger] -route = "/magic-8" -[component.build] -command = "cargo build --target wasm32-wasi --release" -watch = ["src/**/*.rs", "Cargo.toml"] diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/src/lib.rs b/magic-8-ball/apps/04-front-end/magic-8-ball-rust/src/lib.rs deleted file mode 100644 index efe2f5c..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/src/lib.rs +++ /dev/null @@ -1,26 +0,0 @@ -use anyhow::Result; -use spin_sdk::{ - http::{Request, Response}, - http_component, -}; - -/// A HTTP component that returns Magic 8 Ball responses -#[http_component] -fn handle_magic_8_ball(_req: Request) -> Result { - let answer_json = format!("{{\"answer\": \"{}\"}}", answer()); - Ok(http::Response::builder() - .status(200) - .header("Content-Type", "application/json") - .body(Some(answer_json.into()))?) -} - -fn answer<'a>() -> &'a str { - let answers = vec![ - "Ask again later.", - "Absolutely!", - "Unlikely", - "Simply put, no", - ]; - let idx = (answers.len() as f32 * rand::random::()) as usize; - answers[idx] -} diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/fileserver/.gitignore b/magic-8-ball/apps/04-front-end/magic-8-ball-ts/fileserver/.gitignore deleted file mode 100644 index 0688291..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/fileserver/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.spin/ diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/package-lock.json b/magic-8-ball/apps/04-front-end/magic-8-ball-ts/package-lock.json deleted file mode 100644 index a1488e5..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/package-lock.json +++ /dev/null @@ -1,2714 +0,0 @@ -{ - "name": "magic-8-ball", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "magic-8-ball", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@fermyon/spin-sdk": "^0.5.0", - "ts-loader": "^9.4.1", - "typescript": "^4.8.4", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@fermyon/spin-sdk": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@fermyon/spin-sdk/-/spin-sdk-0.5.0.tgz", - "integrity": "sha512-LMDEU+Zb+Sl0v/ZlTwKTpZ355wCanqs2jKIwbdnl89Rspllo/GhW/QzBgqRuMP1RidIdBXSorxhhufnmMnxQOQ==", - "dev": true, - "dependencies": { - "buffer": "npm:Buffer@^0.0.0", - "Buffer": "^0.0.0", - "fast-text-encoding": "^1.0.6", - "itty-router": "^3.0.12", - "typedarray-to-buffer": "^4.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@types/eslint": { - "version": "8.21.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.2.tgz", - "integrity": "sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "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, - "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/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/Buffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/Buffer/-/Buffer-0.0.0.tgz", - "integrity": "sha512-+zdncl8lI5TCkARStn9F1BwcuJYofYmD0oEHe5FNfCvGfeDJwf6+dSikCdQN6BMXXmHMhNNUagBN367WST1AIQ==", - "dev": true, - "engines": { - "node": ">= 0.2.0" - } - }, - "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 - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001466", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", - "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "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, - "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/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "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 - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "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 - }, - "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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.332.tgz", - "integrity": "sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "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 - }, - "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 - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/itty-router": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/itty-router/-/itty-router-3.0.12.tgz", - "integrity": "sha512-s98XTPhle6GGbaFf0kYrOD3Q8gyhnqvOqkwYijC3AmkceNKqWUp13YHg6dWmqmVv4pP7l7c94XI92I0EXVGO0w==", - "dev": true - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "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 - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "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, - "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, - "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 - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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" - } - ] - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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, - "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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.6.tgz", - "integrity": "sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", - "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", - "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" - } - ] - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "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, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@fermyon/spin-sdk": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@fermyon/spin-sdk/-/spin-sdk-0.5.0.tgz", - "integrity": "sha512-LMDEU+Zb+Sl0v/ZlTwKTpZ355wCanqs2jKIwbdnl89Rspllo/GhW/QzBgqRuMP1RidIdBXSorxhhufnmMnxQOQ==", - "dev": true, - "requires": { - "Buffer": "^0.0.0", - "fast-text-encoding": "^1.0.6", - "itty-router": "^3.0.12", - "typedarray-to-buffer": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@types/eslint": { - "version": "8.21.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.2.tgz", - "integrity": "sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "Buffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/Buffer/-/Buffer-0.0.0.tgz", - "integrity": "sha512-+zdncl8lI5TCkARStn9F1BwcuJYofYmD0oEHe5FNfCvGfeDJwf6+dSikCdQN6BMXXmHMhNNUagBN367WST1AIQ==", - "dev": true - }, - "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 - }, - "caniuse-lite": { - "version": "1.0.30001466", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", - "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "electron-to-chromium": { - "version": "1.4.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.332.tgz", - "integrity": "sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "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, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "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 - }, - "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 - }, - "fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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 - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "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 - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "itty-router": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/itty-router/-/itty-router-3.0.12.tgz", - "integrity": "sha512-s98XTPhle6GGbaFf0kYrOD3Q8gyhnqvOqkwYijC3AmkceNKqWUp13YHg6dWmqmVv4pP7l7c94XI92I0EXVGO0w==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "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 - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "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, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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 - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.6.tgz", - "integrity": "sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" - } - }, - "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, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - } - }, - "typedarray-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", - "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", - "dev": true - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/spin.toml b/magic-8-ball/apps/04-front-end/magic-8-ball-ts/spin.toml deleted file mode 100644 index 3ba069b..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/spin.toml +++ /dev/null @@ -1,23 +0,0 @@ -spin_manifest_version = "1" -authors = ["Fermyon Engineering "] -description = "A Magic 8 Ball" -name = "magic-8-ball" -trigger = { type = "http", base = "/" } -version = "0.1.0" - - -[[component]] -source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.0.3/spin_static_fs.wasm", digest = "sha256:38bf971900228222f7f6b2ccee5051f399adca58d71692cdfdea98997965fd0d" } -id = "fileserver" -files = [ { source = "../../frontend/", destination = "/" } ] -[component.trigger] -route = "/..." - -[[component]] -id = "magic-8-ball" -source = "target/spin-http-js.wasm" -exclude_files = ["**/node_modules"] -[component.trigger] -route = "/magic-8" -[component.build] -command = "npm run build" diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/src/index.ts b/magic-8-ball/apps/04-front-end/magic-8-ball-ts/src/index.ts deleted file mode 100644 index 0ee0ef4..0000000 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/src/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { HandleRequest, HttpRequest, HttpResponse } from "@fermyon/spin-sdk" - -const encoder = new TextEncoder() - -export const handleRequest: HandleRequest = async function (request: HttpRequest): Promise { - let answerJson = `{\"answer\": \"${answer()}\"}`; - return { - status: 200, - headers: { "Content-Type": "application/json" }, - body: answerJson - } -} - -function answer(): string { - let answers = [ - 'Ask again later.', - 'Absolutely!', - 'Unlikely', - 'Simply put, no' - ]; - let idx = Math.floor(Math.random() * answers.length); - return answers[idx]; -} diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-rust/.gitignore b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/.gitignore similarity index 100% rename from magic-8-ball/apps/04-front-end/magic-8-ball-rust/.gitignore rename to magic-8-ball/apps/04-front-end/magic-eight-ball-rust/.gitignore diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.lock b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.lock new file mode 100644 index 0000000..47189fd --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.lock @@ -0,0 +1,675 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" + +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "indexmap" +version = "2.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "magic-eight-ball" +version = "0.1.0" +dependencies = [ + "anyhow", + "rand", + "spin-sdk", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "routefinder" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0971d3c8943a6267d6bd0d782fdc4afa7593e7381a92a3df950ff58897e066b5" +dependencies = [ + "smartcow", + "smartstring", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "smartcow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "656fcb1c1fca8c4655372134ce87d8afdf5ec5949ebabe8d314be0141d8b5da2" +dependencies = [ + "smartstring", +] + +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "static_assertions", + "version_check", +] + +[[package]] +name = "spdx" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ef1a0fa1e39ac22972c8db23ff89aea700ab96aa87114e1fb55937a631a0c9" +dependencies = [ + "smallvec", +] + +[[package]] +name = "spin-macro" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13524474ab9f876586e29f954377a66ed14fcb646fc9893e6f0e762213ddbd86" +dependencies = [ + "anyhow", + "bytes", + "http", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "spin-sdk" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05d0c09c0935fbb586d0a76e0f14b26b23f421c5e11b81d7200d22c4ead1211" +dependencies = [ + "anyhow", + "async-trait", + "bytes", + "form_urlencoded", + "futures", + "http", + "once_cell", + "routefinder", + "serde", + "serde_json", + "spin-macro", + "thiserror", + "wit-bindgen", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-encoder" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822b645bf4f2446b949776ffca47e2af60b167209ffb70814ef8779d299cd421" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-encoder" +version = "0.41.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-metadata" +version = "0.10.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18ebaa7bd0f9e7a5e5dd29b9a998acf21c4abed74265524dd7e85934597bfb10" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.41.2", + "wasmparser 0.121.2", +] + +[[package]] +name = "wasmparser" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" +dependencies = [ + "indexmap", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.121.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" +dependencies = [ + "bitflags", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38726c54a5d7c03cac28a2a8de1006cfe40397ddf6def3f836189033a413bc08" +dependencies = [ + "bitflags", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8bf1fddccaff31a1ad57432d8bfb7027a7e552969b6c68d6d8820dcf5c2371f" +dependencies = [ + "anyhow", + "wit-component", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7200e565124801e01b7b5ddafc559e1da1b2e1bed5364d669cd1d96fb88722" +dependencies = [ + "anyhow", + "heck", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae33920ad8119fe72cf59eb00f127c0b256a236b9de029a1a10397b1f38bdbd" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.52", + "wit-bindgen-core", + "wit-bindgen-rust", + "wit-component", +] + +[[package]] +name = "wit-component" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480cc1a078b305c1b8510f7c455c76cbd008ee49935f3a6c5fd5e937d8d95b1e" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.36.2", + "wasm-metadata", + "wasmparser 0.116.1", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43771ee863a16ec4ecf9da0fc65c3bbd4a1235c8e3da5f094b562894843dfa76" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", +] diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.toml b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.toml new file mode 100644 index 0000000..cf8bce5 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "magic-eight-ball" +authors = ["Fermyon Engineering "] +description = "A Magic 8 Ball App" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# Useful crate to handle errors. +anyhow = "1" +# Library to get random response +rand = "0.8.5" +# The Spin SDK. +spin-sdk = "2.2.0" + +[workspace] diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon-16x16.png b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..51c3e00f213d147c207eed40d53a8a15595e7a91 GIT binary patch literal 833 zcmV-H1HSx;P)Px%`$DK z&hHTLpJOtaq4RMxKt`JZf|d~ znayTHPft%xAP~G43WYC%!QhW(Tnk`!c2<|kWIm?TX<@Zmg+`+RcXxN#k01zOFc{F$ z(E%cnh#DLmd=LtSBG`r=b8~YenM~$OE|(KtUS8s0bkN;=XEK=>sH>|B%RjpRT%E}4?#@{?anBL8H+;Cv-ZUJsyv*WwTj8MD6YEL0?}V zZexCa9u5x=L8Ve5_F;E-7pzt*=3#hv7;$GMNRl+iVzCbw7Z=!Ix7%?GR4N7EqETFh z*=zS{=QwP)x6{um5b9vNWI1d(!FjXt`Ye z0|c>-%0}%;rP8k=k?5h@?f%}9ax;U;Wa6ElpF6IvudS6zr5EV}1@m}3l(~4XzuzSu z8d}@j+${gIOzm4~Hk&(7PfvAhHd{szM4iLo#2E}mI2a68|6b=`SMg7y#-xE^00000 LNkvXXu0mjfHF0sc literal 0 HcmV?d00001 diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon-32x32.png b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ccebda66df690f43e7206415e2049496353e1427 GIT binary patch literal 2045 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 QHnPF>&qx21z&R55UpL|YDF6Tf literal 0 HcmV?d00001 diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/magic-eight-ball.png b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/icon/magic-eight-ball.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7a7586b6dd92c5de8ad49f692fb7c72ea01278 GIT binary patch literal 54237 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∋4BacEd1IP%1U61X}sB4CWH3jc@M=%SS! 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 Y#vNi<#PKJL1Hg0kw39u-_DahC0Sc>JT>t<8 literal 0 HcmV?d00001 diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/index.html b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/index.html new file mode 100644 index 0000000..ca2c4f2 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/index.html @@ -0,0 +1,40 @@ + + + Spin Magic Eight Ball + + + + + + + +

Ask the Magic Eight Ball a Question

+

Powered by Fermyon Serverless AI

+ +

+ +

+
+
+
+
+ +
+ + + diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/style.css b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/style.css new file mode 100644 index 0000000..3bf4888 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/assets/style.css @@ -0,0 +1,78 @@ +html { + background-color: #ECE5EE; +} + +body { + text-align: center; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + color: #0D203F; +} + +canvas { + margin: 0 auto; +} + +button { + padding: 0.4rem; + border-radius: 0.667em; + outline: none; + margin: 1rem; +} + +main { + max-width: 610px; + margin: auto; + } + +#question { + width: 400px; + font-size: 16px; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; +} + +#btn, #magicEightBall { + text-align: center; + color: black; + margin: 5px; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + font-size: 16px; +} + +#circle { + background-color: #F9F7EE; + color: black; + position: absolute; + margin-left: 70px; + margin-top: 70px; + height: 150px; + width: 150px; + border-radius: 50%; + display: none; +} + +#triangle { + display: none; + width: 120px; + height: 110px; + margin-left: 85px; + margin-top: 70px; + background-image: + linear-gradient(to bottom right, transparent 50%, #D3C3D9 0), + linear-gradient(to top right, #D3C3D9 50%, transparent 0); + background-size: 50% 100%; + background-repeat: no-repeat; + background-position: left, right; + position:absolute; +} + +#reply { + text-align: center; + color: black; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + font-size: 16px; + display: inline-block; + position: absolute; + margin-left: 85px; + margin-top: 100px; + width: 120px; +} diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/install-model.sh b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/install-model.sh new file mode 100755 index 0000000..9d1baef --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/install-model.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +mkdir -p .spin/ai-models +curl -OL https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML/resolve/main/llama-2-13b-chat.ggmlv3.q3_K_L.bin +mv llama-2-13b-chat.ggmlv3.q3_K_L.bin .spin/ai-models/llama2-chat \ No newline at end of file diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/spin.toml b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/spin.toml new file mode 100644 index 0000000..06a741f --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/spin.toml @@ -0,0 +1,27 @@ +spin_manifest_version = 2 + +[application] +name = "magic-eight-ball" +version = "0.1.0" +authors = ["Fermyon Engineering "] +description = "A Magic 8 Ball App" + +[[trigger.http]] +route = "/magic-8" +component = "magic-eight-ball" + +[component.magic-eight-ball] +source = "target/wasm32-wasi/release/magic_eight_ball.wasm" +allowed_outbound_hosts = [] +ai_models = ["llama2-chat"] +[component.magic-eight-ball.build] +command = "cargo build --target wasm32-wasi --release" +watch = ["src/**/*.rs", "Cargo.toml"] + +[[trigger.http]] +route = "/..." +component = "fileserver" + +[component.fileserver] +source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.2.1/spin_static_fs.wasm", digest = "sha256:5f05b15f0f7cd353d390bc5ebffec7fe25c6a6d7a05b9366c86dcb1a346e9f0f" } +files = [{ source = "assets", destination = "/" }] diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/src/lib.rs b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/src/lib.rs new file mode 100644 index 0000000..97186b0 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-rust/src/lib.rs @@ -0,0 +1,61 @@ +use anyhow::Result; +use spin_sdk::http::{IntoResponse, Request, Response}; +use spin_sdk::http_component; +use spin_sdk::llm; + +/// A HTTP component that returns Magic 8 Ball responses +#[http_component] +fn handle_magic_eight_ball(req: Request) -> anyhow::Result { + let body = req.body(); + let question = std::str::from_utf8(&body)?; + if question.is_empty() { + return Ok(Response::builder() + .status(200) + .header("Content-Type", "application/json") + .body("No question provided") + .build()); + } + let answer_json = format!(r#"{{"answer": "{}"}}"#, answer(question.to_string())?); + Ok(Response::builder() + .status(200) + .header("Content-Type", "application/json") + .body(answer_json) + .build()) +} + +fn answer(mut question: String) -> Result { + if &question[question.len() - 1..] != "?" { + question.push('?'); + } + println!("Question: {:?}", question); + let prompt = format!( + r"[INST] <> + You are acting as a Magic 8 Ball that predicts the answer to a questions about events now or in the future. + Your tone should be expressive yet polite. + Your answers should be 10 words or less. + Prefix your response with 'Answer:'. + <> + {question}[/INST]" + ); + // Set model to default Llama2 or the one configured in runtime-config.toml + let model = llm::InferencingModel::Llama2Chat; + let answer = llm::infer_with_options( + model, + &prompt, + llm::InferencingParams { + max_tokens: 20, + repeat_penalty: 1.5, + repeat_penalty_last_n_token_count: 20, + temperature: 0.25, + top_k: 5, + top_p: 0.25, + }, + )? + .text; + let mut answer = answer.trim(); + while let Some(a) = answer.strip_prefix("Answer:") { + answer = a.trim(); + } + println!("Answer: {:?}", answer); + Ok(answer.trim().to_string()) +} diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/.gitignore b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/.gitignore similarity index 100% rename from magic-8-ball/apps/04-front-end/magic-8-ball-ts/.gitignore rename to magic-8-ball/apps/04-front-end/magic-eight-ball-ts/.gitignore diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/README.md b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/README.md similarity index 100% rename from magic-8-ball/apps/04-front-end/magic-8-ball-ts/README.md rename to magic-8-ball/apps/04-front-end/magic-eight-ball-ts/README.md diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon-16x16.png b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..51c3e00f213d147c207eed40d53a8a15595e7a91 GIT binary patch literal 833 zcmV-H1HSx;P)Px%`$DK z&hHTLpJOtaq4RMxKt`JZf|d~ znayTHPft%xAP~G43WYC%!QhW(Tnk`!c2<|kWIm?TX<@Zmg+`+RcXxN#k01zOFc{F$ z(E%cnh#DLmd=LtSBG`r=b8~YenM~$OE|(KtUS8s0bkN;=XEK=>sH>|B%RjpRT%E}4?#@{?anBL8H+;Cv-ZUJsyv*WwTj8MD6YEL0?}V zZexCa9u5x=L8Ve5_F;E-7pzt*=3#hv7;$GMNRl+iVzCbw7Z=!Ix7%?GR4N7EqETFh z*=zS{=QwP)x6{um5b9vNWI1d(!FjXt`Ye z0|c>-%0}%;rP8k=k?5h@?f%}9ax;U;Wa6ElpF6IvudS6zr5EV}1@m}3l(~4XzuzSu z8d}@j+${gIOzm4~Hk&(7PfvAhHd{szM4iLo#2E}mI2a68|6b=`SMg7y#-xE^00000 LNkvXXu0mjfHF0sc literal 0 HcmV?d00001 diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon-32x32.png b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ccebda66df690f43e7206415e2049496353e1427 GIT binary patch literal 2045 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 QHnPF>&qx21z&R55UpL|YDF6Tf literal 0 HcmV?d00001 diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/magic-eight-ball.png b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/icon/magic-eight-ball.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7a7586b6dd92c5de8ad49f692fb7c72ea01278 GIT binary patch literal 54237 zcma%i`#;nD|9@T5DoI_gLQb7s9dOCp<~ZquORQ4Pr_7m6EN3GrDyQNqGB!oYVdgM% zo`fwiXB!(9V-9ng*)Ya;eg1;)53kz}x7Tg2*K^O;<8VJbUfs1al|FRx(4IYeq|ME4 z-ruul@0H)jf&JodB9N&e;+MUM`=;0Tlyxi3i9hV~HnB9>v!^0WYWtC-`18TXX7-3Z zd;Wa#``A0~r5e6x&p@#GO_K-VE(=Y7JkN&_%}s^tx0Qvxk~fQ9HzhSGT5f*oJC_|B z@akm4MUveoyS|$#ug{%K(RqEZBI)nfW~Q(2C+Z*ejNBDeEhCq<*`64KFt?+<5o?}J z9GL%N^}0(K2GNtl2!JXwhDks|MGEZy_wCYARsutO_H*N?38@QBzcyomBKG;3g~%41 z2Aat0Hdy?h@Aozdcpd-!MbH>NT=3n$Y;5lRd5bSN`-ad_e35k_<%3St^25uvmM(SC za|P3#ws+v!{Ka=VWgq_MyDC(u^2X(8!GzhzFWWd#*-ZUM{RLj+MM8sT&)9lxD7Ey% zWiLuLQgmDjSMSrEqgRruH~)iU%p2($AGUfl)O$y~8p{#FBasRZ5*Wd;x@?Obop>rC zqdPmw>tROF3tp|)&5=-{uHlsLV;8Kl8^`F*$W(K`5kH7fkyO%b+wf2iBHtb`74@iFBpsBEpu$$lWWzfWhbKwtWEmugc>8I0o zPyLsd7Wn=7!9_0u!JYy4u`YxJUV!BGd!@SS!Gw6!3?;Yb@n`~n=E|^tj|Hw-Q15Cu z*_T#7TiJ#|-7=4Q*=LF(WIsw2G4 zcB>L5`1$U#DKH^OmY$L?VhTez3Fs`U4D1@*X3T0p;QN&FnfJ(F(x<_)u)2ysX&x%ERgK_a zYnEu^Q!FY0br0w6?K<-j+J%6ep+Yp$4PmWs;g9)ed-X3V zRu2laoE@qh6XDSiv4|hAGIk;ajA$}`v_B7Ip?kjA_5hc(8h7|OravWHM+Of10+rKn z`f;I}+5g#su@&Y%Gjm~Pe<-hlVtHxN_pB`{v_rRza&wJF*E`lwdQAdNs`Ywo>p zRxIa!bYv8ki(|&6ZU!B-Q;D41w&Co$G`w|w-XKLM8KtJ!b^w>CIosF_wVbGy2ve8n zzVT1@8}PCf zJxg=hax?m&yOtb}@B4Fx^hFwfvAXBNJK&QUD%^&$Fj5s;EzTmbQ8iEP&NSm&1(3l*2~y-1Lf zorE#8GCR_tb{D|o%Qq%6{GD>zUe zbQ~nBxCbTE54*ECFjUXKp&wo~K-=%UuwvK zf&naT$O>!XIFp^iCtk!x^M`DWIV8ovoMp=?6l>J%B3fAX&xe7^*{4)EUJcT}f5HT*HX|baB$zof3Gm3h9|| zm;nPep&g9c&f)M|0jwHQO|xiGuX&?g6TO%5JGb!x4c&;{pNBLJnx-@Ms9nB6(T_VKY(j16qn+`GyYgLkY{1Nge&;(VHB zbglR6z&ROpYCLvxIr{jX56wL!l58j(Z~4;K{^{MslzXPeArj%~<;eFAv_m;QT+H0JXG^ynKBxh{$TK9yLV@2dr)gd+oCwh7)STUtE}zB%YZj5u)YjZh+5^` z!}1jD_t zOHuwrt(#N`{27{+m*H*fc+UUR%ziI)Ju-yWVw0lWrHF8Hd3c_n zb9)RtneADUt9oAvP#rcFLc^&>Vz##Z9ap!UCt#zG;89;{w7kYwNFXcJKQY@$5M$9= zvvZ|K$C6XQ0l88Lgz)gC1hno~%8<8FfZ&#*hv8${4@pzf0D5rhztk6{dMA_&ibO<* zZfVzl(?!WatX_UJO$F5bg>H zZF)D}5rU#d!fk3QZZ+~@yQ_GNXbn%(bimL0Xg((5d>2=u?vHLDzo(?vyEm5%u;Y=? zKPQ#tjJOw8NoQ!%zC*<@r^+nE??{0L-KXSbh@lOCK~0dGf#g-b z@GFS{UJ%lQTTen5^a%Z2Eq``;liU^EowsS>Q$a8~VVP5(8xRSssjwg4ZIMxWLQ?SF z9`MX`5tJ^ep01H2YHki69js{3a;t%G5(<>pMgSp;BkKu!x5jn986F+C4YInXA5 zs|xHQIzhFM06`~ql9@^hOqxxQv>t0&#!LaL0MKa2hKR+}k`yXrlQ7$q2SNQx@GY~-&kfS)8uLBOU8Up>T zf*-h)4y3)xgkNv&mdmNC?g9W+x2V)F%0U^cpUR4d0(%du6RQK`$yzsjCd~i+sNn{w zysau!*4%m}D9wx{6^_ddfc6s{pl>Xlg#qsz3Nu0nCSwDX;Fsc0p>;VPm=iuj244nLr+{#hu{( zA((v7k3KU`-@Mp$p?x@+Yyn1p+2hDQ1dJAHUqA?hGfZ~C20(HbQ4#uDtNT2oKv)9% zpKyD)^1b@(jZwp1`&jxuSHcH1@Luixp`1L1t!enr@3&Q&?>RL^KCEJBG@v6lj+r)o zs)lVP4jBbReLu7#V(ucF2doShtqXUzXEgmZX&p}C;D;midZ+6yex5yRyf^|79&lq# z!dz8W##m$4gW_HnHQkvR#&0~9yq;jPkfe2dL7@=*H@G9HGNC|q-p~~KrkVO&9qZYw z(x3~WgOz_+xL!9VA4T+gxjG8nCZE5e^m}#+YFCRd?>=4{jVL){v^H+s;LEi{?H8e| zV67+FV`Sy^oDAX)zsD&|#5XMuDmO1TKMlY88kLIFFccDA%c<#4NfxK3Vam0=x@OVE z;Ui%KmY@*D<62G|{|bhxE{N3Il{m!~sZht3FUE+^nrd^MdpRjK2C$*P*xn85lbts+ zmw0|Ku3@~EIBT-(%!R%YtMqbs>(pgj?e_5Hvc}1;QL2%%7sb6$?PsZBlDIK`E^Cz) zI{Ro{l!-&~{g>@)yeI(y0oUWvUu(ZsN;<$^%6$R;2oC`ki@{x3Z0c+2c{VCgW#ntU zRG2O(aNpNZVUg{wU5CCqh7g#O+++7uO9ADEt3I_A?|uozvlWuA=^Bs71<+*|b7~Bi zud5n|D?hCuDU#O<#_Byfc4$rr$^c!}OAdn4=TB<aw>@4w>GSQ~ZlNBh#P+_jN!+36xb zoX=Se5fVDLoYV;naYrQgol1o+x7Je`PU@mmbyTNC7r*g3bEEn~Ob-Z*xGEDXyyWcU z4{sV%edSCH7-_s*Ry%3muv}rV3*`PM0MKC>F=-o3W92UE^)#c2wE@U(bc4MT)kO~# zV1tA_JfIKU5~jo@lVt>N?W??W#1T9f!w74Y20aPd!1xpG&eR z_jH+$pZCM@_rtCqUkx60FkLN@-QUiyIA7sr$eM0k$UhsAjD!yAkJPk(aot;n;bL)3 zzzZ(X9b&vhbl*g(Y&-?*tcbhm?Isbzqd8NN3IMOf*`lBHo9~YA;OS^^a~x~(Zm{f6 zAn5GYFUc=5YkP$&>(9b=IAslGjPj>R)yvm$^4=no01dAz&{rW!j(*MQkk|R`=kwcb z6_Mv=KqtCnSGR%zL!BWyq?3XHwEEZeb}vK0+r|m`@i(qwyk;`v`nZL)J|2d_h>`2W zd^b0Wv^)HSV$b*3| zmYnfBrsYu;skdE|e*}Z7B16E-|Bk= z(5(SNoeM4FnG(_Zu|xAi1{#fC6IIJm%+@l8>fq_+u^Qv;@c=v5T_G)Ovs;{>xWDt) zE>t$C>XT(q{=^w`qpi8bwZd-Gzru?rk(XR{xWU?*3w?RF-I+;9d{WGnwUp*MJ@Zt5 ztL}@OlnkI`5>NJKrVZ9A$!ur_Dwn#}#L)F-(7ZLB z5?U!eh^)MsG}H{*b_uZ4M9x{ri2BlE)}}eQ=AB1Q`vM+px;z9s2L*W~U85hHpFIm| z5hF-Oh#ak&=E4xMam(&qCrYL8)tHJR3(^hOJDztBSMR@vm^BC;$I~x|px=RaeYhL_ zn9X=nv0g}39A!Ep0DpiM9|H|&&%tX0kvKJ>i~lRu;U=6;%&2tI38TnNaaj|!$VB$m z;E2L`W)jY0Czn}nWyoza-Cf?@S(bY*E*F|=D9Xhbl>H5;RMB4=Dw=s<)Z;$xM@WoB zxR`)gMYozYQ63%EY0UD6&6d1S=cW5CClz@#C9A?xL-PAw8Kqh;!LD?m?TsxTs98!y z=x5xC3KBwnPf$oqwetUNQ>%`Af^+N|H6!OfH|x1id@qqfff1yRj0;u{<9acPo4MoV zsm41S#+z$}#-a~`b3Lqc>qx?(AePBZ#Tbphwhkf#AGmKwpHkP{jkeCsYW!6okaToa zdNyu~&8XInE%hk#u>6r7;!r~l1E!?4cK=ST#q~`*ExZq> zp)df5f%<6I-1ql1gi$E<=~^Eg%^4S1rK*wr4%J@#oT?uEts=4#q6@-ME4!>evwXDK zT9I1fDw+>-UFBG~47m7FvMcQ?=7xjQeUJUHJk%kzx3}W-HvYy2`RCvaX6V8Ei`tGC z$6+MTWVZpZL$nY-Gz>21DE?*LQLE&C7aTf61A)qozuxx52bq@SUOm}utGs%#knLR> zNx{L8erH@T`mpM=4*~9P4$6{19AGIXXsK?-Xj%-&^pWkak7pi9+_qXVsCv}IwG7sLffJn)P0ybG@$SZ?@Hb$m;Y zQ1`)_NBFN)=fI3xvdHj6z?|v>nXSA?b4m@wkynWc%Cj6%Qm{t6)u)-D^0@Qn&NT%| zFimH=;3qm}0vE&o?`*2>%g0bJe1r0zx!8r4}l*z+J=Sy0LH6f zeVc_tFCY=$w8+~5BbA<+(h*A|qb$%Bm;E~{rpD3sa2vQ;fXxB5t00Z@num~gH4mVR zH_9$S!x6d614o3u-YR*t$ZAT^aT7Amr>gxu_ubkDyu{*mXk#dXc(eD>O_|fIBoX5aR^9>Uf z_qY()Rhwe0OSld(UD2(bPW`$_J>~zArg%M0Uqh6Q@lf~oPKCLOk}ad=kq>r#HtPgB zUcFi}pET9d_B!_&(>D&p@ViPPf0Oy!am=|HG-62>vz6E*T6$>f9I{x>QRy%WZH;V^ za@`>LRLHvk_?7?hvQwF_R;`>orh&WAvB!|!c8Xt%hAh=^p(9h#T)QsytnJd^Jj z?hAgNl_S3JuaX_25)A*^-!p*J`=yCwl2WwR9v4|XvRrb$ZOZ8!xj2$!W5n8<>z~Jd z*!6B9qm%wj&{)kST8CT|1x60P|rSiilxHYm> zaeQS}yT_21+vwt5^^>_j^4RdDwUVj!baln!80@EIlBr0{wNC@}+%fgnnn@4VyaU(| za_NNBe06BM{4B4KqMy!h(ehIcq@RO!bqK}DBBluW%?2^>UXSzu#XU4=QyCbY@)q1c zSmU?r;YJJo`jK)O8Ik-j*l44r!H-`Y;f;yvjt?F8oxxdtxH_$}nd`7#E6uUS2nP|r zS-~Aft-zj^rcqw>cfj9-Uk5)w1c<&L^vsy-czvR@!>ir6dLpW7)%~jv@63pj{aHko zqpLL85`#qMxi%op#zu+NSIgLwB`h<6Q9?GxJ-1Cb1TpTz2#E6cK$`q)wIMOl>&-Bw zBqo!~+`cB=!wh zL@!~Emfq@&#$Ft$N#(ky+>B*skx#yYy5r6~tg$g_&R}pv#V>5fwtikN%i)Uq%}K|_ zFFFf#TZpvb@|e{O%)(j+BxbdwW;D2S?^;B0v8JSv-bJS=m)S$%pXyExe_dqv=#3wJflU2s7pl3D|21moiN?39U%rA4a6cG07`G74BjV_w z*f&NMX*isu`>cNzW^L&Fg~j>m#Y^{Mk&4DKK8TwuB@&{Fmn`Z)k76P5G+N(y9dP@1Jc6l3q z2cO)c`Z7;>UxdrPes5V)FUY~k-RboM6uF23=Il|xJ#bQ775<|sNf*5EpiX zJvaDhvU%wcAmmThRTU#vuYZo#2V3*zNY^okv(QT$t6rTasdH5(%xnhL&OFN15%zRR zs{lQvROM=}s8wy_ni^21(u;%UGitC}E*Xt~tUTN^$$sI6Q#>1*)}ni}lDQM+zE!~Q zH40^l3JQ%`3Q5aLDC$^bYb32osN?iKmIi#QMxQS4szshj;n7E>@5F??MJ7(4}aV05XuK#nI- zJ|BmJvp+Y_xAldB9&S_;wB`~`pw}q2q<>vgp+1}vnzuzUhDc5*KXUPUj=SqsjgWs* z(+oz-efrRg8B{@{a_BIPZdp>-0Cx!Ml;)6)ceom4)!6M_f+9Iu7;p}Le^eKI+(Znt zW#7f1uK_O_6Ha~bMxx8!JeSY2qIPL{+-)YjBRU+1`eFU#gx$!aZ2Nqi&CuJ(fn;D} zWd2L;2aaCpuMA=%y+;>G4;X6CDj@Nv;|O3?HypyuFNQF6am{(l$#wymP8_5Rbq5{^ ztlbgj!<~aU{H^7h-MKKDB?n&fNZq9|e6)dy7**Sp-VeE9$URIiA6z_p%?W)9c+oE? zeO3__@^yLOU5vjOwd=jzS1wYg7)$*(8OvY1F<&kIk05@HSbfg4Qh!2OQ#$D0^=P4R zb&;m!@2cF;8wMBX;pXR5|3@yMF8KrERD;ItrPeNsrKpbye>e>&0VZ{kb=6iR6ZVRP z=#zy;%Z35D(8H)*px2YqsEqGr_s~{H)?K*EvN;Onnv# zLU2nVI=C6}e2o%6p|O+IA2n%)tUR;~xl5joH&{+KUyF};wp3B@GLrsO{}9;ELm5<& ztu{=l!BosHHeKDMHE&Ylm%`TicE`r0I+x+%XV9zFy-I)Lxva|Lewvm3N9VOyb@xs? zJ-ryQYPk1lx4DE>o?69nLIqIqEW~E>SVCmK(a1c~4Wh~&@-m)j)Jp~xYSOd}1twEY z^V|2A^M!r6nSwR{LjLW^QP0D@wgsBEi zryI~j&<2LkyxzphHi=Y?M>DV3SGG>uI@fJ|OdQ=x8dVJ|6z_M%qY8WH;EwYQ(M;^l zOeVdZ{x0LK;&F8XG35}Z7Z7;F0aJF){|!o0QWB$f->`1zNUGG_a*5W-R1~&)F0c$u zHhQVwb7>B;CUYI5lLdHIMxpDOI*5um@xu81$pA+!*EJ{({0*bCFrzb&7{sPVc<X-GH1kmGWok*nJlD;mx$20$EUN;Z=xZmQ18^#cu%uaSz9*d=)uyy!U6U{oIDDe zg({F9BkE7KKb%RDj_tmzHLh=t^<-x2xS#~{5W*9%05EONjP%9^9Glm>;89Ap@5lnj zGQIp#xe+-8r2Zgr@Z`AEOT8{hlbP_<(bLtp%P@ohHOuT#r^u1dG6u6Q03>X6s)NRK z24Y*nMgk84OE74`Kw)kWNg=l78Ew7Phj-l?r=FA}hgOp@zK$I{jxO^7JVI6^uwD{Q z$_&Bb)L9<1L{6pG9i*1V0G`(1W$42XfkpI7q$0%(AUhNBe6XGS#zC#cJ4Xbr++Uw= zM|Mc(K0HNJ#mDO}<{>g7sYSe_Gg;r8TKJtZ1)D8dYxy+&<1htB-abc?hY{!_-bAc4=V3|LyU&s#26l=Q4(yY+Ytc=i zZMy6n-tBX&CQ~ZmDlw&Q^5XI|w=%H^DBP&)^CU3VaB*_>VTY&cnxbDe4~Mv^B1q~1$!D&`3)WS_yv)qALpwNIa`m^~1B57eWzabiEZvMbX>=yP;NmuijY zzeUKpH-(=Q{qxo3zW*1q>bf$W{a-UH#{bHvNH?KnL<#_Y7FTf~?8<%4Qy}zRA9df` zg+gb%-V8D8r`>!U=gKTnZ&J%s1=el3<>T+>L3oLato~HZb#@5Xt;orUAUvVbv zl!=pRr8MV1YpanRSxSl|hJ>eMO63W9hW1#e>Pk*p z0(ai=BxY*kSH;ViR1;?d4v&C5fc|96i9< z7N!#;28YXRE_Z(x<}H)(R_u%E`h#`XQbv^WhrVKyfwzT&3avqgp>!v4Jq>_gc@B8p zF1CU}qI#T=U81G+q|gCB)qj?*WQ zIs5yC`=RR2_4om8ASdeHOf53VKI*7K24DEtiM*dz&45&T<+{4y-yj|jC}Dx}ff|)D ztt7F;$@UtDHvXa2=xBSRU*GV_jVGbkhrm{^w%H4|W+$?^s3amN1PI~>tH z)_+8KkIA-!l!7qH5U;^%b-GcMYPzPdfr z`;}5(=2TG`_1d{2_+eE*M>_jUdy;9)-4*sfs@@7WZK2^rzWiW|E_e8<3f?19QVmurNY7VzAJ=&1e=e9uFC$?VN4SaI4BTj@>Ds z5tpi&4f8)sRGz0;788}$NR={#D`)hRvLQB;lTye@g?OAkJMfVESxo3r(m7Hg@@`J3 z13TZcnV4xrg&6gXn+mULE|yBIZTb%7N_?_PvO9~Mr`yYZ(Dt@M3_nWL5&POa)WkYTQ?{hk zi6@Y|PE+3_gHuZnIxh-h7k`{3=*u|3;%hhGqfjqw)dR|!1oWk<2<8R}lwH-WUs8u3 z`|&4-&Hq&qg7E$9A}9P)M7Yc9Cx;&(;ML+6CiyOEfN&2^`Mdjeq7QFAkZ8Tmt zZ5W1FD1Bt@;snwFLZtA&X8gwdL# z+0Mv(UEujN49tG|GS!keC|<EhHg^>pNB z_$qfg4|N~z{i9DKOX%dl6~<3=UsXipx6>m>3zIIrZtrH$!AIrMAPpfcg2TD1(->?PyRhF@Vz zsh$>SgnK+!RQea_Y+KMvh;mC0(m$ZE2G!pf!HW^SkB#iSM{@}qqs0GSWbTgM6_?1a zT+s4cjA+4|N!1vwC8qpre+YQu*7B|WI({!#;7ch4LlhbV-+_t>TsrjM;T>D`dW)ra zi=8dt1MZaxZoG}EFPtAQHW$2&8zRUC<9&@2(t$opVa;1QVr^J;6O_^R1|{d0nvbqF zjo%<{pCf;TrN*O;U*-v4$g`G_%TXY)l)}rtA!CHMuYLRoG5yXql<1`9;L*#qF?f>+ zeHQWtjG4+Zrzo`LX`SOxwSu>qX3&jFXU2Vx5T|JR!S^v-&-3i9jzTLh_1grTH4t1 z^u1z#JCNXBhB|(R`X|TCwF$hxeLDL5)>P124`NI}k?m@&v$n8Q5%uS?rHJpk8?t^= z61i*jXQ}m^qIKy2AT-SYIyg`UXKF1*E$wmT&!l947fWw##aBcy7~|BOsHM8xl)}B` z30a!d$4&(*ax>j}^vTXTc@(f?xZv7unf}1@^$7NvU}~ zXziI*T9csKlmM{?5g-nhNU<|}bPi&-2-#H25sS`&Q+vkpYRgCSo}P#j96Ryj{jJcx zb0K2BY=IPDl5CwmT-T9P^|(IfZW zsP4&Jf1RwFWnC9PpE<*RNgPp!FbyMK=wM~sGP)@`IGRvy@Va;x*z zI;qoU_J+n4sn5CZV<;cNfq34|J1JPH=q4tlg$P6pTu4sqk;U*@G}t9ck+2s^erMRc zmTp_(>btSd)8m&{UL6Wnn&sG{bP44Dy`0Z~9}-tx4zBmN?z1Y@8N6i#OU(dIm@EBe z4Z|RgyW&kAYKkQ*_S7Zt<#S@0;jD&?x5R+Dz6^mWJ+KpYl1^9bL^_lf;c#$4EP5*apLTqK@=@6H@=scY7=^V zwo011Ubr+l<#k@8fGhk;Znu}a40)O7Ev?{TF>lB>NF6l%O6UU6B$db^pLP(Kt=VNGgcGYLn?B1!I2-h*@(U!0kH5M-;YoM$ zoc0Oz;i#6P?Tpgse)k)r*;hBrmQT%KVs|zKg^Vx_;>Khm;_2p-cMv=LuRk71$d$nD zhL3MOU7~b)mxcS@v{G%mj@>IX)avfBBX=l4+fTmXm%vM0IPQf6|8~XBz!)A1RS4!6 zoh8rL+ewJ=Em92WEV?mNha$D%HkAR`Q8G1xL0k0r6NWd9X2{tdDam`chK>yDhK@I1x03+wWilqg@ue@| z==IacWedM#RIdn8#@y~SZsxC?x5yl&gMC9FB12yoYzePcN;YI`r3qIvo43CR_K<^G zPX|1>QY&{xz4q^yZa3^swcYv)@uv{%%%46t$0;$&R>k*SEz=Y5rLSYu_3Bi*F*>a8 z8$9D(9=la_=kdDzC6{@3oQ}}U)mbxI$df-6Vy1jMsS3mTjON})_*n*_?=oJ8mKnv& z|1LVq)YU<2$l^HbW@0I8gOHP0u&ld3MFvTh$e;d^mt{f&5{NCuKvL@RjyBK;+n z{Q80NMrU8mcw}eeB7wP7yvdu{jcyf6kKL|)GEzAqJ|ma#h$0?GK+?n$7;&?3yE^+i z`T6luf&J02Ai2L0Lbt=?9-nPU78=2yg*m44Bo7ocnQFV-Fzh6|un`9)w;F$(K-?C~ znI#RF*F;Tk>B*xs&5qiej(k4<-SZd~sd|snNDTIw5esWx0vWTJRm6lop=C&`sBmAJ zKG{7tCob~l>!ioy1#T$Tzf9dZT-`N>97?O&D_u)PiqIFlqJT5zoEo(q8@T7MrmmmB6Qa~>&guR^Tyk-3ryL6Mye}0ha@2O7I6hR_Zt?L6{|57}g+%XDn>b`OH z#8sm35|VWeNtS6lGvw{soDSq~n@M2ZliheO*CFMnW!0=ERm+$E7xHsZdtHpcdCT_{ zsp4QtsWOn4aR9oh=5LSPntJ5jDqic-x%WZd2m@Is{R>!HR&)rgf%{Uv{7 zIaiFUk;v&RW4RnDZaxgFwiYjG9#a_bw|p5E5IvtB6Lh#2XE{b7J*)0lV?R?b(6Cnv z!I`9H0{&Rm&Z7{y^DpaR?{xfWOB=n3Mr+p5%uyrvR^jh@u{;A_uUoI4|4Sn|ntA9E z*Xf$$LPW1dj;QO{0^tC}mfuv8eU^Rr46nD!g;D~15}+qTPi{#&w_y*6xyrRQAKwww zglX=LfaXedW(8oaIiInq7RIo=6z*2}`}(imMr+A$PYxu8GKl(O&U?5x*TEjcNv~#u zu+i4-zghjI>Co}KgPR+{RwSQ%3~=jZ2twseUHrF9*1zmL1`cXQ+7q-{c~?sV`jK9h zb|+wY1QpoiiQ7_&oLy&keL!rASK?6a)^fR9+>DWff5Gjp+!-q`ehI)NWe$Um{Ft$& z!lUmaPLux-+84@*s#TEZ5g$Nb;Sf}wqn(pMwCC~Mq7(o?#z67Vjm5S_^ z^iyvq7Pu(W37)>5Pw)0gNLApQ%59i&F$>S_A*Rqnc94;5}EOHn8+# ziTCB8eseX-ju>GG)wcIPqa5OXy5@8z#PP_mVu{8xz1P6tI9+sU_@5m)=e9^@?Bw@p zkYk&#~>h9h3Cm~{=BkU^R$*t1mTVL!n#rAdBCoIW~`sLk8 z$B?aVXN8->s|0rV*wY}L{lb8!W1IJqnDUjr)wDpwTAyhcuxzZWhZQ$?xtlD%^=8Iw zCBi7aq9c#nzmyeGCR{CDu4q7;87&pit5Ve=_P^%=GH_zfpviz`<0Y;YVuZ_+-Q=7c zP1blS1f4xMKF=ILzaS}m1@mwf}+5)UkNYutL5wE zZ=d#xoF3frYmC{AL!a^{kwa(k4m>uUNFF%gTeqq`}{ZdH-w7l_Z$%AlqIbnMxJNbl zY2bNTtTzi}2A2eu4J!Z2i$5}XBO=jB%&*H#=LP3qUx){q&@vyd)OEzw{R?(JO{#m0 zEa=fMa+IpXrmI1k(7nV>AE;$`rSP|bZ3%U4vnH+aKf(11l{3_eknT4Gr!A*-lUZ#w zKHg+LU26zKK2mM`Rp6tuNOL$o`Lbe∋4BacEd1IP%1U61X}sB4CWH3jc@M=%SS! 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 Y#vNi<#PKJL1Hg0kw39u-_DahC0Sc>JT>t<8 literal 0 HcmV?d00001 diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/index.html b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/index.html new file mode 100644 index 0000000..ca2c4f2 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/index.html @@ -0,0 +1,40 @@ + + + Spin Magic Eight Ball + + + + + + + +

Ask the Magic Eight Ball a Question

+

Powered by Fermyon Serverless AI

+ +

+ +

+
+
+
+
+ +
+ + + diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/style.css b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/style.css new file mode 100644 index 0000000..3bf4888 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/assets/style.css @@ -0,0 +1,78 @@ +html { + background-color: #ECE5EE; +} + +body { + text-align: center; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + color: #0D203F; +} + +canvas { + margin: 0 auto; +} + +button { + padding: 0.4rem; + border-radius: 0.667em; + outline: none; + margin: 1rem; +} + +main { + max-width: 610px; + margin: auto; + } + +#question { + width: 400px; + font-size: 16px; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; +} + +#btn, #magicEightBall { + text-align: center; + color: black; + margin: 5px; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + font-size: 16px; +} + +#circle { + background-color: #F9F7EE; + color: black; + position: absolute; + margin-left: 70px; + margin-top: 70px; + height: 150px; + width: 150px; + border-radius: 50%; + display: none; +} + +#triangle { + display: none; + width: 120px; + height: 110px; + margin-left: 85px; + margin-top: 70px; + background-image: + linear-gradient(to bottom right, transparent 50%, #D3C3D9 0), + linear-gradient(to top right, #D3C3D9 50%, transparent 0); + background-size: 50% 100%; + background-repeat: no-repeat; + background-position: left, right; + position:absolute; +} + +#reply { + text-align: center; + color: black; + font-family: Sen, Europa, Avenir, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + font-size: 16px; + display: inline-block; + position: absolute; + margin-left: 85px; + margin-top: 100px; + width: 120px; +} diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/install-model.sh b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/install-model.sh new file mode 100755 index 0000000..9d1baef --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/install-model.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +mkdir -p .spin/ai-models +curl -OL https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML/resolve/main/llama-2-13b-chat.ggmlv3.q3_K_L.bin +mv llama-2-13b-chat.ggmlv3.q3_K_L.bin .spin/ai-models/llama2-chat \ No newline at end of file diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package-lock.json b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package-lock.json new file mode 100644 index 0000000..c297bf1 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package-lock.json @@ -0,0 +1,1615 @@ +{ + "name": "magic-eight-ball", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "magic-eight-ball", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@fermyon/spin-sdk": "0.6.0" + }, + "devDependencies": { + "ts-loader": "^9.4.1", + "typescript": "^4.8.4", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fermyon/spin-sdk": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@fermyon/spin-sdk/-/spin-sdk-0.6.0.tgz", + "integrity": "sha512-lISlStRVFVof0mDtbn7NzJ2aXUdGjwEPeEzVOGk5YyD0NiUf8jlm/Dbi5tt8wcst1VG4wkoUnGiDaxO1PckFRg==", + "dependencies": { + "buffer": "npm:Buffer@^0.0.0", + "Buffer": "^0.0.0", + "fast-text-encoding": "^1.0.6", + "itty-router": "^3.0.12", + "typedarray-to-buffer": "^4.0.0" + } + }, + "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, + "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, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "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 + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "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, + "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/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/Buffer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/Buffer/-/Buffer-0.0.0.tgz", + "integrity": "sha512-+zdncl8lI5TCkARStn9F1BwcuJYofYmD0oEHe5FNfCvGfeDJwf6+dSikCdQN6BMXXmHMhNNUagBN367WST1AIQ==", + "engines": { + "node": ">= 0.2.0" + } + }, + "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 + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001594", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", + "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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, + "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/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "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 + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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 + }, + "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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.693", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", + "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", + "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "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 + }, + "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 + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/itty-router": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/itty-router/-/itty-router-3.0.12.tgz", + "integrity": "sha512-s98XTPhle6GGbaFf0kYrOD3Q8gyhnqvOqkwYijC3AmkceNKqWUp13YHg6dWmqmVv4pP7l7c94XI92I0EXVGO0w==" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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 + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "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, + "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, + "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 + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "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, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "dev": true, + "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-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", + "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/package.json b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package.json similarity index 66% rename from magic-8-ball/apps/04-front-end/magic-8-ball-ts/package.json rename to magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package.json index 2c58538..22b2a7b 100644 --- a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/package.json +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/package.json @@ -1,20 +1,22 @@ { - "name": "magic-8-ball", + "name": "magic-eight-ball", "version": "1.0.0", - "description": "A Magic 8 Ball", + "description": "A Magic 8 Ball App", "main": "index.js", "scripts": { - "build": "npx webpack --mode=production && mkdir -p target && spin js2wasm -o target/spin-http-js.wasm dist/spin.js", + "build": "npx webpack --mode=production && mkdir -p target && spin js2wasm -o target/magic-eight-ball.wasm dist/spin.js", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { - "@fermyon/spin-sdk": "^0.5.0", "ts-loader": "^9.4.1", "typescript": "^4.8.4", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" + }, + "dependencies": { + "@fermyon/spin-sdk": "0.6.0" } } diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/spin.toml b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/spin.toml new file mode 100644 index 0000000..5147a4d --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/spin.toml @@ -0,0 +1,27 @@ +spin_manifest_version = 2 + +[application] +authors = ["Fermyon Engineering "] +description = "A Magic 8 Ball App" +name = "magic-eight-ball" +version = "0.1.0" + +[[trigger.http]] +route = "/magic-8" +component = "magic-eight-ball" + +[component.magic-eight-ball] +source = "target/magic-eight-ball.wasm" +exclude_files = ["**/node_modules"] +ai_models = ["llama2-chat"] +[component.magic-eight-ball.build] +command = "npm run build" +watch = ["src/**/*.ts", "package.json"] + +[[trigger.http]] +route = "/..." +component = "fileserver" + +[component.fileserver] +source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.2.1/spin_static_fs.wasm", digest = "sha256:5f05b15f0f7cd353d390bc5ebffec7fe25c6a6d7a05b9366c86dcb1a346e9f0f" } +files = [{ source = "assets", destination = "/" }] diff --git a/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/src/index.ts b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/src/index.ts new file mode 100644 index 0000000..bb342b1 --- /dev/null +++ b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/src/index.ts @@ -0,0 +1,56 @@ +import { + HandleRequest, + HttpRequest, + HttpResponse, + Llm, + InferencingModels, +} from "@fermyon/spin-sdk"; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder("utf-8"); + +export const handleRequest: HandleRequest = async function ( + request: HttpRequest +): Promise { + const question = decoder.decode(request.body); + if (question.length == 0) { + return { + status: 400, + body: encoder.encode("No question asked").buffer, + }; + } + + let answerJson = `{\"answer\": \"${answer(question)}\"}`; + return { + status: 200, + headers: { "Content-Type": "application/json" }, + body: answerJson, + }; +}; + +function answer(question: string): string { + console.log(`Question: ${question}`); + const prompt = `[INST] <> + You are acting as a Magic 8 Ball that predicts the answer to a questions about events now or in the future. + Your tone should be expressive yet polite. + Your answers should be 10 words or less. + Prefix your response with 'Answer:'. + <> + ${question}[/INST]`; + let response = Llm.infer(InferencingModels.Llama2Chat, prompt, { + maxTokens: 20, + repeatPenalty: 1.5, + repeatPenaltyLastNTokenCount: 20, + temperature: 0.25, + topK: 5, + topP: 0.25, + }).text; + // Parse the response to remove the expected `Answer:` prefix from the response + const answerPrefix = "Answer:"; + response = response.trim(); + if (response.startsWith(answerPrefix)) { + response = response.substring(answerPrefix.length); + } + console.log(`Answer: ${response}`); + return response; +} diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/tsconfig.json b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/tsconfig.json similarity index 100% rename from magic-8-ball/apps/04-front-end/magic-8-ball-ts/tsconfig.json rename to magic-8-ball/apps/04-front-end/magic-eight-ball-ts/tsconfig.json diff --git a/magic-8-ball/apps/04-front-end/magic-8-ball-ts/webpack.config.js b/magic-8-ball/apps/04-front-end/magic-eight-ball-ts/webpack.config.js similarity index 100% rename from magic-8-ball/apps/04-front-end/magic-8-ball-ts/webpack.config.js rename to magic-8-ball/apps/04-front-end/magic-eight-ball-ts/webpack.config.js