From 2a9d9d500d05509eb47c939f6677569e7ac42576 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 18 Mar 2026 13:17:57 +0100 Subject: [PATCH 01/12] feat: Add `STACK` and `DEMO` templating parameters (#432) * feat: Add `STACK` and `DEMO` templating parameters Co-authored-by: Xenia Fischer * changelog * clippy * Consitently list stack before demo --- README.md | 8 ++++++++ rust/stackable-cockpit/src/platform/demo/params.rs | 6 ++++++ rust/stackable-cockpit/src/platform/demo/spec.rs | 6 ++++-- rust/stackable-cockpit/src/platform/manifests.rs | 12 +++++++++--- rust/stackable-cockpit/src/platform/stack/params.rs | 6 +++++- rust/stackable-cockpit/src/platform/stack/spec.rs | 2 ++ rust/stackablectl/CHANGELOG.md | 6 ++++++ rust/stackablectl/src/cmds/demo.rs | 2 ++ rust/stackablectl/src/cmds/stack.rs | 5 +++-- 9 files changed, 45 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 688e4083..c003321a 100644 --- a/README.md +++ b/README.md @@ -77,3 +77,11 @@ hooks are: [pre-commit]: https://pre-commit.com/ [web-readme]: ./web/README.md [lib-readme]: ./rust/stackable-cockpit/README.md + +### Templating variables + +| Variable | Availability | Content | +| ----------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | +| `NAMESPACE` | Always | The namespace where the stack and demo (not the operators!) are deployed into | +| `STACK` | Always (both in stack and demo manifests) | The name of the stack | +| `DEMO` | In demos manifests: Always
In stack manifests: Only when deployed as part of a demo! | The name of the demo | diff --git a/rust/stackable-cockpit/src/platform/demo/params.rs b/rust/stackable-cockpit/src/platform/demo/params.rs index 84f54d2b..3f1486ac 100644 --- a/rust/stackable-cockpit/src/platform/demo/params.rs +++ b/rust/stackable-cockpit/src/platform/demo/params.rs @@ -4,6 +4,12 @@ use stackable_operator::kvp::Labels; use crate::platform::operator::ChartSourceType; pub struct DemoInstallParameters { + /// Name of the stack, which is always present, as a demo builds on top of a stack + pub stack_name: String, + + /// Name of the demo, which is always present + pub demo_name: String, + pub operator_namespace: String, pub demo_namespace: String, diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index 96107d49..bce047dc 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -153,13 +153,13 @@ impl DemoSpec { .await?; let stack_install_parameters = StackInstallParameters { + stack_name: self.stack.clone(), + demo_name: Some(install_parameters.demo_name.clone()), operator_namespace: install_parameters.operator_namespace.clone(), stack_namespace: install_parameters.demo_namespace.clone(), parameters: install_parameters.stack_parameters.clone(), labels: install_parameters.stack_labels.clone(), skip_release: install_parameters.skip_release, - stack_name: self.stack.clone(), - demo_name: None, chart_source: install_parameters.chart_source.clone(), operator_values: install_parameters.operator_values.clone(), }; @@ -204,6 +204,8 @@ impl DemoSpec { &self.manifests, ¶ms, &install_params.demo_namespace, + &install_params.stack_name, + Some(&install_params.demo_name), install_params.labels, client, transfer_client, diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index 15fcf306..56181dde 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -65,11 +65,13 @@ pub enum Error { pub trait InstallManifestsExt { // TODO (Techassi): This step shouldn't care about templating the manifests nor fetching them from remote #[instrument(skip_all, fields(%namespace, indicatif.pb_show = true))] - #[allow(async_fn_in_trait)] + #[allow(clippy::too_many_arguments, async_fn_in_trait)] async fn install_manifests( manifests: &[ManifestSpec], parameters: &HashMap, namespace: &str, + stack_name: &str, + demo_name: Option<&str>, labels: Labels, client: &Client, transfer_client: &xfer::Client, @@ -80,9 +82,13 @@ pub trait InstallManifestsExt { Span::current().pb_set_length(manifests.len() as u64); let mut parameters = parameters.clone(); - // We add the NAMESPACE parameter, so that stacks/demos can use that to render e.g. the - // fqdn service names [which contain the namespace]. + // We need some additional templating capabilities, e.g. the namespace, so that stacks/demos + // can use that to render e.g. the fqdn service names [which contain the namespace]. parameters.insert("NAMESPACE".to_owned(), namespace.to_owned()); + parameters.insert("STACK".to_owned(), stack_name.into()); + if let Some(demo_name) = demo_name { + parameters.insert("DEMO".to_owned(), demo_name.into()); + } for manifest in manifests { let parameters = parameters.clone(); diff --git a/rust/stackable-cockpit/src/platform/stack/params.rs b/rust/stackable-cockpit/src/platform/stack/params.rs index 0688eba2..b3cf9717 100644 --- a/rust/stackable-cockpit/src/platform/stack/params.rs +++ b/rust/stackable-cockpit/src/platform/stack/params.rs @@ -5,9 +5,13 @@ use crate::platform::operator::ChartSourceType; #[derive(Debug)] pub struct StackInstallParameters { - pub demo_name: Option, + /// Name of the stack, which is always present pub stack_name: String, + /// Optional name of the demo, which is only present in case this stack is installed as part of + /// a demo. This is unset in case a stack is installed directly. + pub demo_name: Option, + pub operator_namespace: String, pub stack_namespace: String, diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index 2bb39d62..58ace389 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -249,6 +249,8 @@ impl StackSpec { &self.manifests, ¶meters, &install_params.stack_namespace, + &install_params.stack_name, + install_params.demo_name.as_deref(), install_params.labels, client, transfer_client, diff --git a/rust/stackablectl/CHANGELOG.md b/rust/stackablectl/CHANGELOG.md index a1e2ad53..2ff5a338 100644 --- a/rust/stackablectl/CHANGELOG.md +++ b/rust/stackablectl/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Add `STACK` and `DEMO` templating parameters. Have a look at the README for details ([#432]). + +[#432]: https://github.com/stackabletech/stackable-cockpit/pull/432 + ## [1.3.0] - 2026-03-16 ### Added diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index 251a94fe..4980ff30 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -388,6 +388,8 @@ async fn install_cmd( .context(LoadOperatorValuesSnafu)?; let install_parameters = DemoInstallParameters { + stack_name: demo.stack.clone(), + demo_name: args.demo_name.clone(), operator_namespace: args.namespaces.operator_namespace.clone(), demo_namespace: args.namespaces.namespace.clone(), stack_parameters: args.stack_parameters.clone(), diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index f4045f9a..490d74e0 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -359,12 +359,13 @@ async fn install_cmd( .context(LoadOperatorValuesSnafu)?; let install_parameters = StackInstallParameters { + stack_name: args.stack_name.clone(), + // There is no demo when installing only a stack + demo_name: None, operator_namespace: args.namespaces.operator_namespace.clone(), stack_namespace: args.namespaces.namespace.clone(), - stack_name: args.stack_name.clone(), parameters: args.parameters.clone(), skip_release: args.skip_release, - demo_name: None, labels, chart_source: ChartSourceType::from(cli.chart_type()), operator_values, From 32cf8475a73b2daff38c3af48bcff3f7c9ac141b Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 18 Mar 2026 13:47:50 +0100 Subject: [PATCH 02/12] chore(stackablectl): Release 1.4.0 (#433) --- Cargo.lock | 111 +++++++++++++------------ Cargo.nix | 145 ++++++++++++++++----------------- extra/man/stackablectl.1 | 14 +++- rust/stackablectl/CHANGELOG.md | 4 +- rust/stackablectl/Cargo.toml | 2 +- 5 files changed, 142 insertions(+), 134 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26bdbd3d..73ba5ed3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,9 +66,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -81,15 +81,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -414,9 +414,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.56" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "jobserver", @@ -518,9 +518,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -540,18 +540,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.66" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031" +checksum = "19c9f1dde76b736e3681f28cec9d5a61299cbaae0fce80a68e43724ad56031eb" dependencies = [ "clap", ] [[package]] name = "clap_complete_nushell" -version = "4.5.10" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685bc86fd34b7467e0532a4f8435ab107960d69a243785ef0275e571b35b641a" +checksum = "fbb9e9715d29a754b468591be588f6b926f5b0a1eb6a8b62acabeb66ff84d897" dependencies = [ "clap", "clap_complete", @@ -559,9 +559,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", @@ -571,15 +571,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "clap_mangen" -version = "0.2.31" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ea63a92086df93893164221ad4f24142086d535b3a0957b9b9bea2dc86301" +checksum = "7e30ffc187e2e3aeafcd1c6e2aa416e29739454c0ccaa419226d5ecd181f2d78" dependencies = [ "clap", "roff", @@ -596,9 +596,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" @@ -634,13 +634,12 @@ dependencies = [ [[package]] name = "console" -version = "0.16.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "once_cell", "unicode-width", "windows-sys 0.61.2", ] @@ -2241,9 +2240,9 @@ checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f" [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -2580,9 +2579,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] @@ -2993,9 +2992,9 @@ dependencies = [ [[package]] name = "roff" -version = "0.2.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" +checksum = "dbf2048e0e979efb2ca7b91c4f1a8d77c91853e9b987c94c555668a8994915ad" [[package]] name = "rstest" @@ -3188,9 +3187,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -3723,7 +3722,7 @@ dependencies = [ [[package]] name = "stackablectl" -version = "1.3.0" +version = "1.4.0" dependencies = [ "built", "clap", @@ -3956,9 +3955,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -4045,9 +4044,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399b1124a3c9e16766831c6bba21e50192572cdd98706ea114f9502509686ffc" +checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" dependencies = [ "indexmap", "serde_core", @@ -4060,18 +4059,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.0.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap", "toml_datetime", @@ -4081,18 +4080,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.0.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" [[package]] name = "tonic" @@ -4280,9 +4279,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -5002,9 +5001,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.15" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] @@ -5151,18 +5150,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.41" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e13bc581734df6250836c59a5f44f3c57db9f9acb9dc8e3eaabdaf6170254d" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.41" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3545ea9e86d12ab9bba9fcd99b54c1556fd3199007def5a03c375623d05fac1c" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.nix b/Cargo.nix index 7d3e8250..7ee3108b 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -295,9 +295,9 @@ rec { }; "anstream" = rec { crateName = "anstream"; - version = "0.6.21"; + version = "1.0.0"; edition = "2021"; - sha256 = "0jjgixms4qjj58dzr846h2s29p8w7ynwr9b9x6246m1pwy0v5ma3"; + sha256 = "13d2bj0xfg012s4rmq44zc8zgy1q8k9yp7yhvfnarscnmwpj2jl2"; dependencies = [ { name = "anstyle"; @@ -340,9 +340,9 @@ rec { }; "anstyle" = rec { crateName = "anstyle"; - version = "1.0.13"; + version = "1.0.14"; edition = "2021"; - sha256 = "0y2ynjqajpny6q0amvfzzgw0gfw3l47z85km4gvx87vg02lcr4ji"; + sha256 = "0030szmgj51fxkic1hpakxxgappxzwm6m154a3gfml83lq63l2wl"; features = { "default" = [ "std" ]; }; @@ -350,9 +350,9 @@ rec { }; "anstyle-parse" = rec { crateName = "anstyle-parse"; - version = "0.2.7"; + version = "1.0.0"; edition = "2021"; - sha256 = "1hhmkkfr95d462b3zf6yl2vfzdqfy5726ya572wwg8ha9y148xjf"; + sha256 = "03hkv2690s0crssbnmfkr76kw1k7ah2i6s5amdy9yca2n8w7zkjj"; libName = "anstyle_parse"; dependencies = [ { @@ -1394,9 +1394,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.2.56"; + version = "1.2.57"; edition = "2018"; - sha256 = "1chvh9g2izhqad7vzy4cc7xpdljdvqpsr6x6hv1hmyqv3mlkbgxf"; + sha256 = "08q464b62d03zm7rgiixavkrh5lzfq18lwf884vgycj9735d23bs"; authors = [ "Alex Crichton " ]; @@ -1727,10 +1727,10 @@ rec { }; "clap" = rec { crateName = "clap"; - version = "4.5.60"; - edition = "2021"; + version = "4.6.0"; + edition = "2024"; crateBin = []; - sha256 = "02h3nzznssjgp815nnbzk0r62y2iw03kdli75c233kirld6z75r7"; + sha256 = "0l8k0ja5rf4hpn2g98bqv5m6lkh2q6b6likjpmm6fjw3cxdsz4xi"; dependencies = [ { name = "clap_builder"; @@ -1769,9 +1769,9 @@ rec { }; "clap_builder" = rec { crateName = "clap_builder"; - version = "4.5.60"; - edition = "2021"; - sha256 = "0xk8mdizvmmn6w5ij5cwhy5pbgyac4w9pfvl6nqmjl7a5hql38i4"; + version = "4.6.0"; + edition = "2024"; + sha256 = "17q6np22yxhh5y5v53y4l31ps3hlaz45mvz2n2nicr7n3c056jki"; dependencies = [ { name = "anstream"; @@ -1808,9 +1808,9 @@ rec { }; "clap_complete" = rec { crateName = "clap_complete"; - version = "4.5.66"; - edition = "2021"; - sha256 = "0c8h6x3x1ddldfmhii12hrd92v1av8d18rckdzjs8qciwfvs6my7"; + version = "4.6.0"; + edition = "2024"; + sha256 = "1sric3allwj3isk81khgmsx9qab1bafyr37jh4v6wwvbwzfz3j8r"; dependencies = [ { name = "clap"; @@ -1837,9 +1837,9 @@ rec { }; "clap_complete_nushell" = rec { crateName = "clap_complete_nushell"; - version = "4.5.10"; - edition = "2021"; - sha256 = "06k4bfrp3rbm0bpqadr4kbb60y8hmcsq8kraagh6fx2bsdpwhnv8"; + version = "4.6.0"; + edition = "2024"; + sha256 = "15yqhkzndsxbmii8nspbl6qga9mrys4fa6srd2s599r9bmqykfgv"; dependencies = [ { name = "clap"; @@ -1867,9 +1867,9 @@ rec { }; "clap_derive" = rec { crateName = "clap_derive"; - version = "4.5.55"; - edition = "2021"; - sha256 = "1r949xis3jmhzh387smd70vc8a3b9734ck3g5ahg59a63bd969x9"; + version = "4.6.0"; + edition = "2024"; + sha256 = "0snapc468s7n3avr33dky4y7rmb7ha3qsp9l0k5vh6jacf5bs40i"; procMacro = true; dependencies = [ { @@ -1899,16 +1899,16 @@ rec { }; "clap_lex" = rec { crateName = "clap_lex"; - version = "1.0.0"; - edition = "2021"; - sha256 = "0c8888qi1l9sayqlv666h8s0yxn2qc6jr88v1zagk43mpjjjx0is"; + version = "1.1.0"; + edition = "2024"; + sha256 = "1ycqkpygnlqnndghhcxjb44lzl0nmgsia64x9581030yifxs7m68"; }; "clap_mangen" = rec { crateName = "clap_mangen"; - version = "0.2.31"; - edition = "2021"; - sha256 = "00b3r0nym6wvgfas1crmsn3205149ynj2hhnjcwgjv88j8xad7j3"; + version = "0.2.33"; + edition = "2024"; + sha256 = "0y1d3wccspkd48cs9jhc9i2kk5z22sj2lvhwrnpsxqz2hz0zyc3y"; dependencies = [ { name = "clap"; @@ -1952,9 +1952,9 @@ rec { }; "colorchoice" = rec { crateName = "colorchoice"; - version = "1.0.4"; + version = "1.0.5"; edition = "2021"; - sha256 = "0x8ymkz1xr77rcj1cfanhf416pc4v681gmkc9dzb3jqja7f62nxh"; + sha256 = "0w75k89hw39p0mnnhlrwr23q50rza1yjki44qvh2mgrnj065a1qx"; }; "combine" = rec { @@ -2083,9 +2083,9 @@ rec { }; "console" = rec { crateName = "console"; - version = "0.16.2"; + version = "0.16.3"; edition = "2021"; - sha256 = "1i5y6h3myz38jl9p3gglx5vh9c69kxxajsv3jx0pw8i6i555mr03"; + sha256 = "11zwz1vnfr0nx6dyjx0gjymp8864y5hxwf01ynfd2s8kapsqlknn"; dependencies = [ { name = "encode_unicode"; @@ -2097,11 +2097,6 @@ rec { packageId = "libc"; optional = true; } - { - name = "once_cell"; - packageId = "once_cell"; - optional = true; - } { name = "unicode-width"; packageId = "unicode-width"; @@ -2116,7 +2111,7 @@ rec { ]; features = { "default" = [ "unicode-width" "ansi-parsing" "std" ]; - "std" = [ "dep:libc" "dep:once_cell" "alloc" ]; + "std" = [ "dep:libc" "alloc" ]; "unicode-width" = [ "dep:unicode-width" ]; "windows-console-colors" = [ "ansi-parsing" ]; }; @@ -7240,9 +7235,9 @@ rec { }; "once_cell" = rec { crateName = "once_cell"; - version = "1.21.3"; + version = "1.21.4"; edition = "2021"; - sha256 = "0b9x77lb9f1j6nqgf5aka4s2qj0nly176bpbrv6f9iakk5ff3xa2"; + sha256 = "0l1v676wf71kjg2khch4dphwh1jp3291ffiymr2mvy1kxd5kwz4z"; authors = [ "Aleksey Kladov " ]; @@ -8283,9 +8278,9 @@ rec { }; "portable-atomic-util" = rec { crateName = "portable-atomic-util"; - version = "0.2.5"; + version = "0.2.6"; edition = "2018"; - sha256 = "1xcm0ia8756k6hdgafx4g3lx3fw0hvz2zqswq7c2sy58gxnvk7bs"; + sha256 = "18wrsx7fjwc2kgbpfjfm3igv3vdzsidmjhbqivjln7d0c6z9f4q9"; libName = "portable_atomic_util"; dependencies = [ { @@ -9893,9 +9888,9 @@ rec { }; "roff" = rec { crateName = "roff"; - version = "0.2.2"; - edition = "2021"; - sha256 = "1wyqz6m0pm4p6wzhwhahvcidfm7nwb38zl4q7ha940pn3w66dy48"; + version = "1.1.0"; + edition = "2024"; + sha256 = "1b8m96cshs2nam6ck1xrx59iijbpild4y75rlwngp7lp1s709wnv"; }; "rstest" = rec { @@ -10592,9 +10587,9 @@ rec { }; "schannel" = rec { crateName = "schannel"; - version = "0.1.28"; + version = "0.1.29"; edition = "2018"; - sha256 = "1qb6s5gyxfz2inz753a4z3mc1d266mwvz0c5w7ppd3h44swq27c9"; + sha256 = "0ffrzz5vf2s3gnzvphgb5gg8fqifvryl07qcf7q3x1scj3jbghci"; authors = [ "Steven Fackler " "Steffen Butzer " @@ -12391,7 +12386,7 @@ rec { }; "stackablectl" = rec { crateName = "stackablectl"; - version = "1.3.0"; + version = "1.4.0"; edition = "2021"; crateBin = [ { @@ -13104,9 +13099,9 @@ rec { }; "tinyvec" = rec { crateName = "tinyvec"; - version = "1.10.0"; + version = "1.11.0"; edition = "2018"; - sha256 = "1yhk0qdqyiaa4v2j9h8pzax5gxgwpz4da0lcphfil6g6pk1zv9dz"; + sha256 = "1wvycrghzmaysnw34kzwnf0mfx6r75045s24r214wnnjadqfcq9y"; authors = [ "Lokathor " ]; @@ -13121,11 +13116,12 @@ rec { "alloc" = [ "tinyvec_macros" ]; "arbitrary" = [ "dep:arbitrary" ]; "borsh" = [ "dep:borsh" ]; + "defmt" = [ "dep:defmt" ]; "generic-array" = [ "dep:generic-array" ]; "latest_stable_rust" = [ "rustc_1_61" ]; "real_blackbox" = [ "criterion/real_blackbox" ]; "rustc_1_61" = [ "rustc_1_57" ]; - "serde" = [ "dep:serde" ]; + "serde" = [ "dep:serde_core" ]; "std" = [ "alloc" ]; "tinyvec_macros" = [ "dep:tinyvec_macros" ]; }; @@ -13484,9 +13480,9 @@ rec { }; "toml" = rec { crateName = "toml"; - version = "1.0.6+spec-1.1.0"; + version = "1.0.7+spec-1.1.0"; edition = "2021"; - sha256 = "1z3gd04jal7r2jhnww4qvln5g4h1wlhvlsqwhdk6gqf9lcj136rr"; + sha256 = "15kaclc4y8yb4ahny19ng51rmff4vj7lyy5qq25lavkgi9yxaa6x"; dependencies = [ { name = "indexmap"; @@ -13548,9 +13544,9 @@ rec { }; "toml_datetime" = rec { crateName = "toml_datetime"; - version = "1.0.0+spec-1.1.0"; + version = "1.0.1+spec-1.1.0"; edition = "2021"; - sha256 = "0gpiaddhignli6whj52ysjxwmmy82r8qxihckzss8y4md5f5bhij"; + sha256 = "1sgk7zc6x187iib7kj1nzn44mp0zrk9hgii69rbar35m3ms0wclv"; dependencies = [ { name = "serde_core"; @@ -13569,9 +13565,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.25.4+spec-1.1.0"; + version = "0.25.5+spec-1.1.0"; edition = "2021"; - sha256 = "1whkik77grpr5qw8q0zhqx1admghpkdm2hzm6xh9dp2krv8cp4vi"; + sha256 = "1qgjkq687jkdrc3wq4fi95lj6d0bvwqs9xi3d41wx2x28h3a98cc"; dependencies = [ { name = "indexmap"; @@ -13604,9 +13600,9 @@ rec { }; "toml_parser" = rec { crateName = "toml_parser"; - version = "1.0.9+spec-1.1.0"; + version = "1.0.10+spec-1.1.0"; edition = "2021"; - sha256 = "1i54qpvvcppy8ybdn9gssas81vfzq0kmgkcnxzhyf8w9w0al8bbh"; + sha256 = "081lsv63zphnff9ssb0yjavcc82sblvj808rvwb4h76kxx5mpwkx"; dependencies = [ { name = "winnow"; @@ -13624,9 +13620,9 @@ rec { }; "toml_writer" = rec { crateName = "toml_writer"; - version = "1.0.6+spec-1.1.0"; + version = "1.0.7+spec-1.1.0"; edition = "2021"; - sha256 = "01r6x42d1p8p5kzfsi1fm4dakm3w53vi69f2ivyqpvi1xm5g25mb"; + sha256 = "0vdmlskpqkjf5n2zghna8mwlqdbf0ryskfxnlhfjphixdqfalypi"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -14370,9 +14366,9 @@ rec { }; "tracing-subscriber" = rec { crateName = "tracing-subscriber"; - version = "0.3.22"; + version = "0.3.23"; edition = "2018"; - sha256 = "07hz575a0p1c2i4xw3gs3hkrykhndnkbfhyqdwjhvayx4ww18c1g"; + sha256 = "06fkr0qhggvrs861d7f74pn3i3a10h5jsp4n70jj9ys5b675fzyb"; libName = "tracing_subscriber"; authors = [ "Eliza Weisman " @@ -17766,9 +17762,9 @@ rec { }; "winnow" = rec { crateName = "winnow"; - version = "0.7.15"; + version = "1.0.0"; edition = "2021"; - sha256 = "0i9rkl2rqpbnnxlgs20gmkj3nd0b2k8q55mjmpc2ybb84xwxjyfz"; + sha256 = "1n67gx8mg2b6r2z54zwbrb6qsfbdsar1lvafsfaajr3jcvj8h3m9"; dependencies = [ { name = "memchr"; @@ -17778,13 +17774,16 @@ rec { } ]; features = { + "ascii" = [ "parser" ]; + "binary" = [ "parser" ]; "debug" = [ "std" "dep:anstream" "dep:anstyle" "dep:is_terminal_polyfill" "dep:terminal_size" ]; - "default" = [ "std" ]; + "default" = [ "std" "ascii" "binary" ]; "simd" = [ "dep:memchr" ]; "std" = [ "alloc" "memchr?/std" ]; - "unstable-doc" = [ "alloc" "std" "simd" "unstable-recover" ]; + "unstable-doc" = [ "alloc" "std" "ascii" "binary" "simd" "unstable-recover" ]; + "unstable-recover" = [ "parser" ]; }; - resolvedDefaultFeatures = [ "alloc" "default" "std" ]; + resolvedDefaultFeatures = [ "alloc" "ascii" "binary" "default" "parser" "std" ]; }; "wit-bindgen" = rec { crateName = "wit-bindgen"; @@ -18251,9 +18250,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.41"; + version = "0.8.42"; edition = "2021"; - sha256 = "0k95f1hszgda7s7drfdcz6wpvigk8igrmi9n10jzckbkh72kpqcn"; + sha256 = "1qq50mj06rds2iac197kpkdlvgql1j3vvm82gy5qayladxqqnmzj"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -18287,9 +18286,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.41"; + version = "0.8.42"; edition = "2021"; - sha256 = "075cbz826mip7jhgbph7j0cx6vsmq5a9pngwm6xvjanihsgfli9m"; + sha256 = "0bx010zlchg4y8xixvkb4c74634j7ypnbpl7cqjdcfsdxacc0v3y"; procMacro = true; libName = "zerocopy_derive"; authors = [ diff --git a/extra/man/stackablectl.1 b/extra/man/stackablectl.1 index 110babb2..06961fd3 100644 --- a/extra/man/stackablectl.1 +++ b/extra/man/stackablectl.1 @@ -1,6 +1,6 @@ .ie \n(.g .ds Aq \(aq .el .ds Aq ' -.TH stackablectl 1 "stackablectl 1.3.0" +.TH stackablectl 1 "stackablectl 1.4.0" .SH NAME stackablectl \- Command line tool to interact with the Stackable Data Platform .SH SYNOPSIS @@ -117,7 +117,15 @@ This maps to the listener\-operator Helm Chart preset value, see [the listener\- .br .br -[\fIpossible values: \fRnone, stable\-nodes, ephemeral\-nodes] +\fIPossible values:\fR +.RS 14 +.IP \(bu 2 +none +.IP \(bu 2 +stable\-nodes +.IP \(bu 2 +ephemeral\-nodes +.RE .SH SUBCOMMANDS .TP stackablectl\-operator(1) @@ -150,6 +158,6 @@ Retrieve version data of the stackablectl installation stackablectl\-help(1) Print this message or the help of the given subcommand(s) .SH VERSION -v1.3.0 +v1.4.0 .SH AUTHORS Stackable GmbH diff --git a/rust/stackablectl/CHANGELOG.md b/rust/stackablectl/CHANGELOG.md index 2ff5a338..495020e9 100644 --- a/rust/stackablectl/CHANGELOG.md +++ b/rust/stackablectl/CHANGELOG.md @@ -4,9 +4,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [1.4.0] - 2026-03-18 + ### Added -- Add `STACK` and `DEMO` templating parameters. Have a look at the README for details ([#432]). +- Add `STACK` and `DEMO` templating parameters. Have a look at the `README.md` for details ([#432]). [#432]: https://github.com/stackabletech/stackable-cockpit/pull/432 diff --git a/rust/stackablectl/Cargo.toml b/rust/stackablectl/Cargo.toml index f45f1fe6..83388405 100644 --- a/rust/stackablectl/Cargo.toml +++ b/rust/stackablectl/Cargo.toml @@ -2,7 +2,7 @@ name = "stackablectl" description = "Command line tool to interact with the Stackable Data Platform" # See /Cargo.toml -version = "1.3.0" +version = "1.4.0" authors.workspace = true license.workspace = true edition.workspace = true From f9efd1e8e06c960e9b0c7574c0da836312a5827d Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 31 Mar 2026 10:19:04 +0200 Subject: [PATCH 03/12] fix: Bump aws-lc-rs/sys and rustls-webpki to negate 3 advisories (#436) * fix: Bump aws-lc-rs/aws-lc-sys to 1.16.2/0.39.1 This bump negates the following two advisories: - RUSTSEC-2026-0044 - RUSTSEC-2026-0048 * fix: Bump rustls-webpki to 0.103.10 to negate RUSTSEC-2026-0049 --- Cargo.lock | 12 ++++++------ Cargo.nix | 17 +++++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73ba5ed3..1494413a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,9 +194,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", "zeroize", @@ -204,9 +204,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.38.0" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" dependencies = [ "cc", "cmake", @@ -3154,9 +3154,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", diff --git a/Cargo.nix b/Cargo.nix index 7ee3108b..78e86277 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -600,10 +600,10 @@ rec { }; "aws-lc-rs" = rec { crateName = "aws-lc-rs"; - version = "1.16.1"; + version = "1.16.2"; edition = "2021"; - links = "aws_lc_rs_1_16_1_sys"; - sha256 = "1gzlb3c82vv3b9adi15kqpk8wps699rjssc3ijkc42pidl0grgwl"; + links = "aws_lc_rs_1_16_2_sys"; + sha256 = "1z6i8qs0xjnzvslxnkhvywzzwfkafb1s4nrpg3f2k1nii4i92m50"; libName = "aws_lc_rs"; authors = [ "AWS-LibCrypto" @@ -635,10 +635,10 @@ rec { }; "aws-lc-sys" = rec { crateName = "aws-lc-sys"; - version = "0.38.0"; + version = "0.39.1"; edition = "2021"; - links = "aws_lc_0_38_0"; - sha256 = "0bkqm9adn7f8c8hd3dnp16cgh39cgjckfzqs55ymmfw9xmlfa8a3"; + links = "aws_lc_0_39_1"; + sha256 = "16b32brldbf97s05kzfvz263mkk54padn5kl95kakfh5h7wmr8l3"; build = "builder/main.rs"; libName = "aws_lc_sys"; authors = [ @@ -666,6 +666,7 @@ rec { features = { "bindgen" = [ "dep:bindgen" ]; "default" = [ "all-bindings" ]; + "fips" = [ "dep:bindgen" ]; "ssl" = [ "bindgen" "all-bindings" ]; }; resolvedDefaultFeatures = [ "prebuilt-nasm" ]; @@ -10504,9 +10505,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.103.9"; + version = "0.103.10"; edition = "2021"; - sha256 = "0lwg1nnyv7pp2lfwwjhy81bxm233am99jnsp3iymdhd6k8827pyp"; + sha256 = "1vyipcdbazvhl6kyi1m8n0bg98sk25iv12bby2xcly653awb4cyz"; libName = "webpki"; dependencies = [ { From a6a2382034d634ba182a7dc8951cdd62910dd88a Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 31 Mar 2026 10:48:32 +0200 Subject: [PATCH 04/12] docs: Add missing release notes for stackablectl (#435) * docs: Add missing release notes for stackablectl * chore: Update release instructions --- docs/modules/stackablectl/pages/release-notes.adoc | 6 ++++++ .../partials/release-notes/release-1.3.0.adoc | 8 ++++++++ .../partials/release-notes/release-1.4.0.adoc | 4 ++++ rust/stackablectl/RELEASE.md | 10 ++++++---- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 docs/modules/stackablectl/partials/release-notes/release-1.3.0.adoc create mode 100644 docs/modules/stackablectl/partials/release-notes/release-1.4.0.adoc diff --git a/docs/modules/stackablectl/pages/release-notes.adoc b/docs/modules/stackablectl/pages/release-notes.adoc index 069cfd86..032d3b36 100644 --- a/docs/modules/stackablectl/pages/release-notes.adoc +++ b/docs/modules/stackablectl/pages/release-notes.adoc @@ -6,6 +6,12 @@ A full list of changes is available directly in https://github.com/stackabletech // WARNING: Please keep the empty newlines, otherwise headings are broken. +include::partial$release-notes/release-1.4.0.adoc[] + +include::partial$release-notes/release-1.3.0.adoc[] + +include::partial$release-notes/release-1.2.2.adoc[] + include::partial$release-notes/release-1.2.1.adoc[] include::partial$release-notes/release-1.2.0.adoc[] diff --git a/docs/modules/stackablectl/partials/release-notes/release-1.3.0.adoc b/docs/modules/stackablectl/partials/release-notes/release-1.3.0.adoc new file mode 100644 index 00000000..b90e52d3 --- /dev/null +++ b/docs/modules/stackablectl/partials/release-notes/release-1.3.0.adoc @@ -0,0 +1,8 @@ +== 1.3.0 + +* Allow specifying Helm values for operator installations. + See https://github.com/stackabletech/stackable-cockpit/pull/425[stackable-cockpit#425]. +* Bump Rust to `1.93.0` as well as dependencies. + See https://github.com/stackabletech/stackable-cockpit/pull/426[stackable-cockpit#426]. +* Bump Go to `1.26.0` as well as dependencies. + See https://github.com/stackabletech/stackable-cockpit/pull/426[stackable-cockpit#426]. diff --git a/docs/modules/stackablectl/partials/release-notes/release-1.4.0.adoc b/docs/modules/stackablectl/partials/release-notes/release-1.4.0.adoc new file mode 100644 index 00000000..bcbc4fb7 --- /dev/null +++ b/docs/modules/stackablectl/partials/release-notes/release-1.4.0.adoc @@ -0,0 +1,4 @@ +== 1.4.0 + +* Add `STACK` and `DEMO` templating parameters. Have a look at the `README.md` for details. + See https://github.com/stackabletech/stackable-cockpit/pull/432[stackable-cockpit#432]. diff --git a/rust/stackablectl/RELEASE.md b/rust/stackablectl/RELEASE.md index da5dcd70..3451d985 100644 --- a/rust/stackablectl/RELEASE.md +++ b/rust/stackablectl/RELEASE.md @@ -6,10 +6,12 @@ to be done: 1. Ensure your local `main` branch is up-to-date and then proceed to checkout a new branch using `git checkout -b chore/release-stackablectl-X.Y.Z`. 2. Update both the Cargo.toml and CHANGELOG.md file to the new version `X.Y.Z`. -3. Update various files by running the following xtask `cargo xtask gen-man` and +3. Add the relevant changes from the changelog to a new release notes partial under + `docs/stackablectl/partials/release-notes`. +4. Update various files by running the following xtask `cargo xtask gen-man` and `make regenerate-nix`. This is also automatically done if pre-commit is enabled. -4. Push the changes and raise a PR. -5. Merge the PR onto `main` and then proceed to tag the appropriate commit using +5. Push the changes and raise a PR. +6. Merge the PR onto `main` and then proceed to tag the appropriate commit using `git tag -s stackablectl-Y.Y.Z -m stackablectl-Y.Y.Z`. -6. Building the artifacts and creating the release on GitHub is fully automated from this point +7. Building the artifacts and creating the release on GitHub is fully automated from this point onward. From bc299a211a411ecd392ee4dc47c6f2c07d9336c8 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 31 Mar 2026 11:13:21 +0200 Subject: [PATCH 05/12] chore: Add script to verify release notes (#437) --- .pre-commit-config.yaml | 8 ++++++++ scripts/verify_release_notes.sh | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100755 scripts/verify_release_notes.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 263ef2bf..d88e2480 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -103,8 +103,16 @@ repos: - id: cargo-rustfmt name: cargo-rustfmt + files: \.rs$ language: system # Pinning to a specific rustc version, so that we get consistent formatting entry: cargo +nightly-2025-05-26 fmt --all -- --check stages: [pre-commit] pass_filenames: false + + - id: ./scripts/verify_release_notes + name: ./scripts/verify_release_notes + language: system + entry: ./scripts/verify_release_notes.sh + stages: [pre-commit, pre-merge-commit, manual] + pass_filenames: false diff --git a/scripts/verify_release_notes.sh b/scripts/verify_release_notes.sh new file mode 100755 index 00000000..9d574349 --- /dev/null +++ b/scripts/verify_release_notes.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -euo pipefail + +STACKABLECTL_VERSION=$(grep 'version' "./rust/stackablectl/Cargo.toml" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) +[ -n "$STACKABLECTL_VERSION" ] || ( + echo "CRATE_VERSION for is empty." >&2 + echo "Please check ./rust/stackablectl/Cargo.toml" >&2 + exit 1 +) + +RELEASE_NOTES_FILE="./docs/modules/stackablectl/partials/release-notes/release-${STACKABLECTL_VERSION}.adoc" + +if [ ! -f "$RELEASE_NOTES_FILE" ]; then + echo "$RELEASE_NOTES_FILE does not exist, please create it and add the appropriate content" >&2 + exit 1 +fi From a58f836a0150846dbb4671a4de2ae8da49366b02 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Fri, 10 Apr 2026 11:46:26 +0200 Subject: [PATCH 06/12] feat: add listener presets for minikube (#438) --- .../src/platform/operator/listener_operator.rs | 11 +++++++++++ rust/stackablectl/CHANGELOG.md | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/rust/stackable-cockpit/src/platform/operator/listener_operator.rs b/rust/stackable-cockpit/src/platform/operator/listener_operator.rs index 214a128a..ae27e2c4 100644 --- a/rust/stackable-cockpit/src/platform/operator/listener_operator.rs +++ b/rust/stackable-cockpit/src/platform/operator/listener_operator.rs @@ -45,6 +45,9 @@ pub async fn determine_and_store_listener_class_preset(from_cli: Option<&Listene let listener_class_preset = match kubernetes_environment { // Kind does not support LoadBalancers out of the box, so avoid that KubernetesEnvironment::Kind => ListenerClassPreset::StableNodes, + // Minikube does support LoadBalancers via "minikube tunnel", but that requires additional setup + // and we assume that users running Minikube with stackablectl want to keep things simple. + KubernetesEnvironment::Minikube => ListenerClassPreset::StableNodes, // LoadBalancer support in k3s is optional, so let's be better safe than sorry and not use // them KubernetesEnvironment::K3s => ListenerClassPreset::StableNodes, @@ -69,6 +72,7 @@ enum KubernetesEnvironment { Kind, K3s, Ionos, + Minikube, Unknown, } @@ -100,6 +104,13 @@ async fn guess_kubernetes_environment() -> Result Date: Tue, 14 Apr 2026 10:50:02 +0200 Subject: [PATCH 07/12] fix: set current stackablectl release to 1.4.0 (#434) * fix: set current stackablectl release to 1.4.0 * fix: Bump aws-lc-{rs,sys} to negate RUSTSEC-2026-0048+0044 * fix: Bump rustls-webpki to negate RUSTSEC-2026-0049 * fix: Remove duplicate version key in Cargo.lock * fix: Remove more stuff from merge conflict --------- Co-authored-by: Techassi --- Cargo.lock | 4 ++-- Cargo.nix | 4 ++-- docs/modules/stackablectl/pages/installation.adoc | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1494413a..4e76efd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3154,9 +3154,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" dependencies = [ "aws-lc-rs", "ring", diff --git a/Cargo.nix b/Cargo.nix index 78e86277..fb349b3e 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -10505,9 +10505,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.103.10"; + version = "0.103.11"; edition = "2021"; - sha256 = "1vyipcdbazvhl6kyi1m8n0bg98sk25iv12bby2xcly653awb4cyz"; + sha256 = "1m3wpj1sfnpgwd6692lf42bcjsk6mbl6dwgarkn20jzadx8sz9i0"; libName = "webpki"; dependencies = [ { diff --git a/docs/modules/stackablectl/pages/installation.adoc b/docs/modules/stackablectl/pages/installation.adoc index 7166b474..199a0599 100644 --- a/docs/modules/stackablectl/pages/installation.adoc +++ b/docs/modules/stackablectl/pages/installation.adoc @@ -1,7 +1,7 @@ = Installation :page-aliases: stable@stackablectl::installation.adoc -:latest-release: https://github.com/stackabletech/stackable-cockpit/releases/tag/stackablectl-1.2.1 +:latest-release: https://github.com/stackabletech/stackable-cockpit/releases/tag/stackablectl-1.4.0 :fish-comp-loations: https://fishshell.com/docs/current/completions.html#where-to-put-completions :nushell-comp-locations: https://www.nushell.sh/book/custom_commands.html#persisting @@ -23,14 +23,14 @@ You can also use the following command: [source,console] ---- -$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.2.1/stackablectl-x86_64-unknown-linux-gnu +$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.4.0/stackablectl-x86_64-unknown-linux-gnu ---- **aarch64** (arm64): [source,console] ---- -$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.2.1/stackablectl-aarch64-unknown-linux-gnu +$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.4.0/stackablectl-aarch64-unknown-linux-gnu ---- Install the binary into a directory in the `$PATH`, and make it executable: @@ -60,14 +60,14 @@ You can also use the following command: [source,console] ---- -$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.2.1/stackablectl-x86_64-apple-darwin +$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.4.0/stackablectl-x86_64-apple-darwin ---- **aarch64** (arm64): [source,console] ---- -$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.2.1/stackablectl-aarch64-apple-darwin +$ curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.4.0/stackablectl-aarch64-apple-darwin ---- Install the binary into a directory in the `$PATH`, and make it executable: From b0c771c272bcceeb71f90af14ec5b3eab857d1e3 Mon Sep 17 00:00:00 2001 From: Xenia Date: Tue, 14 Apr 2026 13:40:35 +0200 Subject: [PATCH 08/12] feat: Add uninstall demo/stack feature (#429) * feat: Add uninstall demo/stack feature * changelog, some fixes after merge, cargo clippy * pre-commit fixes * pre-commit fix * regenerate-nix * adjustments after main merge * further uninstall adjustments * small word fix * cargo update * add documentation * delete namespace function * use Label struct for label * rename function * code readability * reduce nesting * delete object refactoring * small docs adjustment * Revert "small docs adjustment" This reverts commit 7dfe50e19cedb050f8d73dd73021f9ee32e421bc. * Update rust/stackablectl/src/cmds/demo.rs Co-authored-by: Techassi * stackspec in uninstall refactoring * confirm dialog for canceling delete, refactor install confim dialog * function comment for helm uninstall * rename variable * refactor namespace confirmation * add stack parameter on demo uninstall * Update rust/stackable-cockpit/src/utils/k8s/client.rs Co-authored-by: Techassi * import deref * refactor namespace assignment * refactor namespace deletion function * bump operator-rs and use deref on label key * add assume-yes argument and some small fixes * adjust changelog entry * fix changelog order --------- Co-authored-by: Techassi --- Cargo.lock | 325 +++++----- Cargo.nix | 557 +++++++++++------- Cargo.toml | 4 +- crate-hashes.json | 14 +- .../stackablectl/pages/commands/demo.adoc | 29 +- .../stackablectl/pages/commands/stack.adoc | 36 ++ .../stackablectl/partials/commands/demo.adoc | 9 +- .../stackablectl/partials/commands/stack.adoc | 9 +- extra/completions/_stackablectl | 132 ++++- extra/completions/stackablectl.bash | 462 ++++++++++++++- extra/completions/stackablectl.elv | 84 +++ extra/completions/stackablectl.fish | 134 +++-- extra/completions/stackablectl.nu | 90 ++- rust/stackable-cockpit/Cargo.toml | 1 + .../src/platform/demo/params.rs | 10 + .../src/platform/demo/spec.rs | 131 +++- .../src/platform/manifests.rs | 99 +++- .../src/platform/stack/params.rs | 14 + .../src/platform/stack/spec.rs | 134 ++++- .../stackable-cockpit/src/utils/k8s/client.rs | 159 ++++- rust/stackablectl/CHANGELOG.md | 4 + rust/stackablectl/Cargo.toml | 1 + rust/stackablectl/src/args/mod.rs | 2 + rust/stackablectl/src/args/prompt.rs | 9 + rust/stackablectl/src/cmds/demo.rs | 180 +++++- rust/stackablectl/src/cmds/stack.rs | 169 +++++- 26 files changed, 2316 insertions(+), 482 deletions(-) create mode 100644 rust/stackablectl/src/args/prompt.rs diff --git a/Cargo.lock b/Cargo.lock index 4e76efd0..6a729830 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -414,9 +414,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.57" +version = "1.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" dependencies = [ "find-msvc-tools", "jobserver", @@ -587,9 +587,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -890,6 +890,18 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -1091,9 +1103,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "find-msvc-tools" @@ -1477,9 +1489,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1492,7 +1504,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1578,12 +1589,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1591,9 +1603,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1604,9 +1616,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1618,15 +1630,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1638,15 +1650,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1708,9 +1720,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -1758,9 +1770,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -1792,9 +1804,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "java-properties" @@ -1857,7 +1869,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -1866,9 +1878,31 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "jobserver" @@ -1882,10 +1916,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -1941,11 +1977,11 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "darling", "regex", - "snafu 0.8.9", + "snafu 0.9.0", ] [[package]] @@ -2066,9 +2102,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libloading" @@ -2088,9 +2124,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" dependencies = [ "libc", ] @@ -2103,9 +2139,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -2189,9 +2225,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -2219,9 +2255,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-traits" @@ -2297,9 +2333,9 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" +checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" dependencies = [ "http", "opentelemetry", @@ -2565,12 +2601,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "portable-atomic" version = "1.13.1" @@ -2588,9 +2618,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2992,9 +3022,9 @@ dependencies = [ [[package]] name = "roff" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf2048e0e979efb2ca7b91c4f1a8d77c91853e9b987c94c555668a8994915ad" +checksum = "323c417e1d9665a65b263ec744ba09030cfb277e9daa0b018a4ab62e57bc8189" [[package]] name = "rstest" @@ -3061,9 +3091,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -3260,9 +3290,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -3345,9 +3375,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -3408,6 +3438,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + [[package]] name = "shlex" version = "1.3.0" @@ -3426,9 +3462,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "siphasher" @@ -3545,6 +3581,7 @@ version = "0.0.0-dev" dependencies = [ "bcrypt", "clap", + "either", "futures", "helm-sys", "indexmap", @@ -3601,9 +3638,10 @@ dependencies = [ [[package]] name = "stackable-operator" -version = "0.108.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.109.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ + "base64", "clap", "const_format", "delegate", @@ -3618,13 +3656,14 @@ dependencies = [ "k8s-openapi", "kube", "product-config", + "rand 0.9.2", "regex", "schemars", "semver", "serde", "serde_json", "serde_yaml", - "snafu 0.8.9", + "snafu 0.9.0", "stackable-operator-derive", "stackable-shared", "stackable-telemetry", @@ -3640,7 +3679,7 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "darling", "proc-macro2", @@ -3651,7 +3690,7 @@ dependencies = [ [[package]] name = "stackable-shared" version = "0.1.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "jiff", "k8s-openapi", @@ -3660,15 +3699,15 @@ dependencies = [ "semver", "serde", "serde_yaml", - "snafu 0.8.9", + "snafu 0.9.0", "strum", "time", ] [[package]] name = "stackable-telemetry" -version = "0.6.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.6.3" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "axum", "clap", @@ -3679,7 +3718,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry_sdk", "pin-project", - "snafu 0.8.9", + "snafu 0.9.0", "strum", "tokio", "tower", @@ -3691,21 +3730,21 @@ dependencies = [ [[package]] name = "stackable-versioned" -version = "0.8.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.9.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "schemars", "serde", "serde_json", "serde_yaml", - "snafu 0.8.9", + "snafu 0.9.0", "stackable-versioned-macros", ] [[package]] name = "stackable-versioned-macros" -version = "0.8.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.9.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "convert_case", "convert_case_extras", @@ -3729,6 +3768,7 @@ dependencies = [ "clap_complete", "clap_complete_nushell", "comfy-table", + "dialoguer", "directories", "dotenvy", "futures", @@ -3831,6 +3871,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "tera" version = "1.20.1" @@ -3945,9 +3998,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -3970,9 +4023,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" dependencies = [ "bytes", "libc", @@ -3986,9 +4039,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -4044,9 +4097,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.7+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "indexmap", "serde_core", @@ -4059,18 +4112,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.1+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.5+spec-1.1.0" +version = "0.25.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" +checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" dependencies = [ "indexmap", "toml_datetime", @@ -4080,18 +4133,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.10+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.7+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tonic" @@ -4347,9 +4400,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -4461,9 +4514,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -4558,9 +4611,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if", "once_cell", @@ -4571,23 +4624,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4595,9 +4644,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -4608,9 +4657,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -4651,9 +4700,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" dependencies = [ "js-sys", "wasm-bindgen", @@ -5001,9 +5050,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] @@ -5098,9 +5147,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "xml" @@ -5127,9 +5176,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5138,9 +5187,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -5150,18 +5199,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -5170,18 +5219,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -5197,9 +5246,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -5208,9 +5257,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -5219,9 +5268,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.nix b/Cargo.nix index fb349b3e..b4a24133 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -1395,9 +1395,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.2.57"; + version = "1.2.59"; edition = "2018"; - sha256 = "08q464b62d03zm7rgiixavkrh5lzfq18lwf884vgycj9735d23bs"; + sha256 = "10sjxshjiyvglpqnap8z8fqdggf9mnxm8dn5kwr8mli4cpnd795p"; authors = [ "Alex Crichton " ]; @@ -1937,9 +1937,9 @@ rec { }; "cmake" = rec { crateName = "cmake"; - version = "0.1.57"; + version = "0.1.58"; edition = "2021"; - sha256 = "0zgg10qgykig4nxyf7whrqfg7fkk0xfxhiavikmrndvbrm23qi3m"; + sha256 = "0y06zxw5sv1p5vvpp5rz1qwbrq7ccawrl09nqy5ahx1a5418mxy0"; authors = [ "Alex Crichton " ]; @@ -2834,6 +2834,42 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" ]; }; + "dialoguer" = rec { + crateName = "dialoguer"; + version = "0.12.0"; + edition = "2021"; + sha256 = "15mdq2cp838yiq9fs1jkhvskixvlqz5p8f8dipkn88xz06sh9w95"; + dependencies = [ + { + name = "console"; + packageId = "console"; + } + { + name = "shell-words"; + packageId = "shell-words"; + } + { + name = "tempfile"; + packageId = "tempfile"; + optional = true; + } + { + name = "zeroize"; + packageId = "zeroize"; + optional = true; + } + ]; + features = { + "default" = [ "editor" "password" ]; + "editor" = [ "tempfile" ]; + "fuzzy-matcher" = [ "dep:fuzzy-matcher" ]; + "fuzzy-select" = [ "fuzzy-matcher" ]; + "password" = [ "zeroize" ]; + "tempfile" = [ "dep:tempfile" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "default" "editor" "password" "tempfile" "zeroize" ]; + }; "digest" = rec { crateName = "digest"; version = "0.10.7"; @@ -3366,9 +3402,9 @@ rec { }; "fastrand" = rec { crateName = "fastrand"; - version = "2.3.0"; + version = "2.4.1"; edition = "2018"; - sha256 = "1ghiahsw1jd68df895cy5h3gzwk30hndidn3b682zmshpgmrx41p"; + sha256 = "1mnqxxnxvd69ma9mczabpbbsgwlhd6l78yv3vd681453a9s247wz"; authors = [ "Stjepan Glavina " ]; @@ -3378,7 +3414,7 @@ rec { "js" = [ "std" "getrandom" ]; "std" = [ "alloc" ]; }; - resolvedDefaultFeatures = [ "alloc" "std" ]; + resolvedDefaultFeatures = [ "alloc" "default" "std" ]; }; "find-msvc-tools" = rec { crateName = "find-msvc-tools"; @@ -4575,9 +4611,9 @@ rec { }; "hyper" = rec { crateName = "hyper"; - version = "1.8.1"; + version = "1.9.0"; edition = "2021"; - sha256 = "04cxr8j5y86bhxxlyqb8xkxjskpajk7cxwfzzk4v3my3a3rd9cia"; + sha256 = "1jmwbwqcaficskg76kq402gbymbnh2z4v99xwq3l5aa6n8bg16b2"; authors = [ "Sean McArthur " ]; @@ -4634,11 +4670,6 @@ rec { packageId = "pin-project-lite"; optional = true; } - { - name = "pin-utils"; - packageId = "pin-utils"; - optional = true; - } { name = "smallvec"; packageId = "smallvec"; @@ -4676,7 +4707,7 @@ rec { "client" = [ "dep:want" "dep:pin-project-lite" "dep:smallvec" ]; "ffi" = [ "dep:http-body-util" "dep:futures-util" ]; "full" = [ "client" "http1" "http2" "server" ]; - "http1" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:httparse" "dep:itoa" "dep:pin-utils" ]; + "http1" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:httparse" "dep:itoa" ]; "http2" = [ "dep:futures-channel" "dep:futures-core" "dep:h2" ]; "server" = [ "dep:httpdate" "dep:pin-project-lite" "dep:smallvec" ]; "tracing" = [ "dep:tracing" ]; @@ -5024,9 +5055,9 @@ rec { }; "icu_collections" = rec { crateName = "icu_collections"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "0hsblchsdl64q21qwrs4hvc2672jrf466zivbj1bwyv606bn8ssc"; + sha256 = "070r7xd0pynm0hnc1v2jzlbxka6wf50f81wybf9xg0y82v6x3119"; authors = [ "The ICU4X Project Developers" ]; @@ -5042,6 +5073,11 @@ rec { usesDefaultFeatures = false; features = [ "zerovec" ]; } + { + name = "utf8_iter"; + packageId = "utf8_iter"; + usesDefaultFeatures = false; + } { name = "yoke"; packageId = "yoke"; @@ -5069,9 +5105,9 @@ rec { }; "icu_locale_core" = rec { crateName = "icu_locale_core"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "1djvdc2f5ylmp1ymzv4gcnmq1s4hqfim9nxlcm173lsd01hpifpd"; + sha256 = "0a9cmin5w1x3bg941dlmgszn33qgq428k7qiqn5did72ndi9n8cj"; authors = [ "The ICU4X Project Developers" ]; @@ -5103,6 +5139,14 @@ rec { usesDefaultFeatures = false; } ]; + devDependencies = [ + { + name = "litemap"; + packageId = "litemap"; + usesDefaultFeatures = false; + features = [ "testing" ]; + } + ]; features = { "alloc" = [ "litemap/alloc" "tinystr/alloc" "writeable/alloc" "serde?/alloc" ]; "databake" = [ "dep:databake" "alloc" ]; @@ -5113,9 +5157,9 @@ rec { }; "icu_normalizer" = rec { crateName = "icu_normalizer"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "16dmn5596la2qm0r3vih0bzjfi0vx9a20yqjha6r1y3vnql8hv2z"; + sha256 = "1d7krxr0xpc4x9635k1100a24nh0nrc59n65j6yk6gbfkplmwvn5"; authors = [ "The ICU4X Project Developers" ]; @@ -5157,6 +5201,7 @@ rec { "compiled_data" = [ "dep:icu_normalizer_data" "icu_properties?/compiled_data" "icu_provider/baked" ]; "datagen" = [ "serde" "dep:databake" "icu_properties" "icu_collections/databake" "zerovec/databake" "icu_properties?/datagen" "icu_provider/export" ]; "default" = [ "compiled_data" "utf8_iter" "utf16_iter" ]; + "harfbuzz_traits" = [ "dep:harfbuzz-traits" ]; "icu_properties" = [ "dep:icu_properties" ]; "serde" = [ "dep:serde" "icu_collections/serde" "zerovec/serde" "icu_properties?/serde" "icu_provider/serde" ]; "utf16_iter" = [ "dep:utf16_iter" "dep:write16" ]; @@ -5166,9 +5211,9 @@ rec { }; "icu_normalizer_data" = rec { crateName = "icu_normalizer_data"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "02jnzizg6q75m41l6c13xc7nkc5q8yr1b728dcgfhpzw076wrvbs"; + sha256 = "0f5d5d5fhhr9937m2z6z38fzh6agf14z24kwlr6lyczafypf0fys"; authors = [ "The ICU4X Project Developers" ]; @@ -5176,9 +5221,9 @@ rec { }; "icu_properties" = rec { crateName = "icu_properties"; - version = "2.1.2"; + version = "2.2.0"; edition = "2021"; - sha256 = "1v3lbmhhi7i6jgw51ikjb1p50qh5rb67grlkdnkc63l7zq1gq2q2"; + sha256 = "1pkh3s837808cbwxvfagwc28cvwrz2d9h5rl02jwrhm51ryvdqxy"; authors = [ "The ICU4X Project Developers" ]; @@ -5223,6 +5268,7 @@ rec { "compiled_data" = [ "dep:icu_properties_data" "icu_provider/baked" ]; "datagen" = [ "serde" "dep:databake" "zerovec/databake" "icu_collections/databake" "icu_locale_core/databake" "zerotrie/databake" "icu_provider/export" ]; "default" = [ "compiled_data" ]; + "harfbuzz_traits" = [ "dep:harfbuzz-traits" ]; "serde" = [ "dep:serde" "icu_locale_core/serde" "zerovec/serde" "icu_collections/serde" "icu_provider/serde" "zerotrie/serde" ]; "unicode_bidi" = [ "dep:unicode-bidi" ]; }; @@ -5230,9 +5276,9 @@ rec { }; "icu_properties_data" = rec { crateName = "icu_properties_data"; - version = "2.1.2"; + version = "2.2.0"; edition = "2021"; - sha256 = "1bvpkh939rgzrjfdb7hz47v4wijngk0snmcgrnpwc9fpz162jv31"; + sha256 = "052awny0qwkbcbpd5jg2cd7vl5ry26pq4hz1nfsgf10c3qhbnawf"; authors = [ "The ICU4X Project Developers" ]; @@ -5240,9 +5286,9 @@ rec { }; "icu_provider" = rec { crateName = "icu_provider"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "0576b7dizgyhpfa74kacv86y4g1p7v5ffd6c56kf1q82rvq2r5l5"; + sha256 = "08dl8pxbwr8zsz4c5vphqb7xw0hykkznwi4rw7bk6pwb3krlr70k"; authors = [ "The ICU4X Project Developers" ]; @@ -5432,9 +5478,9 @@ rec { }; "indexmap" = rec { crateName = "indexmap"; - version = "2.13.0"; + version = "2.13.1"; edition = "2021"; - sha256 = "05qh5c4h2hrnyypphxpwflk45syqbzvqsvvyxg43mp576w2ff53p"; + sha256 = "1zs2af09vgdaix8qzhi3bd12zpn5za7pbc6v0cc0q2ryrfws5a25"; dependencies = [ { name = "equivalent"; @@ -5594,9 +5640,9 @@ rec { }; "iri-string" = rec { crateName = "iri-string"; - version = "0.7.10"; + version = "0.7.12"; edition = "2021"; - sha256 = "06kk3a5jz576p7vrpf7zz9jv3lrgcyp7pczcblcxdnryg3q3h4y9"; + sha256 = "082fpx6c5ghvmqpwxaf2b268m47z2ic3prajqbmi1s1qpfj5kri5"; libName = "iri_string"; authors = [ "YOSHIOKA Takuma " @@ -5677,9 +5723,9 @@ rec { }; "itoa" = rec { crateName = "itoa"; - version = "1.0.17"; + version = "1.0.18"; edition = "2021"; - sha256 = "1lh93xydrdn1g9x547bd05g0d3hra7pd1k4jfd2z1pl1h5hwdv4j"; + sha256 = "10jnd1vpfkb8kj38rlkn2a6k02afvj3qmw054dfpzagrpl6achlg"; authors = [ "David Tolnay " ]; @@ -5876,7 +5922,7 @@ rec { } { name = "jni-sys"; - packageId = "jni-sys"; + packageId = "jni-sys 0.3.1"; } { name = "log"; @@ -5905,15 +5951,65 @@ rec { "libloading" = [ "dep:libloading" ]; }; }; - "jni-sys" = rec { + "jni-sys 0.3.1" = rec { crateName = "jni-sys"; - version = "0.3.0"; - edition = "2015"; - sha256 = "0c01zb9ygvwg9wdx2fii2d39myzprnpqqhy7yizxvjqp5p04pbwf"; + version = "0.3.1"; + edition = "2021"; + sha256 = "0n1j8fbz081w1igfrpc79n6vgm7h3ik34nziy5fjgq5nz7hm59j1"; libName = "jni_sys"; authors = [ "Steven Fackler " ]; + dependencies = [ + { + name = "jni-sys"; + packageId = "jni-sys 0.4.1"; + rename = "jni_sys_04"; + } + ]; + features = { + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "jni-sys 0.4.1" = rec { + crateName = "jni-sys"; + version = "0.4.1"; + edition = "2021"; + sha256 = "1wlahx6f2zhczdjqyn8mk7kshb8x5vsd927sn3lvw41rrf47ldy6"; + libName = "jni_sys"; + authors = [ + "Steven Fackler " + "Robert Bragg " + ]; + dependencies = [ + { + name = "jni-sys-macros"; + packageId = "jni-sys-macros"; + } + ]; + + }; + "jni-sys-macros" = rec { + crateName = "jni-sys-macros"; + version = "0.4.1"; + edition = "2021"; + sha256 = "0r32gbabrak15a7p487765b5wc0jcna2yv88mk6m1zjqyi1bkh1q"; + procMacro = true; + libName = "jni_sys_macros"; + authors = [ + "Robert Bragg " + ]; + dependencies = [ + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn 2.0.117"; + features = [ "full" ]; + } + ]; }; "jobserver" = rec { @@ -5941,14 +6037,26 @@ rec { }; "js-sys" = rec { crateName = "js-sys"; - version = "0.3.91"; + version = "0.3.94"; edition = "2021"; - sha256 = "171rzgq33wc1nxkgnvhlqqwwnrifs13mg3jjpjj5nf1z0yvib5xl"; + sha256 = "1nb4fr7c78mrrdhmg04nbac1zvd5z3panvqka8sy30nfh3py411f"; libName = "js_sys"; authors = [ "The wasm-bindgen Developers" ]; dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + optional = true; + } + { + name = "futures-util"; + packageId = "futures-util"; + optional = true; + usesDefaultFeatures = false; + features = [ "std" ]; + } { name = "once_cell"; packageId = "once_cell"; @@ -5962,9 +6070,11 @@ rec { ]; features = { "default" = [ "std" "unsafe-eval" ]; + "futures" = [ "dep:cfg-if" "dep:futures-util" ]; + "futures-core-03-stream" = [ "futures" "dep:futures-core" ]; "std" = [ "wasm-bindgen/std" ]; }; - resolvedDefaultFeatures = [ "default" "std" "unsafe-eval" ]; + resolvedDefaultFeatures = [ "default" "futures" "std" "unsafe-eval" ]; }; "json-patch" = rec { crateName = "json-patch"; @@ -6133,7 +6243,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "k8s_version"; @@ -6152,7 +6262,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } ]; features = { @@ -6769,9 +6879,9 @@ rec { }; "libc" = rec { crateName = "libc"; - version = "0.2.183"; + version = "0.2.184"; edition = "2021"; - sha256 = "17c9gyia7rrzf9gsssvk3vq9ca2jp6rh32fsw6ciarpn5djlddmm"; + sha256 = "1bz4525m7lwzr63iidh7lp9ppz2c9va1pn6fyjh5wsp1ajjd5xa8"; authors = [ "The Rust Project Developers" ]; @@ -6824,9 +6934,9 @@ rec { }; "libredox" = rec { crateName = "libredox"; - version = "0.1.14"; + version = "0.1.15"; edition = "2021"; - sha256 = "02p3pxlqf54znf1jhiyyjs0i4caf8ckrd5l8ygs4i6ba3nfy6i0p"; + sha256 = "022g34brmdis15kji0w9kla6xk6098xvs416ihgnn92isj7z9nvx"; authors = [ "4lDO2 <4lDO2@protonmail.com>" ]; @@ -6870,9 +6980,9 @@ rec { }; "litemap" = rec { crateName = "litemap"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0xsy8pfp9s802rsj1bq2ys2kbk1g36w5dr3gkfip7gphb5x60wv3"; + sha256 = "1w7628bc7wwcxc4n4s5kw0610xk06710nh2hn5kwwk2wa91z9nlj"; authors = [ "The ICU4X Project Developers" ]; @@ -7095,9 +7205,9 @@ rec { }; "mio" = rec { crateName = "mio"; - version = "1.1.1"; + version = "1.2.0"; edition = "2021"; - sha256 = "1z2phpalqbdgihrcjp8y09l3kgq6309jnhnr6h11l9s7mnqcm6x6"; + sha256 = "1hanrh4fwsfkdqdaqfidz48zz1wdix23zwn3r2x78am0garfbdsh"; authors = [ "Carl Lerche " "Thomas de Zeeuw " @@ -7107,17 +7217,7 @@ rec { { name = "libc"; packageId = "libc"; - target = { target, features }: ("hermit" == target."os" or null); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: ("wasi" == target."os" or null); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); + target = { target, features }: ((target."unix" or false) || ("hermit" == target."os" or null) || ("wasi" == target."os" or null)); } { name = "wasi"; @@ -7194,9 +7294,9 @@ rec { }; "num-conv" = rec { crateName = "num-conv"; - version = "0.2.0"; + version = "0.2.1"; edition = "2021"; - sha256 = "0l4hj7lp8zbb9am4j3p7vlcv47y9bbazinvnxx9zjhiwkibyr5yg"; + sha256 = "0rqrr29brafaa2za352pbmhkk556n7f8z9rrkgmjp1idvdl3fry6"; libName = "num_conv"; authors = [ "Jacob Pratt " @@ -7428,9 +7528,9 @@ rec { }; "opentelemetry-otlp" = rec { crateName = "opentelemetry-otlp"; - version = "0.31.0"; + version = "0.31.1"; edition = "2021"; - sha256 = "1gv3h75z8c0p9b85mbq7f1rgsi18wip1xlfa6g82lkfa5pdnc8vs"; + sha256 = "07zp0b62b9dajnvvcd6j2ppw5zg7wp4ixka9z6fr3bxrrdmcss8z"; libName = "opentelemetry_otlp"; dependencies = [ { @@ -7542,6 +7642,9 @@ rec { "serde_json" = [ "dep:serde_json" ]; "serialize" = [ "serde" "serde_json" ]; "tls" = [ "tonic/tls-ring" ]; + "tls-aws-lc" = [ "tonic/tls-aws-lc" ]; + "tls-provider-agnostic" = [ "tonic/_tls-any" ]; + "tls-ring" = [ "tonic/tls-ring" ]; "tls-roots" = [ "tls" "tonic/tls-native-roots" ]; "tls-webpki-roots" = [ "tls" "tonic/tls-webpki-roots" ]; "tokio" = [ "dep:tokio" ]; @@ -8252,17 +8355,6 @@ rec { sha256 = "1kfmwvs271si96zay4mm8887v5khw0c27jc9srw1a75ykvgj54x8"; libName = "pin_project_lite"; - }; - "pin-utils" = rec { - crateName = "pin-utils"; - version = "0.1.0"; - edition = "2018"; - sha256 = "117ir7vslsl2z1a7qzhws4pd01cg2d3338c47swjyvqv2n60v1wb"; - libName = "pin_utils"; - authors = [ - "Josef Brandl " - ]; - }; "portable-atomic" = rec { crateName = "portable-atomic"; @@ -8298,9 +8390,9 @@ rec { }; "potential_utf" = rec { crateName = "potential_utf"; - version = "0.1.4"; + version = "0.1.5"; edition = "2021"; - sha256 = "0xxg0pkfpq299wvwln409z4fk80rbv55phh3f1jhjajy5x1ljfdp"; + sha256 = "0r0518fr32xbkgzqap509s3r60cr0iancsg9j1jgf37cyz7b20q1"; authors = [ "The ICU4X Project Developers" ]; @@ -9889,9 +9981,9 @@ rec { }; "roff" = rec { crateName = "roff"; - version = "1.1.0"; + version = "1.1.1"; edition = "2024"; - sha256 = "1b8m96cshs2nam6ck1xrx59iijbpild4y75rlwngp7lp1s709wnv"; + sha256 = "12c1pibjxdjai80hpalxgqkzn30316x49iry4rdscrcn3mz42g1j"; }; "rstest" = rec { @@ -10103,9 +10195,9 @@ rec { }; "rustc-hash" = rec { crateName = "rustc-hash"; - version = "2.1.1"; + version = "2.1.2"; edition = "2021"; - sha256 = "03gz5lvd9ghcwsal022cgkq67dmimcgdjghfb5yb5d352ga06xrm"; + sha256 = "1gjdc5bw9982cj176jvgz9rrqf9xvr1q1ddpzywf5qhs7yzhlc4l"; libName = "rustc_hash"; authors = [ "The Rust Project Developers" @@ -10234,7 +10326,7 @@ rec { "thread" = [ "linux-raw-sys/prctl" ]; "use-libc" = [ "libc_errno" "libc" ]; }; - resolvedDefaultFeatures = [ "alloc" "std" "stdio" "termios" ]; + resolvedDefaultFeatures = [ "alloc" "default" "fs" "std" "stdio" "termios" ]; }; "rustls" = rec { crateName = "rustls"; @@ -10827,9 +10919,9 @@ rec { }; "semver" = rec { crateName = "semver"; - version = "1.0.27"; - edition = "2018"; - sha256 = "1qmi3akfrnqc2hfkdgcxhld5bv961wbk8my3ascv5068mc5fnryp"; + version = "1.0.28"; + edition = "2021"; + sha256 = "1kaimrpy876bcgi8bfj0qqfxk77zm9iz2zhn1hp9hj685z854y4a"; authors = [ "David Tolnay " ]; @@ -11087,9 +11179,9 @@ rec { }; "serde_spanned" = rec { crateName = "serde_spanned"; - version = "1.0.4"; - edition = "2021"; - sha256 = "0xkp0qdzams5sqwndbw3xrhf4c0bb5r46w2ywkp1aqsdb8ggkfzq"; + version = "1.1.1"; + edition = "2024"; + sha256 = "09jzk7i6wihn3d8i3wi4j4n98ghi93c3b8m8k64nxq0ijn3vaqk6"; dependencies = [ { name = "serde_core"; @@ -11264,6 +11356,20 @@ rec { "loom" = [ "dep:loom" ]; }; }; + "shell-words" = rec { + crateName = "shell-words"; + version = "1.1.1"; + edition = "2015"; + sha256 = "0xzd5p53xl0ndnk63r0by52rhdrh6pd37szfxszkg73zb6ffcvyw"; + libName = "shell_words"; + authors = [ + "Tomasz Miąsko " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "shlex" = rec { crateName = "shlex"; version = "1.3.0"; @@ -11306,9 +11412,9 @@ rec { }; "simd-adler32" = rec { crateName = "simd-adler32"; - version = "0.3.8"; + version = "0.3.9"; edition = "2018"; - sha256 = "18lx2gdgislabbvlgw5q3j5ssrr77v8kmkrxaanp3liimp2sc873"; + sha256 = "0532ysdwcvzyp2bwpk8qz0hijplcdwpssr5gy5r7qwqqy5z5qgbh"; libName = "simd_adler32"; authors = [ "Marvin Countryman " @@ -11653,6 +11759,10 @@ rec { packageId = "clap"; features = [ "derive" "env" ]; } + { + name = "either"; + packageId = "either"; + } { name = "futures"; packageId = "futures"; @@ -11882,12 +11992,12 @@ rec { }; "stackable-operator" = rec { crateName = "stackable-operator"; - version = "0.108.0"; + version = "0.109.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_operator"; @@ -11895,6 +12005,10 @@ rec { "Stackable GmbH " ]; dependencies = [ + { + name = "base64"; + packageId = "base64"; + } { name = "clap"; packageId = "clap"; @@ -11958,6 +12072,10 @@ rec { name = "product-config"; packageId = "product-config"; } + { + name = "rand"; + packageId = "rand 0.9.2"; + } { name = "regex"; packageId = "regex"; @@ -11986,7 +12104,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "stackable-operator-derive"; @@ -12054,7 +12172,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; procMacro = true; @@ -12089,7 +12207,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_shared"; @@ -12134,7 +12252,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "strum"; @@ -12165,12 +12283,12 @@ rec { }; "stackable-telemetry" = rec { crateName = "stackable-telemetry"; - version = "0.6.2"; + version = "0.6.3"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_telemetry"; @@ -12222,7 +12340,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "strum"; @@ -12275,12 +12393,12 @@ rec { }; "stackable-versioned" = rec { crateName = "stackable-versioned"; - version = "0.8.3"; + version = "0.9.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_versioned"; @@ -12308,7 +12426,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "stackable-versioned-macros"; @@ -12319,12 +12437,12 @@ rec { }; "stackable-versioned-macros" = rec { crateName = "stackable-versioned-macros"; - version = "0.8.3"; + version = "0.9.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; procMacro = true; @@ -12419,6 +12537,10 @@ rec { packageId = "comfy-table"; features = [ "custom_styling" ]; } + { + name = "dialoguer"; + packageId = "dialoguer"; + } { name = "directories"; packageId = "directories"; @@ -12737,6 +12859,54 @@ rec { }; resolvedDefaultFeatures = [ "default" "proc-macro" ]; }; + "tempfile" = rec { + crateName = "tempfile"; + version = "3.27.0"; + edition = "2021"; + sha256 = "1gblhnyfjsbg9wjg194n89wrzah7jy3yzgnyzhp56f3v9jd7wj9j"; + authors = [ + "Steven Allen " + "The Rust Project Developers" + "Ashley Mannix " + "Jason White " + ]; + dependencies = [ + { + name = "fastrand"; + packageId = "fastrand"; + } + { + name = "getrandom"; + packageId = "getrandom 0.4.2"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: ((target."unix" or false) || (target."windows" or false) || ("wasi" == target."os" or null)); + } + { + name = "once_cell"; + packageId = "once_cell"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "rustix"; + packageId = "rustix"; + target = { target, features }: ((target."unix" or false) || ("wasi" == target."os" or null)); + features = [ "fs" ]; + } + { + name = "windows-sys"; + packageId = "windows-sys 0.61.2"; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Storage_FileSystem" "Win32_Foundation" ]; + } + ]; + features = { + "default" = [ "getrandom" ]; + "getrandom" = [ "dep:getrandom" ]; + }; + resolvedDefaultFeatures = [ "default" "getrandom" ]; + }; "tera" = rec { crateName = "tera"; version = "1.20.1"; @@ -13070,9 +13240,9 @@ rec { }; "tinystr" = rec { crateName = "tinystr"; - version = "0.8.2"; + version = "0.8.3"; edition = "2021"; - sha256 = "0sa8z88axdsf088hgw5p4xcyi6g3w3sgbb6qdp81bph9bk2fkls2"; + sha256 = "0vfr8x285w6zsqhna0a9jyhylwiafb2kc8pj2qaqaahw48236cn8"; authors = [ "The ICU4X Project Developers" ]; @@ -13140,9 +13310,9 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.50.0"; + version = "1.51.0"; edition = "2021"; - sha256 = "0bc2c5kd57p2xd4l6hagb0bkrp798k5vw0f3xzzwy0sf6ws5xb97"; + sha256 = "1k90g0ij7vap4lwz45gr0kq97f637smdmxjyq47vjyjazk0c9l9b"; authors = [ "Tokio Contributors " ]; @@ -13158,6 +13328,12 @@ rec { optional = true; target = { target, features }: ((target."tokio_unstable" or false) && ("linux" == target."os" or null)); } + { + name = "libc"; + packageId = "libc"; + optional = true; + target = { target, features }: ("wasi" == target."os" or null); + } { name = "libc"; packageId = "libc"; @@ -13192,7 +13368,7 @@ rec { name = "socket2"; packageId = "socket2"; optional = true; - target = { target, features }: (!(builtins.elem "wasm" target."family")); + target = { target, features }: ((!(builtins.elem "wasm" target."family")) || (("wasi" == target."os" or null) && (!("p1" == target."env" or null)))); features = [ "all" ]; } { @@ -13250,9 +13426,9 @@ rec { }; "tokio-macros" = rec { crateName = "tokio-macros"; - version = "2.6.1"; + version = "2.7.0"; edition = "2021"; - sha256 = "172nwz3s7mmh266hb8l5xdnc7v9kqahisppqhinfd75nz3ps4maw"; + sha256 = "15m4f37mdafs0gg36sh0rskm1i768lb7zmp8bw67kaxr3avnqniq"; procMacro = true; libName = "tokio_macros"; authors = [ @@ -13481,9 +13657,9 @@ rec { }; "toml" = rec { crateName = "toml"; - version = "1.0.7+spec-1.1.0"; - edition = "2021"; - sha256 = "15kaclc4y8yb4ahny19ng51rmff4vj7lyy5qq25lavkgi9yxaa6x"; + version = "1.1.2+spec-1.1.0"; + edition = "2024"; + sha256 = "1vpggpamqhw4852kic7465zsidczsla06wz6friqkkfbhigd3ww1"; dependencies = [ { name = "indexmap"; @@ -13545,9 +13721,9 @@ rec { }; "toml_datetime" = rec { crateName = "toml_datetime"; - version = "1.0.1+spec-1.1.0"; - edition = "2021"; - sha256 = "1sgk7zc6x187iib7kj1nzn44mp0zrk9hgii69rbar35m3ms0wclv"; + version = "1.1.1+spec-1.1.0"; + edition = "2024"; + sha256 = "1mws2mkkf46l7inn77azhm0vdwxngv9vsbhbl0ah33p2c9gzcr9i"; dependencies = [ { name = "serde_core"; @@ -13566,9 +13742,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.25.5+spec-1.1.0"; - edition = "2021"; - sha256 = "1qgjkq687jkdrc3wq4fi95lj6d0bvwqs9xi3d41wx2x28h3a98cc"; + version = "0.25.10+spec-1.1.0"; + edition = "2024"; + sha256 = "06rdlg34g1ply2drbp0fr4xypsvdmfay714s75n5w8wy2v51h958"; dependencies = [ { name = "indexmap"; @@ -13601,9 +13777,9 @@ rec { }; "toml_parser" = rec { crateName = "toml_parser"; - version = "1.0.10+spec-1.1.0"; - edition = "2021"; - sha256 = "081lsv63zphnff9ssb0yjavcc82sblvj808rvwb4h76kxx5mpwkx"; + version = "1.1.2+spec-1.1.0"; + edition = "2024"; + sha256 = "09kmzc55a0j21whm290wlf5a8b18a0qc87a1s8sncrckc6wfkax2"; dependencies = [ { name = "winnow"; @@ -13621,9 +13797,9 @@ rec { }; "toml_writer" = rec { crateName = "toml_writer"; - version = "1.0.7+spec-1.1.0"; - edition = "2021"; - sha256 = "0vdmlskpqkjf5n2zghna8mwlqdbf0ryskfxnlhfjphixdqfalypi"; + version = "1.1.1+spec-1.1.0"; + edition = "2024"; + sha256 = "1nwjhvvrxz8f4ck1qi4xcz2x9qhpci37nrknhxxf9sqk22dsyvbm"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -14628,9 +14804,9 @@ rec { }; "unicode-segmentation" = rec { crateName = "unicode-segmentation"; - version = "1.12.0"; + version = "1.13.2"; edition = "2018"; - sha256 = "14qla2jfx74yyb9ds3d2mpwpa4l4lzb9z57c6d2ba511458z5k7n"; + sha256 = "135a26m4a0wj319gcw28j6a5aqvz00jmgwgmcs6szgxjf942facn"; libName = "unicode_segmentation"; authors = [ "kwantam " @@ -14982,9 +15158,9 @@ rec { }; "uuid" = rec { crateName = "uuid"; - version = "1.22.0"; + version = "1.23.0"; edition = "2021"; - sha256 = "0dvsfn44sddhyhlhk7m3i559wyb125h86799fm5abky0067kr3d6"; + sha256 = "1nbrzkdhwr4clshsks7flc2jq6lavjrsx65hyn63c9dd5vsbdj2s"; authors = [ "Ashley Mannix" "Dylan DPC" @@ -15259,9 +15435,9 @@ rec { }; "wasm-bindgen" = rec { crateName = "wasm-bindgen"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; - sha256 = "13nkhw552hpllrrmkd2x9y4bmcxr82kdpky2n667kqzcq6jzjck5"; + sha256 = "1c6hi55mq70546hrvrx7wa27sn3yvf04gg6hf8riwn8mnhdzql85"; libName = "wasm_bindgen"; authors = [ "The wasm-bindgen Developers" @@ -15310,62 +15486,38 @@ rec { }; "wasm-bindgen-futures" = rec { crateName = "wasm-bindgen-futures"; - version = "0.4.64"; + version = "0.4.67"; edition = "2021"; - sha256 = "1f3xnr40wwims4zhvh119dhwmffz4h4x82cffi118ri878mm5ig9"; + sha256 = "0znqqp9z52s4ckb94crjlbqbfd7i8zvnjpx7s3nhcwjvj3k3sqh3"; libName = "wasm_bindgen_futures"; authors = [ "The wasm-bindgen Developers" ]; dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if"; - } - { - name = "futures-util"; - packageId = "futures-util"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } { name = "js-sys"; packageId = "js-sys"; usesDefaultFeatures = false; - } - { - name = "once_cell"; - packageId = "once_cell"; - usesDefaultFeatures = false; + features = [ "futures" ]; } { name = "wasm-bindgen"; packageId = "wasm-bindgen"; usesDefaultFeatures = false; } - { - name = "web-sys"; - packageId = "web-sys"; - usesDefaultFeatures = false; - target = { target, features }: (builtins.elem "atomics" targetFeatures); - features = [ "MessageEvent" "Worker" ]; - } ]; features = { "default" = [ "std" ]; - "futures-core" = [ "dep:futures-core" ]; - "futures-core-03-stream" = [ "futures-core" ]; - "futures-util" = [ "dep:futures-util" ]; - "std" = [ "wasm-bindgen/std" "js-sys/std" "web-sys/std" "futures-util" ]; + "futures-core-03-stream" = [ "js-sys/futures-core-03-stream" ]; + "std" = [ "wasm-bindgen/std" "js-sys/std" ]; }; - resolvedDefaultFeatures = [ "default" "futures-util" "std" ]; + resolvedDefaultFeatures = [ "default" "std" ]; }; "wasm-bindgen-macro" = rec { crateName = "wasm-bindgen-macro"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; - sha256 = "1rhq9kkl7n0zjrag9p25xsi4aabpgfkyf02zn4xv6pqhrw7xb8hq"; + sha256 = "1gl6gqy60khhyqv354m0kmgk541sass8kzymxim7hi6zbaizkgbz"; procMacro = true; libName = "wasm_bindgen_macro"; authors = [ @@ -15387,9 +15539,9 @@ rec { }; "wasm-bindgen-macro-support" = rec { crateName = "wasm-bindgen-macro-support"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; - sha256 = "1qriqqjpn922kv5c7f7627fj823k5aifv06j2gvwsiy5map4rkh3"; + sha256 = "1wlza8xdr18cac2wm3ahxdwx1nnqa01m0d3jf3kd9dmsy8z6kafw"; libName = "wasm_bindgen_macro_support"; authors = [ "The wasm-bindgen Developers" @@ -15423,10 +15575,10 @@ rec { }; "wasm-bindgen-shared" = rec { crateName = "wasm-bindgen-shared"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; links = "wasm_bindgen"; - sha256 = "05lc6w64jxlk4wk8rjci4z61lhx2ams90la27a41gvi3qaw2d8vm"; + sha256 = "0frxrdi1w0cswv8v7n1972hd23nbwm8hr7a2dhdq8bbd59l9l4ir"; libName = "wasm_bindgen_shared"; authors = [ "The wasm-bindgen Developers" @@ -15551,9 +15703,9 @@ rec { }; "web-sys" = rec { crateName = "web-sys"; - version = "0.3.91"; + version = "0.3.94"; edition = "2021"; - sha256 = "1y91r8f4dy4iqgrr03swdzqffz6wmllrgninp8kgpaq4n5xs2jw5"; + sha256 = "02nxnhv349r2gcy8w71cjj6nimww1g2zy20y8r4hhbxi75z04w6d"; libName = "web_sys"; authors = [ "The wasm-bindgen Developers" @@ -16043,7 +16195,7 @@ rec { "default" = [ "std" ]; "std" = [ "wasm-bindgen/std" "js-sys/std" ]; }; - resolvedDefaultFeatures = [ "AbortController" "AbortSignal" "Blob" "BlobPropertyBag" "Event" "EventTarget" "File" "FormData" "Headers" "MessageEvent" "ReadableStream" "Request" "RequestCache" "RequestCredentials" "RequestInit" "RequestMode" "Response" "ServiceWorkerGlobalScope" "Window" "Worker" "WorkerGlobalScope" "default" "std" ]; + resolvedDefaultFeatures = [ "AbortController" "AbortSignal" "Blob" "BlobPropertyBag" "EventTarget" "File" "FormData" "Headers" "ReadableStream" "Request" "RequestCache" "RequestCredentials" "RequestInit" "RequestMode" "Response" "ServiceWorkerGlobalScope" "Window" "WorkerGlobalScope" "default" "std" ]; }; "web-time" = rec { crateName = "web-time"; @@ -17763,9 +17915,9 @@ rec { }; "winnow" = rec { crateName = "winnow"; - version = "1.0.0"; + version = "1.0.1"; edition = "2021"; - sha256 = "1n67gx8mg2b6r2z54zwbrb6qsfbdsar1lvafsfaajr3jcvj8h3m9"; + sha256 = "1dbji1bwviy08pl74f2qw2m4w9hc4p3vyl3lfj05jdydy59w1nh9"; dependencies = [ { name = "memchr"; @@ -18099,9 +18251,9 @@ rec { }; "writeable" = rec { crateName = "writeable"; - version = "0.6.2"; + version = "0.6.3"; edition = "2021"; - sha256 = "1fg08y97n6vk7l0rnjggw3xyrii6dcqg54wqaxldrlk98zdy1pcy"; + sha256 = "1i54d13h9bpap2hf13xcry1s4lxh7ap3923g8f3c0grd7c9fbyhz"; authors = [ "The ICU4X Project Developers" ]; @@ -18185,9 +18337,9 @@ rec { }; "yoke" = rec { crateName = "yoke"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0m29dm0bf5iakxgma0bj6dbmc3b8qi9b1vaw9sa76kdqmz3fbmkj"; + sha256 = "1jprcs7a98a5whvfs6r3jvfh1nnfp6zyijl7y4ywmn88lzywbs5b"; authors = [ "Manish Goregaokar " ]; @@ -18220,9 +18372,9 @@ rec { }; "yoke-derive" = rec { crateName = "yoke-derive"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0pbyja133jnng4mrhimzdq4a0y26421g734ybgz8wsgbfhl0andn"; + sha256 = "13l5y5sz4lqm7rmyakjbh6vwgikxiql51xfff9hq2j485hk4r16y"; procMacro = true; libName = "yoke_derive"; authors = [ @@ -18251,9 +18403,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.42"; + version = "0.8.48"; edition = "2021"; - sha256 = "1qq50mj06rds2iac197kpkdlvgql1j3vvm82gy5qayladxqqnmzj"; + sha256 = "1sb8plax8jbrsng1jdval7bdhk7hhrx40dz3hwh074k6knzkgm7f"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -18287,9 +18439,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.42"; + version = "0.8.48"; edition = "2021"; - sha256 = "0bx010zlchg4y8xixvkb4c74634j7ypnbpl7cqjdcfsdxacc0v3y"; + sha256 = "1m5s0g92cxggqc74j83k1priz24k3z93sj5gadppd20p9c4cvqvh"; procMacro = true; libName = "zerocopy_derive"; authors = [ @@ -18322,9 +18474,9 @@ rec { }; "zerofrom" = rec { crateName = "zerofrom"; - version = "0.1.6"; + version = "0.1.7"; edition = "2021"; - sha256 = "19dyky67zkjichsb7ykhv0aqws3q0jfvzww76l66c19y6gh45k2h"; + sha256 = "1py40in4rirc9q8w36q67pld0zk8ssg024xhh0cncxgal7ra3yk9"; authors = [ "Manish Goregaokar " ]; @@ -18344,9 +18496,9 @@ rec { }; "zerofrom-derive" = rec { crateName = "zerofrom-derive"; - version = "0.1.6"; + version = "0.1.7"; edition = "2021"; - sha256 = "00l5niw7c1b0lf1vhvajpjmcnbdp2vn96jg4nmkhq2db0rp5s7np"; + sha256 = "18c4wsnznhdxx6m80piil1lbyszdiwsshgjrybqcm4b6qic22lqi"; procMacro = true; libName = "zerofrom_derive"; authors = [ @@ -18392,9 +18544,9 @@ rec { }; "zerotrie" = rec { crateName = "zerotrie"; - version = "0.2.3"; + version = "0.2.4"; edition = "2021"; - sha256 = "0lbqznlqazmrwwzslw0ci7p3pqxykrbfhq29npj0gmb2amxc2n9a"; + sha256 = "1gr0pkcn3qsr6in6iixqyp0vbzwf2j1jzyvh7yl2yydh3p9m548g"; authors = [ "The ICU4X Project Developers" ]; @@ -18419,7 +18571,9 @@ rec { } ]; features = { + "alloc" = [ "zerovec?/alloc" ]; "databake" = [ "dep:databake" "zerovec?/databake" ]; + "dense" = [ "dep:zerovec" ]; "litemap" = [ "dep:litemap" "alloc" ]; "serde" = [ "dep:serde_core" "dep:litemap" "alloc" "litemap/serde" "zerovec?/serde" ]; "yoke" = [ "dep:yoke" ]; @@ -18430,9 +18584,9 @@ rec { }; "zerovec" = rec { crateName = "zerovec"; - version = "0.11.5"; + version = "0.11.6"; edition = "2021"; - sha256 = "00m0p47k2g9mkv505hky5xh3r6ps7v8qc0dy4pspg542jj972a3c"; + sha256 = "0fdjsy6b31q9i0d73sl7xjd12xadbwi45lkpfgqnmasrqg5i3ych"; authors = [ "The ICU4X Project Developers" ]; @@ -18455,11 +18609,20 @@ rec { usesDefaultFeatures = false; } ]; + devDependencies = [ + { + name = "yoke"; + packageId = "yoke"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + ]; features = { "alloc" = [ "serde?/alloc" ]; "databake" = [ "dep:databake" ]; "derive" = [ "dep:zerovec-derive" ]; "hashmap" = [ "dep:twox-hash" "alloc" ]; + "schemars" = [ "dep:schemars" "alloc" ]; "serde" = [ "dep:serde" ]; "yoke" = [ "dep:yoke" ]; }; @@ -18467,9 +18630,9 @@ rec { }; "zerovec-derive" = rec { crateName = "zerovec-derive"; - version = "0.11.2"; + version = "0.11.3"; edition = "2021"; - sha256 = "1wsig4h5j7a1scd5hrlnragnazjny9qjc44hancb6p6a76ay7p7a"; + sha256 = "0m85qj92mmfvhjra6ziqky5b1p4kcmp5069k7kfadp5hr8jw8pb2"; procMacro = true; libName = "zerovec_derive"; authors = [ diff --git a/Cargo.toml b/Cargo.toml index 26abd4e3..68985380 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,8 +28,10 @@ clap = { version = "4.5", features = ["derive", "env"] } clap_complete = "4.5" clap_complete_nushell = "4.5" comfy-table = { version = "7.1", features = ["custom_styling"] } +dialoguer = "0.12.0" directories = "6.0" dotenvy = "0.15" +either = "1.15.0" futures = "0.3" indexmap = { version = "2.2", features = ["serde"] } indicatif = "0.18" @@ -49,7 +51,7 @@ serde_json = "1.0" serde_yaml = "0.9" sha2 = "0.10" snafu = { version = "0.9", features = ["futures"] } -stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.108.0", default-features = false, features = ["crds", "kube-ws"] } +stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.109.0", default-features = false, features = ["crds", "kube-ws"] } tera = "1.20" termion = "4.0" tokio = { version = "1.38", features = ["rt-multi-thread", "macros", "fs", "process", "io-std"] } diff --git a/crate-hashes.json b/crate-hashes.json index e1706bc4..5ad3e870 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -4,12 +4,12 @@ "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-derive@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-runtime@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#k8s-version@0.1.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-operator-derive@0.3.1": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-operator@0.108.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-shared@0.1.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-telemetry@0.6.2": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-versioned-macros@0.8.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-versioned@0.8.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#k8s-version@0.1.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-operator-derive@0.3.1": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-operator@0.109.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-shared@0.1.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-telemetry@0.6.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-versioned-macros@0.9.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-versioned@0.9.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file diff --git a/docs/modules/stackablectl/pages/commands/demo.adoc b/docs/modules/stackablectl/pages/commands/demo.adoc index 074cd0cd..e5b66450 100644 --- a/docs/modules/stackablectl/pages/commands/demo.adoc +++ b/docs/modules/stackablectl/pages/commands/demo.adoc @@ -159,4 +159,31 @@ $ stackablectl stacklets list == Uninstalling a Demo -Currently, there is no support for uninstalling a demo again. However, this functionality will come soon. +To uninstall a demo, you can run the following command, specifying the namespace the demo was installed in. + +[source,console] +---- +$ stackablectl demo uninstall trino-taxi-data -n + +---- + +[NOTE] +==== +The uninstall command deletes the namespace the demo was installed in. Therefore it is not possible to uninstall demos in the `default` namespace. +==== + +[WARNING] +==== +Currently, some resources deployed by the demo are either still lingering after the deletion process or need to be deleted before running the uninstall command. + +* All demos + ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted +* end-to-end-security, argo-cd-git-ops, hbase-hdfs-load-cycling-data, jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data + ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted +* argo-cd-git-ops + ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` + ** Then you can delete the namespaces `stackable-airflow`, `minio`, and `sealed-secrets` + ** Delete the ArgoCD ApplicationSet `stackable-operators` and wait for ArgoCD to delete the Applications of that ApplicationSet + ** Only after deleting the above, run the `stackablectl demo uninstall` command, otherwise the deletion might get stuck + ** `*.argoproj.io` CRDs and `sealedsecrets.bitnami.com` CRD are not deleted +==== diff --git a/docs/modules/stackablectl/pages/commands/stack.adoc b/docs/modules/stackablectl/pages/commands/stack.adoc index 27c9049b..ccbface6 100644 --- a/docs/modules/stackablectl/pages/commands/stack.adoc +++ b/docs/modules/stackablectl/pages/commands/stack.adoc @@ -89,3 +89,39 @@ Installed stack logging Use "stackablectl operator installed" to display the installed operators Use "stackablectl stacklet list" to display the installed stacklets ---- + +== Uninstalling a Stack + +To uninstall a stack, you can run the following command, specifying the namespace the stack was installed in. + +[source,console] +---- +$ stackablectl stack uninstall logging -n + +---- + +[NOTE] +==== +The uninstall command deletes the namespace the stack was installed in. Therefore it is not possible to uninstall stacks in the `default` namespace. +==== + +[WARNING] +==== +Currently, some resources deployed by the stack are either still lingering after the deletion process or need to be deleted before running the uninstall command. + +* All stacks + ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted +* argo-cd-git-ops, hdfs-hbase, jupyterhub-pyspark-hdfs + ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted +* argo-cd-git-ops + ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` + ** Then you can delete the namespaces `stackable-airflow`, `minio`, and `sealed-secrets` + ** Delete the ArgoCD ApplicationSet `stackable-operators` and wait for ArgoCD to delete the Applications of that ApplicationSet + ** Only after deleting the above, run the `stackablectl stack uninstall` command, otherwise the deletion might get stuck + ** `*.argoproj.io` CRDs and `sealedsecrets.bitnami.com` CRD are not deleted +* monitoring + ** `*.monitoring.coreos.com` CRDs are not deleted +* observability + ** Delete OpenTelemetryCollector `otel-collector-grpc-external` and `otel-collector-grpc` + ** Only after deleting the above, run the `stackablectl stack uninstall` command, otherwise the deletion might get stuck +==== diff --git a/docs/modules/stackablectl/partials/commands/demo.adoc b/docs/modules/stackablectl/partials/commands/demo.adoc index c5b2d39b..21f5b844 100644 --- a/docs/modules/stackablectl/partials/commands/demo.adoc +++ b/docs/modules/stackablectl/partials/commands/demo.adoc @@ -6,10 +6,11 @@ Interact with demos, which are end-to-end usage demonstrations of the Stackable Usage: stackablectl demo [OPTIONS] Commands: - list List available demos - describe Print out detailed demo information - install Install a specific demo - help Print this message or the help of the given subcommand(s) + list List available demos + describe Print out detailed demo information + install Install a specific demo + uninstall Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + help Print this message or the help of the given subcommand(s) Options: -l, --log-level diff --git a/docs/modules/stackablectl/partials/commands/stack.adoc b/docs/modules/stackablectl/partials/commands/stack.adoc index 639b1621..9bc0a561 100644 --- a/docs/modules/stackablectl/partials/commands/stack.adoc +++ b/docs/modules/stackablectl/partials/commands/stack.adoc @@ -6,10 +6,11 @@ Interact with stacks, which are ready-to-use product combinations Usage: stackablectl stack [OPTIONS] Commands: - list List available stacks - describe Describe a specific stack - install Install a specific stack - help Print this message or the help of the given subcommand(s) + list List available stacks + describe Describe a specific stack + install Install a specific stack + uninstall Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + help Print this message or the help of the given subcommand(s) Options: -l, --log-level diff --git a/extra/completions/_stackablectl b/extra/completions/_stackablectl index abba1406..e3512fea 100644 --- a/extra/completions/_stackablectl +++ b/extra/completions/_stackablectl @@ -667,12 +667,51 @@ minikube\:"Use a minikube cluster"))' \ repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based on the version and thus will be operator-specific"))' \ '--listener-class-preset=[Choose the ListenerClass preset (\`none\`, \`ephemeral-nodes\` or \`stable-nodes\`)]:LISTENER_CLASS_PRESET:(none stable-nodes ephemeral-nodes)' \ '--skip-release[Skip the installation of the release during the stack install process]' \ +'-y[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--assume-yes[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--yes[Assume "yes" as answer to all prompts and run non-interactively]' \ '--no-cache[Do not cache the remote (default) demo, stack and release files]' \ '-h[Print help (see more with '\''--help'\'')]' \ '--help[Print help (see more with '\''--help'\'')]' \ '-V[Print version]' \ '--version[Print version]' \ -':stack_name -- Name of the stack to describe:_default' \ +':stack_name -- Name of the stack to install:_default' \ +&& ret=0 +;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +'--operator-namespace=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'--operator-ns=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'-n+[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--namespace=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--product-ns=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--release=[Target a specific Stackable release]:RELEASE:_default' \ +'-l+[Log level this application uses]:LOG_LEVEL:_default' \ +'--log-level=[Log level this application uses]:LOG_LEVEL:_default' \ +'*-d+[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*--demo-file=[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*-s+[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*--stack-file=[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*-r+[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'*--release-file=[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'-f+[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--operator-values=[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--helm-repo-stable=[Provide a custom Helm stable repository URL]:URL:_urls' \ +'--helm-repo-test=[Provide a custom Helm test repository URL]:URL:_urls' \ +'--helm-repo-dev=[Provide a custom Helm dev repository URL]:URL:_urls' \ +'--chart-source=[Source the charts from either a OCI registry or from index.yaml-based repositories]:CHART_SOURCE:((oci\:"OCI registry" +repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based on the version and thus will be operator-specific"))' \ +'--listener-class-preset=[Choose the ListenerClass preset (\`none\`, \`ephemeral-nodes\` or \`stable-nodes\`)]:LISTENER_CLASS_PRESET:(none stable-nodes ephemeral-nodes)' \ +'--skip-operators-and-crds[Skip uninstalling Stackable operators and CRDs]' \ +'-y[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--assume-yes[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--yes[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--no-cache[Do not cache the remote (default) demo, stack and release files]' \ +'-h[Print help (see more with '\''--help'\'')]' \ +'--help[Print help (see more with '\''--help'\'')]' \ +'-V[Print version]' \ +'--version[Print version]' \ +':stack_name -- Name of the stack to uninstall:_default' \ && ret=0 ;; (help) @@ -699,6 +738,10 @@ _arguments "${_arguments_options[@]}" : \ _arguments "${_arguments_options[@]}" : \ && ret=0 ;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 +;; (help) _arguments "${_arguments_options[@]}" : \ && ret=0 @@ -980,6 +1023,9 @@ minikube\:"Use a minikube cluster"))' \ repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based on the version and thus will be operator-specific"))' \ '--listener-class-preset=[Choose the ListenerClass preset (\`none\`, \`ephemeral-nodes\` or \`stable-nodes\`)]:LISTENER_CLASS_PRESET:(none stable-nodes ephemeral-nodes)' \ '--skip-release[Skip the installation of the release during the stack install process]' \ +'-y[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--assume-yes[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--yes[Assume "yes" as answer to all prompts and run non-interactively]' \ '--no-cache[Do not cache the remote (default) demo, stack and release files]' \ '-h[Print help (see more with '\''--help'\'')]' \ '--help[Print help (see more with '\''--help'\'')]' \ @@ -988,6 +1034,42 @@ repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based o ':DEMO -- Demo to install:_default' \ && ret=0 ;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +'--operator-namespace=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'--operator-ns=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'-n+[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--namespace=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--product-ns=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--release=[Target a specific Stackable release]:RELEASE:_default' \ +'-l+[Log level this application uses]:LOG_LEVEL:_default' \ +'--log-level=[Log level this application uses]:LOG_LEVEL:_default' \ +'*-d+[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*--demo-file=[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*-s+[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*--stack-file=[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*-r+[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'*--release-file=[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'-f+[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--operator-values=[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--helm-repo-stable=[Provide a custom Helm stable repository URL]:URL:_urls' \ +'--helm-repo-test=[Provide a custom Helm test repository URL]:URL:_urls' \ +'--helm-repo-dev=[Provide a custom Helm dev repository URL]:URL:_urls' \ +'--chart-source=[Source the charts from either a OCI registry or from index.yaml-based repositories]:CHART_SOURCE:((oci\:"OCI registry" +repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based on the version and thus will be operator-specific"))' \ +'--listener-class-preset=[Choose the ListenerClass preset (\`none\`, \`ephemeral-nodes\` or \`stable-nodes\`)]:LISTENER_CLASS_PRESET:(none stable-nodes ephemeral-nodes)' \ +'--skip-operators-and-crds[Skip uninstalling Stackable operators and CRDs]' \ +'-y[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--assume-yes[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--yes[Assume "yes" as answer to all prompts and run non-interactively]' \ +'--no-cache[Do not cache the remote (default) demo, stack and release files]' \ +'-h[Print help (see more with '\''--help'\'')]' \ +'--help[Print help (see more with '\''--help'\'')]' \ +'-V[Print version]' \ +'--version[Print version]' \ +':demo_name -- Demo to uninstall:_default' \ +&& ret=0 +;; (help) _arguments "${_arguments_options[@]}" : \ ":: :_stackablectl__demo__help_commands" \ @@ -1012,6 +1094,10 @@ _arguments "${_arguments_options[@]}" : \ _arguments "${_arguments_options[@]}" : \ && ret=0 ;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 +;; (help) _arguments "${_arguments_options[@]}" : \ && ret=0 @@ -1568,6 +1654,10 @@ _arguments "${_arguments_options[@]}" : \ (install) _arguments "${_arguments_options[@]}" : \ && ret=0 +;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 ;; esac ;; @@ -1620,6 +1710,10 @@ _arguments "${_arguments_options[@]}" : \ (install) _arguments "${_arguments_options[@]}" : \ && ret=0 +;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 ;; esac ;; @@ -1866,6 +1960,7 @@ _stackablectl__demo_commands() { 'list:List available demos' \ 'describe:Print out detailed demo information' \ 'install:Install a specific demo' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl demo commands' commands "$@" @@ -1881,6 +1976,7 @@ _stackablectl__demo__help_commands() { 'list:List available demos' \ 'describe:Print out detailed demo information' \ 'install:Install a specific demo' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl demo help commands' commands "$@" @@ -1905,6 +2001,11 @@ _stackablectl__demo__help__list_commands() { local commands; commands=() _describe -t commands 'stackablectl demo help list commands' commands "$@" } +(( $+functions[_stackablectl__demo__help__uninstall_commands] )) || +_stackablectl__demo__help__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl demo help uninstall commands' commands "$@" +} (( $+functions[_stackablectl__demo__install_commands] )) || _stackablectl__demo__install_commands() { local commands; commands=() @@ -1915,6 +2016,11 @@ _stackablectl__demo__list_commands() { local commands; commands=() _describe -t commands 'stackablectl demo list commands' commands "$@" } +(( $+functions[_stackablectl__demo__uninstall_commands] )) || +_stackablectl__demo__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl demo uninstall commands' commands "$@" +} (( $+functions[_stackablectl__experimental-debug_commands] )) || _stackablectl__experimental-debug_commands() { local commands; commands=() @@ -1996,6 +2102,7 @@ _stackablectl__help__demo_commands() { 'list:List available demos' \ 'describe:Print out detailed demo information' \ 'install:Install a specific demo' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ ) _describe -t commands 'stackablectl help demo commands' commands "$@" } @@ -2014,6 +2121,11 @@ _stackablectl__help__demo__list_commands() { local commands; commands=() _describe -t commands 'stackablectl help demo list commands' commands "$@" } +(( $+functions[_stackablectl__help__demo__uninstall_commands] )) || +_stackablectl__help__demo__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl help demo uninstall commands' commands "$@" +} (( $+functions[_stackablectl__help__experimental-debug_commands] )) || _stackablectl__help__experimental-debug_commands() { local commands; commands=() @@ -2102,6 +2214,7 @@ _stackablectl__help__stack_commands() { 'list:List available stacks' \ 'describe:Describe a specific stack' \ 'install:Install a specific stack' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ ) _describe -t commands 'stackablectl help stack commands' commands "$@" } @@ -2120,6 +2233,11 @@ _stackablectl__help__stack__list_commands() { local commands; commands=() _describe -t commands 'stackablectl help stack list commands' commands "$@" } +(( $+functions[_stackablectl__help__stack__uninstall_commands] )) || +_stackablectl__help__stack__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl help stack uninstall commands' commands "$@" +} (( $+functions[_stackablectl__help__stacklet_commands] )) || _stackablectl__help__stacklet_commands() { local commands; commands=( @@ -2314,6 +2432,7 @@ _stackablectl__stack_commands() { 'list:List available stacks' \ 'describe:Describe a specific stack' \ 'install:Install a specific stack' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl stack commands' commands "$@" @@ -2329,6 +2448,7 @@ _stackablectl__stack__help_commands() { 'list:List available stacks' \ 'describe:Describe a specific stack' \ 'install:Install a specific stack' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl stack help commands' commands "$@" @@ -2353,6 +2473,11 @@ _stackablectl__stack__help__list_commands() { local commands; commands=() _describe -t commands 'stackablectl stack help list commands' commands "$@" } +(( $+functions[_stackablectl__stack__help__uninstall_commands] )) || +_stackablectl__stack__help__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl stack help uninstall commands' commands "$@" +} (( $+functions[_stackablectl__stack__install_commands] )) || _stackablectl__stack__install_commands() { local commands; commands=() @@ -2363,6 +2488,11 @@ _stackablectl__stack__list_commands() { local commands; commands=() _describe -t commands 'stackablectl stack list commands' commands "$@" } +(( $+functions[_stackablectl__stack__uninstall_commands] )) || +_stackablectl__stack__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl stack uninstall commands' commands "$@" +} (( $+functions[_stackablectl__stacklet_commands] )) || _stackablectl__stacklet_commands() { local commands; commands=( diff --git a/extra/completions/stackablectl.bash b/extra/completions/stackablectl.bash index be0544fa..fef7c698 100644 --- a/extra/completions/stackablectl.bash +++ b/extra/completions/stackablectl.bash @@ -112,6 +112,9 @@ _stackablectl() { stackablectl__demo,list) cmd="stackablectl__demo__list" ;; + stackablectl__demo,uninstall) + cmd="stackablectl__demo__uninstall" + ;; stackablectl__demo__help,describe) cmd="stackablectl__demo__help__describe" ;; @@ -124,6 +127,9 @@ _stackablectl() { stackablectl__demo__help,list) cmd="stackablectl__demo__help__list" ;; + stackablectl__demo__help,uninstall) + cmd="stackablectl__demo__help__uninstall" + ;; stackablectl__help,cache) cmd="stackablectl__help__cache" ;; @@ -184,6 +190,9 @@ _stackablectl() { stackablectl__help__demo,list) cmd="stackablectl__help__demo__list" ;; + stackablectl__help__demo,uninstall) + cmd="stackablectl__help__demo__uninstall" + ;; stackablectl__help__operator,describe) cmd="stackablectl__help__operator__describe" ;; @@ -223,6 +232,9 @@ _stackablectl() { stackablectl__help__stack,list) cmd="stackablectl__help__stack__list" ;; + stackablectl__help__stack,uninstall) + cmd="stackablectl__help__stack__uninstall" + ;; stackablectl__help__stacklet,credentials) cmd="stackablectl__help__stacklet__credentials" ;; @@ -316,6 +328,9 @@ _stackablectl() { stackablectl__stack,list) cmd="stackablectl__stack__list" ;; + stackablectl__stack,uninstall) + cmd="stackablectl__stack__uninstall" + ;; stackablectl__stack__help,describe) cmd="stackablectl__stack__help__describe" ;; @@ -328,6 +343,9 @@ _stackablectl() { stackablectl__stack__help,list) cmd="stackablectl__stack__help__list" ;; + stackablectl__stack__help,uninstall) + cmd="stackablectl__stack__help__uninstall" + ;; stackablectl__stacklet,credentials) cmd="stackablectl__stacklet__credentials" ;; @@ -2139,7 +2157,7 @@ _stackablectl() { return 0 ;; stackablectl__demo) - opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install help" + opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -2479,7 +2497,7 @@ _stackablectl() { return 0 ;; stackablectl__demo__help) - opts="list describe install help" + opts="list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -2548,8 +2566,22 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__demo__help__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__demo__install) - opts="-c -n -l -d -s -r -f -h -V --skip-release --stack-parameters --parameters --cluster --cluster-name --cluster-nodes --cluster-cp-nodes --operator-ns --operator-namespace --product-ns --namespace --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " + opts="-c -n -y -l -d -s -r -f -h -V --skip-release --stack-parameters --parameters --cluster --cluster-name --cluster-nodes --cluster-cp-nodes --operator-ns --operator-namespace --product-ns --namespace --yes --assume-yes --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -2936,6 +2968,192 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__demo__uninstall) + opts="-n -y -l -d -s -r -f -h -V --operator-ns --operator-namespace --product-ns --namespace --skip-operators-and-crds --yes --assume-yes --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + --operator-namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --operator-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --product-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -n) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --release) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --log-level) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -l) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --demo-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -d) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --stack-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -s) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --release-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -r) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --operator-values) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -f) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --helm-repo-stable) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-test) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-dev) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --chart-source) + COMPREPLY=($(compgen -W "oci repo" -- "${cur}")) + return 0 + ;; + --listener-class-preset) + COMPREPLY=($(compgen -W "none stable-nodes ephemeral-nodes" -- "${cur}")) + return 0 + ;; + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__experimental__debug) opts="-n -c -l -d -s -r -f -h -V --namespace --container --image --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version [CMD]..." if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then @@ -3259,7 +3477,7 @@ _stackablectl() { return 0 ;; stackablectl__help__demo) - opts="list describe install" + opts="list describe install uninstall" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -3314,6 +3532,20 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__help__demo__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__help__experimental__debug) opts="" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then @@ -3511,7 +3743,7 @@ _stackablectl() { return 0 ;; stackablectl__help__stack) - opts="list describe install" + opts="list describe install uninstall" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -3566,6 +3798,20 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__help__stack__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__help__stacklet) opts="credentials list" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then @@ -5937,7 +6183,7 @@ _stackablectl() { return 0 ;; stackablectl__stack) - opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install help" + opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -6277,7 +6523,7 @@ _stackablectl() { return 0 ;; stackablectl__stack__help) - opts="list describe install help" + opts="list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -6346,8 +6592,22 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__stack__help__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__stack__install) - opts="-c -n -l -d -s -r -f -h -V --skip-release --stack-parameters --parameters --cluster --cluster-name --cluster-nodes --cluster-cp-nodes --operator-ns --operator-namespace --product-ns --namespace --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " + opts="-c -n -y -l -d -s -r -f -h -V --skip-release --stack-parameters --parameters --cluster --cluster-name --cluster-nodes --cluster-cp-nodes --operator-ns --operator-namespace --product-ns --namespace --yes --assume-yes --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -6734,6 +6994,192 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__stack__uninstall) + opts="-n -y -l -d -s -r -f -h -V --operator-ns --operator-namespace --product-ns --namespace --skip-operators-and-crds --yes --assume-yes --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + --operator-namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --operator-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --product-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -n) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --release) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --log-level) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -l) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --demo-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -d) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --stack-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -s) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --release-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -r) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --operator-values) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -f) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --helm-repo-stable) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-test) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-dev) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --chart-source) + COMPREPLY=($(compgen -W "oci repo" -- "${cur}")) + return 0 + ;; + --listener-class-preset) + COMPREPLY=($(compgen -W "none stable-nodes ephemeral-nodes" -- "${cur}")) + return 0 + ;; + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__stacklet) opts="-l -d -s -r -f -h -V --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version credentials list help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then diff --git a/extra/completions/stackablectl.elv b/extra/completions/stackablectl.elv index e98558e7..7ff8743c 100644 --- a/extra/completions/stackablectl.elv +++ b/extra/completions/stackablectl.elv @@ -430,6 +430,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available stacks' cand describe 'Describe a specific stack' cand install 'Install a specific stack' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;stack;list'= { @@ -512,6 +513,41 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand --chart-source 'Source the charts from either a OCI registry or from index.yaml-based repositories' cand --listener-class-preset 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' cand --skip-release 'Skip the installation of the release during the stack install process' + cand -y 'Assume "yes" as answer to all prompts and run non-interactively' + cand --assume-yes 'Assume "yes" as answer to all prompts and run non-interactively' + cand --yes 'Assume "yes" as answer to all prompts and run non-interactively' + cand --no-cache 'Do not cache the remote (default) demo, stack and release files' + cand -h 'Print help (see more with ''--help'')' + cand --help 'Print help (see more with ''--help'')' + cand -V 'Print version' + cand --version 'Print version' + } + &'stackablectl;stack;uninstall'= { + cand --operator-namespace 'Namespace where the operators are deployed' + cand --operator-ns 'Namespace where the operators are deployed' + cand -n 'Namespace where the stacks or demos are deployed' + cand --namespace 'Namespace where the stacks or demos are deployed' + cand --product-ns 'Namespace where the stacks or demos are deployed' + cand --release 'Target a specific Stackable release' + cand -l 'Log level this application uses' + cand --log-level 'Log level this application uses' + cand -d 'Provide one or more additional (custom) demo file(s)' + cand --demo-file 'Provide one or more additional (custom) demo file(s)' + cand -s 'Provide one or more additional (custom) stack file(s)' + cand --stack-file 'Provide one or more additional (custom) stack file(s)' + cand -r 'Provide one or more additional (custom) release file(s)' + cand --release-file 'Provide one or more additional (custom) release file(s)' + cand -f 'Path to a Helm values file that will be used for the installation of operators' + cand --operator-values 'Path to a Helm values file that will be used for the installation of operators' + cand --helm-repo-stable 'Provide a custom Helm stable repository URL' + cand --helm-repo-test 'Provide a custom Helm test repository URL' + cand --helm-repo-dev 'Provide a custom Helm dev repository URL' + cand --chart-source 'Source the charts from either a OCI registry or from index.yaml-based repositories' + cand --listener-class-preset 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' + cand --skip-operators-and-crds 'Skip uninstalling Stackable operators and CRDs' + cand -y 'Assume "yes" as answer to all prompts and run non-interactively' + cand --assume-yes 'Assume "yes" as answer to all prompts and run non-interactively' + cand --yes 'Assume "yes" as answer to all prompts and run non-interactively' cand --no-cache 'Do not cache the remote (default) demo, stack and release files' cand -h 'Print help (see more with ''--help'')' cand --help 'Print help (see more with ''--help'')' @@ -522,6 +558,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available stacks' cand describe 'Describe a specific stack' cand install 'Install a specific stack' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;stack;help;list'= { @@ -530,6 +567,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;stack;help;install'= { } + &'stackablectl;stack;help;uninstall'= { + } &'stackablectl;stack;help;help'= { } &'stackablectl;stacklet'= { @@ -646,6 +685,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available demos' cand describe 'Print out detailed demo information' cand install 'Install a specific demo' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;demo;list'= { @@ -728,6 +768,41 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand --chart-source 'Source the charts from either a OCI registry or from index.yaml-based repositories' cand --listener-class-preset 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' cand --skip-release 'Skip the installation of the release during the stack install process' + cand -y 'Assume "yes" as answer to all prompts and run non-interactively' + cand --assume-yes 'Assume "yes" as answer to all prompts and run non-interactively' + cand --yes 'Assume "yes" as answer to all prompts and run non-interactively' + cand --no-cache 'Do not cache the remote (default) demo, stack and release files' + cand -h 'Print help (see more with ''--help'')' + cand --help 'Print help (see more with ''--help'')' + cand -V 'Print version' + cand --version 'Print version' + } + &'stackablectl;demo;uninstall'= { + cand --operator-namespace 'Namespace where the operators are deployed' + cand --operator-ns 'Namespace where the operators are deployed' + cand -n 'Namespace where the stacks or demos are deployed' + cand --namespace 'Namespace where the stacks or demos are deployed' + cand --product-ns 'Namespace where the stacks or demos are deployed' + cand --release 'Target a specific Stackable release' + cand -l 'Log level this application uses' + cand --log-level 'Log level this application uses' + cand -d 'Provide one or more additional (custom) demo file(s)' + cand --demo-file 'Provide one or more additional (custom) demo file(s)' + cand -s 'Provide one or more additional (custom) stack file(s)' + cand --stack-file 'Provide one or more additional (custom) stack file(s)' + cand -r 'Provide one or more additional (custom) release file(s)' + cand --release-file 'Provide one or more additional (custom) release file(s)' + cand -f 'Path to a Helm values file that will be used for the installation of operators' + cand --operator-values 'Path to a Helm values file that will be used for the installation of operators' + cand --helm-repo-stable 'Provide a custom Helm stable repository URL' + cand --helm-repo-test 'Provide a custom Helm test repository URL' + cand --helm-repo-dev 'Provide a custom Helm dev repository URL' + cand --chart-source 'Source the charts from either a OCI registry or from index.yaml-based repositories' + cand --listener-class-preset 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' + cand --skip-operators-and-crds 'Skip uninstalling Stackable operators and CRDs' + cand -y 'Assume "yes" as answer to all prompts and run non-interactively' + cand --assume-yes 'Assume "yes" as answer to all prompts and run non-interactively' + cand --yes 'Assume "yes" as answer to all prompts and run non-interactively' cand --no-cache 'Do not cache the remote (default) demo, stack and release files' cand -h 'Print help (see more with ''--help'')' cand --help 'Print help (see more with ''--help'')' @@ -738,6 +813,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available demos' cand describe 'Print out detailed demo information' cand install 'Install a specific demo' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;demo;help;list'= { @@ -746,6 +822,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;demo;help;install'= { } + &'stackablectl;demo;help;uninstall'= { + } &'stackablectl;demo;help;help'= { } &'stackablectl;completions'= { @@ -1119,6 +1197,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available stacks' cand describe 'Describe a specific stack' cand install 'Install a specific stack' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' } &'stackablectl;help;stack;list'= { } @@ -1126,6 +1205,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;help;stack;install'= { } + &'stackablectl;help;stack;uninstall'= { + } &'stackablectl;help;stacklet'= { cand credentials 'Display credentials for a stacklet' cand list 'List deployed stacklets' @@ -1138,6 +1219,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available demos' cand describe 'Print out detailed demo information' cand install 'Install a specific demo' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' } &'stackablectl;help;demo;list'= { } @@ -1145,6 +1227,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;help;demo;install'= { } + &'stackablectl;help;demo;uninstall'= { + } &'stackablectl;help;completions'= { cand bash 'Generate shell completions for Bash' cand elvish 'Generate shell completions for Elvish' diff --git a/extra/completions/stackablectl.fish b/extra/completions/stackablectl.fish index ba0bb555..d213a694 100644 --- a/extra/completions/stackablectl.fish +++ b/extra/completions/stackablectl.fish @@ -306,27 +306,28 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and _ complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall a release' complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and __fish_seen_subcommand_from help" -f -a "upgrade" -d 'Upgrade a release' complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l release -d 'Target a specific Stackable release' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s l -l log-level -d 'Log level this application uses' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' -repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' -stable-nodes\t'' -ephemeral-nodes\t''" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s V -l version -d 'Print version' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "list" -d 'List available stacks' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "describe" -d 'Describe a specific stack' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "install" -d 'Install a specific stack' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "list" -d 'List available stacks' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "describe" -d 'Describe a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "install" -d 'Install a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from list" -s o -l output -r -f -a "plain\t'Print output formatted as plain text' table\t'Print output formatted as a table' json\t'Print output formatted as JSON' @@ -393,12 +394,35 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __f stable-nodes\t'' ephemeral-nodes\t''" complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -l skip-release -d 'Skip the installation of the release during the stack install process' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -s y -l assume-yes -l yes -d 'Assume "yes" as answer to all prompts and run non-interactively' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help (see more with \'--help\')' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l operator-namespace -l operator-ns -d 'Namespace where the operators are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s n -l namespace -l product-ns -d 'Namespace where the stacks or demos are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l skip-operators-and-crds -d 'Skip uninstalling Stackable operators and CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s y -l assume-yes -l yes -d 'Assume "yes" as answer to all prompts and run non-interactively' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s V -l version -d 'Print version' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "list" -d 'List available stacks' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "describe" -d 'Describe a specific stack' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and not __fish_seen_subcommand_from credentials list help" -s l -l log-level -d 'Log level this application uses' -r complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and not __fish_seen_subcommand_from credentials list help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F @@ -461,27 +485,28 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and __fish_seen_subcommand_from help" -f -a "credentials" -d 'Display credentials for a stacklet' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and __fish_seen_subcommand_from help" -f -a "list" -d 'List deployed stacklets' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l release -d 'Target a specific Stackable release' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s l -l log-level -d 'Log level this application uses' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' -repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' -stable-nodes\t'' -ephemeral-nodes\t''" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s V -l version -d 'Print version' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "list" -d 'List available demos' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "describe" -d 'Print out detailed demo information' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "install" -d 'Install a specific demo' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "list" -d 'List available demos' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "describe" -d 'Print out detailed demo information' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "install" -d 'Install a specific demo' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from list" -s o -l output -r -f -a "plain\t'Print output formatted as plain text' table\t'Print output formatted as a table' json\t'Print output formatted as JSON' @@ -548,12 +573,35 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fi stable-nodes\t'' ephemeral-nodes\t''" complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -l skip-release -d 'Skip the installation of the release during the stack install process' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -s y -l assume-yes -l yes -d 'Assume "yes" as answer to all prompts and run non-interactively' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help (see more with \'--help\')' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l operator-namespace -l operator-ns -d 'Namespace where the operators are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s n -l namespace -l product-ns -d 'Namespace where the stacks or demos are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l skip-operators-and-crds -d 'Skip uninstalling Stackable operators and CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s y -l assume-yes -l yes -d 'Assume "yes" as answer to all prompts and run non-interactively' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s V -l version -d 'Print version' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "list" -d 'List available demos' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "describe" -d 'Print out detailed demo information' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install a specific demo' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand completions; and not __fish_seen_subcommand_from bash elvish fish nushell zsh help" -s l -l log-level -d 'Log level this application uses' -r complete -c stackablectl -n "__fish_stackablectl_using_subcommand completions; and not __fish_seen_subcommand_from bash elvish fish nushell zsh help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F @@ -796,11 +844,13 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fi complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "list" -d 'List available stacks' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "describe" -d 'Describe a specific stack' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "install" -d 'Install a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stacklet" -f -a "credentials" -d 'Display credentials for a stacklet' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stacklet" -f -a "list" -d 'List deployed stacklets' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "list" -d 'List available demos' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "describe" -d 'Print out detailed demo information' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "install" -d 'Install a specific demo' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "bash" -d 'Generate shell completions for Bash' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "elvish" -d 'Generate shell completions for Elvish' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "fish" -d 'Generate shell completions for Fish' diff --git a/extra/completions/stackablectl.nu b/extra/completions/stackablectl.nu index ee82490f..901342f9 100644 --- a/extra/completions/stackablectl.nu +++ b/extra/completions/stackablectl.nu @@ -559,6 +559,8 @@ module completions { --operator-ns: string # Namespace where the operators are deployed --namespace(-n): string # Namespace where the stacks or demos are deployed --product-ns: string # Namespace where the stacks or demos are deployed + --assume-yes(-y) # Assume "yes" as answer to all prompts and run non-interactively + --yes # Assume "yes" as answer to all prompts and run non-interactively --release: string # Target a specific Stackable release --log-level(-l): string # Log level this application uses --no-cache # Do not cache the remote (default) demo, stack and release files @@ -573,7 +575,41 @@ module completions { --listener-class-preset: string@"nu-complete stackablectl stack install listener_class_preset" # Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`) --help(-h) # Print help (see more with '--help') --version(-V) # Print version - stack_name: string # Name of the stack to describe + stack_name: string # Name of the stack to install + ] + + def "nu-complete stackablectl stack uninstall chart_source" [] { + [ "oci" "repo" ] + } + + def "nu-complete stackablectl stack uninstall listener_class_preset" [] { + [ "none" "stable-nodes" "ephemeral-nodes" ] + } + + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl stack uninstall" [ + --operator-namespace: string # Namespace where the operators are deployed + --operator-ns: string # Namespace where the operators are deployed + --namespace(-n): string # Namespace where the stacks or demos are deployed + --product-ns: string # Namespace where the stacks or demos are deployed + --skip-operators-and-crds # Skip uninstalling Stackable operators and CRDs + --assume-yes(-y) # Assume "yes" as answer to all prompts and run non-interactively + --yes # Assume "yes" as answer to all prompts and run non-interactively + --release: string # Target a specific Stackable release + --log-level(-l): string # Log level this application uses + --no-cache # Do not cache the remote (default) demo, stack and release files + --demo-file(-d): path # Provide one or more additional (custom) demo file(s) + --stack-file(-s): path # Provide one or more additional (custom) stack file(s) + --release-file(-r): path # Provide one or more additional (custom) release file(s) + --operator-values(-f): path # Path to a Helm values file that will be used for the installation of operators + --helm-repo-stable: string # Provide a custom Helm stable repository URL + --helm-repo-test: string # Provide a custom Helm test repository URL + --helm-repo-dev: string # Provide a custom Helm dev repository URL + --chart-source: string@"nu-complete stackablectl stack uninstall chart_source" # Source the charts from either a OCI registry or from index.yaml-based repositories + --listener-class-preset: string@"nu-complete stackablectl stack uninstall listener_class_preset" # Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`) + --help(-h) # Print help (see more with '--help') + --version(-V) # Print version + stack_name: string # Name of the stack to uninstall ] # Print this message or the help of the given subcommand(s) @@ -592,6 +628,10 @@ module completions { export extern "stackablectl stack help install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl stack help uninstall" [ + ] + # Print this message or the help of the given subcommand(s) export extern "stackablectl stack help help" [ ] @@ -813,6 +853,8 @@ module completions { --operator-ns: string # Namespace where the operators are deployed --namespace(-n): string # Namespace where the stacks or demos are deployed --product-ns: string # Namespace where the stacks or demos are deployed + --assume-yes(-y) # Assume "yes" as answer to all prompts and run non-interactively + --yes # Assume "yes" as answer to all prompts and run non-interactively --release: string # Target a specific Stackable release --log-level(-l): string # Log level this application uses --no-cache # Do not cache the remote (default) demo, stack and release files @@ -830,6 +872,40 @@ module completions { DEMO: string # Demo to install ] + def "nu-complete stackablectl demo uninstall chart_source" [] { + [ "oci" "repo" ] + } + + def "nu-complete stackablectl demo uninstall listener_class_preset" [] { + [ "none" "stable-nodes" "ephemeral-nodes" ] + } + + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl demo uninstall" [ + --operator-namespace: string # Namespace where the operators are deployed + --operator-ns: string # Namespace where the operators are deployed + --namespace(-n): string # Namespace where the stacks or demos are deployed + --product-ns: string # Namespace where the stacks or demos are deployed + --skip-operators-and-crds # Skip uninstalling Stackable operators and CRDs + --assume-yes(-y) # Assume "yes" as answer to all prompts and run non-interactively + --yes # Assume "yes" as answer to all prompts and run non-interactively + --release: string # Target a specific Stackable release + --log-level(-l): string # Log level this application uses + --no-cache # Do not cache the remote (default) demo, stack and release files + --demo-file(-d): path # Provide one or more additional (custom) demo file(s) + --stack-file(-s): path # Provide one or more additional (custom) stack file(s) + --release-file(-r): path # Provide one or more additional (custom) release file(s) + --operator-values(-f): path # Path to a Helm values file that will be used for the installation of operators + --helm-repo-stable: string # Provide a custom Helm stable repository URL + --helm-repo-test: string # Provide a custom Helm test repository URL + --helm-repo-dev: string # Provide a custom Helm dev repository URL + --chart-source: string@"nu-complete stackablectl demo uninstall chart_source" # Source the charts from either a OCI registry or from index.yaml-based repositories + --listener-class-preset: string@"nu-complete stackablectl demo uninstall listener_class_preset" # Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`) + --help(-h) # Print help (see more with '--help') + --version(-V) # Print version + demo_name: string # Demo to uninstall + ] + # Print this message or the help of the given subcommand(s) export extern "stackablectl demo help" [ ] @@ -846,6 +922,10 @@ module completions { export extern "stackablectl demo help install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl demo help uninstall" [ + ] + # Print this message or the help of the given subcommand(s) export extern "stackablectl demo help help" [ ] @@ -1281,6 +1361,10 @@ module completions { export extern "stackablectl help stack install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl help stack uninstall" [ + ] + # Interact with deployed stacklets, which are bundles of resources and containers required to run the product export extern "stackablectl help stacklet" [ ] @@ -1309,6 +1393,10 @@ module completions { export extern "stackablectl help demo install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl help demo uninstall" [ + ] + # Generate shell completions for this tool export extern "stackablectl help completions" [ ] diff --git a/rust/stackable-cockpit/Cargo.toml b/rust/stackable-cockpit/Cargo.toml index f6292a8e..15ec1139 100644 --- a/rust/stackable-cockpit/Cargo.toml +++ b/rust/stackable-cockpit/Cargo.toml @@ -17,6 +17,7 @@ helm-sys = { path = "../helm-sys" } bcrypt.workspace = true clap.workspace = true +either.workspace = true indexmap.workspace = true rand.workspace = true reqwest.workspace = true diff --git a/rust/stackable-cockpit/src/platform/demo/params.rs b/rust/stackable-cockpit/src/platform/demo/params.rs index 3f1486ac..3cadda74 100644 --- a/rust/stackable-cockpit/src/platform/demo/params.rs +++ b/rust/stackable-cockpit/src/platform/demo/params.rs @@ -22,3 +22,13 @@ pub struct DemoInstallParameters { pub chart_source: ChartSourceType, pub operator_values: Mapping, } + +pub struct DemoUninstallParameters { + pub demo_name: String, + + pub operator_namespace: String, + pub demo_namespace: String, + + pub skip_operators: bool, + pub skip_crds: bool, +} diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index bce047dc..e8d7fc72 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -1,5 +1,6 @@ use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt, Snafu}; +use stackable_operator::kvp::{Label, LabelError}; use tracing::{Span, debug, info, instrument, warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -9,13 +10,13 @@ use crate::{ common::manifest::ManifestSpec, platform::{ cluster::{ResourceRequests, ResourceRequestsError}, - demo::DemoInstallParameters, + demo::{DemoInstallParameters, DemoUninstallParameters}, manifests::{self, InstallManifestsExt}, release::ReleaseList, stack::{self, StackInstallParameters, StackList}, }, utils::{ - k8s::Client, + k8s::{self, Client}, params::{ IntoParameters, IntoParametersError, Parameter, RawParameter, RawParameterParseError, }, @@ -47,8 +48,21 @@ pub enum Error { #[snafu(display("failed to install stack"))] InstallStack { source: stack::Error }, + /// This error indicates that the release failed to uninstall. + #[snafu(display("failed to uninstall release"))] + UninstallRelease { source: stack::Error }, + #[snafu(display("failed to install stack manifests"))] InstallManifests { source: manifests::Error }, + + #[snafu(display("failed to uninstall Helm manifests"))] + UninstallHelmManifests { source: manifests::Error }, + + #[snafu(display("failed to delete object"))] + DeleteObject { source: k8s::Error }, + + #[snafu(display("failed to build label"))] + BuildLabel { source: LabelError }, } impl InstallManifestsExt for DemoSpec {} @@ -180,33 +194,128 @@ impl DemoSpec { } #[instrument(skip_all, fields( + demo_name = %uninstall_parameters.demo_name, + demo_namespace = %uninstall_parameters.demo_namespace, stack_name = %self.stack, - operator_namespace = %install_params.operator_namespace, - demo_namespace = %install_params.demo_namespace, + ))] + pub async fn uninstall( + &self, + stack_list: StackList, + release_list: ReleaseList, + uninstall_parameters: DemoUninstallParameters, + client: &Client, + transfer_client: &xfer::Client, + ) -> Result<(), Error> { + // Get the stack spec based on the name defined in the demo spec + let stack = stack_list.get(&self.stack).context(NoSuchStackSnafu { + name: self.stack.clone(), + })?; + + // Uninstall Helm Charts + let parameters = &mut Vec::new() + .into_params(self.parameters.clone()) + .context(ParseParametersSnafu)?; + + // We add the STACK and DEMO parameter, so that demos can use that to render e.g. the demo label + parameters.insert("STACK".to_owned(), self.stack.clone()); + parameters.insert("DEMO".to_owned(), uninstall_parameters.demo_name.clone()); + + Self::uninstall_helm_manifests( + &self.manifests, + parameters, + &uninstall_parameters.demo_namespace.to_owned(), + transfer_client, + ) + .await + .context(UninstallHelmManifestsSnafu)?; + + let stack_parameters = &mut Vec::new() + .into_params(stack.parameters.clone()) + .context(ParseParametersSnafu)?; + + // We add the STACK and DEMO parameter, so that stacks can use that to render e.g. the stack label + stack_parameters.insert("STACK".to_owned(), self.stack.clone()); + stack_parameters.insert("DEMO".to_owned(), uninstall_parameters.demo_name.clone()); + + Self::uninstall_helm_manifests( + &stack.manifests, + stack_parameters, + &uninstall_parameters.demo_namespace.to_owned(), + transfer_client, + ) + .await + .context(UninstallHelmManifestsSnafu)?; + + // Delete demo namespace + client + .delete_namespace(uninstall_parameters.demo_namespace) + .await + .context(DeleteObjectSnafu)?; + + // Delete remaining objects not namespace scoped + client + .delete_all_objects_with_label( + Label::try_from(("stackable.tech/demo", &uninstall_parameters.demo_name)) + .context(BuildLabelSnafu)?, + None, + ) + .await + .context(DeleteObjectSnafu)?; + + // Delete operators and the operator namespace + if !uninstall_parameters.skip_operators { + stack + .uninstall_release(release_list, &uninstall_parameters.operator_namespace) + .await + .context(UninstallReleaseSnafu)?; + + client + .delete_namespace(uninstall_parameters.operator_namespace) + .await + .context(DeleteObjectSnafu)?; + } + + // Delete CRDs + if !uninstall_parameters.skip_crds { + client + .delete_crds_with_group_suffix("stackable.tech") + .await + .context(DeleteObjectSnafu)?; + } + + Ok(()) + } + + #[instrument(skip_all, fields( + stack_name = %self.stack, + operator_namespace = %install_parameters.operator_namespace, + demo_namespace = %install_parameters.demo_namespace, indicatif.pb_show = true ))] async fn prepare_manifests( &self, - install_params: DemoInstallParameters, + install_parameters: DemoInstallParameters, client: &Client, transfer_client: &xfer::Client, ) -> Result<(), Error> { info!("Installing demo manifests"); Span::current().pb_set_message("Installing manifests"); - let params = install_params + let mut parameters = install_parameters .parameters .to_owned() .into_params(&self.parameters) .context(ParseParametersSnafu)?; + // We add the STACK and DEMO parameter, so that demos can use that to render e.g. the demo label + parameters.insert("STACK".to_owned(), install_parameters.stack_name); + parameters.insert("DEMO".to_owned(), install_parameters.demo_name); + Self::install_manifests( &self.manifests, - ¶ms, - &install_params.demo_namespace, - &install_params.stack_name, - Some(&install_params.demo_name), - install_params.labels, + ¶meters, + &install_parameters.demo_namespace, + install_parameters.labels, client, transfer_client, ) diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index 56181dde..6e5dd45d 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -40,7 +40,7 @@ pub enum Error { repo_name: String, }, - /// This error indicates that the Hlm wrapper failed to install the Helm + /// This error indicates that the Helm wrapper failed to install the Helm /// release. #[snafu(display("failed to install Helm release {release_name}"))] InstallHelmRelease { @@ -48,6 +48,14 @@ pub enum Error { source: helm::Error, }, + /// This error indicates that the Helm wrapper failed to uninstall the Helm + /// release. + #[snafu(display("failed to uninstall Helm chart"))] + UninstallHelmRelease { + release_name: String, + source: helm::Error, + }, + /// This error indicates that Helm chart options could not be serialized /// into YAML. #[snafu(display("failed to serialize Helm chart options"))] @@ -65,13 +73,11 @@ pub enum Error { pub trait InstallManifestsExt { // TODO (Techassi): This step shouldn't care about templating the manifests nor fetching them from remote #[instrument(skip_all, fields(%namespace, indicatif.pb_show = true))] - #[allow(clippy::too_many_arguments, async_fn_in_trait)] + #[allow(async_fn_in_trait)] async fn install_manifests( manifests: &[ManifestSpec], parameters: &HashMap, namespace: &str, - stack_name: &str, - demo_name: Option<&str>, labels: Labels, client: &Client, transfer_client: &xfer::Client, @@ -85,31 +91,16 @@ pub trait InstallManifestsExt { // We need some additional templating capabilities, e.g. the namespace, so that stacks/demos // can use that to render e.g. the fqdn service names [which contain the namespace]. parameters.insert("NAMESPACE".to_owned(), namespace.to_owned()); - parameters.insert("STACK".to_owned(), stack_name.into()); - if let Some(demo_name) = demo_name { - parameters.insert("DEMO".to_owned(), demo_name.into()); - } for manifest in manifests { let parameters = parameters.clone(); - let labels = labels.clone(); match manifest { ManifestSpec::HelmChart(helm_file) => { debug!(helm_file, "Installing manifest from Helm chart"); - // Read Helm chart YAML and apply templating - let helm_file = helm_file.into_path_or_url().context(ParsePathOrUrlSnafu { - path_or_url: helm_file.clone(), - })?; - - let helm_chart: helm::Chart = transfer_client - .get( - &helm_file, - &Template::new(¶meters).then(Yaml::default()), - ) - .await - .context(FileTransferSnafu)?; + let helm_chart = + get_helm_chart(helm_file, transfer_client, ¶meters).await?; info!(helm_chart.name, helm_chart.version, "Installing Helm chart",); @@ -168,4 +159,70 @@ pub trait InstallManifestsExt { Ok(()) } + + /// This function only handles uninstalling Helm Charts + /// + /// To delete objects installed through other manifests use [`Client::delete_namespace`] or [`Client::delete_all_objects_with_label`] instead. + #[instrument(skip_all, fields(%namespace, indicatif.pb_show = true))] + #[allow(async_fn_in_trait)] + async fn uninstall_helm_manifests( + manifests: &[ManifestSpec], + parameters: &mut HashMap, + namespace: &str, + transfer_client: &xfer::Client, + ) -> Result<(), Error> { + debug!("Uninstalling Helm manifests"); + Span::current().pb_set_message("Uninstalling Helm charts"); + + // We add the NAMESPACE parameter, so that stacks/demos can use that to render e.g. the + // fqdn service names [which contain the namespace]. + parameters.insert("NAMESPACE".to_owned(), namespace.to_owned()); + + for manifest in manifests { + match manifest { + ManifestSpec::HelmChart(helm_file) => { + debug!(helm_file, "Uninstalling manifest from Helm chart"); + + let helm_chart = get_helm_chart(helm_file, transfer_client, parameters).await?; + + info!( + helm_chart.name, + helm_chart.version, "Uninstalling Helm chart", + ); + + helm::uninstall_release(&helm_chart.release_name, namespace, true).context( + UninstallHelmReleaseSnafu { + release_name: &helm_chart.release_name, + }, + )?; + } + ManifestSpec::PlainYaml(_) => { + // This function only handles uninstalling Helm Charts + } + } + } + + Ok(()) + } +} + +pub async fn get_helm_chart( + helm_file: &str, + transfer_client: &xfer::Client, + parameters: &HashMap, +) -> Result { + // Read Helm chart YAML and apply templating + let helm_file_location = helm_file.into_path_or_url().context(ParsePathOrUrlSnafu { + path_or_url: helm_file, + })?; + + let helmchart = transfer_client + .get( + &helm_file_location, + &Template::new(parameters).then(Yaml::default()), + ) + .await + .context(FileTransferSnafu)?; + + Ok(helmchart) } diff --git a/rust/stackable-cockpit/src/platform/stack/params.rs b/rust/stackable-cockpit/src/platform/stack/params.rs index b3cf9717..5e89ef34 100644 --- a/rust/stackable-cockpit/src/platform/stack/params.rs +++ b/rust/stackable-cockpit/src/platform/stack/params.rs @@ -21,3 +21,17 @@ pub struct StackInstallParameters { pub chart_source: ChartSourceType, pub operator_values: Mapping, } + +pub struct StackUninstallParameters { + pub stack_name: String, + + /// Optional name of the demo, which is only present in case this stack is uninstalled as part of + /// a demo. This is unset in case a stack is uninstalled directly. + pub demo_name: Option, + + pub operator_namespace: String, + pub stack_namespace: String, + + pub skip_operators: bool, + pub skip_crds: bool, +} diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index 58ace389..e70116a7 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -1,6 +1,7 @@ use serde::{Deserialize, Serialize}; use serde_yaml::Mapping; use snafu::{OptionExt, ResultExt, Snafu}; +use stackable_operator::kvp::{Label, LabelError}; use tracing::{Span, debug, info, instrument, log::warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -14,10 +15,10 @@ use crate::{ namespace, operator::ChartSourceType, release, - stack::StackInstallParameters, + stack::{StackInstallParameters, StackUninstallParameters}, }, utils::{ - k8s::Client, + k8s::{self, Client}, params::{ IntoParameters, IntoParametersError, Parameter, RawParameter, RawParameterParseError, }, @@ -45,6 +46,10 @@ pub enum Error { #[snafu(display("failed to install release"))] InstallRelease { source: release::Error }, + /// This error indicates that the release failed to uninstall. + #[snafu(display("failed to uninstall release"))] + UninstallRelease { source: release::Error }, + #[snafu(display("stack resource requests error"), context(false))] StackResourceRequests { source: ResourceRequestsError }, @@ -64,6 +69,15 @@ pub enum Error { #[snafu(display("failed to install stack manifests"))] InstallManifests { source: manifests::Error }, + + #[snafu(display("failed to uninstall Helm manifests"))] + UninstallHelmManifests { source: manifests::Error }, + + #[snafu(display("failed to delete object"))] + DeleteObject { source: k8s::Error }, + + #[snafu(display("failed to build label"))] + BuildLabel { source: LabelError }, } /// This struct describes a stack with the v2 spec @@ -71,7 +85,7 @@ pub enum Error { #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "openapi", derive(ToSchema))] pub struct StackSpec { - /// A short description of the demo + /// A short description of the stack pub description: String, /// The release used by the stack, e.g. 23.4 @@ -150,10 +164,7 @@ impl StackSpec { // TODO (Techassi): Can we get rid of the release list and just use the release spec instead #[instrument(skip_all, fields( stack_name = %install_parameters.stack_name, - // NOTE (@NickLarsenNZ): Option doesn't impl Display, so we need to call - // display for the inner type if it exists. Otherwise we gte the Debug - // impl for the whole Option. - demo_name = install_parameters.demo_name.as_ref().map(tracing::field::display), + stack_namespace = %install_parameters.stack_namespace, ))] pub async fn install( &self, @@ -177,7 +188,6 @@ impl StackSpec { self.install_release( release_list, &install_parameters.operator_namespace, - &install_parameters.stack_namespace, &install_parameters.chart_source, &install_parameters.operator_values, ) @@ -197,12 +207,80 @@ impl StackSpec { .await } + #[instrument(skip_all, fields( + stack_name = %uninstall_parameters.stack_name, + stack_namespace = %uninstall_parameters.stack_namespace, + ))] + pub async fn uninstall( + &self, + release_list: release::ReleaseList, + uninstall_parameters: StackUninstallParameters, + client: &Client, + transfer_client: &xfer::Client, + ) -> Result<(), Error> { + // Uninstall Helm Charts + let parameters = &mut Vec::new() + .into_params(self.parameters.clone()) + .context(ParseParametersSnafu)?; + + // We add the STACK and optionally DEMO parameter, so that stacks can use that to render e.g. the stack label + parameters.insert("STACK".to_owned(), uninstall_parameters.stack_name.clone()); + if let Some(demo_name) = uninstall_parameters.demo_name { + parameters.insert("DEMO".to_owned(), demo_name); + } + + Self::uninstall_helm_manifests( + &self.manifests, + parameters, + &uninstall_parameters.stack_namespace.to_owned(), + transfer_client, + ) + .await + .context(UninstallHelmManifestsSnafu)?; + + // Delete stack namespace + client + .delete_namespace(uninstall_parameters.stack_namespace) + .await + .context(DeleteObjectSnafu)?; + + // Delete remaining objects not namespace scoped + client + .delete_all_objects_with_label( + Label::try_from(("stackable.tech/stack", &uninstall_parameters.stack_name)) + .context(BuildLabelSnafu)?, + None, + ) + .await + .context(DeleteObjectSnafu)?; + + // Delete operators and the operator namespace + if !uninstall_parameters.skip_operators { + self.uninstall_release(release_list, &uninstall_parameters.operator_namespace) + .await?; + + client + .delete_namespace(uninstall_parameters.operator_namespace) + .await + .context(DeleteObjectSnafu)?; + } + + // Delete CRDs + if !uninstall_parameters.skip_crds { + client + .delete_crds_with_group_suffix("stackable.tech") + .await + .context(DeleteObjectSnafu)?; + } + + Ok(()) + } + #[instrument(skip_all, fields(release = %self.release, %operator_namespace, indicatif.pb_show = true))] pub async fn install_release( &self, release_list: release::ReleaseList, operator_namespace: &str, - _namespace: &str, // TODO (@NickLarsenNZ): remove this field chart_source: &ChartSourceType, operator_values: &Mapping, ) -> Result<(), Error> { @@ -229,29 +307,55 @@ impl StackSpec { .context(InstallReleaseSnafu) } + #[instrument(skip_all, fields(release = %self.release, %operator_namespace, indicatif.pb_show = true))] + pub async fn uninstall_release( + &self, + release_list: release::ReleaseList, + operator_namespace: &str, + ) -> Result<(), Error> { + info!(self.release, "Trying to uninstall release"); + Span::current().pb_set_message("Uninstalling operators"); + + // Get the release by name + let release = release_list + .get(&self.release) + .context(NoSuchReleaseSnafu { + name: self.release.clone(), + })?; + + // Uninstall the release + release + .uninstall(&self.operators, &[], operator_namespace) + .context(UninstallReleaseSnafu) + } + #[instrument(skip_all, fields(indicatif.pb_show = true))] pub async fn prepare_manifests( &self, - install_params: StackInstallParameters, + install_parameters: StackInstallParameters, client: &Client, transfer_client: &xfer::Client, ) -> Result<(), Error> { info!("Installing stack manifests"); Span::current().pb_set_message("Installing manifests"); - let parameters = install_params + let mut parameters = install_parameters .parameters .to_owned() .into_params(&self.parameters) .context(ParseParametersSnafu)?; + // We add the STACK and optionally DEMO parameter, so that stacks can use that to render e.g. the stack label + parameters.insert("STACK".to_owned(), install_parameters.stack_name); + if let Some(demo_name) = install_parameters.demo_name { + parameters.insert("DEMO".to_owned(), demo_name); + } + Self::install_manifests( &self.manifests, ¶meters, - &install_params.stack_namespace, - &install_params.stack_name, - install_params.demo_name.as_deref(), - install_params.labels, + &install_parameters.stack_namespace, + install_parameters.labels, client, transfer_client, ) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 6fb44d6f..afc0b085 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -1,20 +1,24 @@ -use std::{collections::BTreeMap, string::FromUtf8Error}; +use std::{collections::BTreeMap, ops::Deref, string::FromUtf8Error}; use serde::Deserialize; use snafu::{OptionExt, ResultExt, Snafu}; use stackable_operator::{ crd::listener::v1alpha1::Listener, - k8s_openapi::api::{ - apps::v1::{Deployment, StatefulSet}, - core::v1::{Endpoints, Namespace, Node, Secret, Service}, + k8s_openapi::{ + Resource, + api::{ + apps::v1::{Deployment, StatefulSet}, + core::v1::{Endpoints, Namespace, Node, Secret, Service}, + }, + apiextensions_apiserver::pkg::apis::apiextensions::v1::CustomResourceDefinition, }, kube::{ self, Api, Discovery, ResourceExt, - api::{ListParams, Patch, PatchParams, PostParams}, + api::{DeleteParams, ListParams, Patch, PatchParams, PostParams}, core::{DynamicObject, GroupVersionKind, ObjectList, ObjectMeta, TypeMeta}, - discovery::{ApiCapabilities, ApiResource, Scope}, + discovery::{self, ApiCapabilities, ApiResource, Scope}, }, - kvp::Labels, + kvp::{Label, Labels}, }; use tokio::sync::RwLock; use tracing::{Span, info, instrument}; @@ -47,6 +51,11 @@ pub enum Error { gvk: GroupVersionKind, }, + #[snafu(display("failed to delete object"))] + KubeRuntimeDelete { + source: kube::runtime::wait::delete::Error, + }, + #[snafu(display("failed to deserialize YAML data"))] DeserializeYaml { source: serde_yaml::Error }, @@ -237,6 +246,31 @@ impl Client { Ok(()) } + /// Deletes CRDs for the given group suffix + pub async fn delete_crds_with_group_suffix(&self, group_suffix: &str) -> Result<()> { + let api_client = Api::::all(self.client.clone()); + + for crd in api_client + .list(&ListParams::default()) + .await + .context(KubeClientFetchSnafu)? + { + if crd.spec.group.ends_with(group_suffix) { + if let Some(name) = crd.metadata.name { + kube::runtime::wait::delete::delete_and_finalize( + api_client.clone(), + &name, + &DeleteParams::default(), + ) + .await + .context(KubeRuntimeDeleteSnafu)?; + } + } + } + + Ok(()) + } + /// Lists objects by looking up a GVK via the discovery. It returns an /// optional list of dynamic objects. The method returns `Ok(None)` /// if the client was unable to resolve the GVK. An error is returned @@ -287,6 +321,89 @@ impl Client { )) } + /// Deletes all objects with a given label in the provided namespace. + /// If no namespace is provided, deletes all clusterwide objects with the given label. + pub async fn delete_all_objects_with_label( + &self, + label: Label, + namespace: Option<&str>, + ) -> Result<(), Error> { + let api_resources = self + .get_api_resources() + .await + .into_iter() + .filter(|(_, capability)| { + let listing_supported = capability.supports_operation(discovery::verbs::LIST); + + let capability_scope_matches = match namespace { + Some(_) => capability.scope == kube::discovery::Scope::Namespaced, + None => capability.scope == kube::discovery::Scope::Cluster, + }; + + listing_supported && capability_scope_matches + }); + + for (api_resource, _) in api_resources { + let objects = self + .list_objects( + &GroupVersionKind { + group: api_resource.group.clone(), + version: api_resource.version.clone(), + kind: api_resource.kind.clone(), + }, + namespace, + ) + .await?; + + let Some(object_list) = objects else { + continue; + }; + + for object in object_list { + if let Some(value) = object.labels().get(label.key().deref()) { + if value.eq(label.value().deref()) { + self.delete_object( + &object.metadata.name.unwrap(), + &api_resource, + object.metadata.namespace.as_deref(), + ) + .await?; + } + } + } + } + + Ok(()) + } + + #[instrument(skip_all, fields(indicatif.pb_show = true))] + pub async fn delete_object( + &self, + object_name: &str, + api_resource: &ApiResource, + namespace: Option<&str>, + ) -> Result<(), Error> { + Span::current().pb_set_message(&format!( + "Deleting {kind} {object_name}", + kind = api_resource.kind + )); + + let object_api = match namespace { + Some(namespace) => { + Api::::namespaced_with(self.client.clone(), namespace, api_resource) + } + None => Api::::all_with(self.client.clone(), api_resource), + }; + + kube::runtime::wait::delete::delete_and_finalize( + object_api, + object_name, + &DeleteParams::foreground(), + ) + .await + .context(KubeRuntimeDeleteSnafu) + } + /// Lists [`Service`]s by matching labels. The Services can be matched by /// the product labels. [`ListParamsExt`] provides a utility function to /// create [`ListParams`] based on a product name and optional instance @@ -459,6 +576,24 @@ impl Client { Ok(()) } + /// Deletes a [`Namespace`] with `name` in the cluster. + #[instrument(skip_all, fields(indicatif.pb_show = true))] + pub async fn delete_namespace(&self, name: String) -> Result<()> { + let namespace_api: Api = Api::all(self.client.clone()); + + Span::current().pb_set_message(&format!("Deleting {kind} {name}", kind = Namespace::KIND)); + + kube::runtime::wait::delete::delete_and_finalize( + namespace_api, + &name, + &DeleteParams::foreground(), + ) + .await + .context(KubeRuntimeDeleteSnafu)?; + + Ok(()) + } + /// Creates a [`Namespace`] only if not already present in the current cluster. pub async fn create_namespace_if_needed(&self, name: String) -> Result<()> { if self.get_namespace(&name).await?.is_none() { @@ -482,6 +617,16 @@ impl Client { endpoints_api.get(name).await.context(KubeClientFetchSnafu) } + pub async fn get_api_resources(&self) -> Vec<(ApiResource, ApiCapabilities)> { + let mut api_resources = Vec::new(); + + for group in self.discovery.read().await.groups() { + api_resources.append(group.recommended_resources().as_mut()); + } + + api_resources + } + /// Try to resolve the given [`GroupVersionKind`]. In case the resolution fails a discovery is run to pull in new /// GVKs that are not present in the [`Discovery`] cache. Afterwards a normal resolution is issued. async fn resolve_gvk( diff --git a/rust/stackablectl/CHANGELOG.md b/rust/stackablectl/CHANGELOG.md index 945cb5cf..bc493c58 100644 --- a/rust/stackablectl/CHANGELOG.md +++ b/rust/stackablectl/CHANGELOG.md @@ -7,7 +7,11 @@ All notable changes to this project will be documented in this file. ### Added - Heuristic for setting listener presets when the environment is Minikube ([#438]). +- Add `uninstall` subcommand for `demo`/`stack` commands ([#429]). +- Add confirmation prompt to `install` subcommand for namespace selection ([#429]). +- Add `--assume-yes` option for running commands non-interactively ([#429]). +[#429]: https://github.com/stackabletech/stackable-cockpit/pull/429 [#438]: https://github.com/stackabletech/stackable-cockpit/pull/438 ## [1.4.0] - 2026-03-18 diff --git a/rust/stackablectl/Cargo.toml b/rust/stackablectl/Cargo.toml index 83388405..15db1c9d 100644 --- a/rust/stackablectl/Cargo.toml +++ b/rust/stackablectl/Cargo.toml @@ -17,6 +17,7 @@ clap_complete.workspace = true clap_complete_nushell.workspace = true clap.workspace = true comfy-table.workspace = true +dialoguer.workspace = true directories.workspace = true dotenvy.workspace = true indexmap.workspace = true diff --git a/rust/stackablectl/src/args/mod.rs b/rust/stackablectl/src/args/mod.rs index cb31577f..0f53377c 100644 --- a/rust/stackablectl/src/args/mod.rs +++ b/rust/stackablectl/src/args/mod.rs @@ -2,10 +2,12 @@ mod cluster; mod file; mod namespace; mod operator_configs; +mod prompt; mod repo; pub use cluster::*; pub use file::*; pub use namespace::*; pub use operator_configs::*; +pub use prompt::*; pub use repo::*; diff --git a/rust/stackablectl/src/args/prompt.rs b/rust/stackablectl/src/args/prompt.rs new file mode 100644 index 00000000..a76b8355 --- /dev/null +++ b/rust/stackablectl/src/args/prompt.rs @@ -0,0 +1,9 @@ +use clap::Args; + +#[derive(Debug, Args)] +#[command(next_help_heading = "Prompt options")] +pub struct CommonPromptArgs { + /// Assume "yes" as answer to all prompts and run non-interactively + #[arg(long, visible_aliases(["yes"]), short = 'y', global = true)] + pub assume_yes: bool, +} diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index 4980ff30..d01cf01b 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -5,12 +5,13 @@ use comfy_table::{ ContentArrangement, Row, Table, presets::{NOTHING, UTF8_FULL}, }; +use dialoguer::Confirm; use snafu::{OptionExt as _, ResultExt, Snafu, ensure}; use stackable_cockpit::{ common::list, constants::{DEFAULT_NAMESPACE, DEFAULT_OPERATOR_NAMESPACE}, platform::{ - demo::{self, DemoInstallParameters}, + demo::{self, DemoInstallParameters, DemoUninstallParameters}, operator::ChartSourceType, release, stack, }, @@ -22,10 +23,10 @@ use stackable_cockpit::{ }; use stackable_operator::kvp::{LabelError, Labels}; use tracing::{Span, debug, info, instrument}; -use tracing_indicatif::span_ext::IndicatifSpanExt as _; +use tracing_indicatif::{self, span_ext::IndicatifSpanExt as _}; use crate::{ - args::{CommonClusterArgs, CommonClusterArgsError, CommonNamespaceArgs}, + args::{CommonClusterArgs, CommonClusterArgsError, CommonNamespaceArgs, CommonPromptArgs}, cli::{Cli, OutputType}, utils::load_operator_values, }; @@ -53,6 +54,11 @@ pub enum DemoCommands { /// Install a specific demo #[command(aliases(["i", "in"]))] Install(DemoInstallArgs), + + /// Uninstall a specific stack. Caution: This will delete the provided stack namespace, + /// the operators and provided operator namespace, and all Stackable CRDs + #[command(aliases(["u", "un"]))] + Uninstall(DemoUninstallArgs), } #[derive(Debug, Args)] @@ -115,10 +121,26 @@ to specify operator versions." #[command(flatten)] namespaces: CommonNamespaceArgs, + + #[command(flatten)] + prompt_args: CommonPromptArgs, } #[derive(Debug, Args)] -pub struct DemoUninstallArgs {} +pub struct DemoUninstallArgs { + /// Demo to uninstall + demo_name: String, + + #[command(flatten)] + namespaces: CommonNamespaceArgs, + + /// Skip uninstalling Stackable operators and CRDs + #[arg(long)] + skip_operators_and_crds: bool, + + #[command(flatten)] + prompt_args: CommonPromptArgs, +} #[derive(Debug, Snafu)] pub enum CmdError { @@ -131,9 +153,6 @@ pub enum CmdError { #[snafu(display("no demo with name {name:?}"))] NoSuchDemo { name: String }, - #[snafu(display("no stack with name {name:?}"))] - NoSuchStack { name: String }, - #[snafu(display("no release {release:?}"))] NoSuchRelease { release: String }, @@ -155,6 +174,15 @@ pub enum CmdError { demo_name: String, }, + #[snafu(display("failed to confirm user input"))] + ConfirmDialog { source: dialoguer::Error }, + + #[snafu(display("failed to uninstall demo {demo_name:?}"))] + UninstallDemo { + source: demo::Error, + demo_name: String, + }, + #[snafu(display("failed to build labels for demo resources"))] BuildLabels { source: LabelError }, @@ -214,6 +242,9 @@ impl DemoArgs { DemoCommands::Install(args) => { install_cmd(args, cli, list, &transfer_client, &release_branch).await } + DemoCommands::Uninstall(args) => { + uninstall_cmd(args, cli, list, &transfer_client, &release_branch).await + } } } } @@ -338,7 +369,10 @@ async fn install_cmd( release_branch: &str, ) -> Result { info!(demo_name = %args.demo_name, "Installing demo"); - Span::current().pb_set_message("Installing demo"); + Span::current().pb_set_message(&format!( + "Installing demo {demo_name}", + demo_name = args.demo_name + )); // Init result output and progress output let mut output = Cli::result(); @@ -382,6 +416,37 @@ async fn install_cmd( .parse_insert(("stackable.tech/stack", &demo.stack)) .context(BuildLabelsSnafu)?; + // `stackablectl demo uninstall` relies on namespace deletion, suggest installing in a non-default namespace + // It should still be possible to skip that if either uninstall is not needed + // or installing an older version of the demo which only supports the 'default' namespace + let non_default_namespace_confirmation = || -> Result { + // Ask to install in a non-default namespace, currently suggesting the demo name as namespace name + Confirm::new() + .with_prompt( + format!( + "Demos installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the demo in the {demo_namespace:?} namespace instead?", + demo_namespace = args.demo_name.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + }; + + let demo_namespace = if args.namespaces.namespace == DEFAULT_NAMESPACE { + if args.prompt_args.assume_yes + || tracing_indicatif::suspend_tracing_indicatif(non_default_namespace_confirmation)? + { + // User selected to install in suggested namespace + args.demo_name.clone() + } else { + // User selected to install in default namespace + args.namespaces.namespace.clone() + } + } else { + // User provided a non-default namespace with command argument + args.namespaces.namespace.clone() + }; + let values_file = cli.get_values_file().context(PathOrUrlParseSnafu)?; let operator_values = load_operator_values(values_file.as_ref(), transfer_client) .await @@ -391,7 +456,7 @@ async fn install_cmd( stack_name: demo.stack.clone(), demo_name: args.demo_name.clone(), operator_namespace: args.namespaces.operator_namespace.clone(), - demo_namespace: args.namespaces.namespace.clone(), + demo_namespace: demo_namespace.clone(), stack_parameters: args.stack_parameters.clone(), parameters: args.parameters.clone(), skip_release: args.skip_release, @@ -427,11 +492,8 @@ async fn install_cmd( let stacklet_cmd = format!( "stackablectl stacklet list{option}", - option = if args.namespaces.namespace != DEFAULT_NAMESPACE { - format!( - " --namespace {namespace}", - namespace = args.namespaces.namespace - ) + option = if demo_namespace != DEFAULT_NAMESPACE { + format!(" --namespace {namespace}", namespace = demo_namespace) } else { "".into() } @@ -447,3 +509,93 @@ async fn install_cmd( Ok(output.render()) } + +#[instrument(skip_all, fields( + demo_name = %args.demo_name, + %release_branch, + indicatif.pb_show = true +))] +async fn uninstall_cmd( + args: &DemoUninstallArgs, + cli: &Cli, + list: demo::List, + transfer_client: &xfer::Client, + release_branch: &str, +) -> Result { + // Init result output and progress output + let mut output = Cli::result(); + + let proceed_with_uninstall = args.prompt_args.assume_yes + || { + tracing_indicatif::suspend_tracing_indicatif(|| -> Result { + Confirm::new() + .with_prompt( + format!( + "Uninstalling the demo {demo_name:?} will delete the {demo_namespace:?} namespace. This action cannot be undone. Proceed?", + demo_name = args.demo_name.clone(), + demo_namespace = args.namespaces.namespace.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + })? + }; + + if !proceed_with_uninstall { + output.with_output(format!( + "Uninstalling demo {demo_name:?} canceled", + demo_name = args.demo_name.clone() + )); + + return Ok(output.render()); + } + + info!(demo_name = %args.demo_name, "Uninstalling demo"); + Span::current().pb_set_message(&format!( + "Uninstalling demo {demo_name}", + demo_name = args.demo_name + )); + + let demo = list.get(&args.demo_name).ok_or(CmdError::NoSuchDemo { + name: args.demo_name.clone(), + })?; + + let stack_files = cli + .get_stack_files(release_branch) + .context(PathOrUrlParseSnafu)?; + let stack_list = stack::StackList::build(&stack_files, transfer_client) + .await + .context(BuildListSnafu)?; + + let client = Client::new().await.context(KubeClientCreateSnafu)?; + + let release_files = cli.get_release_files().context(PathOrUrlParseSnafu)?; + let release_list = release::ReleaseList::build(&release_files, transfer_client) + .await + .context(BuildListSnafu)?; + + demo.uninstall( + stack_list, + release_list, + DemoUninstallParameters { + demo_name: args.demo_name.clone(), + operator_namespace: args.namespaces.operator_namespace.clone(), + demo_namespace: args.namespaces.namespace.clone(), + skip_operators: args.skip_operators_and_crds, + skip_crds: args.skip_operators_and_crds, + }, + &client, + transfer_client, + ) + .await + .context(UninstallDemoSnafu { + demo_name: args.demo_name.clone(), + })?; + + output.with_output(format!( + "Uninstalled demo {demo_name:?}", + demo_name = args.demo_name + )); + + Ok(output.render()) +} diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 490d74e0..11b7452a 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -5,6 +5,7 @@ use comfy_table::{ ContentArrangement, Table, presets::{NOTHING, UTF8_FULL}, }; +use dialoguer::Confirm; use snafu::{OptionExt as _, ResultExt, Snafu, ensure}; use stackable_cockpit::{ common::list, @@ -12,7 +13,7 @@ use stackable_cockpit::{ platform::{ operator::ChartSourceType, release, - stack::{self, StackInstallParameters}, + stack::{self, StackInstallParameters, StackUninstallParameters}, }, utils::{ k8s::{self, Client}, @@ -25,7 +26,7 @@ use tracing::{Span, debug, info, instrument}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; use crate::{ - args::{CommonClusterArgs, CommonClusterArgsError, CommonNamespaceArgs}, + args::{CommonClusterArgs, CommonClusterArgsError, CommonNamespaceArgs, CommonPromptArgs}, cli::{Cli, OutputType}, utils::load_operator_values, }; @@ -53,6 +54,11 @@ pub enum StackCommands { /// Install a specific stack #[command(aliases(["i", "in"]))] Install(StackInstallArgs), + + /// Uninstall a specific stack. Caution: This will delete the provided stack namespace, + /// the operators and provided operator namespace, and all Stackable CRDs + #[command(aliases(["u", "un"]))] + Uninstall(StackUninstallArgs), } #[derive(Debug, Args)] @@ -72,7 +78,7 @@ pub struct StackDescribeArgs { #[derive(Debug, Args)] pub struct StackInstallArgs { - /// Name of the stack to describe + /// Name of the stack to install stack_name: String, /// Skip the installation of the release during the stack install process @@ -111,6 +117,25 @@ Use \"stackablectl stack describe \" to list available parameters for eac #[command(flatten)] namespaces: CommonNamespaceArgs, + + #[command(flatten)] + prompt_args: CommonPromptArgs, +} + +#[derive(Debug, Args)] +pub struct StackUninstallArgs { + /// Name of the stack to uninstall + stack_name: String, + + #[command(flatten)] + namespaces: CommonNamespaceArgs, + + /// Skip uninstalling Stackable operators and CRDs + #[arg(long)] + skip_operators_and_crds: bool, + + #[command(flatten)] + prompt_args: CommonPromptArgs, } #[derive(Debug, Snafu)] @@ -143,6 +168,16 @@ pub enum CmdError { stack_name: String, }, + #[snafu(display("failed to confirm user input"))] + ConfirmDialog { source: dialoguer::Error }, + + #[snafu(display("failed to uninstall stack {stack_name:?}"))] + UninstallStack { + #[snafu(source(from(stack::Error, Box::new)))] + source: Box, + stack_name: String, + }, + #[snafu(display("failed to build labels for stack resources"))] BuildLabels { source: LabelError }, @@ -201,6 +236,9 @@ impl StackArgs { StackCommands::Install(args) => { install_cmd(args, cli, stack_list, &transfer_client).await } + StackCommands::Uninstall(args) => { + uninstall_cmd(args, cli, stack_list, &transfer_client).await + } } } } @@ -325,7 +363,10 @@ async fn install_cmd( transfer_client: &xfer::Client, ) -> Result { info!(stack_name = %args.stack_name, "Installing stack"); - Span::current().pb_set_message("Installing stack"); + Span::current().pb_set_message(&format!( + "Installing stack {stack_name}", + stack_name = args.stack_name + )); let files = cli.get_release_files().context(PathOrUrlParseSnafu)?; let release_list = release::ReleaseList::build(&files, transfer_client) @@ -353,6 +394,39 @@ async fn install_cmd( ]) .context(BuildLabelsSnafu)?; + // `stackablectl stack uninstall` relies on namespace deletion, suggest installing in a non-default namespace + // It should still be possible to skip that if either uninstall is not needed + // or installing an older version of the stack which only supports the 'default' namespace + let non_default_namespace_confirmation = || -> Result { + // Ask to install in a non-default namespace, currently suggesting the stack name as namespace name + Confirm::new() + .with_prompt( + format!( + "Stacks installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the stack in the {stack_namespace:?} namespace instead?", + stack_namespace = args.stack_name.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + }; + + let stack_namespace = if args.namespaces.namespace == DEFAULT_NAMESPACE { + if args.prompt_args.assume_yes + || tracing_indicatif::suspend_tracing_indicatif( + non_default_namespace_confirmation, + )? + { + // User selected to install in suggested namespace + args.stack_name.clone() + } else { + // User selected to install in default namespace + args.namespaces.namespace.clone() + } + } else { + // User provided a non-default namespace with command argument + args.namespaces.namespace.clone() + }; + let values_file = cli.get_values_file().context(PathOrUrlParseSnafu)?; let operator_values = load_operator_values(values_file.as_ref(), transfer_client) .await @@ -363,7 +437,7 @@ async fn install_cmd( // There is no demo when installing only a stack demo_name: None, operator_namespace: args.namespaces.operator_namespace.clone(), - stack_namespace: args.namespaces.namespace.clone(), + stack_namespace: stack_namespace.clone(), parameters: args.parameters.clone(), skip_release: args.skip_release, labels, @@ -392,11 +466,8 @@ async fn install_cmd( let stacklet_cmd = format!( "stackablectl stacklet list{option}", - option = if args.namespaces.namespace != DEFAULT_NAMESPACE { - format!( - " --namespace {namespace}", - namespace = args.namespaces.namespace - ) + option = if stack_namespace != DEFAULT_NAMESPACE { + format!(" --namespace {namespace}", namespace = stack_namespace) } else { "".into() } @@ -415,3 +486,81 @@ async fn install_cmd( None => Ok("No such stack".into()), } } + +#[instrument(skip(cli, stack_list, transfer_client), fields(indicatif.pb_show = true))] +async fn uninstall_cmd( + args: &StackUninstallArgs, + cli: &Cli, + stack_list: stack::StackList, + transfer_client: &xfer::Client, +) -> Result { + let mut output = Cli::result(); + + let proceed_with_uninstall = args.prompt_args.assume_yes + || tracing_indicatif::suspend_tracing_indicatif(|| -> Result { + Confirm::new() + .with_prompt( + format!( + "Uninstalling the stack {stack_name:?} will delete the {stack_namespace:?} namespace. This action cannot be undone. Proceed?", + stack_name = args.stack_name.clone(), + stack_namespace = args.namespaces.namespace.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + })?; + + if !proceed_with_uninstall { + output.with_output(format!( + "Uninstalling stack {stack_name:?} canceled", + stack_name = args.stack_name.clone() + )); + + return Ok(output.render()); + } + + info!(stack_name = %args.stack_name, "Uninstalling stack"); + Span::current().pb_set_message(&format!( + "Uninstalling stack {stack_name}", + stack_name = args.stack_name + )); + + match stack_list.get(&args.stack_name) { + Some(stack) => { + let client = Client::new().await.context(KubeClientCreateSnafu)?; + + let files = cli.get_release_files().context(PathOrUrlParseSnafu)?; + let release_list = release::ReleaseList::build(&files, transfer_client) + .await + .context(BuildListSnafu)?; + + stack + .uninstall( + release_list, + StackUninstallParameters { + stack_name: args.stack_name.clone(), + // There is no demo when uninstalling only a stack + demo_name: None, + operator_namespace: args.namespaces.operator_namespace.clone(), + stack_namespace: args.namespaces.namespace.clone(), + skip_operators: args.skip_operators_and_crds, + skip_crds: args.skip_operators_and_crds, + }, + &client, + transfer_client, + ) + .await + .context(UninstallStackSnafu { + stack_name: args.stack_name.clone(), + })?; + + output.with_output(format!( + "Uninstalled stack {stack_name:?}", + stack_name = args.stack_name + )); + + Ok(output.render()) + } + None => Ok("No such stack".into()), + } +} From 9d3b6b0786bd425a78c3ad7b8df743c52c2b86c2 Mon Sep 17 00:00:00 2001 From: Benedikt Labrenz Date: Tue, 21 Apr 2026 15:27:43 +0200 Subject: [PATCH 09/12] chore: Remove old frontend and all references (#439) * remove old frontend and all references * fix CI checks --- .dockerignore | 5 - .gitattributes | 2 - .github/workflows/pr_cockpit-web.yml | 52 - .github/workflows/pr_general.yml | 16 - .github/workflows/pr_pre-commit.yml | 5 - .gitignore | 5 - .pre-commit-config.yaml | 10 +- .prettierignore | 1 - Cargo.lock | 67 +- Cargo.nix | 166 +- Cargo.toml | 2 +- README.md | 21 +- Tiltfile | 2 - default.nix | 29 +- docker/Dockerfile | 13 +- nix/sources.json | 12 - package.json | 7 - rust/stackable-cockpitd/Cargo.toml | 8 +- rust/stackable-cockpitd/README.md | 3 - rust/stackable-cockpitd/src/cli.rs | 3 +- rust/stackable-cockpitd/src/handlers/mod.rs | 6 - rust/stackable-cockpitd/src/handlers/ui.rs | 31 - .../src/handlers/ui_disabled.rs | 9 - rust/stackable-cockpitd/src/main.rs | 5 +- rust/xtask/Cargo.toml | 1 - rust/xtask/src/main.rs | 13 +- rust/xtask/src/openapi.rs | 46 - shell.nix | 3 - web/.editorconfig | 2 - web/.eslintignore | 2 - web/.eslintrc | 41 - web/.gitignore | 27 - web/.prettierignore | 3 - web/.prettierrc.json | 5 - web/Cargo.toml | 11 - web/README.md | 15 - web/build.rs | 54 - web/index.html | 13 - web/package.json | 61 - web/public/.gitkeep | 0 web/public/fonts/Inter-Bold.woff2 | Bin 106140 -> 0 bytes web/public/fonts/Inter-Medium.woff2 | Bin 105924 -> 0 bytes web/public/fonts/Inter-Regular.woff2 | Bin 98868 -> 0 bytes web/src/api/listeners.ts | 70 - web/src/api/meta.ts | 4 - web/src/api/mock-utils.ts | 3 - web/src/api/schema.d.ts | 234 - web/src/api/session.ts | 55 - web/src/api/stacklets.ts | 47 - web/src/components/button.tsx | 49 - web/src/components/datatable.tsx | 117 - web/src/components/form/search.tsx | 21 - web/src/components/header.tsx | 70 - web/src/components/language.tsx | 23 - web/src/components/loading.tsx | 9 - web/src/components/symbols.tsx | 14 - web/src/components/title.tsx | 31 - web/src/fonts.css | 23 - web/src/lib.rs | 2 - web/src/localization/README.md | 9 - web/src/localization/index.tsx | 106 - web/src/localization/locale/de.ftl | 18 - web/src/localization/locale/en.ftl | 18 - web/src/localization/locale/sv.ftl | 18 - web/src/main.tsx | 51 - web/src/pages/login.tsx | 98 - web/src/pages/stacklets/connect.tsx | 71 - web/src/pages/stacklets/list.module.css | 6 - web/src/pages/stacklets/list.tsx | 109 - web/src/resources/logo.png | Bin 6125 -> 0 bytes web/src/types/index.ts | 3 - web/src/types/option.ts | 412 -- web/src/types/result.ts | 330 -- web/src/types/utils.ts | 3 - web/src/utils/localstorage.ts | 25 - web/src/vite-env.d.ts | 1 - web/tests/option.test.ts | 241 - web/tests/result.test.ts | 126 - web/tsconfig.json | 23 - web/uno.config.ts | 15 - web/vite.config.ts | 18 - web/vitest.config.ts | 11 - yarn.lock | 3931 ----------------- 83 files changed, 36 insertions(+), 7156 deletions(-) delete mode 100644 .github/workflows/pr_cockpit-web.yml delete mode 100644 .prettierignore delete mode 100644 package.json delete mode 100644 rust/stackable-cockpitd/src/handlers/ui.rs delete mode 100644 rust/stackable-cockpitd/src/handlers/ui_disabled.rs delete mode 100644 rust/xtask/src/openapi.rs delete mode 100644 web/.editorconfig delete mode 100644 web/.eslintignore delete mode 100644 web/.eslintrc delete mode 100644 web/.gitignore delete mode 100644 web/.prettierignore delete mode 100644 web/.prettierrc.json delete mode 100644 web/Cargo.toml delete mode 100644 web/README.md delete mode 100644 web/build.rs delete mode 100644 web/index.html delete mode 100644 web/package.json delete mode 100644 web/public/.gitkeep delete mode 100644 web/public/fonts/Inter-Bold.woff2 delete mode 100644 web/public/fonts/Inter-Medium.woff2 delete mode 100644 web/public/fonts/Inter-Regular.woff2 delete mode 100644 web/src/api/listeners.ts delete mode 100644 web/src/api/meta.ts delete mode 100644 web/src/api/mock-utils.ts delete mode 100644 web/src/api/schema.d.ts delete mode 100644 web/src/api/session.ts delete mode 100644 web/src/api/stacklets.ts delete mode 100644 web/src/components/button.tsx delete mode 100644 web/src/components/datatable.tsx delete mode 100644 web/src/components/form/search.tsx delete mode 100644 web/src/components/header.tsx delete mode 100644 web/src/components/language.tsx delete mode 100644 web/src/components/loading.tsx delete mode 100644 web/src/components/symbols.tsx delete mode 100644 web/src/components/title.tsx delete mode 100644 web/src/fonts.css delete mode 100644 web/src/lib.rs delete mode 100644 web/src/localization/README.md delete mode 100644 web/src/localization/index.tsx delete mode 100644 web/src/localization/locale/de.ftl delete mode 100644 web/src/localization/locale/en.ftl delete mode 100644 web/src/localization/locale/sv.ftl delete mode 100644 web/src/main.tsx delete mode 100644 web/src/pages/login.tsx delete mode 100644 web/src/pages/stacklets/connect.tsx delete mode 100644 web/src/pages/stacklets/list.module.css delete mode 100644 web/src/pages/stacklets/list.tsx delete mode 100644 web/src/resources/logo.png delete mode 100644 web/src/types/index.ts delete mode 100644 web/src/types/option.ts delete mode 100644 web/src/types/result.ts delete mode 100644 web/src/types/utils.ts delete mode 100644 web/src/utils/localstorage.ts delete mode 100644 web/src/vite-env.d.ts delete mode 100644 web/tests/option.test.ts delete mode 100644 web/tests/result.test.ts delete mode 100644 web/tsconfig.json delete mode 100644 web/uno.config.ts delete mode 100644 web/vite.config.ts delete mode 100644 web/vitest.config.ts delete mode 100644 yarn.lock diff --git a/.dockerignore b/.dockerignore index 5f53f952..7fd788f8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,10 +10,5 @@ crate-hashes.json result image.tar -node_modules -.pnp -.pnp.* -.yarn - # We do NOT want to ignore .git because we use the `built` crate to gather the current git commit hash at built time # This means we need the .git directory in our Docker image, it will be thrown away and won't be included in the final image diff --git a/.gitattributes b/.gitattributes index 74bc5051..b29b6b3f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,9 +1,7 @@ -web/src/api/schema.d.ts linguist-generated extra/completions/* linguist-generated crate-hashes.json linguist-generated extra/man/* linguist-generated Cargo.nix linguist-generated -yarn.lock linguist-generated nix/** linguist-generated go.sum linguist-generated gomod2nix.toml linguist-generated diff --git a/.github/workflows/pr_cockpit-web.yml b/.github/workflows/pr_cockpit-web.yml deleted file mode 100644 index 17926267..00000000 --- a/.github/workflows/pr_cockpit-web.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -name: web -on: - pull_request: - paths: - - ".github/workflows/pr_cockpit-web.yml" - - "package.json" - - "yarn.lock" - - "web/**" - -jobs: - build-web: - name: Web frontend built - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - - run: yarn --cwd web run build - - eslint: - name: Run web linting via ESLint - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - - run: yarn --cwd web run lint - - prettier: - name: Validate web formatting - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - - run: yarn --cwd web run format --check - - name: Git Diff showed uncommitted changes - if: ${{ failure() }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - with: - script: | - core.setFailed('web/ contains unformatted code, run `yarn --cwd web run format --write` and re-commit!') diff --git a/.github/workflows/pr_general.yml b/.github/workflows/pr_general.yml index 81702f6d..e5d6dccf 100644 --- a/.github/workflows/pr_general.yml +++ b/.github/workflows/pr_general.yml @@ -32,12 +32,6 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 with: key: udeps @@ -84,11 +78,6 @@ jobs: with: key: doc - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - run: cargo doc --document-private-items run_tests: @@ -111,11 +100,6 @@ jobs: with: key: test - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - run: cargo test tests_passed: diff --git a/.github/workflows/pr_pre-commit.yml b/.github/workflows/pr_pre-commit.yml index 0e0a5f86..581c8056 100644 --- a/.github/workflows/pr_pre-commit.yml +++ b/.github/workflows/pr_pre-commit.yml @@ -18,11 +18,6 @@ jobs: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 18 - cache: yarn - - run: yarn install --frozen-lockfile - uses: stackabletech/actions/run-pre-commit@5901c3b1455488820c4be367531e07c3c3e82538 # v0.4.0 with: rust: ${{ env.RUST_TOOLCHAIN_VERSION }} diff --git a/.gitignore b/.gitignore index 40b2fd66..3cc0380c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,10 @@ # Rust /target -# Frontend -/node_modules htpasswd -.yarn # Misc /demos /stacks /result .env -.pnp -.pnp.* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d88e2480..62bd2bf5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: hooks: - id: trailing-whitespace # Generated file - exclude: ^web/src/api/schema\.d\.ts|extra/.*$ + exclude: ^extra/.*$ - id: end-of-file-fixer exclude: Cargo.nix - id: detect-aws-credentials @@ -69,14 +69,6 @@ repos: stages: [pre-commit, pre-merge-commit, manual] pass_filenames: false - - id: gen-openapi - name: gen-openapi - files: ^web/ - language: system - entry: cargo xtask gen-openapi - stages: [pre-commit, pre-merge-commit, manual] - pass_filenames: false - - id: gen-ctl-readme name: gen-ctl-readme files: ^rust/stackablectl/ diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 438e8979..00000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -web/src/api/schema.d.ts diff --git a/Cargo.lock b/Cargo.lock index 6a729830..100f6188 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -481,7 +481,7 @@ checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" dependencies = [ "chrono", "chrono-tz-build", - "phf 0.11.3", + "phf", ] [[package]] @@ -491,8 +491,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" dependencies = [ "parse-zoneinfo", - "phf 0.11.3", - "phf_codegen 0.11.3", + "phf", + "phf_codegen", ] [[package]] @@ -2504,17 +2504,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_shared 0.11.3", -] - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_shared 0.13.1", - "serde", + "phf_shared", ] [[package]] @@ -2523,18 +2513,8 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" -dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", + "phf_generator", + "phf_shared", ] [[package]] @@ -2543,20 +2523,10 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.3", + "phf_shared", "rand 0.8.5", ] -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared 0.13.1", -] - [[package]] name = "phf_shared" version = "0.11.3" @@ -2566,15 +2536,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" version = "1.1.11" @@ -3184,9 +3145,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.11" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "aws-lc-rs", "ring", @@ -3606,14 +3567,6 @@ dependencies = [ "which", ] -[[package]] -name = "stackable-cockpit-web" -version = "0.0.0-dev" -dependencies = [ - "phf 0.13.1", - "phf_codegen 0.13.1", -] - [[package]] name = "stackable-cockpitd" version = "0.0.0-dev" @@ -3626,7 +3579,6 @@ dependencies = [ "serde", "snafu 0.9.0", "stackable-cockpit", - "stackable-cockpit-web", "tokio", "tower-http", "tracing", @@ -5169,7 +5121,6 @@ dependencies = [ "regex", "serde_json", "snafu 0.9.0", - "stackable-cockpitd", "stackablectl", "tera", ] diff --git a/Cargo.nix b/Cargo.nix index b4a24133..db19601b 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -63,16 +63,6 @@ rec { # File a bug if you depend on any for non-debug work! debug = internal.debugCrate { inherit packageId; }; }; - "stackable-cockpit-web" = rec { - packageId = "stackable-cockpit-web"; - build = internal.buildRustCrateWithFeatures { - packageId = "stackable-cockpit-web"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; "stackable-cockpitd" = rec { packageId = "stackable-cockpitd"; build = internal.buildRustCrateWithFeatures { @@ -1580,7 +1570,7 @@ rec { } { name = "phf"; - packageId = "phf 0.11.3"; + packageId = "phf"; usesDefaultFeatures = false; } ]; @@ -1620,12 +1610,12 @@ rec { } { name = "phf"; - packageId = "phf 0.11.3"; + packageId = "phf"; usesDefaultFeatures = false; } { name = "phf_codegen"; - packageId = "phf_codegen 0.11.3"; + packageId = "phf_codegen"; usesDefaultFeatures = false; } ]; @@ -8121,7 +8111,7 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; - "phf 0.11.3" = rec { + "phf" = rec { crateName = "phf"; version = "0.11.3"; edition = "2021"; @@ -8132,7 +8122,7 @@ rec { dependencies = [ { name = "phf_shared"; - packageId = "phf_shared 0.11.3"; + packageId = "phf_shared"; usesDefaultFeatures = false; } ]; @@ -8146,39 +8136,7 @@ rec { "unicase" = [ "phf_macros?/unicase" "phf_shared/unicase" ]; }; }; - "phf 0.13.1" = rec { - crateName = "phf"; - version = "0.13.1"; - edition = "2021"; - sha256 = "1pzswx5gdglgjgp4azyzwyr4gh031r0kcnpqq6jblga72z3jsmn1"; - authors = [ - "Steven Fackler " - ]; - dependencies = [ - { - name = "phf_shared"; - packageId = "phf_shared 0.13.1"; - usesDefaultFeatures = false; - } - { - name = "serde"; - packageId = "serde"; - optional = true; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "macros" = [ "phf_macros" ]; - "phf_macros" = [ "dep:phf_macros" ]; - "serde" = [ "dep:serde" ]; - "std" = [ "phf_shared/std" "serde?/std" ]; - "uncased" = [ "phf_macros?/uncased" "phf_shared/uncased" ]; - "unicase" = [ "phf_macros?/unicase" "phf_shared/unicase" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "phf_codegen 0.11.3" = rec { + "phf_codegen" = rec { crateName = "phf_codegen"; version = "0.11.3"; edition = "2021"; @@ -8189,36 +8147,16 @@ rec { dependencies = [ { name = "phf_generator"; - packageId = "phf_generator 0.11.3"; + packageId = "phf_generator"; } { name = "phf_shared"; - packageId = "phf_shared 0.11.3"; + packageId = "phf_shared"; } ]; }; - "phf_codegen 0.13.1" = rec { - crateName = "phf_codegen"; - version = "0.13.1"; - edition = "2021"; - sha256 = "1qfnsl2hiny0yg4lwn888xla5iwccszgxnx8dhbwl6s2h2fpzaj9"; - authors = [ - "Steven Fackler " - ]; - dependencies = [ - { - name = "phf_generator"; - packageId = "phf_generator 0.13.1"; - } - { - name = "phf_shared"; - packageId = "phf_shared 0.13.1"; - } - ]; - - }; - "phf_generator 0.11.3" = rec { + "phf_generator" = rec { crateName = "phf_generator"; version = "0.11.3"; edition = "2021"; @@ -8230,7 +8168,7 @@ rec { dependencies = [ { name = "phf_shared"; - packageId = "phf_shared 0.11.3"; + packageId = "phf_shared"; usesDefaultFeatures = false; } { @@ -8244,30 +8182,7 @@ rec { "criterion" = [ "dep:criterion" ]; }; }; - "phf_generator 0.13.1" = rec { - crateName = "phf_generator"; - version = "0.13.1"; - edition = "2021"; - crateBin = []; - sha256 = "0dwpp11l41dy9mag4phkyyvhpf66lwbp79q3ik44wmhyfqxcwnhk"; - authors = [ - "Steven Fackler " - ]; - dependencies = [ - { - name = "fastrand"; - packageId = "fastrand"; - usesDefaultFeatures = false; - } - { - name = "phf_shared"; - packageId = "phf_shared 0.13.1"; - usesDefaultFeatures = false; - } - ]; - - }; - "phf_shared 0.11.3" = rec { + "phf_shared" = rec { crateName = "phf_shared"; version = "0.11.3"; edition = "2021"; @@ -8288,27 +8203,6 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" ]; }; - "phf_shared 0.13.1" = rec { - crateName = "phf_shared"; - version = "0.13.1"; - edition = "2021"; - sha256 = "0rpjchnswm0x5l4mz9xqfpw0j4w68sjvyqrdrv13h7lqqmmyyzz5"; - authors = [ - "Steven Fackler " - ]; - dependencies = [ - { - name = "siphasher"; - packageId = "siphasher"; - } - ]; - features = { - "default" = [ "std" ]; - "uncased" = [ "dep:uncased" ]; - "unicase" = [ "dep:unicase" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; "pin-project" = rec { crateName = "pin-project"; version = "1.1.11"; @@ -10597,9 +10491,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.103.11"; + version = "0.103.12"; edition = "2021"; - sha256 = "1m3wpj1sfnpgwd6692lf42bcjsk6mbl6dwgarkn20jzadx8sz9i0"; + sha256 = "01nxzkfd1l96jzp04svc7iznlkarzx3wb9p63a0i17rc4y2vnyc2"; libName = "webpki"; dependencies = [ { @@ -11871,26 +11765,6 @@ rec { }; resolvedDefaultFeatures = [ "full" "openapi" ]; }; - "stackable-cockpit-web" = rec { - crateName = "stackable-cockpit-web"; - version = "0.0.0-dev"; - edition = "2021"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./web; }; - libName = "stackable_cockpit_web"; - dependencies = [ - { - name = "phf"; - packageId = "phf 0.13.1"; - } - ]; - buildDependencies = [ - { - name = "phf_codegen"; - packageId = "phf_codegen 0.13.1"; - } - ]; - - }; "stackable-cockpitd" = rec { crateName = "stackable-cockpitd"; version = "0.0.0-dev"; @@ -11946,11 +11820,6 @@ rec { packageId = "stackable-cockpit"; features = [ "openapi" ]; } - { - name = "stackable-cockpit-web"; - packageId = "stackable-cockpit-web"; - optional = true; - } { name = "tokio"; packageId = "tokio"; @@ -11985,10 +11854,7 @@ rec { features = [ "v4" ]; } ]; - features = { - "ui" = [ "dep:stackable-cockpit-web" ]; - }; - resolvedDefaultFeatures = [ "default" "ui" ]; + }; "stackable-operator" = rec { crateName = "stackable-operator"; @@ -18320,10 +18186,6 @@ rec { packageId = "snafu 0.9.0"; features = [ "futures" ]; } - { - name = "stackable-cockpitd"; - packageId = "stackable-cockpitd"; - } { name = "stackablectl"; packageId = "stackablectl"; diff --git a/Cargo.toml b/Cargo.toml index 68985380..148bc31b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["rust/*", "web", "."] +members = ["rust/*", "."] resolver = "2" [workspace.package] diff --git a/README.md b/README.md index c003321a..a40572df 100644 --- a/README.md +++ b/README.md @@ -11,21 +11,19 @@ [Stackable Data Platform](https://stackable.tech/) | [Platform Docs](https://docs.stackable.tech/) | [Discussions](https://github.com/orgs/stackabletech/discussions) | [Discord](https://discord.gg/7kZ3BNnCAF) -This repository contains the Stackable library `stackable-cockpit`, the Stackable CLI tool `stackablectl`, the Stackable -Cockpit server `stackable-cockpitd`, and the web-based admin user interface. +This repository contains the Stackable library `stackable-cockpit`, the Stackable CLI tool `stackablectl`, and the +Stackable Cockpit server `stackable-cockpitd`. ## Components - [`stackable-cockpit`][lib-readme]: The underlying library for all actions related to the Stackable Data Platform - [`stackablectl`][ctl-readme]: CLI tool to interact with local and remote deployments of the data platform - [`stackable-cockpitd`][server-readme]: API server used by frontends to interact with the data platform -- [`stackable-cockpit-web`][web-readme]: The web-based admin UI powered by SolidJS, TypeScript and Vite ## Developer Setup ### Prerequisites -- A working (and up2date) NodeJS installation, with Yarn as the preferred package manager - A working (and up2date) Rust installation including rustc, clippy, and cargo - Optional, but strongly advised: a working [pre-commit][pre-commit] installation @@ -36,19 +34,11 @@ git clone git@github.com:stackabletech/stackable-cockpit.git cd stackable-cockpit ``` -The admin UI is registered as a crate and is part of the build process, as the HTML/CSS/JS bundle is included in the -final `stackable-cockpitd` binary. To get the build process running, first execute `yarn install` to install all required NodeJS -dependencies in the `node_modules` folder. - ---- - Each component can be build separately like this: ```shell -cargo build --release -p stackablectl # Builds stackablectl -cargo build --release -p stackable-cockpitd # Builds the Stackable Cockpit API server -cargo build --release -p stackable-cockpitd --features ui # Builds the Stackable Cockpit API server bundled with the admin UI -cd web && yarn run build && cd - # Builds the admin UI +cargo build --release -p stackablectl # Builds stackablectl +cargo build --release -p stackable-cockpitd # Builds the Stackable Cockpit API server ``` ### Pre-commit hooks and xtasks @@ -64,18 +54,15 @@ hooks are: - [`detect-private-key`](https://github.com/pre-commit/pre-commit-hooks#detect-private-key): Detect private keys - [`yamllint`](https://github.com/adrienverge/yamllint): Runs linting on all YAML files - [`markdownlint`](https://github.com/igorshubovych/markdownlint-cli): Runs linting on all Markdown files -- [`prettier`](https://github.com/pre-commit/mirrors-prettier): Runs prettier on files located in `web` - `cargo clippy --all-targets --all-features -- -D warnings`: Runs Clippy on all files and errors on warnings - `cargo fmt -- --check`: Checks if Rust code needs formatting - `cargo xtask gen-comp`: Runs shell completions generation for `stackablectl` - `cargo xtask gen-man`: Runs man page generation for `stackablectl` -- `cargo xtask gen-openapi`: Runs OpenAPI spec generation to connect backend with frontend - `cargo xtask gen-ctl-readme`: Generates and inserts `stackablectl` help text into README [server-readme]: ./rust/stackable-cockpitd/README.md [ctl-readme]: ./rust/stackablectl/README.md [pre-commit]: https://pre-commit.com/ -[web-readme]: ./web/README.md [lib-readme]: ./rust/stackable-cockpit/README.md ### Templating variables diff --git a/Tiltfile b/Tiltfile index de8ddd65..9b9cdb38 100644 --- a/Tiltfile +++ b/Tiltfile @@ -14,8 +14,6 @@ custom_build( deps=[ # Rust 'rust', 'Cargo.toml', 'Cargo.lock', 'vendor', - # Web UI - 'web', 'yarn.lock', # Nix 'nix', 'default.nix', ], diff --git a/default.nix b/default.nix index b8823184..05fd9820 100644 --- a/default.nix +++ b/default.nix @@ -11,16 +11,6 @@ cargo ? import ./Cargo.nix { inherit nixpkgs pkgs release; defaultCrateOverrides = pkgs.defaultCrateOverrides // { - stackable-cockpit-web = attrs: { - nativeBuildInputs = [ - pkgs.nodePackages.yarn - pkgs.nodejs_20 - ]; - preConfigure = '' - [[ ! -e node_modules ]] || rm -r node_modules - ln -s ${web.nodeModules} node_modules - ''; - }; helm-sys = attrs: { GO_HELM_WRAPPER = goHelmWrapper + "/bin"; LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; @@ -41,20 +31,6 @@ meta ? pkgs.lib.importJSON ./nix/meta.json, dockerName ? "oci.stackable.tech/sandbox/${meta.operator.name}", dockerTag ? null, - web ? js2nix.buildEnv { - # js2nix doesn't import peer dependencies, so we use overlays to patch them in explicitly - # https://github.com/canva-public/js2nix/blob/d37912f6cc824e7f41bea7a481af1739ca195c8f/docs/usage.md#overriding - package-json = ./web/package.json; - yarn-lock = ./yarn.lock; - overlays = [ - (self: super: { - # TODO: remove once this https://github.com/canva-public/js2nix/issues/20 is resolved - buildNodeModule = pkgs.lib.makeOverridable ( - args: (super.buildNodeModule args).override { doCheck = false; } - ); - }) - ]; - }, goHelmWrapper ? pkgs.buildGoApplication { go = pkgs.go_1_26; pname = "go-helm-wrapper"; @@ -75,7 +51,6 @@ done ''; }, - js2nix ? pkgs.callPackage sources.js2nix { nodejs = pkgs.nodejs_20; }, gomod2nix ? pkgs.callPackage sources.gomod2nix { }, }: rec { @@ -85,9 +60,7 @@ rec { pkgs meta ; - build = cargo.workspaceMembers.stackable-cockpitd.build.override { - features = [ "ui" ]; - }; + build = cargo.workspaceMembers.stackable-cockpitd.build; entrypoint = build + "/bin/stackable-cockpitd"; # crds = pkgs.runCommand "${meta.operator.name}-crds.yaml" {} # '' diff --git a/docker/Dockerfile b/docker/Dockerfile index f9baffc9..be70ac91 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -31,15 +31,6 @@ RUN GO_VERSION=1.26.0 \ && ln -s /opt/go/bin/go /usr/local/bin WORKDIR / -##PATCH: Install node (for UI build) -WORKDIR /opt/node -RUN NODE_VERSION=18.16.0 \ - ARCH=$(arch | sed 's/^x86_64$/x64/' | sed 's/^aarch64$/arm64/') \ - && curl --location "https://repo.stackable.tech/repository/packages/node/node-v${NODE_VERSION}-linux-${ARCH}.tar.xz" | tar xvJ --strip-components=1 \ - && ln -s /opt/node/bin/{node,corepack} /usr/local/bin \ - && corepack enable yarn -WORKDIR / - # IMPORTANT # If you change the toolchain version here, make sure to also change the "rust_version" # property in operator-templating/repositories.yaml @@ -58,9 +49,9 @@ COPY docker/ubi8-rust-builder/copy_artifacts.sh / WORKDIR /src COPY . /src -## PATCH: disabled cyclonedx, run yarn install, build stackable-cockpitd with ui feature enabled +## PATCH: disabled cyclonedx # hadolint ignore=SC1091 -RUN . "$HOME/.cargo/env" && yarn && cargo build --release --workspace --features stackable-cockpitd/ui +RUN . "$HOME/.cargo/env" && cargo build --release --workspace # ONBUILD RUN . "$HOME/.cargo/env" && cargo auditable build --release --workspace && cargo cyclonedx --output-pattern package --all --output-cdx # Copy the "interesting" files into /app. diff --git a/nix/sources.json b/nix/sources.json index 9bff9ae9..3043939d 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -24,18 +24,6 @@ "url_template": "https://github.com///archive/.tar.gz", "version": "1.5.0" }, - "js2nix": { - "branch": "main", - "description": "Node.js modules installation using Nix", - "homepage": "", - "owner": "canva-public", - "repo": "js2nix", - "rev": "8cd32b5c87767b019e0960b27599f6b9d195ddb0", - "sha256": "0mp62ai0n6k57cx8sn118qis37xvfylskagghxja00gdcank3nxr", - "type": "tarball", - "url": "https://github.com/canva-public/js2nix/archive/8cd32b5c87767b019e0960b27599f6b9d195ddb0.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, "nixpkgs": { "branch": "nixpkgs-unstable", "description": "Nix Packages collection", diff --git a/package.json b/package.json deleted file mode 100644 index 45a78b88..00000000 --- a/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "private": true, - "workspaces": [ - "web" - ], - "packageManager": "yarn@1.22.19" -} diff --git a/rust/stackable-cockpitd/Cargo.toml b/rust/stackable-cockpitd/Cargo.toml index 173649a5..fe41ae1e 100644 --- a/rust/stackable-cockpitd/Cargo.toml +++ b/rust/stackable-cockpitd/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "stackable-cockpitd" -description = "Stackable cockpit daemon bundling the HTTP REST API and UI" +description = "Stackable cockpit daemon bundling the HTTP REST API" version.workspace = true authors.workspace = true license.workspace = true @@ -8,14 +8,8 @@ edition.workspace = true repository.workspace = true publish = false -[features] -default = [] -# The UI builds slowly, so run in API-only mode during development -ui = ["dep:stackable-cockpit-web"] - [dependencies] stackable-cockpit = { path = "../stackable-cockpit", features = ["openapi"] } -stackable-cockpit-web = { path = "../../web", optional = true } axum.workspace = true axum-extra.workspace = true diff --git a/rust/stackable-cockpitd/README.md b/rust/stackable-cockpitd/README.md index 442cd9dd..6f27efbc 100644 --- a/rust/stackable-cockpitd/README.md +++ b/rust/stackable-cockpitd/README.md @@ -12,9 +12,6 @@ and exposes functionality via an HTTP REST API. Core community-provided dependen - [`tracing`][tracing-link] is used for context-rich application logging. Our complete stack emits tracing events that can be consumed via multiple different subscribers. - [`snafu`][snafu-link] for easy custom error handling. -The Stackable UI is bundled into the final binary during the build process. The source code for the front end is located -in [web](../../web). Detailed information about the frontend stack can be found in the [README](../../web/README.me). - ## Development ```shell diff --git a/rust/stackable-cockpitd/src/cli.rs b/rust/stackable-cockpitd/src/cli.rs index 37d94cce..3c56dc80 100644 --- a/rust/stackable-cockpitd/src/cli.rs +++ b/rust/stackable-cockpitd/src/cli.rs @@ -5,8 +5,7 @@ use clap::Parser; #[derive(Debug, Parser)] #[command(author, version, about, propagate_version = true)] #[command( - about = "Run the Stackable daemon which exposes the Stackable library via an HTTP -REST API and provides a web-based application." + about = "Run the Stackable daemon which exposes the Stackable library via an HTTP REST API." )] pub struct Cli { /// Port the daemon listens on diff --git a/rust/stackable-cockpitd/src/handlers/mod.rs b/rust/stackable-cockpitd/src/handlers/mod.rs index 61145488..de3222b1 100644 --- a/rust/stackable-cockpitd/src/handlers/mod.rs +++ b/rust/stackable-cockpitd/src/handlers/mod.rs @@ -3,9 +3,3 @@ pub mod releases; pub mod root; pub mod stacklets; pub mod stacks; - -#[cfg(feature = "ui")] -pub mod ui; -#[cfg(not(feature = "ui"))] -#[path = "ui_disabled.rs"] -pub mod ui; diff --git a/rust/stackable-cockpitd/src/handlers/ui.rs b/rust/stackable-cockpitd/src/handlers/ui.rs deleted file mode 100644 index e250e0bb..00000000 --- a/rust/stackable-cockpitd/src/handlers/ui.rs +++ /dev/null @@ -1,31 +0,0 @@ -use axum::{ - Router, - extract::Path, - http::{HeaderValue, header::CONTENT_TYPE}, - response::{Html, IntoResponse}, - routing::get, -}; - -pub fn router() -> Router { - Router::new() - .route("/assets/:assset", get(asset)) - .route("/", get(ui)) - .route("/*path", get(ui)) -} - -async fn ui() -> Html<&'static str> { - Html(stackable_cockpit_web::INDEX_HTML) -} -async fn asset(Path(name): Path) -> impl IntoResponse { - ( - [( - CONTENT_TYPE, - match name.rsplit_once('.') { - Some((_, "js")) => HeaderValue::from_static("text/javascript"), - Some((_, "css")) => HeaderValue::from_static("text/css"), - _ => HeaderValue::from_static("application/octet-stream"), - }, - )], - stackable_cockpit_web::ASSETS[&name], - ) -} diff --git a/rust/stackable-cockpitd/src/handlers/ui_disabled.rs b/rust/stackable-cockpitd/src/handlers/ui_disabled.rs deleted file mode 100644 index 88adbd9e..00000000 --- a/rust/stackable-cockpitd/src/handlers/ui_disabled.rs +++ /dev/null @@ -1,9 +0,0 @@ -use axum::{Router, routing::get}; - -pub fn router() -> Router { - Router::new().route("/", get(disabled_message)) -} - -async fn disabled_message() -> &'static str { - "UI is disabled, rebuild with --features ui to enable" -} diff --git a/rust/stackable-cockpitd/src/main.rs b/rust/stackable-cockpitd/src/main.rs index 98c5f61c..e36173f0 100644 --- a/rust/stackable-cockpitd/src/main.rs +++ b/rust/stackable-cockpitd/src/main.rs @@ -2,7 +2,6 @@ use std::net::SocketAddr; use axum::{ Router, - response::Redirect, routing::{get, post}, }; use clap::Parser; @@ -53,9 +52,7 @@ async fn main() -> Result<(), Whatever> { let router = Router::new() .nest("/api/", api) - .nest("/ui/", handlers::ui::router()) - .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", api_doc::openapi())) - .route("/", get(|| async { Redirect::permanent("/ui/") })); + .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", api_doc::openapi())); let listen_addr = SocketAddr::new(cli.address, cli.port); info!(addr = %listen_addr, "Starting server"); diff --git a/rust/xtask/Cargo.toml b/rust/xtask/Cargo.toml index 1007dca3..69a5beb7 100644 --- a/rust/xtask/Cargo.toml +++ b/rust/xtask/Cargo.toml @@ -13,6 +13,5 @@ once_cell.workspace = true regex.workspace = true serde_json.workspace = true snafu.workspace = true -stackable-cockpitd = { path = "../stackable-cockpitd" } stackablectl = { path = "../stackablectl" } tera.workspace = true diff --git a/rust/xtask/src/main.rs b/rust/xtask/src/main.rs index 80de075e..a6d2c0a3 100644 --- a/rust/xtask/src/main.rs +++ b/rust/xtask/src/main.rs @@ -2,14 +2,12 @@ use clap::Parser; use snafu::Snafu; use crate::{ - completions::GenCompError, docs::GenDocsError, man::GenManError, openapi::GenOpenapiError, - readme::GenReadmeError, + completions::GenCompError, docs::GenDocsError, man::GenManError, readme::GenReadmeError, }; mod completions; mod docs; mod man; -mod openapi; mod readme; #[derive(clap::Parser)] @@ -18,7 +16,6 @@ enum XtaskCommand { GenAll, GenMan, GenComp, - GenOpenapi, GenCtlReadme, GenDocs, } @@ -31,12 +28,6 @@ enum TaskError { #[snafu(display("failed to generate shell completions"), context(false))] Comp { source: GenCompError }, - #[snafu( - display("failed to generate OpenAPI TypeScript schema based on the OpenAPI JSON spec"), - context(false) - )] - Openapi { source: GenOpenapiError }, - #[snafu( display("failed to generate stackablectl usage README file"), context(false) @@ -54,13 +45,11 @@ fn main() -> Result<(), TaskError> { // IMPORTANT (@NickLarsenNZ): ensure all commands defined below are also in here. man::generate()?; completions::generate()?; - openapi::generate()?; readme::generate()?; docs::generate()?; } XtaskCommand::GenMan => man::generate()?, XtaskCommand::GenComp => completions::generate()?, - XtaskCommand::GenOpenapi => openapi::generate()?, XtaskCommand::GenCtlReadme => readme::generate()?, XtaskCommand::GenDocs => docs::generate()?, } diff --git a/rust/xtask/src/openapi.rs b/rust/xtask/src/openapi.rs deleted file mode 100644 index 270e64fb..00000000 --- a/rust/xtask/src/openapi.rs +++ /dev/null @@ -1,46 +0,0 @@ -use std::{ - io::Write, - process::{Command, Stdio}, -}; - -use snafu::{ResultExt, Snafu, ensure}; -use stackable_cockpitd::api_doc::openapi; - -#[derive(Debug, Snafu)] -pub enum GenOpenapiError { - #[snafu(display("error serializing openapi"))] - SerializeOpenApi { source: serde_json::Error }, - - #[snafu(display("error running importing openapi schema importer"))] - ImportOpenapiSchemaRun { source: std::io::Error }, - - #[snafu(display("openapi schema importer failed with error code {error_code:?}"))] - ImportOpenapiSchema { error_code: Option }, - - #[snafu(display("error writing openapi schema into importer"))] - WriteOpenapiSchema { source: std::io::Error }, -} - -pub fn generate() -> Result<(), GenOpenapiError> { - let openapi_json = openapi().to_json().context(SerializeOpenApiSnafu)?; - let mut codegen = Command::new("yarn") - .args(["--cwd", "web", "run", "openapi-codegen"]) - .stdin(Stdio::piped()) - .spawn() - .context(ImportOpenapiSchemaRunSnafu)?; - codegen - .stdin - .take() - .expect("child stdin must be available") - .write_all(openapi_json.as_bytes()) - .context(WriteOpenapiSchemaSnafu)?; - let status = codegen.wait().context(ImportOpenapiSchemaRunSnafu)?; - ensure!( - status.success(), - ImportOpenapiSchemaSnafu { - error_code: status.code() - } - ); - - Ok(()) -} diff --git a/shell.nix b/shell.nix index 9ddaba37..d0ec38be 100644 --- a/shell.nix +++ b/shell.nix @@ -43,9 +43,6 @@ pkgs.mkShell rec { rustup # additions for this repo - yarn - typescript - vite go ]); diff --git a/web/.editorconfig b/web/.editorconfig deleted file mode 100644 index b429316b..00000000 --- a/web/.editorconfig +++ /dev/null @@ -1,2 +0,0 @@ -[*] -indent_size = 2 diff --git a/web/.eslintignore b/web/.eslintignore deleted file mode 100644 index 74746490..00000000 --- a/web/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -# generated files -src/api/schema.d.ts diff --git a/web/.eslintrc b/web/.eslintrc deleted file mode 100644 index 86d58a6b..00000000 --- a/web/.eslintrc +++ /dev/null @@ -1,41 +0,0 @@ -{ - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:solid/typescript", - "plugin:unicorn/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": true - }, - "plugins": ["@typescript-eslint", "solid", "unicorn"], - "rules": { - // Causes false positives for Solid resources - "@typescript-eslint/no-misused-promises": "off", - "unicorn/prevent-abbreviations": [ - "error", - { - "replacements": { - "env": false, - // Err is used for the Result type - "err": false, - // Fn or fn is used in callbacks, predicate and filter functions - "fn": false, - // props and params are distinct SolidJS concepts - "props": false, - "params": false - } - } - ], - "unicorn/no-useless-undefined": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ] - } -} diff --git a/web/.gitignore b/web/.gitignore deleted file mode 100644 index ffc6a8f1..00000000 --- a/web/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -# Test results / coverage -coverage diff --git a/web/.prettierignore b/web/.prettierignore deleted file mode 100644 index c2b7dc50..00000000 --- a/web/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -# Generated by openapi-typescript -src/api/schema.d.ts diff --git a/web/.prettierrc.json b/web/.prettierrc.json deleted file mode 100644 index e359dad9..00000000 --- a/web/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "trailingComma": "all", - "singleQuote": true, - "jsxSingleQuote": true -} diff --git a/web/Cargo.toml b/web/Cargo.toml deleted file mode 100644 index 34621892..00000000 --- a/web/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "stackable-cockpit-web" -version.workspace = true -edition = "2021" -publish = false - -[dependencies] -phf = { workspace = true } - -[build-dependencies] -phf_codegen = { workspace = true } diff --git a/web/README.md b/web/README.md deleted file mode 100644 index a7443df8..00000000 --- a/web/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# stackable-cockpit-web - -## The stack - -The Stackable UI is a modern web app written in TypeScript. Core community-provided dependencies are: - -- [SolidJS][solidjs-link] is a reactivity-based framework for building modular web apps. -- [UnoCSS][unocss-link] is an on-demand CSS framework that generates CSS based on HTML classes. -- [Vite][vite-link] is a modern and fast TS/JS toolchain for all kinds of frameworks. Based on Rollup. - -[solidjs-link]: https://www.solidjs.com/ -[unocss-link]: https://unocss.dev/ -[vite-link]: https://vitejs.dev/ - -## Development diff --git a/web/build.rs b/web/build.rs deleted file mode 100644 index 7342c6c9..00000000 --- a/web/build.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::{fs::File, io::Write, path::PathBuf, process::Command}; - -fn main() { - let out_dir = PathBuf::from(std::env::var("OUT_DIR").expect("OUT_DIR is required")); - - let vite_out_dir = out_dir.join("vite-dist"); - // Vite always seems to update the mtime of the project folder on each build, so track the files that we know matter individually - for tracked_file in [ - "package.json", - "../yarn.lock", - "index.html", - "public", - "src", - "tsconfig.json", - "vite.config.ts", - ] { - println!("cargo:rerun-if-changed={tracked_file}"); - } - - let mut vite_command = Command::new("yarn"); - vite_command - .arg("run") - .arg("build") - .arg("--outDir") - .arg(&vite_out_dir) - .arg("--base") - .arg("/ui/"); - - let vite_status = vite_command.status(); - match vite_status { - Ok(vite_status) if vite_status.success() => {} - _ => panic!("web-ui build failed: command {vite_command:?} resulted in {vite_status:?}"), - }; - - let mut asset_map = phf_codegen::Map::new(); - for asset_file in vite_out_dir.join("assets").read_dir().unwrap() { - let asset_file = asset_file.unwrap(); - let asset_file_name = asset_file.file_name(); - let asset_file_path = asset_file.path(); - asset_map.entry( - asset_file_name - .to_str() - .expect("asset filename must be valid UTF-8") - .to_string(), - format!("include_bytes!({asset_file_path:?})"), - ); - } - write!( - File::create(out_dir.join("vite-asset-map.rs")).unwrap(), - "{asset_map}", - asset_map = asset_map.build() - ) - .unwrap(); -} diff --git a/web/index.html b/web/index.html deleted file mode 100644 index d01e30f6..00000000 --- a/web/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Stackable Cockpit - - -
- - - diff --git a/web/package.json b/web/package.json deleted file mode 100644 index 838053c8..00000000 --- a/web/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "web-ui", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "lint": "eslint --ext .js,.ts,.tsx,.jsx,.json ./src", - "coverage": "vitest run --coverage", - "build": "tsc && vite build", - "preview": "vite preview", - "test:ui": "vitest --ui", - "openapi-codegen": "openapi-typescript -o src/api/schema.d.ts", - "format": "prettier .", - "test": "vitest", - "dev": "vite" - }, - "devDependencies": { - "@types/feather-icons": "^4.29.1", - "@typescript-eslint/eslint-plugin": "^5.59.5", - "@typescript-eslint/parser": "^5.59.5", - "@vitest/coverage-c8": "^0.31.1", - "@vitest/ui": "^0.31.1", - "eslint": "^8.40.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-solid": "^0.12.1", - "eslint-plugin-unicorn": "^47.0.0", - "openapi-typescript": "^6.5.0", - "prettier": "^2.8.8", - "typescript": "^5.0.4", - "unocss": "^0.51.8", - "vite": "^4.5.3", - "vite-plugin-solid": "^2.7.2", - "vitest": "^0.31.4" - }, - "dependencies": { - "@fluent/bundle": "^0.18.0", - "@fluent/langneg": "^0.7.0", - "@fluent/sequence": "^0.8.0", - "@solid-devtools/overlay": "^0.27.7", - "@solidjs/router": "^0.8.2", - "@unocss/reset": "^0.51.12", - "feather-icons": "^4.29.0", - "openapi-fetch": "^0.2.0", - "solid-js": "^1.7.4" - }, - "js2nix": { - "overlay": { - "vite-plugin-solid": { - "addDependencies": [ - "vite" - ] - }, - "@solidjs/router": { - "addDependencies": [ - "solid-js" - ] - } - } - }, - "packageManager": "yarn@1.22.19" -} diff --git a/web/public/.gitkeep b/web/public/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/web/public/fonts/Inter-Bold.woff2 b/web/public/fonts/Inter-Bold.woff2 deleted file mode 100644 index 2846f29cc8af8cef50f51381940bac8845c38f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106140 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
)V`qXZDL!rw2D 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

B1ttL7O_Gw{HhNLeIl%?EWPJgN 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 diff --git a/web/public/fonts/Inter-Medium.woff2 b/web/public/fonts/Inter-Medium.woff2 deleted file mode 100644 index f92498a2ecf4d95ddd85c8b18f7b9ebc15e11658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105924 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 RS-;sm8d61l{^uOb{{jFVK@0!@ diff --git a/web/public/fonts/Inter-Regular.woff2 b/web/public/fonts/Inter-Regular.woff2 deleted file mode 100644 index 6c2b6893d593201d7c94e52687f78b2ef28b357e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98868 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%0D(-D;tD2U3Vy$! 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 diff --git a/web/src/api/listeners.ts b/web/src/api/listeners.ts deleted file mode 100644 index 2ff5aea7..00000000 --- a/web/src/api/listeners.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { ObjectMeta } from './meta'; -import { delay } from './mock-utils'; - -interface Listener { - metadata: ObjectMeta; - product: string; - endpoints: ListenerEndpoint[]; -} - -interface ListenerEndpoint { - path: string; - web: boolean; -} - -export async function getListeners(): Promise { - await delay(200); - return [ - { - metadata: { - namespace: 'default', - name: 'simple-nifi', - }, - product: 'nifi', - endpoints: [ - { - path: 'https://127.0.0.1:8443/ui', - web: true, - }, - { - path: 'mqtt://127.0.0.1:9999', - web: false, - }, - ], - }, - { - metadata: { - namespace: 'default', - name: 'dimple-nifi', - }, - product: 'nifi', - endpoints: [ - { - path: 'https://127.0.0.1:8443/ui', - web: true, - }, - { - path: 'mqtt://127.0.0.1:9999', - web: false, - }, - ], - }, - { - metadata: { - namespace: 'sefault', - name: 'dimple-nifi', - }, - product: 'nifi', - endpoints: [ - { - path: 'https://127.0.0.1:8443/ui', - web: true, - }, - { - path: 'mqtt://127.0.0.1:9999', - web: false, - }, - ], - }, - ]; -} diff --git a/web/src/api/meta.ts b/web/src/api/meta.ts deleted file mode 100644 index 2c8a16e3..00000000 --- a/web/src/api/meta.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ObjectMeta { - namespace: string; - name: string; -} diff --git a/web/src/api/mock-utils.ts b/web/src/api/mock-utils.ts deleted file mode 100644 index afb87495..00000000 --- a/web/src/api/mock-utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function delay(amount: number): Promise { - return new Promise((resolve) => setTimeout(resolve, amount)); -} diff --git a/web/src/api/schema.d.ts b/web/src/api/schema.d.ts deleted file mode 100644 index c3261227..00000000 --- a/web/src/api/schema.d.ts +++ /dev/null @@ -1,234 +0,0 @@ -/** - * This file was auto-generated by openapi-typescript. - * Do not make direct changes to the file. - */ - - -/** OneOf type helpers */ -type Without = { [P in Exclude]?: never }; -type XOR = (T | U) extends object ? (Without & U) | (Without & T) : T | U; -type OneOf = T extends [infer Only] ? Only : T extends [infer A, infer B, ...infer Rest] ? OneOf<[XOR, ...Rest]> : never; - -export interface paths { - "/demos": { - /** Retrieves all demos. */ - get: operations["get_demos"]; - }; - "/demos/{name}": { - /** Retrieves one demo identified by `name`. */ - get: operations["get_demo"]; - }; - "/login": { - post: operations["log_in"]; - }; - "/ping": { - get: operations["ping"]; - }; - "/releases": { - /** Retrieves all releases. */ - get: operations["get_releases"]; - }; - "/releases/{name}": { - /** Retrieves one release identified by `name`. */ - get: operations["get_release"]; - }; - "/stacklets": { - /** Retrieves all stacklets. */ - get: operations["get_stacklets"]; - }; -} - -export type webhooks = Record; - -export interface components { - schemas: { - /** @description This struct describes a demo with the v2 spec */ - DemoSpec: { - /** @description A short description of the demo */ - description: string; - /** @description An optional link to a documentation page */ - documentation?: string | null; - /** @description A variable number of labels (tags) */ - labels?: string[]; - /** @description A variable number of Helm or YAML manifests */ - manifests?: components["schemas"]["ManifestSpec"][]; - /** @description A variable number of supported parameters */ - parameters?: components["schemas"]["Parameter"][]; - resourceRequests?: null | components["schemas"]["ResourceRequests"]; - /** @description The name of the underlying stack */ - stackableStack: string; - /** - * @description Supported namespaces this demo can run in. An empty list indicates that - * the demo can run in any namespace. - */ - supportedNamespaces?: string[]; - }; - DisplayCondition: { - condition: string; - is_good?: boolean | null; - message?: string | null; - }; - ManifestSpec: OneOf<[{ - helmChart: string; - }, { - plainYaml: string; - }]>; - ObjectMeta: { - name: string; - namespace: string; - }; - /** - * @description Parameter descibes a common parameter format. This format is used in demo - * and stack definitions. - */ - Parameter: { - /** @description Parameter default value */ - default: string; - /** @description Parameter description */ - description: string; - /** @description Parameter name */ - name: string; - }; - ProductSpec: { - operatorVersion: string; - }; - ReleaseSpec: { - /** @description A short description of this release */ - description: string; - /** @description List of products and their version in this release */ - products: { - [key: string]: components["schemas"]["ProductSpec"]; - }; - /** @description Date this released was released */ - releaseDate: string; - }; - /** - * @description Demos and stacks can define how much cluster resources they need to run - * via their definition. The struct [`ResourceRequests`] contains information - * how many CPU cores and how much memory and disk space are required to run - * the demo/stack. - */ - ResourceRequests: { - cpu: string; - memory: string; - pvc: string; - }; - Session: { - sessionToken: components["schemas"]["SessionToken"]; - }; - SessionToken: string; - Stacklet: { - /** @description Multiple cluster conditions. */ - conditions: components["schemas"]["DisplayCondition"][]; - /** - * @description Endpoint addresses the product is reachable at. - * The key is the service name (e.g. `web-ui`), the value is the URL. - */ - endpoints: { - [key: string]: string; - }; - /** @description Name of the stacklet. */ - name: string; - /** @description Some CRDs are cluster scoped. */ - namespace?: string | null; - /** @description Name of the product. */ - product: string; - }; - }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; -} - -export type $defs = Record; - -export type external = Record; - -export interface operations { - - /** Retrieves all demos. */ - get_demos: { - responses: { - /** @description Retrieving a list of demos succeeded */ - 200: { - content: { - "application/json": components["schemas"]["DemoSpec"][]; - }; - }; - /** @description Retrieving a list of demos failed */ - 404: { - content: never; - }; - }; - }; - /** Retrieves one demo identified by `name`. */ - get_demo: { - responses: { - /** @description Retrieving the demo with 'name' succeeded */ - 200: { - content: { - "application/json": components["schemas"]["DemoSpec"]; - }; - }; - /** @description Retrieving the demo with 'name' failed */ - 404: { - content: never; - }; - }; - }; - log_in: { - responses: { - 200: { - content: { - "application/json": components["schemas"]["Session"]; - }; - }; - 401: { - content: { - "text/plain": string; - }; - }; - }; - }; - ping: { - responses: { - 200: { - content: { - "text/plain": string; - }; - }; - }; - }; - /** Retrieves all releases. */ - get_releases: { - responses: { - /** @description Retrieving a list of releases succeeded */ - 200: { - content: { - "application/json": components["schemas"]["ReleaseSpec"][]; - }; - }; - /** @description Retrieving a list of releases failed */ - 404: { - content: never; - }; - }; - }; - /** Retrieves one release identified by `name`. */ - get_release: { - responses: { - }; - }; - /** Retrieves all stacklets. */ - get_stacklets: { - responses: { - 200: { - content: { - "application/json": components["schemas"]["Stacklet"][]; - }; - }; - }; - }; -} diff --git a/web/src/api/session.ts b/web/src/api/session.ts deleted file mode 100644 index c9f47cf1..00000000 --- a/web/src/api/session.ts +++ /dev/null @@ -1,55 +0,0 @@ -import openapiCreateClient from 'openapi-fetch'; -import { paths } from './schema'; -import { createLocalStorageSignal } from '../utils/localstorage'; -import { None, someIfDefined } from '../types'; -import { createMemo } from 'solid-js'; - -const createClient = (options?: RequestInit) => - openapiCreateClient({ baseUrl: '/api', ...options }); -const [currentSessionToken, setCurrentSessionToken] = - createLocalStorageSignal('sessionToken'); -export const isLoggedIn = () => currentSessionToken().isSome(); -export const client = createMemo(() => { - const headers: HeadersInit = {}; - currentSessionToken().map((sessionToken) => { - headers.Authorization = `Bearer ${sessionToken}`; - }); - return createClient({ headers }); -}); - -// Try to validate that the session token is still valid, and log the user out otherwise -export function validateSessionOrLogOut() { - if (isLoggedIn()) { - client() - .get('/ping', {}) - .then((pingResponse) => { - if (pingResponse.response.status === 401) { - setCurrentSessionToken(None); - } - }) - // We don't want to block page loads on waiting for this validation - // eslint-disable-next-line unicorn/prefer-top-level-await - .catch((error) => - console.error('Failed to validate session token', error), - ); - } -} - -export async function logIn( - username: string, - password: string, -): Promise { - // Always use unauthenticated client for login requests - const response = await createClient().post('/login', { - headers: { Authorization: 'Basic ' + btoa(`${username}:${password}`) }, - }); - setCurrentSessionToken(someIfDefined(response.data?.sessionToken)); - if (!response.response.ok) { - return response.error; - } -} -// We want to leave room in the function contract to invalidate the session token in the future -// eslint-disable-next-line @typescript-eslint/require-await -export async function logOut() { - setCurrentSessionToken(None); -} diff --git a/web/src/api/stacklets.ts b/web/src/api/stacklets.ts deleted file mode 100644 index 39a60216..00000000 --- a/web/src/api/stacklets.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { components } from './schema'; -import { client } from './session'; -import { ObjectMeta } from './meta'; -import { delay } from './mock-utils'; - -export type Stacklet = components['schemas']['Stacklet']; -export type DisplayCondition = components['schemas']['DisplayCondition']; -export async function getStacklets(): Promise { - const { data } = await client().get('/stacklets', {}); - if (data === undefined) { - throw new Error('No data returned by API'); - } else { - return data; - } -} - -export type DiscoveryFieldType = 'url' | 'blob'; -interface StackletDiscovery { - metadata: ObjectMeta; - data: { [x: string]: string }; - fieldTypes: { [x: string]: DiscoveryFieldType }; -} - -export async function getStackletDiscovery( - namespace: string, - discoveryConfigMapName: string, -): Promise { - await delay(200); - if (namespace == 'default' && discoveryConfigMapName == 'simple-nifi') { - return { - metadata: { namespace, name: discoveryConfigMapName }, - data: { NIFI_URL: 'https://foo.com' }, - fieldTypes: { NIFI_URL: 'url' }, - }; - } else if ( - namespace == 'default' && - discoveryConfigMapName == 'simple-hdfs' - ) { - return { - metadata: { namespace, name: discoveryConfigMapName }, - data: { 'hdfs-config.xml': 'config goes here' }, - fieldTypes: {}, - }; - } else { - return undefined; - } -} diff --git a/web/src/components/button.tsx b/web/src/components/button.tsx deleted file mode 100644 index f97c8581..00000000 --- a/web/src/components/button.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { A } from '@solidjs/router'; -import { JSX } from 'solid-js'; - -/// Special types of buttons that need specific callouts -export type ButtonRole = 'primary'; - -export interface VisualButtonProps { - children: JSX.Element; - role?: ButtonRole; -} - -const buttonProps = (props: VisualButtonProps) => { - const roleClasses = - // buttonProps is only called within a reactive scope - // eslint-disable-next-line solid/reactivity - props.role === 'primary' - ? 'bg-stackable-blue-light hover-bg-stackable-blue-dark active-stackable-blue-dark border-stackable-blue-dark' - : 'bg-gray-700 hover-bg-gray-600 active-bg-gray-500 border-gray-600'; - - return { - class: `p-2 text-size-4 c-white rounded border-1 border-solid cursor-pointer decoration-none ${roleClasses}`, - }; -}; - -export interface ButtonProps extends VisualButtonProps { - onClick: () => void; -} - -export const Button = (props: ButtonProps) => ( - -); - -export interface ButtonLinkProps extends VisualButtonProps { - href: string; -} - -export const ButtonLink = (props: ButtonLinkProps) => ( - - {props.children} - -); diff --git a/web/src/components/datatable.tsx b/web/src/components/datatable.tsx deleted file mode 100644 index b958ac40..00000000 --- a/web/src/components/datatable.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { For, JSX, Show, createMemo, createSignal } from 'solid-js'; -import { Button } from './button'; -import { SearchInput } from './form/search'; -import { LoadingBar } from './loading'; -import { translate } from '../localization'; - -export interface DataTableColumn { - label: string; - get: (x: T) => JSX.Element; - sortBy?: (x: T) => string; -} - -export interface DataTableProps { - columns: DataTableColumn[]; - items: T[]; - - searchQuery?: string; - setSearchQuery?: (query: string) => void; - - extraButtons?: JSX.Element; - - refresh?: () => void; - isLoading?: boolean; -} - -export function DataTable(props: DataTableProps): JSX.Element { - const [sortComparator, setSortComparator] = createSignal< - ((x: T, y: T) => number) | undefined - >(); - - const sortedItems = createMemo(() => { - const currentSortComparator = sortComparator(); - if (currentSortComparator == undefined) { - return props.items; - } else { - const items = [...props.items]; - items.sort(currentSortComparator); - return items; - } - }); - - const sortByColumn = (event: Event, column: DataTableColumn) => { - event.preventDefault(); - setSortComparator(() => - column.sortBy ? keyComparator(column.sortBy) : undefined, - ); - }; - - return ( -

-
- - props.setSearchQuery?.(q)} - /> - -
- {props.extraButtons} - - - -
- - - - - {(column) => ( - - )} - - - - - - - - - {(item) => ( - - - {(col) => ( - - )} - - - )} - - -
- - sortByColumn(event, column)} - > - {column.label} - - -
-
- -
-
- {col.get(item)} -
-
- ); -} - -const collator = new Intl.Collator(); - -function keyComparator(key: (x: T) => string): (x: T, y: T) => number { - return (x, y) => collator.compare(key(x), key(y)); -} diff --git a/web/src/components/form/search.tsx b/web/src/components/form/search.tsx deleted file mode 100644 index cf2c96e8..00000000 --- a/web/src/components/form/search.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { SearchSymbol } from '../symbols'; - -interface SearchInputProps { - query: string; - setQuery: (query: string) => void; -} -export const SearchInput = (props: SearchInputProps) => { - return ( - - ); -}; diff --git a/web/src/components/header.tsx b/web/src/components/header.tsx deleted file mode 100644 index 50c8b839..00000000 --- a/web/src/components/header.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { A } from '@solidjs/router'; -import { ParentProps, Show } from 'solid-js'; -import logo from '../resources/logo.png'; -import { logOut } from '../api/session'; -import { translate } from '../localization'; -import { LanguagePicker } from './language'; - -interface NavItemProps { - href?: string; - onClick?: () => void; -} - -const NavItem = (props: ParentProps) => { - const linkClass = - 'p-4 b-0 cursor-pointer c-white flex flex-items-center h-full decoration-none bg-gray-900'; - const inactiveClass = 'bg-opacity-30 hover:bg-opacity-50'; - - return ( -
  • - { - event.preventDefault(); - props.onClick?.(); - }} - > - {props.children} - - } - > - props.onClick?.()} - > - {props.children} - - -
  • - ); -}; - -export const Header = () => { - return ( - - ); -}; diff --git a/web/src/components/language.tsx b/web/src/components/language.tsx deleted file mode 100644 index 5c63e2eb..00000000 --- a/web/src/components/language.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { For } from 'solid-js'; -import { requireLanguageContext, translate } from '../localization'; -import { Some } from '../types/option'; - -export const LanguagePicker = () => { - const context = requireLanguageContext(); - return ( - - ); -}; diff --git a/web/src/components/loading.tsx b/web/src/components/loading.tsx deleted file mode 100644 index c236eb96..00000000 --- a/web/src/components/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export const LoadingBar = () => ( - - Loading... - - - - - -); diff --git a/web/src/components/symbols.tsx b/web/src/components/symbols.tsx deleted file mode 100644 index 8d5e1e8b..00000000 --- a/web/src/components/symbols.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { FeatherIconNames, icons as featherIcons } from 'feather-icons'; - -interface FeatherSymbolProps { - icon: FeatherIconNames; -} -const FeatherSymbol = (props: FeatherSymbolProps) => { - const icon = () => featherIcons[props.icon]; - // Icon contents are provided statically by feather, and not influenced by user input - // eslint-disable-next-line solid/no-innerhtml - return ; -}; - -export const SearchSymbol = () => ; -export const AddSymbol = () => ; diff --git a/web/src/components/title.tsx b/web/src/components/title.tsx deleted file mode 100644 index 1bff706d..00000000 --- a/web/src/components/title.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { createEffect, onCleanup } from 'solid-js'; -import { createMutable } from 'solid-js/store'; - -const originalTitle = document.title; -const titleStack = createMutable([() => originalTitle]); -createEffect(() => { - /* console.debug('Updating title stack', titleStack); */ - document.title = titleStack.map((x) => x()).join(' :: '); -}); - -interface TitleProps { - children: string; -} -export const Title = (props: TitleProps) => { - /* console.debug('Adding to title stack', props.children); */ - const getTitle = () => props.children; - // titleStack is consumed in a reactive context, so this is valid - // eslint-disable-next-line solid/reactivity - titleStack.push(getTitle); - onCleanup(() => { - /* console.debug(`Removing from title stack`, props.children); */ - const stackEntryIndex = titleStack.indexOf(getTitle); - if (stackEntryIndex === -1) { - throw new Error( - `Title stack entry for ${props.children} could not be found`, - ); - } - titleStack.splice(stackEntryIndex, 1); - }); - return <>; -}; diff --git a/web/src/fonts.css b/web/src/fonts.css deleted file mode 100644 index 6b06ead2..00000000 --- a/web/src/fonts.css +++ /dev/null @@ -1,23 +0,0 @@ -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url('static/fonts/Inter-Regular.woff2') format('woff2'); -} - -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url('static/fonts/Inter-Medium.woff2') format('woff2'); -} - -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url('static/fonts/Inter-Bold.woff2') format('woff2'); -} diff --git a/web/src/lib.rs b/web/src/lib.rs deleted file mode 100644 index 55c7e676..00000000 --- a/web/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub const INDEX_HTML: &str = include_str!(concat!(env!("OUT_DIR"), "/vite-dist/index.html")); -pub const ASSETS: phf::Map<&str, &[u8]> = include!(concat!(env!("OUT_DIR"), "/vite-asset-map.rs")); diff --git a/web/src/localization/README.md b/web/src/localization/README.md deleted file mode 100644 index f84736ec..00000000 --- a/web/src/localization/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Cockpit Localization - -We use [Fluent](https://projectfluent.org/) to power our translations. - -Each translation is stored as a file in the `locale/` folder, following the naming convention `locale/{langtag}.ftl`, where -`{langtag}` IETF language tag (for example: `en` for "generic english", or `en-US` for "US english"). - -Translation keys are named according using `kebab-case`, with `--` used as the hierarchy separator (for example: -`category--long-key`). diff --git a/web/src/localization/index.tsx b/web/src/localization/index.tsx deleted file mode 100644 index a66dea6b..00000000 --- a/web/src/localization/index.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { FluentBundle, FluentResource, FluentVariable } from '@fluent/bundle'; -import { mapBundleSync } from '@fluent/sequence'; -import { negotiateLanguages } from '@fluent/langneg'; -import { JSX, createContext, createMemo, useContext } from 'solid-js'; -import { createLocalStorageSignal } from '../utils/localstorage'; -import { Option } from '../types'; - -const fluentTranslationFiles = import.meta.glob('./locale/*.ftl', { - eager: true, - as: 'raw', -}); -const translationBundles = Object.fromEntries( - Object.entries(fluentTranslationFiles).map(([fileName, ftl]) => { - const localeName = fileName.replace( - /^.*\/(.+)\..*$/, - (_, locale: string) => locale, - ); - - const resource = new FluentResource(ftl); - const bundle = new FluentBundle(localeName); - const errors = bundle.addResource(resource); - if (errors.length > 0) { - throw new Error( - `Failed to load translation bundle ${fileName} as ${localeName}`, - { cause: errors[0] }, - ); - } - - return [localeName, bundle]; - }), -); - -const FALLBACK_LOCALE = 'en'; -interface LanguageContext { - activeLocales(): string[]; - setUserLocale(language: Option): void; - availableLocales(): Record; -} -const LanguageContext = createContext(); -export const requireLanguageContext = () => { - const langContext = useContext(LanguageContext); - if (langContext === undefined) { - throw new Error( - 'LanguageContext is required but no LanguageProvider is currently active', - ); - } - return langContext; -}; - -export const LanguageProvider = (props: { children: JSX.Element }) => { - const [userLanguage, setUserLocale] = - createLocalStorageSignal('user.language'); - const activeLocales = createMemo(() => - userLanguage().mapOrElse( - () => - negotiateLanguages( - navigator.languages, - Object.keys(translationBundles), - { - defaultLocale: FALLBACK_LOCALE, - }, - ), - (ul) => [ul, FALLBACK_LOCALE], - ), - ); - return ( - translationBundles, - }} - > - {props.children} - - ); -}; - -export const translate = ( - translatableName: string, - variables?: Record, - options?: { overrideLocales?: string[] }, -) => { - const context = requireLanguageContext(); - const localeChain = options?.overrideLocales ?? context.activeLocales(); - - const bundle = mapBundleSync( - localeChain.map((locale) => translationBundles[locale]), - translatableName, - ); - if (bundle === null) { - console.error( - `No translation found for ${translatableName} (locale chain: ${localeChain.toString()})`, - ); - return `#${translatableName}#`; - } - - const pattern = bundle.getMessage(translatableName)?.value; - if (pattern === undefined || pattern === null) { - throw new Error( - `Translation pattern for ${translatableName} has no value (in bundle ${bundle.locales.toString()})`, - ); - } - - return bundle.formatPattern(pattern, variables); -}; diff --git a/web/src/localization/locale/de.ftl b/web/src/localization/locale/de.ftl deleted file mode 100644 index 3ba1e668..00000000 --- a/web/src/localization/locale/de.ftl +++ /dev/null @@ -1,18 +0,0 @@ -locale-name = Deutsch - -refresh = Aktualisieren - -stacklet--list = Stacklets -stacklet--add = Stacklet hinzufügen - -stacklet--product = Produkt -stacklet--namespace = Namensraum -stacklet--name = Name -stacklet--endpoints = Endpunkte -stacklet--status = Status - -login--log-in = Anmelden -login--log-out = Abmelden -login--username = Nutzername -login--password = Passwort -login--logging-in = Anmelden... diff --git a/web/src/localization/locale/en.ftl b/web/src/localization/locale/en.ftl deleted file mode 100644 index 43f8c504..00000000 --- a/web/src/localization/locale/en.ftl +++ /dev/null @@ -1,18 +0,0 @@ -locale-name = English - -refresh = Refresh - -stacklet--list = Stacklets -stacklet--add = Add Stacklet - -stacklet--product = Product -stacklet--namespace = Namespace -stacklet--name = Name -stacklet--endpoints = Endpoints -stacklet--status = Status - -login--log-in = Log in -login--log-out = Log out -login--username = Username -login--password = Password -login--logging-in = Logging in... diff --git a/web/src/localization/locale/sv.ftl b/web/src/localization/locale/sv.ftl deleted file mode 100644 index 021b8976..00000000 --- a/web/src/localization/locale/sv.ftl +++ /dev/null @@ -1,18 +0,0 @@ -locale-name = Svenska - -refresh = Ladda om - -stacklet--list = Stackletar -stacklet--add = Lägg till Stacklet - -stacklet--product = Produkt -stacklet--namespace = Namnrymd -stacklet--name = Namn -stacklet--endpoints = Endpoints -stacklet--status = Status - -login--log-in = Logga in -login--log-out = Logga ut -login--username = Användarnamn -login--password = Lösenord -login--logging-in = Loggar in... diff --git a/web/src/main.tsx b/web/src/main.tsx deleted file mode 100644 index 05fb70ba..00000000 --- a/web/src/main.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import '@unocss/reset/sanitize/sanitize.css'; -import 'virtual:uno.css'; -import { render } from 'solid-js/web'; -import { Navigate, Route, Router, Routes } from '@solidjs/router'; -import { Header } from './components/header'; -import { StackletConnectionDetails } from './pages/stacklets/connect'; -import { Stacklets } from './pages/stacklets/list'; -import { LoginPageOr } from './pages/login'; -import { LanguageProvider } from './localization'; -import { attachDevtoolsOverlay } from '@solid-devtools/overlay'; - -attachDevtoolsOverlay(); - -const App = () => { - return ( -
    - -
    -
    - - - - } /> - -
    - -
    - ); -}; - -const root = document.querySelector('#app'); -if (root == undefined) { - throw new Error( - 'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got mispelled?', - ); -} else { - render( - () => ( - - - - - - ), - root, - ); -} diff --git a/web/src/pages/login.tsx b/web/src/pages/login.tsx deleted file mode 100644 index 98189dd1..00000000 --- a/web/src/pages/login.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { - JSX, - Show, - createResource, - createSignal, - createUniqueId, - untrack, -} from 'solid-js'; -import logo from '../resources/logo.png'; -import { isLoggedIn, logIn, validateSessionOrLogOut } from '../api/session'; -import { Button } from '../components/button'; -import { translate } from '../localization'; - -interface LoginPageOrProps { - children: JSX.Element; -} -export const LoginPageOr = (props: LoginPageOrProps) => { - // Validate the session when loading, but there's little to no point re-validating - // when the user has just logged in. - untrack(() => validateSessionOrLogOut()); - return ( - }> - {props.children} - - ); -}; - -export const LoginPage = () => { - const [username, setUsername] = createSignal(''); - const [password, setPassword] = createSignal(''); - const [currentAttempt, setCurrentAttempt] = createSignal( - Promise.resolve(undefined), - ); - // Create attempts imperatively, use createResource to render the results - const [loginMessage] = createResource( - () => currentAttempt(), - (attempt) => attempt, - ); - const clickLogin = () => { - void setCurrentAttempt(() => logIn(username(), password())); - }; - const usernameId = createUniqueId(); - const passwordId = createUniqueId(); - return ( -
    -
    -

    - Stackable -

    -

    {translate('login--log-in')}

    -
    - - setUsername(event.target.value)} - /> - - setPassword(event.target.value)} - /> -
    - -
    {translate('login--logging-in')}
    -
    - -
    {loginMessage()}
    -
    - -
    -
    -
    -
    - ); -}; diff --git a/web/src/pages/stacklets/connect.tsx b/web/src/pages/stacklets/connect.tsx deleted file mode 100644 index 30026d37..00000000 --- a/web/src/pages/stacklets/connect.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { - For, - Match, - Show, - Switch, - createResource, - createUniqueId, -} from 'solid-js'; -import { DiscoveryFieldType, getStackletDiscovery } from '../../api/stacklets'; -import { Params, useParams } from '@solidjs/router'; - -interface StackletConnectionDetailsParams extends Params { - namespace: string; - name: string; -} - -export const StackletConnectionDetails = () => { - const params = useParams(); - const [discoveryConfig, { refetch }] = createResource(() => - getStackletDiscovery(params.namespace, params.name), - ); - const configParams = () => { - const currentDiscoveryConfig = discoveryConfig(); - const data = currentDiscoveryConfig?.data || {}; - const types = currentDiscoveryConfig?.fieldTypes || {}; - return Object.keys(data) - .sort() - .map((key) => ({ key, value: data[key], type: types[key] || 'blob' })); - }; - return ( - <> - - Loading... -
      - - {(item) => ( -
    • - -
    • - )} -
      -
    - - ); -}; - -interface FieldProps { - label: string; - value: string; - type: DiscoveryFieldType; -} - -const Field = (props: FieldProps) => { - const dataFieldId = createUniqueId(); - return ( - - - {props.label} - - {/* Fall back to rendering as blob if unknown */} - - - - - - ); -}; diff --git a/web/src/pages/stacklets/list.module.css b/web/src/pages/stacklets/list.module.css deleted file mode 100644 index b37c87af..00000000 --- a/web/src/pages/stacklets/list.module.css +++ /dev/null @@ -1,6 +0,0 @@ -.inline-list-item { - display: inline; -} -.inline-list-item:not(:last-child)::after { - content: ', '; -} diff --git a/web/src/pages/stacklets/list.tsx b/web/src/pages/stacklets/list.tsx deleted file mode 100644 index 243f17f0..00000000 --- a/web/src/pages/stacklets/list.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { For, Show, createResource } from 'solid-js'; -import { DisplayCondition, getStacklets } from '../../api/stacklets'; -import { DataTable } from '../../components/datatable'; -import styles from './list.module.css'; -import { translate } from '../../localization'; - -export const Stacklets = () => { - const [stacklets, { refetch }] = createResource(getStacklets); - return ( - <> - x.product, - sortBy: (x) => x.product, - }, - { - label: translate('stacklet--namespace'), - get: (x) => x.namespace || '(Cluster-scoped)', - sortBy: (x) => x.namespace || '', - }, - { - label: translate('stacklet--name'), - get: (x) => x.name, - sortBy: (x) => x.name, - }, - { - label: translate('stacklet--endpoints'), - get: (x) => , - }, - { - label: translate('stacklet--status'), - get: (x) => , - }, - /* { - label: 'Actions', - get: (x) => ( - - Connect - - ), - }, */ - ]} - extraButtons={ - <> - {/* - {translate('stacklet--add')} - */} - - } - refresh={refetch} - isLoading={stacklets.loading} - /> - - ); -}; - -const StackletConditions = (props: { conditions: DisplayCondition[] }) => ( -
      - - {(cond) => ( -
    • - -
    • - )} -
      -
    -); - -const StackletCondition = (props: { condition: DisplayCondition }) => ( - - {props.condition.condition} - -); - -const StackletEndpoints = (props: { - endpoints: { [key: string]: string | undefined }; -}) => ( -
      - - {(item) => ( -
    • - - {item[0]}: {item[1]} - - } - > - - {item[0]} - - -
    • - )} -
      -
    -); diff --git a/web/src/resources/logo.png b/web/src/resources/logo.png deleted file mode 100644 index 49c633b1fef41a2391134b3459e184939e9e3a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6125 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 { - /** - * Returns true if the option is a `Some` value. - * - * @returns boolean - */ - isSome(): this is Some; - - /** - * Returns true if the option is a `Some` and the value inside of it matches - * a predicate. - * - * @param fn Predicate to match - * @returns boolean - */ - isSomeAnd(fn: (value: Readonly) => boolean): this is Some; - - /** - * Returns true if the option is a `None` value. - * - * @returns boolean - */ - isNone(): this is None; - - match(matcher: { some: (value: Readonly) => T; none: () => T }): T; - - /** - * Maps an `Option` to `Option` by applying a function to a contained - * value (if `Some`) or returns `None` (if `None`). - * - * @param fn Mapping function. - * @returns The mapped option. - */ - map(fn: (value: Readonly) => T): Option; - - /** - * Returns the provided default result (if none), or applies a function to - * the contained value (if any). - * - * @param defaultValue The default value if `None`. - * @param fn The mapping function. - */ - mapOr(defaultValue: T, fn: (value: Readonly) => T): T; - - /** - * Computes a default function result (if none), or applies a different - * function to the contained value (if any). - * - * @param defaultFn Closure computing the default value if `None`. - * @param fn The mapping function. - */ - mapOrElse(defaultFn: () => T, fn: (value: Readonly) => T): T; - - /** - * Transforms the `Option` into a `Result`, mapping `Some(v)` to - * `Ok(v)` and `None` to `Err(err)`. - * - * @param error The error value if `None`. - * @returns The transformed result. - */ - okOr(error: E): Result; - - /** - * Transforms the `Option` into a `Result`, mapping `Some(v)` to - * `Ok(v)` and `None` to `Err(err())`. - * - * @param err Closure to compute the error value if `None`. - * @returns The transformed result. - */ - okOrElse(err: () => E): Result; - - /** - * Returns `None` if the option is `None`, otherwise returns `other`. - * - * @param other The other option if `Some`. - * @returns Either `None` or the `other` option. - */ - and(other: Option): Option; - - /** - * Returns `None` if the option is `None`, otherwise calls `fn` with the - * wrapped value and returns the result. - * - * @param fn The function which produces the other option if `Some`. - * @returns Either `None` or the computed other option. - */ - andThen(fn: (value: Readonly) => Option): Option; - - /** - * Returns `None` if the option is `None`, otherwise calls `predicate` with - * the wrapped value and returns: - * - * - `Some(t)` if predicate returns true (where t is the wrapped value), and - * - `None` if predicate returns false. - * - * @param predicate The filter function. - * @returns `Some` if the filter function returned true, otherwise `None`. - */ - filter(predicate: (value: Readonly) => boolean): Option; - - /** - * Returns the option if it contains a value, otherwise returns `other`. - * - * @param other The `other` option if `None`. - * @returns Either this or `other`. - */ - or(other: Option): Option; - - /** - * Returns the option if it contains a value, otherwise calls `fn` and returns - * the result. - * - * @param fn Function to compute the other option. - * @returns Either this or the other computed option. - */ - orElse(fn: () => Option): Option; - - /** - * Returns `Some` if exactly one of self, `other` is `Some`, otherwise returns - * `None`. - * - * @param other The other option. - */ - xor(other: Option): Option; - - /** - * Returns true if the option is a `Some` value containing the given `value`. - * - * @param value The value to match `Some(value)`. - * @returns boolean - */ - contains(value: S): boolean; - - /** - * Zips `self` with another `Option`. - * - * If `self` is `Some(s)` and other is `Some(o)`, this method returns - * `Some([s, o])`. Otherwise, `None` is returned. - * - * @param other The other option to zip with. - * @returns The zipped option or `None`. - */ - zip(other: Option): Option<[S, T]>; - - /** - * Zips `self` and another `Option` with function `fn`. - * - * If `self` is `Some(s)` and other is `Some(o)`, this method returns - * `Some(fn(s, o))`. Otherwise, `None` is returned. - * - * @param other The other option to zip with. - * @param fn Function which get's applied to the zipped values. - * @returns The zipped and transformed option or `None`. - */ - zipWith(other: Option, fn: (self: S, other: T) => K): Option; - - /** - * Returns the contained `Some` value. - * - * Because this function may throw, its use is generally discouraged. Instead, - * prefer to use pattern matching and handle the `None` case explicitly, or - * call `unwrap_or` or `unwrap_or_else`. - * - * @returns The contained `Some` value. - * - * @throws Throws if the self value equals `None`. - */ - unwrap(): S; - - /** - * Returns the contained `Some` value or a provided default. - * - * @param defaultValue Default value returned when `None`. - * @returns Either contained `Some` value of `defaultValue`. - */ - unwrapOr(defaultValue: T): S | T; - - /** - * Returns the contained `Some` value or computes it from a closure. - * - * @param fn Closure to compute default value. - */ - unwrapOrElse(fn: () => T): S | T; - - /** - * Returns the contained Some value - * - * ### Recommended Message Style - * - * We recommend that `expect` messages are used to describe the reason you - * expect the `Option` should be `Some`. - * - * **Hint:** If you’re having trouble remembering how to phrase expect error - * messages remember to focus on the word “should” as in “env variable should - * be set by blah” or “the given binary should be available and executable by - * the current user”. - * - * @param message Error message. - * @returns The contained `Some` value. - * - * @throws Throws if the value is a `None` with a custom panic message - * provided by `msg`. - */ - expect(message: string): S; -} - -class NoneImpl implements BaseOption { - isSome(): this is Some { - return false; - } - - isSomeAnd(_fn: (value: never) => boolean): this is Some { - return false; - } - - isNone(): this is None { - return true; - } - - match(matcher: { none: () => T }): T { - return matcher.none(); - } - - map(_fn: (value: never) => T): None { - return None; - } - - mapOr(defaultValue: T, _fn: (value: never) => T): T { - return defaultValue; - } - - mapOrElse(defaultFn: () => T, _fn: (value: never) => T): T { - return defaultFn(); - } - - okOr(error: E): Result { - return Err(error); - } - - okOrElse(err: () => E): Result { - return Err(err()); - } - - and(_other: Option): None { - return None; - } - - andThen(_fn: (value: never) => Option): None { - return None; - } - - filter(_predicate: (value: never) => boolean): None { - return None; - } - - or(other: Option): Option { - return other; - } - - orElse(fn: () => Option): Option { - return fn(); - } - - xor(other: Option): Option { - return other.isSome() ? other : None; - } - - contains(_value: never): false { - return false; - } - - zip(_other: Option): None { - return None; - } - - zipWith(_other: Option, _fn: (self: never, other: T) => K): None { - return None; - } - - unwrap(): never { - return this.expect('called `Option::unwrap()` on a `None` value'); - } - - unwrapOr(defaultValue: T): T { - return defaultValue; - } - - unwrapOrElse(fn: () => T): T { - return fn(); - } - - expect(message: string): never { - throw new Error(message); - } -} - -export const None = new NoneImpl(); -export type None = NoneImpl; -Object.freeze(None); - -class SomeImpl implements BaseOption { - constructor(public value: S) {} - - isSome(): this is Some { - return true; - } - - isSomeAnd(op: (value: Readonly) => boolean): this is Some { - return op(this.value); - } - - isNone(): this is None { - return false; - } - - match(matcher: { some: (value: Readonly) => T }): T { - // See - // - https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1947 - // - https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1946 - // - https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1940 - - // eslint-disable-next-line unicorn/no-array-callback-reference - return matcher.some(this.value); - } - - map(fn: (value: Readonly) => T): Some { - return Some(fn(this.value)); - } - - mapOr(_defaultValue: T, fn: (value: Readonly) => T): T { - return fn(this.value); - } - - mapOrElse(_defaultFn: () => T, fn: (value: Readonly) => T): T { - return fn(this.value); - } - - okOr(_error: E): Result { - return Ok(this.value); - } - - okOrElse(_err: () => E): Result { - return Ok(this.value); - } - - and(other: Option): typeof other { - return other; - } - - andThen(fn: (value: Readonly) => Option): Option { - return fn(this.value); - } - - filter(predicate: (value: Readonly) => boolean): Option { - return predicate(this.value) ? this : None; - } - - or(_other: Option): Some { - return this; - } - - orElse(_fn: () => Option): Some { - return this; - } - - xor(other: Option): Option { - return other.isNone() ? this : None; - } - - contains(value: S): boolean { - return this.value === value; - } - - zip(other: Option): Option<[S, T]> { - return other.map((otherValue) => [this.value, otherValue]); - } - - zipWith(other: Option, fn: (self: S, other: T) => K): Option { - return other.map((otherValue) => fn(this.value, otherValue)); - } - - unwrap(): S { - return this.value; - } - - unwrapOr(_defaultValue: T): S { - return this.value; - } - - unwrapOrElse(_fn: () => T): S { - return this.value; - } - - expect(_message: string): S { - return this.value; - } -} - -export const Some = (value: T) => new SomeImpl(value); -export type Some = SomeImpl; - -export type Option = Some | None; - -export function someIfDefined(value: T | undefined): Option { - return value === undefined ? None : Some(value); -} -export function someIfNotNull(value: T | null): Option { - return value === null ? None : Some(value); -} diff --git a/web/src/types/result.ts b/web/src/types/result.ts deleted file mode 100644 index 5cbd4083..00000000 --- a/web/src/types/result.ts +++ /dev/null @@ -1,330 +0,0 @@ -import { None, Option, Some } from './option'; -import { ToString } from './utils'; - -interface BaseResult { - /** - * Returns true if the result is `Ok`. - * - * @returns boolean - */ - isOk(): this is Ok; - - /** - * Returns `true` if the result is `Ok` and the value inside of it matches - * a predicate. - * - * @param fn Predicate to match. - * @returns boolean - */ - isOkAnd(fn: (value: Readonly) => boolean): this is Ok; - - /** - * Returns `true` if the result is `Err`. - * - * @returns boolean - */ - isErr(): this is Err; - - /** - * Returns `true` if the result is `Err` and the value inside of it matches - * a predicate. - * - * @param fn Predicate to match. - * @returns boolean - */ - isErrAnd(fn: (error: Readonly) => boolean): this is Err; - - match(matcher: { - ok: (value: Readonly) => T; - err: (error: Readonly) => K; - }): T | K; - - /** - * Returns the contained `Ok` value. - * - * Because this function may throw, its use is generally discouraged. Instead, - * prefer to use pattern matching and handle the `Err` case explicitly, or - * call `unwrap_or` or `unwrap_or_else`. - * - * @returns The contained `Ok` value. - * - * @throws Throws if the value is an `Err`, with a panic message provided by - * the `Err`'s value. - */ - unwrap(): O; - - /** - * Returns the contained `Err` value. - * - * @returns The contained `Err` value. - * - * @throws Throws if the value is an `Ok`, with a custom panic message - * provided by the `Ok`'s value. - */ - unwrapErr(): E; - - /** - * Returns the contained `Ok` value or a provided default. - * - * @param defaultValue The default value if `Err`. - * @returns Either contained `Ok` value of default value. - */ - unwrapOr(defaultValue: O): O; - - /** - * Returns the contained `Ok` value or computes it from a closure. - * - * @param fn Computed the default value if `Err`. - * @returns The contained `Ok` value or computed default value. - */ - unwrapOrElse(fn: (error: Readonly) => O): O; - - /** - * Converts from `Result` to `Option`. Converts self into an - * `Option` and discarding the error, if any. - * - * @returns The converted option. - */ - ok(): Option; - - /** - * Converts from `Result` to `Option`. Converts self into an - * `Option` and discarding the success value, if any. - * - * @returns The converted option. - */ - err(): Option; - - /** - * Maps a `Result` to `Result` by applying a function to a - * contained `Ok` value, leaving an `Err` value untouched. - * - * This function can be used to compose the results of two functions. - * - * @param fn The mapping function. - * @returns The mapped result. - */ - map(fn: (value: Readonly) => T): Result; - - /** - * Returns the provided default (if `Err`), or applies a function to the - * contained value (if `Ok`). - * - * @param defaultValue The default value of `Err`. - * @param fn The mapping function if `Ok`. - * @returns The mapped result. - */ - mapOr(defaultValue: T, fn: (value: Readonly) => T): T; - - /** - * Maps a `Result` to `T` by applying fallback function default to a - * contained `Err` value, or function `fn` to a contained `Ok` value. - * - * This function can be used to unpack a successful result while handling - * an error. - * - * @param defaultFn Function computing the default value if `Err`. - * @param fn Mapping function if `Ok`. - * @returns The mapped value. - */ - mapOrElse( - defaultFn: (error: Readonly) => T, - fn: (value: Readonly) => T, - ): T; - - /** - * Maps a `Result` to `Result` by applying a function to a - * contained `Err` value, leaving an `Ok` value untouched. - * - * This function can be used to pass through a successful result while - * handling an error. - * - * @param fn Error mapping function. - * @returns The mapped result. - */ - mapErr(fn: (error: Readonly) => T): Result; - - /** - * Returns the contained `Ok` value. - * - * Because this function may throw, its use is generally discouraged. Instead, - * prefer to use pattern matching and handle the `Err` case explicitly, or - * call `unwrap_or` or `unwrap_or_else`. - * - * @param message Error message. - * @returns The contained `Ok` value. - * - * @throws Throws if the value is an `Err`, with a panic message including the - * passed message, and the content of the `Err`. - */ - expect(message: string): O; - - /** - * Returns the contained `Err` value. - * - * @param message Error message. - * @returns The contained `Err` value. - * - * @throws Throws if the value is an `Ok`, with an error message including the - * passed message, and the content of the `Ok`. - */ - expectErr(message: string): E; -} - -export class OkImpl implements BaseResult { - constructor(public value: O) {} - - isOk(): this is Ok { - return true; - } - - isOkAnd(fn: (value: Readonly) => boolean): this is Ok { - return fn(this.value); - } - - isErr(): this is Err { - return false; - } - - isErrAnd(_fn: (error: Readonly) => boolean): this is Err { - return false; - } - - match(matcher: { ok: (value: Readonly) => T }): T { - return matcher.ok(this.value); - } - - unwrap(): O { - return this.value; - } - - unwrapErr(): never { - return this.expectErr('called `Result.unwrapErr()` on an `Ok` value'); - } - - unwrapOr(_defaultValue: O): O { - return this.value; - } - - unwrapOrElse(_fn: (error: Readonly) => O): O { - return this.value; - } - - ok(): Option { - return Some(this.value); - } - - err(): None { - return None; - } - - map(fn: (value: Readonly) => T): Result { - return Ok(fn(this.value)); - } - - mapOr(_defaultValue: T, fn: (value: Readonly) => T): T { - return fn(this.value); - } - - mapOrElse( - _defaultFn: (error: Readonly) => T, - fn: (value: Readonly) => T, - ): T { - return fn(this.value); - } - - mapErr(_fn: (error: Readonly) => T): Result { - return Ok(this.value); - } - - expect(_message: string): O { - return this.value; - } - - expectErr(message: string): never { - throw new Error(`${message}`); - } -} - -export const Ok = (value: O) => new OkImpl(value); -export type Ok = OkImpl; - -class ErrImpl implements BaseResult { - constructor(public error: E) {} - - isOk(): this is Ok { - return false; - } - - isOkAnd(_fn: (value: never) => boolean): this is Ok { - return false; - } - - isErr(): this is Err { - return true; - } - - isErrAnd(fn: (error: Readonly) => boolean): this is Err { - return fn(this.error); - } - - match(matcher: { err: (error: Readonly) => K }): T | K { - return matcher.err(this.error); - } - - unwrap(): never { - return this.expect('called `Result.unwrap()` on an `Err` value'); - } - - unwrapErr(): E { - return this.error; - } - - unwrapOr(defaultValue: T): T { - return defaultValue; - } - - unwrapOrElse(fn: (error: Readonly) => T): T { - return fn(this.error); - } - - ok(): Option { - return None; - } - - err(): Option { - return Some(this.error); - } - - map(_fn: (value: never) => T): Result { - return Err(this.error); - } - - mapOr(defaultValue: T, _fn: (value: never) => T): T { - return defaultValue; - } - - mapOrElse( - defaultFn: (error: Readonly) => T, - _fn: (value: never) => T, - ): T { - return defaultFn(this.error); - } - - mapErr(fn: (error: Readonly) => T): Result { - return Err(fn(this.error)); - } - - expect(message: string): never { - throw new Error(`${message}`); - } - - expectErr(_message: string): E { - return this.error; - } -} - -export const Err = (error: E) => new ErrImpl(error); -export type Err = ErrImpl; - -export type Result = Ok | Err; diff --git a/web/src/types/utils.ts b/web/src/types/utils.ts deleted file mode 100644 index f2c7bcba..00000000 --- a/web/src/types/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ToString { - toString(): string; -} diff --git a/web/src/utils/localstorage.ts b/web/src/utils/localstorage.ts deleted file mode 100644 index 5caf05ee..00000000 --- a/web/src/utils/localstorage.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Signal, createEffect, createRoot, createSignal } from 'solid-js'; -import { Option, someIfNotNull } from '../types'; - -function createStorageSignal( - storage: Storage, - name: string, -): Signal> { - const [value, setValue] = createSignal>( - someIfNotNull(storage.getItem(name)), - ); - // The session writer effect's lifecycle should be tied to that of the signal - createRoot(() => { - createEffect(() => { - value().match({ - none: () => storage.removeItem(name), - some: (currentValue) => storage.setItem(name, currentValue), - }); - }); - }); - return [value, setValue]; -} - -export function createLocalStorageSignal(name: string): Signal> { - return createStorageSignal(localStorage, name); -} diff --git a/web/src/vite-env.d.ts b/web/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/web/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/web/tests/option.test.ts b/web/tests/option.test.ts deleted file mode 100644 index ca5b925a..00000000 --- a/web/tests/option.test.ts +++ /dev/null @@ -1,241 +0,0 @@ -/* eslint-disable unicorn/prevent-abbreviations */ -import { assert, describe, it } from 'vitest'; -import { Err, None, Ok, Some } from '../src/types'; - -describe('option tests', () => { - it('option isSome', () => { - const option = Some('foo'); - - assert.isTrue(option.isSome()); - assert.isFalse(option.isNone()); - }); - - it('option isSomeAnd', () => { - const option = Some('foo'); - - assert.isTrue(option.isSomeAnd((value) => value.length === 3)); - assert.isFalse(option.isSomeAnd((value) => value.length === 2)); - assert.isFalse(option.isNone()); - }); - - it('option isNone', () => { - const option = None; - - assert.isFalse(option.isSome()); - assert.isTrue(option.isNone()); - }); - - it('option map', () => { - const optionA = Some('foo'); - assert.deepEqual( - optionA.map((value) => value.length), - Some(3), - ); - - const optionB = None; - assert.deepEqual( - optionB.map(() => 3), - None, - ); - }); - - it('option mapOr', () => { - const optionA = Some('foo'); - assert.equal( - optionA.mapOr(2, (value) => value.length), - 3, - ); - - const optionB = None; - assert.equal( - optionB.mapOr(2, () => 3), - 2, - ); - }); - - it('option mapOrElse', () => { - const optionA = Some('foo'); - assert.equal( - optionA.mapOrElse( - () => 2, - (value) => value.length, - ), - 3, - ); - - const optionB = None; - assert.equal( - optionB.mapOrElse( - () => 2, - () => 3, - ), - 2, - ); - }); - - it('option okOr', () => { - const optionA = Some('foo'); - assert.deepEqual(optionA.okOr('Error'), Ok('foo')); - - const optionB = None; - assert.deepEqual(optionB.okOr('Error'), Err('Error')); - }); - - it('option okOrElse', () => { - const optionA = Some('foo'); - assert.deepEqual( - optionA.okOrElse(() => 'Error'), - Ok('foo'), - ); - - const optionB = None; - assert.deepEqual( - optionB.okOrElse(() => 'Error'), - Err('Error'), - ); - }); - - it('option and', () => { - const optionA = Some('foo'); - assert.deepEqual(optionA.and(Some('bar')), Some('bar')); - - const optionB = None; - assert.deepEqual(optionB.and(Some('var')), None); - }); - - it('option andThen', () => { - const optionA = Some('foo'); - assert.deepEqual( - optionA.andThen((value) => Some(value.length)), - Some(3), - ); - - const optionB = Some('foo'); - assert.deepEqual( - optionB.andThen(() => None), - None, - ); - - const optionC = None; - assert.deepEqual( - optionC.andThen(() => Some(3)), - None, - ); - }); - - it('option filter', () => { - const optionA = Some('foo'); - assert.deepEqual( - optionA.filter((value) => value.length === 3), - Some('foo'), - ); - - const optionB = Some('foo'); - assert.deepEqual( - optionB.filter((value) => value.length === 2), - None, - ); - - const optionC = None; - assert.deepEqual( - optionC.filter(() => true), - None, - ); - }); - - it('option or', () => { - const optionA = Some('foo'); - const optionAOr = optionA.or(Some('bar')); - - assert.deepEqual(optionAOr, Some('foo')); - - const optionB = None; - const optionBOr = optionB.or(Some('bar')); - - assert.deepEqual(optionBOr, Some('bar')); - }); - - it('option orElse', () => { - const optionA = Some('foo'); - const optionAOr = optionA.orElse(() => Some('bar')); - - assert.deepEqual(optionAOr, Some('foo')); - - const optionB = None; - const optionBOr = optionB.orElse(() => Some('bar')); - - assert.deepEqual(optionBOr, Some('bar')); - }); - - it('option xor', () => { - const optionA = Some('foo'); - const someA = optionA.xor(None); - const noneA = optionA.xor(Some('bar')); - - assert.deepEqual(someA, Some('foo')); - assert.deepEqual(noneA, None); - - const optionB = None; - const noneB = optionB.xor(None); - const someB = optionB.xor(Some('bar')); - - assert.deepEqual(noneB, None); - assert.deepEqual(someB, Some('bar')); - }); - - it('option contains', () => { - const optionA = Some('foo'); - assert.isTrue(optionA.contains('foo')); - - const optionB = Some('foo'); - assert.isFalse(optionB.contains('bar')); - }); - - it('option zip', () => { - const option = Some('foo'); - const zipped = option.zip(Some(3)); - assert.deepEqual(zipped.unwrap(), ['foo', 3]); - - const zippedNone = option.zip(None); - assert.deepEqual(zippedNone, None); - }); - - it('option zipWith', () => { - const option = Some('foo'); - const zipped = option.zipWith(Some(3), (str, num) => str.repeat(num)); - assert.deepEqual(zipped, Some('foofoofoo')); - - const zippedNone = option.zipWith(None, () => 'bar'); - assert.deepEqual(zippedNone, None); - }); - - it('option unwrap', () => { - const option = Some('foo'); - assert.equal(option.unwrap(), 'foo'); - - const optionNone = None; - assert.throw(() => optionNone.unwrap()); - }); - - it('option unwrapOr', () => { - const optionA = Some('foo'); - assert.equal(optionA.unwrapOr('bar'), 'foo'); - - const optionB = None; - assert.equal(optionB.unwrapOr(3), 3); - }); - - it('option unwrapOrElse', () => { - const optionA = Some('foo'); - assert.equal( - optionA.unwrapOrElse(() => 3), - 'foo', - ); - - const optionB = None; - assert.equal( - optionB.unwrapOrElse(() => 3), - 3, - ); - }); -}); diff --git a/web/tests/result.test.ts b/web/tests/result.test.ts deleted file mode 100644 index ca5ed15f..00000000 --- a/web/tests/result.test.ts +++ /dev/null @@ -1,126 +0,0 @@ -/* eslint-disable unicorn/prevent-abbreviations */ -import { assert, describe, it } from 'vitest'; - -import { Err, None, Ok, Some } from '../src/types'; - -describe('result tests', () => { - it('result isOk', () => { - const result = Ok('foo'); - - assert.equal(result.isOk(), true); - assert.equal(result.isErr(), false); - }); - - it('result isOkAnd', () => { - const result = Ok('foo'); - - assert.equal( - result.isOkAnd((value) => value.length === 3), - true, - ); - assert.equal( - result.isOkAnd((value) => value.length === 2), - false, - ); - }); - - it('result ok', () => { - const result = Ok('foo'); - - assert.deepEqual(result.ok(), Some('foo')); - assert.deepEqual(result.err(), None); - }); - - it('result map', () => { - const result = Ok('foo'); - const mapped = result.map((value) => value.length); - - assert.equal(mapped.unwrap(), 3); - }); - - it('result isErr', () => { - const result = Err('foo'); - - assert.equal(result.isErr(), true); - assert.equal(result.isOk(), false); - }); - - it('result isErrAnd', () => { - const result = Err('foo'); - - assert.equal( - result.isErrAnd((error) => error.length === 3), - true, - ); - assert.equal( - result.isErrAnd((error) => error.length === 2), - false, - ); - }); - - it('result err', () => { - const result = Err('foo'); - - assert.deepEqual(result.err(), Some('foo')); - assert.deepEqual(result.ok(), None); - }); - - it('result map', () => { - const result = Ok('foo'); - const mapped = result.map((value) => value.length); - - assert.isTrue(result.isOk()); - assert.isTrue(mapped.isOk()); - - assert.equal(result.unwrap(), 'foo'); - assert.equal(mapped.unwrap(), 3); - }); - - it('result mapOr', () => { - const resultA = Ok('foo'); - const mappedA = resultA.mapOr(2, (value) => value.length); - - assert.isTrue(resultA.isOk()); - assert.equal(mappedA, 3); - - const resultB = Err('bar'); - const mappedB = resultB.mapOr(2, () => 3); - - assert.isTrue(resultB.isErr()); - assert.equal(mappedB, 2); - }); - - it('result mapOrElse', () => { - const resultA = Ok('foo'); - const mappedA = resultA.mapOrElse( - () => 2, - (value) => value.length, - ); - - assert.isTrue(resultA.isOk()); - assert.equal(mappedA, 3); - - const resultB = Err('bar'); - const mappedB = resultB.mapOrElse( - (err) => err.length, - () => 2, - ); - - assert.isTrue(resultB.isErr()); - assert.equal(mappedB, 3); - }); - - it('result mapErr', () => { - const resultA = Ok('foo'); - assert.deepEqual( - resultA.mapErr(() => 'bar'), - Ok('foo'), - ); - - const resultB = Err('foo'); - assert.deepEqual( - resultB.mapErr((err) => err.length), - Err(3), - ); - }); -}); diff --git a/web/tsconfig.json b/web/tsconfig.json deleted file mode 100644 index d1ee89c9..00000000 --- a/web/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "jsx": "preserve", - "jsxImportSource": "solid-js" - }, - "exclude": ["**/dist/**", "**/node_modules/**"] -} diff --git a/web/uno.config.ts b/web/uno.config.ts deleted file mode 100644 index f214078e..00000000 --- a/web/uno.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig, presetUno } from 'unocss'; - -export default defineConfig({ - theme: { - colors: { - stackable: { - blue: { - light: '#1880BD', - dark: '#0B689F', - }, - }, - }, - }, - presets: [presetUno()], -}); diff --git a/web/vite.config.ts b/web/vite.config.ts deleted file mode 100644 index 9302e761..00000000 --- a/web/vite.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from 'vite'; -import solidPlugin from 'vite-plugin-solid'; -import UnoCSS from 'unocss/vite'; - -export default defineConfig({ - plugins: [solidPlugin(), UnoCSS()], - server: { - proxy: { - // Forward API requests to stackable-cockpitd - '/api': 'http://127.0.0.1:8000', - }, - }, - css: { - modules: { - localsConvention: 'camelCaseOnly', - }, - }, -}); diff --git a/web/vitest.config.ts b/web/vitest.config.ts deleted file mode 100644 index c7c898dc..00000000 --- a/web/vitest.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - coverage: { - enabled: true, - provider: 'c8', - reporter: ['html', 'text'], - }, - }, -}); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 6b30c1c0..00000000 --- a/yarn.lock +++ /dev/null @@ -1,3931 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@antfu/install-pkg@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5" - integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== - dependencies: - execa "^5.1.1" - find-up "^5.0.0" - -"@antfu/utils@^0.7.7": - version "0.7.8" - resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.8.tgz#86cb0974bcab7e64e29b57d6d9021102307257de" - integrity sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg== - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== - dependencies: - "@babel/highlight" "^7.24.2" - picocolors "^1.0.0" - -"@babel/compat-data@^7.23.5": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== - -"@babel/core@^7.23.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.23.6", "@babel/generator@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== - dependencies: - "@babel/types" "^7.24.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-plugin-utils@^7.24.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== - -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/template@^7.22.15", "@babel/template@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== - dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - -"@fluent/bundle@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@fluent/bundle/-/bundle-0.18.0.tgz#bf67e306719a33baf3b66c88af5ac427d7800dbd" - integrity sha512-8Wfwu9q8F9g2FNnv82g6Ch/E1AW1wwljsUOolH5NEtdJdv0sZTuWvfCM7c3teB9dzNaJA8rn4khpidpozHWYEA== - -"@fluent/langneg@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@fluent/langneg/-/langneg-0.7.0.tgz#51c58d0b422595640195d8234c0f15687cfcb261" - integrity sha512-StAM0vgsD1QK+nFikaKs9Rxe3JGNipiXrpmemNGwM4gWERBXPe9gjzsBoKjgBgq1Vyiy+xy/C652QIWY+MPyYw== - -"@fluent/sequence@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@fluent/sequence/-/sequence-0.8.0.tgz#dd3da353a0635f1efa5f27e6d4fc59e01f162372" - integrity sha512-eV5QlEEVV/wR3AFQLXO67x4yPRPQXyqke0c8yucyMSeW36B3ecZyVFlY1UprzrfFV8iPJB4TAehDy/dLGbvQ1Q== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@iconify/types@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" - integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== - -"@iconify/utils@^2.1.5": - version "2.1.23" - resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.23.tgz#1cde237dd5142a66d9fbd065b2fa7acc4f80f862" - integrity sha512-YGNbHKM5tyDvdWZ92y2mIkrfvm5Fvhe6WJSkWu7vvOFhMtYDP0casZpoRz0XEHZCrYsR4stdGT3cZ52yp5qZdQ== - dependencies: - "@antfu/install-pkg" "^0.1.1" - "@antfu/utils" "^0.7.7" - "@iconify/types" "^2.0.0" - debug "^4.3.4" - kolorist "^1.8.0" - local-pkg "^0.5.0" - mlly "^1.6.1" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nothing-but/utils@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nothing-but/utils/-/utils-0.3.2.tgz#516a993bc9a4bd6367aa263d0895954c974cf3d0" - integrity sha512-y7ynAt3lVjvXF7+xVVezGnq4pJliX/ducCa9/AV6iB03M1JUcV0iq/9qK6h+4ieFPXhTAX2a/VuBNgksjnUQZw== - -"@polka/url@^1.0.0-next.24": - version "1.0.0-next.25" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" - integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== - -"@rollup/pluginutils@^5.0.2": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" - integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" - -"@solid-devtools/debugger@^0.22.4": - version "0.22.4" - resolved "https://registry.yarnpkg.com/@solid-devtools/debugger/-/debugger-0.22.4.tgz#68fd0e1e4fe6738c4782ea8c58150c0c49543d5a" - integrity sha512-rrKZB1hbteOpptH4AiK9nKT3oLoJDAU1UJnfZJB4zIvvmqZXQcpsEYfXvJjDBIYHONeuTJ3K2tpgLjGb7h7H6g== - dependencies: - "@nothing-but/utils" "^0.3.2" - "@solid-devtools/shared" "^0.12.3" - "@solid-primitives/bounds" "^0.0.114" - "@solid-primitives/cursor" "^0.0.111" - "@solid-primitives/event-bus" "^1.0.7" - "@solid-primitives/event-listener" "^2.2.13" - "@solid-primitives/keyboard" "^1.2.3" - "@solid-primitives/platform" "^0.0.105" - "@solid-primitives/rootless" "^1.4.1" - "@solid-primitives/scheduled" "^1.4.0" - "@solid-primitives/static-store" "^0.0.4" - "@solid-primitives/utils" "^6.2.0" - -"@solid-devtools/frontend@^0.10.3": - version "0.10.3" - resolved "https://registry.yarnpkg.com/@solid-devtools/frontend/-/frontend-0.10.3.tgz#4d600fb370778030755c4541f91245258011ef44" - integrity sha512-mbz+4pJcVDZvz4YKKFpAyUyFQx49DCdgvcs5b5kkJxhzVeCBN/JbxsThBIWfDE603VD0A7wjjzTDeAxrNRTrBQ== - dependencies: - "@solid-devtools/debugger" "^0.22.4" - "@solid-devtools/shared" "^0.12.3" - "@solid-primitives/context" "^0.2.1" - "@solid-primitives/cursor" "^0.0.111" - "@solid-primitives/date" "^2.0.15" - "@solid-primitives/event-bus" "^1.0.7" - "@solid-primitives/event-listener" "^2.2.13" - "@solid-primitives/jsx-tokenizer" "^1.0.6" - "@solid-primitives/keyboard" "^1.2.3" - "@solid-primitives/keyed" "^1.2.0" - "@solid-primitives/media" "^2.2.3" - "@solid-primitives/mouse" "^2.0.14" - "@solid-primitives/props" "^3.1.6" - "@solid-primitives/range" "^0.1.14" - "@solid-primitives/resize-observer" "^2.0.18" - "@solid-primitives/scheduled" "^1.4.0" - "@solid-primitives/static-store" "^0.0.4" - "@solid-primitives/styles" "^0.0.110" - "@solid-primitives/timer" "^1.3.7" - "@solid-primitives/utils" "^6.2.0" - clsx "^2.0.0" - solid-headless "^0.13.1" - -"@solid-devtools/overlay@^0.27.7": - version "0.27.9" - resolved "https://registry.yarnpkg.com/@solid-devtools/overlay/-/overlay-0.27.9.tgz#fdb60eff6bcbceeb2d25adba3e4e22df846f0cb5" - integrity sha512-kUQmTGzb+ISIaSB8eknbvUE4834ruUyHbtYpb5JJUfN4gsSdwr4q//kPEuLEoA4tZfMJp9VGjP6GuA+s3kHEqg== - dependencies: - "@solid-devtools/debugger" "^0.22.4" - "@solid-devtools/frontend" "^0.10.3" - "@solid-devtools/shared" "^0.12.3" - "@solid-primitives/cursor" "^0.0.111" - "@solid-primitives/event-listener" "^2.2.13" - "@solid-primitives/media" "^2.2.3" - "@solid-primitives/utils" "^6.2.0" - -"@solid-devtools/shared@^0.12.3": - version "0.12.3" - resolved "https://registry.yarnpkg.com/@solid-devtools/shared/-/shared-0.12.3.tgz#ccd10dcae9e8be7997c74e118c55c52b6bc0517a" - integrity sha512-GBPyj+S4lZmVO5WK73/FP1l1lHYoeDwqbSV2M15l5LSAtaG68HBE6smmMQI7G12XShfs8soM+PXwlx8YZ9ElIw== - dependencies: - "@solid-primitives/event-bus" "^1.0.7" - "@solid-primitives/event-listener" "^2.2.13" - "@solid-primitives/media" "^2.2.3" - "@solid-primitives/refs" "^1.0.4" - "@solid-primitives/rootless" "^1.4.1" - "@solid-primitives/scheduled" "^1.4.0" - "@solid-primitives/static-store" "^0.0.4" - "@solid-primitives/styles" "^0.0.110" - "@solid-primitives/utils" "^6.2.0" - -"@solid-primitives/bounds@^0.0.114": - version "0.0.114" - resolved "https://registry.yarnpkg.com/@solid-primitives/bounds/-/bounds-0.0.114.tgz#80e44d96fc50fbf75db630cee4512be0a9aee6c5" - integrity sha512-PS+PObcgzhoaY05ets7u+9/5vW+5MFcQxwaS18N9ZpxYh8dPkk8vYgJkUegz5t4jIeZrNwowI6xGBpdAQWMPqg== - dependencies: - "@solid-primitives/event-listener" "^2.2.13" - "@solid-primitives/resize-observer" "^2.0.18" - "@solid-primitives/static-store" "^0.0.4" - "@solid-primitives/utils" "^6.2.0" - -"@solid-primitives/context@^0.2.1": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@solid-primitives/context/-/context-0.2.3.tgz#3514620a973ea0703e06db34d5a32709442941ee" - integrity sha512-6/e8qu9qJf48FJ+sxc/B782NdgFw5TvI8+r6U0gHizumfZcWZg8FAJqvRZAiwlygkUNiTQOGTeO10LVbMm0kvg== - -"@solid-primitives/cursor@^0.0.111": - version "0.0.111" - resolved "https://registry.yarnpkg.com/@solid-primitives/cursor/-/cursor-0.0.111.tgz#6fdb9fa8dd13f2797f88ef08abf3354185cb974d" - integrity sha512-P/KqyIdi//VSiE+7uEkbYpO4lubnFBxd40FrNzjZ7iJcxb2woyAsvzKV6pHLIznxRRrAM7bnUsj20e3qbw5TCQ== - dependencies: - "@solid-primitives/utils" "^6.2.0" - -"@solid-primitives/date@^2.0.15": - version "2.0.21" - resolved "https://registry.yarnpkg.com/@solid-primitives/date/-/date-2.0.21.tgz#a75826b428febd4f9521fada26cc1bac444761e9" - integrity sha512-DZSmILY9YZarO0IVRzac8gQ6aMgC9QKzKJEgZnv7cF5K4QdkzhdkYud3HC/pfacZ7x1elopZrS0HbCkQllCrYg== - dependencies: - "@solid-primitives/memo" "^1.3.8" - "@solid-primitives/timer" "^1.3.9" - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/event-bus@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@solid-primitives/event-bus/-/event-bus-1.0.11.tgz#0a4c42d79f588a21c9bf061b6ace1508081d14df" - integrity sha512-bSwVA4aI2aNHomSbEroUnisMSyDDXJbrw4U8kFEvrcYdlLrJX5i6QeCFx+vj/zdQQw62KAllrEIyWP8KMpPVnQ== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/event-listener@^2.2.13", "@solid-primitives/event-listener@^2.3.3": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@solid-primitives/event-listener/-/event-listener-2.3.3.tgz#ab28c8627aa7d6234617867d8b02c80e1b8f0948" - integrity sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/jsx-tokenizer@^1.0.6": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@solid-primitives/jsx-tokenizer/-/jsx-tokenizer-1.0.10.tgz#3ae91d47f8a753c3ca5d818f9d3e8299f5fe3026" - integrity sha512-OziPOhJcVneuEwuC4Ys2atePcBhXZK00h93Tg+dGw5GUijB8hvP97qXZ9Q8oNai0FCInlGUOYQnOgM9piBoSMQ== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/keyboard@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@solid-primitives/keyboard/-/keyboard-1.2.8.tgz#99a695deede1724e03ce415ebdf5969c174fa398" - integrity sha512-pJtcbkjozS6L1xvTht9rPpyPpX55nAkfBzbFWdf3y0Suwh6qClTibvvObzKOf7uzQ+8aZRDH4LsoGmbTKXtJjQ== - dependencies: - "@solid-primitives/event-listener" "^2.3.3" - "@solid-primitives/rootless" "^1.4.5" - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/keyed@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@solid-primitives/keyed/-/keyed-1.2.2.tgz#42323c11ecfd9f6e4525af2cb53475ff2dfb4d51" - integrity sha512-oBziY40JK4XmJ57XGkFl8j0GtEarSu0hhjdkUQgqL/U0QQE3TZrRo9uhgH7I6VGJKBKG7SAraTPE6S5lVLM1ow== - -"@solid-primitives/media@^2.2.3": - version "2.2.9" - resolved "https://registry.yarnpkg.com/@solid-primitives/media/-/media-2.2.9.tgz#bbe1e30b108cd3ece2e214d529e757702eb4dd34" - integrity sha512-QUmU62D4/d9YWx/4Dvr/UZasIkIpqNXz7wosA5GLmesRW9XlPa3G5M6uOmTw73SByHNTCw0D6x8bSdtvvLgzvQ== - dependencies: - "@solid-primitives/event-listener" "^2.3.3" - "@solid-primitives/rootless" "^1.4.5" - "@solid-primitives/static-store" "^0.0.8" - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/memo@^1.3.8": - version "1.3.8" - resolved "https://registry.yarnpkg.com/@solid-primitives/memo/-/memo-1.3.8.tgz#d9359b0fd58b3653ca9fd77c14181f2033a78b5b" - integrity sha512-U75pfLFSxFmM2xbx1+2XPPyWbaXrnUFF10spbFuOUgJ7azrC+4y+FnrVi4RKqHw9gftd8aKQuTiyMQq468YLQw== - dependencies: - "@solid-primitives/scheduled" "^1.4.3" - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/mouse@^2.0.14": - version "2.0.19" - resolved "https://registry.yarnpkg.com/@solid-primitives/mouse/-/mouse-2.0.19.tgz#e126939f946df323f526eb2bd889f756b1eb644d" - integrity sha512-mVYhWsMjjIdZ8iLIypiYGhNGtLOFVCmCeXaNQVYUjPOZkZOm9aaKjjGqgdwVw5RtJ0ZfNvKH/A5WE1t/fOBvLA== - dependencies: - "@solid-primitives/event-listener" "^2.3.3" - "@solid-primitives/rootless" "^1.4.5" - "@solid-primitives/static-store" "^0.0.8" - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/platform@^0.0.105": - version "0.0.105" - resolved "https://registry.yarnpkg.com/@solid-primitives/platform/-/platform-0.0.105.tgz#d282938c585d2e252b219b33ef1c8c96551a396a" - integrity sha512-GULqmMc5vNsLSsIxIEYYxJv/6ypGKG+ig9hzSi4lxVPfooX6Go6txDlhv53woUSvaG939ceZGRq+X5uADMed6g== - -"@solid-primitives/props@^3.1.6": - version "3.1.11" - resolved "https://registry.yarnpkg.com/@solid-primitives/props/-/props-3.1.11.tgz#bd40c2808ab4e2d4adecbd3ccbad5c3756a72b1c" - integrity sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/range@^0.1.14": - version "0.1.18" - resolved "https://registry.yarnpkg.com/@solid-primitives/range/-/range-0.1.18.tgz#4653887d3c2536650c7a923d1978ceaa51d6cb75" - integrity sha512-F5OTdpRFdeLOPEHs92S714GKUk1ZUUmEJ45Z/Z5h6i43DHi7fUFgUL7LeHFxVgIjtGv+Tg5Op7aM9PdSo5iqeQ== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/refs@^1.0.4": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@solid-primitives/refs/-/refs-1.0.8.tgz#2f8e1db2c08601c8a9cf4479b05f490470aaa3ad" - integrity sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/resize-observer@^2.0.18": - version "2.0.25" - resolved "https://registry.yarnpkg.com/@solid-primitives/resize-observer/-/resize-observer-2.0.25.tgz#c97a01193fe9b2c08bc240d096b92888ab44bda0" - integrity sha512-jVDXkt2MiriYRaz4DYs62185d+6jQ+1DCsR+v7f6XMsIJJuf963qdBRFjtZtKXBaxdPNMyuPeDgf5XQe3EoDJg== - dependencies: - "@solid-primitives/event-listener" "^2.3.3" - "@solid-primitives/rootless" "^1.4.5" - "@solid-primitives/static-store" "^0.0.8" - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/rootless@^1.4.1", "@solid-primitives/rootless@^1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@solid-primitives/rootless/-/rootless-1.4.5.tgz#120244fd5e02d9ea111ed2236fedcef572010be4" - integrity sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/scheduled@^1.4.0", "@solid-primitives/scheduled@^1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@solid-primitives/scheduled/-/scheduled-1.4.3.tgz#379443e759c90275f7530c11c9df63ff63c8c9fd" - integrity sha512-HfWN5w7b7FEc6VPLBKnnE302h90jsLMuR28Fcf7neRGGf8jBj6wm6/UFQ00VlKexHFMR6KQ2u4VBh5a1ZcqM8g== - -"@solid-primitives/static-store@^0.0.4": - version "0.0.4" - resolved "https://registry.yarnpkg.com/@solid-primitives/static-store/-/static-store-0.0.4.tgz#90cd12e72bcd68c5a69fd01214e0cfd8f30f805a" - integrity sha512-NcLtDNA6H+Z9LmqaUe4SKfMx0YbszIMXEqfV15cB34t5XyEeOM5TihYwsVJ/dpkmpHYzflm0SwAL+P9uwyzvWQ== - dependencies: - "@solid-primitives/utils" "^6.2.0" - -"@solid-primitives/static-store@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@solid-primitives/static-store/-/static-store-0.0.8.tgz#a4d7a93a254bf89d3c5c5f27a031d1a46c34f5c5" - integrity sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg== - dependencies: - "@solid-primitives/utils" "^6.2.3" - -"@solid-primitives/styles@^0.0.110": - version "0.0.110" - resolved "https://registry.yarnpkg.com/@solid-primitives/styles/-/styles-0.0.110.tgz#7457ffdf539a8ccbfc381a4fda81fa31adc429fa" - integrity sha512-PSaM1Rl4+zwpOfxil8KlY87UC+R1rQy8b2EiCMjgTWakRK1TjvFM78KY5/ohFg42bp2V/DWRx2QaL/Unjm3HMg== - dependencies: - "@solid-primitives/rootless" "^1.4.1" - "@solid-primitives/utils" "^6.2.0" - -"@solid-primitives/timer@^1.3.7", "@solid-primitives/timer@^1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@solid-primitives/timer/-/timer-1.3.9.tgz#ad42595fbdc045804e681078364ebe56f19729f8" - integrity sha512-uD+4+boV7k+5W+hL5d30eodUXSwOfOQz8AfbMPVmLOHaTmd0mdfpw0NkYhyn1rgcx1bSn/nHTd8lraHiMhO/6w== - -"@solid-primitives/utils@^6.2.0", "@solid-primitives/utils@^6.2.3": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@solid-primitives/utils/-/utils-6.2.3.tgz#1abed4c74a2696e08bd2e49cf2b86fc8b87a32bd" - integrity sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ== - -"@solidjs/router@^0.8.2": - version "0.8.4" - resolved "https://registry.yarnpkg.com/@solidjs/router/-/router-0.8.4.tgz#aa19bee6dc6289807821b2d0dd5cf07a79da6b68" - integrity sha512-Gi/WVoVseGMKS1DBdT3pNAMgOzEOp6Q3dpgNd2mW9GUEnVocPmtyBjDvXwN6m7tjSGsqqfqJFXk7bm1hxabSRw== - -"@types/babel__core@^7.20.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== - dependencies: - "@babel/types" "^7.20.7" - -"@types/chai-subset@^1.3.3": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.5.tgz#3fc044451f26985f45625230a7f22284808b0a9a" - integrity sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.3.5": - version "4.3.16" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" - integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== - -"@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/feather-icons@^4.29.1": - version "4.29.4" - resolved "https://registry.yarnpkg.com/@types/feather-icons/-/feather-icons-4.29.4.tgz#3c1d0bba09278c88dd35f6ae102aeb293aabf4bd" - integrity sha512-cvwI455PWx/gJ33XDTIZOdauRy+XCxZggkOT/tAQYZLdySPFATD4RnDC9mxOnCIEaK9kwPm3zZigkAsMkhXb5w== - -"@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@*": - version "20.12.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" - integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== - dependencies: - undici-types "~5.26.4" - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/semver@^7.3.12": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@typescript-eslint/eslint-plugin@^5.59.5": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.59.5": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.55.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@unocss/astro@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/astro/-/astro-0.51.13.tgz#f5b1e30d9d28d27bb86f6d2fc37c4b8ad6892aba" - integrity sha512-Dul0ZJNwseGBxngBMfghfTsf0quf4HcQcqJuIDzA1T+ueavpwf4QScwbDuS0BqFO4ZiIVSItA7f6eLe31PHUmw== - dependencies: - "@unocss/core" "0.51.13" - "@unocss/reset" "0.51.13" - "@unocss/vite" "0.51.13" - -"@unocss/cli@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/cli/-/cli-0.51.13.tgz#d29f795848c963d1e798e03fe7cb1194867ab24b" - integrity sha512-g5CmSVyMFIgw/uStVlABldw+EYsrCyGjHd9jQMMTSZbV9IWuM0Tf+ILAZ+B4iXs62ctnrxPYH3Mha6IIuuZXZg== - dependencies: - "@ampproject/remapping" "^2.2.1" - "@rollup/pluginutils" "^5.0.2" - "@unocss/config" "0.51.13" - "@unocss/core" "0.51.13" - "@unocss/preset-uno" "0.51.13" - cac "^6.7.14" - chokidar "^3.5.3" - colorette "^2.0.20" - consola "^3.1.0" - fast-glob "^3.2.12" - magic-string "^0.30.0" - pathe "^1.1.0" - perfect-debounce "^1.0.0" - -"@unocss/config@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/config/-/config-0.51.13.tgz#1894aae4917dc6af891efb1ddd8d3b35424d51a7" - integrity sha512-EnSLt7Z1C01U3kORh+Iql+zLFm/PQTD1Np6oEW6U0/GTmD3HEilVFQFFxdM5F0X2bBZtZMkkAGGyhRWQj09hDQ== - dependencies: - "@unocss/core" "0.51.13" - unconfig "^0.3.7" - -"@unocss/core@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/core/-/core-0.51.13.tgz#5c3aaa46d8f0e1bd04bee06b945b5e1dd8fcd108" - integrity sha512-SclWkqY2c+p5+PiqrbQkhJNEExPdeo71/aGFye10tpBkgPJWd5xC7dhg5F8M4VPNBtuNCrvBWyqNnunMyuz/WQ== - -"@unocss/extractor-arbitrary-variants@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.51.13.tgz#838a692f0d7661f21097299988ae338905f81f07" - integrity sha512-lF7p0ea/MeNf4IsjzNhRNYP8u+f1h5JjhTzcvFpQo/vpBvuM5ZCyqp4mkXxYnLNLFfTLsc+MxXaU34IXxpw1QA== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/inspector@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/inspector/-/inspector-0.51.13.tgz#31e6c1c794e1370dcdff38e0d4e9eb57490c3555" - integrity sha512-y6wCvLDmfFHfr5MHqcQLZkwRio4+VEH6j607bgUdKTRlZGVCD7/GBV8lperxsxpkspaE1eykOeDmW7Ms99SEuQ== - dependencies: - gzip-size "^6.0.0" - sirv "^2.0.3" - -"@unocss/postcss@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/postcss/-/postcss-0.51.13.tgz#e3146cc7b395fe3923fe76e78b0a31056c8104c3" - integrity sha512-V1QJ7md9jYtBwRc6NGep1Atc+QhaR3115B1wCo8CNM+v+ZOQzpxNsAshvOfyPzfzTj+KLtp4u4zqqaTbYGX2cw== - dependencies: - "@unocss/config" "0.51.13" - "@unocss/core" "0.51.13" - css-tree "^2.3.1" - fast-glob "^3.2.12" - magic-string "^0.30.0" - postcss "^8.4.23" - -"@unocss/preset-attributify@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-attributify/-/preset-attributify-0.51.13.tgz#f5ccb15ec78e145c2980603a67c1a926b346648b" - integrity sha512-a501ylamV90E+tVf7Dgc8Plwex5LQ5oFSYwsxk06QhcxPWdLmDey3SQjL68AsP9qnLGfIez51sV4y/6H8wFqlw== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/preset-icons@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-icons/-/preset-icons-0.51.13.tgz#173f2a1d2a0c368e962d2d83fb894c96bcf87ea1" - integrity sha512-iL9s1NUVeWe3WSh5LHn7vy+veCAag9AFA50IfNlHuAARhuI8JtrMQA8dOXrWrzM0zWBMB+BVIkVaMVrF257n+Q== - dependencies: - "@iconify/utils" "^2.1.5" - "@unocss/core" "0.51.13" - ofetch "^1.0.1" - -"@unocss/preset-mini@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-mini/-/preset-mini-0.51.13.tgz#0d35d7538c1330772b0dd6c60cd4ce0824e52b30" - integrity sha512-Wa6eMq8IiJEb7F8rL+cDX4XFm4ViAULaAvn8rjk7ANGdOmeqYGyGc0IZkOjQgl3PiFJFnitsBluHhg7nMIk7QQ== - dependencies: - "@unocss/core" "0.51.13" - "@unocss/extractor-arbitrary-variants" "0.51.13" - -"@unocss/preset-tagify@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-tagify/-/preset-tagify-0.51.13.tgz#eeb608d43747bf2c718063c30054cb8c6aa1a406" - integrity sha512-9pWPTff/1OKFmOQiGolVKFPzXwJ+r77UhXTB5E793uOQFHPMWCdkjyTPiN12FlB9izjTLIFH3GCGy/koRX9S4w== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/preset-typography@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-typography/-/preset-typography-0.51.13.tgz#7b3f35ea70baae3fbf41f6e69458d45515e8da0a" - integrity sha512-9uXrPztLsc8ZMnmoIdNAC3/gD183wyFECDzXtJqjOrJhzGr1kcv1sByyQO+kRPI67eWErSsDjpJwK2arfDOihQ== - dependencies: - "@unocss/core" "0.51.13" - "@unocss/preset-mini" "0.51.13" - -"@unocss/preset-uno@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-uno/-/preset-uno-0.51.13.tgz#92db5b03f5d988d5def2182cfb41f91935a0eeb0" - integrity sha512-S9po93y87YphySfW21+Z5uzSL/GAGN5MqZURQxaGk9WGxYugAnu2PnvhhyqLCVmP05J34tMSDMkIZZqjnGaJzg== - dependencies: - "@unocss/core" "0.51.13" - "@unocss/preset-mini" "0.51.13" - "@unocss/preset-wind" "0.51.13" - -"@unocss/preset-web-fonts@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-web-fonts/-/preset-web-fonts-0.51.13.tgz#d5d4bcc60980d96f7df97b5345e86fb44996087a" - integrity sha512-jl6AhPcnLYN4oKYQZbU/40714IIuNb7TOFh2kgMkDH70r+fzLEdH+cB4l5m0yTsMhEQ6oDsppxm9aXcsVDRESA== - dependencies: - "@unocss/core" "0.51.13" - ofetch "^1.0.1" - -"@unocss/preset-wind@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/preset-wind/-/preset-wind-0.51.13.tgz#b6bc746f92e7307ef097d1dc9f2eca3f2f3763bc" - integrity sha512-deRXLOWmKmqCJuohWCE5NUzs7XDJLn4pzgYQSUlEAVUfS6rzL49aJmSHA+p/f+HhJs5jipNdvkcrHYEBMNV1XQ== - dependencies: - "@unocss/core" "0.51.13" - "@unocss/preset-mini" "0.51.13" - -"@unocss/reset@0.51.13", "@unocss/reset@^0.51.12": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/reset/-/reset-0.51.13.tgz#62b704eef8657554ef8f3e1caaee4a4805280a14" - integrity sha512-xwYJW6vNbHIpBtlFcW93fZxILZpWatcCc9nclSgsl0YlFUz9w4/aoV9KqwU62Y4VUteJxCZCCXa3pSiPO8h5KA== - -"@unocss/scope@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/scope/-/scope-0.51.13.tgz#4334bec70b5adc33ea73faa7c7952c508b03af4f" - integrity sha512-ATwgDx1qZflR2/EPsAs/XMR9/HdcUNyAZ6VdenwQQdlmAFlIWZQ6smswKyuiJWKtcJynfbdGOWcO3vcocrnSrQ== - -"@unocss/transformer-attributify-jsx-babel@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.51.13.tgz#6855b412e705f2ce032e7cb3e634d0de692906c8" - integrity sha512-HMEeTi3FIuI5gMJnRICbWdDmraL4NfpjSTjSmAo6EsraBuNO2m+/5JZL5Fc1B3olKes2G84FDSlzfofHyinWzw== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/transformer-attributify-jsx@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.51.13.tgz#4117d3a9168ddea3d1e45a1ab3ba6360c3925793" - integrity sha512-vLAtT0K3Rfa3Xiu3LhU4tNCptuO3QlbgSsVO93K3onujfO7qZAaXjK5nj7jiLPyTKtQyl/3WOgNStfReMleF0w== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/transformer-compile-class@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/transformer-compile-class/-/transformer-compile-class-0.51.13.tgz#2463fb3ac88d516bd60322d245917760eb855507" - integrity sha512-7G5ReCIkrZOAikwM9LN74nR4uxffJMSDAbLFDyhdh4qaumJFaxDLDQ4lxpQVZVeXQIF12QSxsnJuI9Fu1nuqmg== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/transformer-directives@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/transformer-directives/-/transformer-directives-0.51.13.tgz#0ae7f4e644cc41f35e2743451d6545656d60f2d5" - integrity sha512-1tl8UcVpqYaKkj1zan/QmUAslEcHe9WdN0/QX3Ao663A5r91EwWhnhwKFfvujrZp1XlFnXgKLmKS8OwTRQfCQg== - dependencies: - "@unocss/core" "0.51.13" - css-tree "^2.3.1" - -"@unocss/transformer-variant-group@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/transformer-variant-group/-/transformer-variant-group-0.51.13.tgz#847a0d7cb05938f6498170b2590ffecf0bcef80a" - integrity sha512-QT3dfnYeht9SpqPFHJrEfZjL+XeMyi0Wwc4ll4ttIQNCl1Ihiwxl4ScRs1oVXlhCAc3hCXNu9V/FWO0cYHRt/Q== - dependencies: - "@unocss/core" "0.51.13" - -"@unocss/vite@0.51.13": - version "0.51.13" - resolved "https://registry.yarnpkg.com/@unocss/vite/-/vite-0.51.13.tgz#8bda8812c5d2a8f18234a698958a05b7579b2604" - integrity sha512-WwyaPnu1XfRiFy4uxXwBuWaL7J1Rcaetsw5lJQUIUdSBTblsd6W7sW+MYTsLfAlA9FUxWDK4ESdI51Xgq4glxw== - dependencies: - "@ampproject/remapping" "^2.2.1" - "@rollup/pluginutils" "^5.0.2" - "@unocss/config" "0.51.13" - "@unocss/core" "0.51.13" - "@unocss/inspector" "0.51.13" - "@unocss/scope" "0.51.13" - "@unocss/transformer-directives" "0.51.13" - chokidar "^3.5.3" - fast-glob "^3.2.12" - magic-string "^0.30.0" - -"@vitest/coverage-c8@^0.31.1": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/coverage-c8/-/coverage-c8-0.31.4.tgz#5628e415fd9bea99ee12127e0524b9d267a33e17" - integrity sha512-VPx368m4DTcpA/P0v3YdVxl4QOSh1DbUcXURLRvDShrIB5KxOgfzw4Bn2R8AhAe/GyiWW/FIsJ/OJdYXCCiC1w== - dependencies: - "@ampproject/remapping" "^2.2.1" - c8 "^7.13.0" - magic-string "^0.30.0" - picocolors "^1.0.0" - std-env "^3.3.2" - -"@vitest/expect@0.31.4": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.31.4.tgz#115c517404488bf3cb6ce4ac411c40d8e86891b8" - integrity sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg== - dependencies: - "@vitest/spy" "0.31.4" - "@vitest/utils" "0.31.4" - chai "^4.3.7" - -"@vitest/runner@0.31.4": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.31.4.tgz#e99abee89132a500d9726a53b58dfc9160db1078" - integrity sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg== - dependencies: - "@vitest/utils" "0.31.4" - concordance "^5.0.4" - p-limit "^4.0.0" - pathe "^1.1.0" - -"@vitest/snapshot@0.31.4": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.31.4.tgz#59a42046fec4950a1ac70cf0ec64aada3b995559" - integrity sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA== - dependencies: - magic-string "^0.30.0" - pathe "^1.1.0" - pretty-format "^27.5.1" - -"@vitest/spy@0.31.4": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.31.4.tgz#fce8e348cea32deff79996d116c67893b19cc47d" - integrity sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag== - dependencies: - tinyspy "^2.1.0" - -"@vitest/ui@^0.31.1": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-0.31.4.tgz#465a4762d7937e3322fe66f94c2378bacfeba1ac" - integrity sha512-sKM16ITX6HrNFF+lNZ2AQAen4/6Bx2i6KlBfIvkUjcTgc5YII/j2ltcX14oCUv4EA0OTWGQuGhO3zDoAsTENGA== - dependencies: - "@vitest/utils" "0.31.4" - fast-glob "^3.2.12" - fflate "^0.7.4" - flatted "^3.2.7" - pathe "^1.1.0" - picocolors "^1.0.0" - sirv "^2.0.3" - -"@vitest/utils@0.31.4": - version "0.31.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.31.4.tgz#5cfdcecfd604a7dbe3972cfe0f2b1e0af1246ad2" - integrity sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ== - dependencies: - concordance "^5.0.4" - loupe "^2.3.6" - pretty-format "^27.5.1" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.2.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.10.0, acorn@^8.11.3, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.flat@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -babel-plugin-jsx-dom-expressions@^0.37.20: - version "0.37.20" - resolved "https://registry.yarnpkg.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.37.20.tgz#506fd0302d6740bdea957d5f7b18eccb117342ca" - integrity sha512-0L3aC5EFyvCgIlEYIqJb4Ym29s1IDI/U5SntZ1ZK054xe0MqBmBi2GLK3f9AOklhdY7kCC3GsHD0bILh6u0Qsg== - dependencies: - "@babel/helper-module-imports" "7.18.6" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.20.7" - html-entities "2.3.3" - validate-html-nesting "^1.2.1" - -babel-preset-solid@^1.8.4: - version "1.8.17" - resolved "https://registry.yarnpkg.com/babel-preset-solid/-/babel-preset-solid-1.8.17.tgz#8d55e8e2ee800be85527425e7943534f984dc815" - integrity sha512-s/FfTZOeds0hYxYqce90Jb+0ycN2lrzC7VP1k1JIn3wBqcaexDKdYi6xjB+hMNkL+Q6HobKbwsriqPloasR9LA== - dependencies: - babel-plugin-jsx-dom-expressions "^0.37.20" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -blueimp-md5@^2.10.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" - integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -c8@^7.13.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.14.0.tgz#f368184c73b125a80565e9ab2396ff0be4d732f3" - integrity sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@istanbuljs/schema" "^0.1.3" - find-up "^5.0.0" - foreground-child "^2.0.0" - istanbul-lib-coverage "^3.2.0" - istanbul-lib-report "^3.0.0" - istanbul-reports "^3.1.4" - rimraf "^3.0.2" - test-exclude "^6.0.0" - v8-to-istanbul "^9.0.0" - yargs "^16.2.0" - yargs-parser "^20.2.9" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -caniuse-lite@^1.0.30001587: - version "1.0.30001617" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" - integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== - -chai@^4.3.7: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -classnames@^2.2.5: - version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -clean-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" - integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== - dependencies: - escape-string-regexp "^1.0.5" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clsx@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concordance@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" - integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== - dependencies: - date-time "^3.1.0" - esutils "^2.0.3" - fast-diff "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.15" - md5-hex "^3.0.1" - semver "^7.3.2" - well-known-symbols "^2.0.0" - -confbox@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" - integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== - -consola@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" - integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -core-js@^3.1.3: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" - integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -csstype@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -date-time@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" - integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== - dependencies: - time-zone "^1.0.0" - -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -defu@^6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" - integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== - -destr@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" - integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -electron-to-chromium@^1.4.668: - version "1.4.763" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz#64f2041ed496fd6fc710b9be806fe91da9334f91" - integrity sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -esbuild@^0.18.10: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== - optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" - -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.8.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-plugin-solid@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-solid/-/eslint-plugin-solid-0.12.1.tgz#6035e9e992620f916fd9d14ad9eb2bbf62a76973" - integrity sha512-fM0sEg9PcS1mcNbWklwc+W/lOv1/XyEwXf53HmFFy4GOA8E3u41h8JW+hc+Vv1m3kh01umKoTalOTET08zKdAQ== - dependencies: - "@typescript-eslint/utils" "^5.55.0" - is-html "^2.0.0" - jsx-ast-utils "^3.3.3" - kebab-case "^1.0.2" - known-css-properties "^0.24.0" - style-to-object "^0.3.0" - -eslint-plugin-unicorn@^47.0.0: - version "47.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz#960e9d3789f656ba3e21982420793b069a911011" - integrity sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA== - dependencies: - "@babel/helper-validator-identifier" "^7.19.1" - "@eslint-community/eslint-utils" "^4.4.0" - ci-info "^3.8.0" - clean-regexp "^1.0.0" - esquery "^1.5.0" - indent-string "^4.0.0" - is-builtin-module "^3.2.1" - jsesc "^3.0.2" - lodash "^4.17.21" - pluralize "^8.0.0" - read-pkg-up "^7.0.1" - regexp-tree "^0.1.24" - regjsparser "^0.10.0" - safe-regex "^2.1.1" - semver "^7.3.8" - strip-indent "^3.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.40.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2, esquery@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2, esutils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -feather-icons@^4.29.0: - version "4.29.2" - resolved "https://registry.yarnpkg.com/feather-icons/-/feather-icons-4.29.2.tgz#b03a47588a1c400f215e884504db1c18860d89f8" - integrity sha512-0TaCFTnBTVCz6U+baY2UJNKne5ifGh7sMG4ZC2LoBWCZdIyPa+y6UiR4lEYGws1JOFWdee8KAsAIvu0VcXqiqA== - dependencies: - classnames "^2.2.5" - core-js "^3.1.3" - -fflate@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" - integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.7, flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-entities@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-tags@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-html@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-html/-/is-html-2.0.0.tgz#b3ab2e27ccb7a12235448f51f115a6690f435fc8" - integrity sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg== - dependencies: - html-tags "^3.0.0" - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-what@^4.1.8: - version "4.1.16" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" - integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-reports@^3.1.4: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsx-ast-utils@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -kebab-case@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/kebab-case/-/kebab-case-1.0.2.tgz#5eac97d5d220acf606d40e3c0ecfea21f1f9e1eb" - integrity sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -known-css-properties@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.24.0.tgz#19aefd85003ae5698a5560d2b55135bf5432155c" - integrity sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA== - -kolorist@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" - integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -local-pkg@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" - integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== - -local-pkg@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" - integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== - dependencies: - mlly "^1.4.2" - pkg-types "^1.0.3" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -magic-string@^0.30.0: - version "0.30.10" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -md5-hex@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" - integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== - dependencies: - blueimp-md5 "^2.10.0" - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - -merge-anything@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-5.1.7.tgz#94f364d2b0cf21ac76067b5120e429353b3525d7" - integrity sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ== - dependencies: - is-what "^4.1.8" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -mlly@^1.2.0, mlly@^1.4.2, mlly@^1.6.1, mlly@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.0.tgz#587383ae40dda23cadb11c3c3cc972b277724271" - integrity sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ== - dependencies: - acorn "^8.11.3" - pathe "^1.1.2" - pkg-types "^1.1.0" - ufo "^1.5.3" - -mrmime@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" - integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-fetch-native@^1.6.3: - version "1.6.4" - resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz#679fc8fd8111266d47d7e72c379f1bed9acff06e" - integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.values@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -ofetch@^1.0.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.3.4.tgz#7ea65ced3c592ec2b9906975ae3fe1d26a56f635" - integrity sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw== - dependencies: - destr "^2.0.3" - node-fetch-native "^1.6.3" - ufo "^1.5.3" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -openapi-fetch@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/openapi-fetch/-/openapi-fetch-0.2.1.tgz#a5865cd030620df9047c588554b1b670b0355757" - integrity sha512-XrpiPz8fPUdYtgcXSU4u8jJ/At67PbFsj6XRZZbt6lMsrosKplWY7dUgnkstYaroschNz/NfYSPIiq0sOaY0nw== - -openapi-typescript@^6.5.0: - version "6.7.5" - resolved "https://registry.yarnpkg.com/openapi-typescript/-/openapi-typescript-6.7.5.tgz#3e7f0d080d540396ef8db3df4ed07e1a4a5bb1d8" - integrity sha512-ZD6dgSZi0u1QCP55g8/2yS5hNJfIpgqsSGHLxxdOjvY7eIrXzj271FJEQw33VwsZ6RCtO/NOuhxa7GBWmEudyA== - dependencies: - ansi-colors "^4.1.3" - fast-glob "^3.3.2" - js-yaml "^4.1.0" - supports-color "^9.4.0" - undici "^5.28.2" - yargs-parser "^21.1.1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.0, pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -perfect-debounce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" - integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-types@^1.0.3, pkg-types@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.1.1.tgz#07b626880749beb607b0c817af63aac1845a73f2" - integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== - dependencies: - confbox "^0.1.7" - mlly "^1.7.0" - pathe "^1.1.2" - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss@^8.4.23, postcss@^8.4.27: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^2.8.8: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp-tree@^0.1.24, regexp-tree@~0.1.1: - version "0.1.27" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" - integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -regjsparser@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.10.0.tgz#b1ed26051736b436f22fdec1c8f72635f9f44892" - integrity sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA== - dependencies: - jsesc "~0.5.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.10.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -safe-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -seroval-plugins@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seroval-plugins/-/seroval-plugins-1.0.5.tgz#eeded50d736d5e1dba142a72b0188df9f4e42b6d" - integrity sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ== - -seroval@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seroval/-/seroval-1.0.5.tgz#d71ee540d936babaed92f56eda3e52d8e2a3deed" - integrity sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sirv@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" - integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -solid-headless@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/solid-headless/-/solid-headless-0.13.1.tgz#eed2d79043891eaebccc8aa1449f7aaa8ba24e2e" - integrity sha512-FZJai49YmdBu6oEo8aJGPMQ1Qn8xiW0cnD6vNFDIQWMKJdXEUtDEwz0hTR9aZ7Epq3IkrZs+98E0vNiv1+pZpA== - dependencies: - solid-use "^0.6.2" - -solid-js@^1.7.4: - version "1.8.17" - resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.8.17.tgz#780ed6f0fd8633009d1b3c29d56bf6b6bb33bd50" - integrity sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q== - dependencies: - csstype "^3.1.0" - seroval "^1.0.4" - seroval-plugins "^1.0.3" - -solid-refresh@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/solid-refresh/-/solid-refresh-0.6.3.tgz#d23ef80f04e177619c9234a809c573cb16360627" - integrity sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA== - dependencies: - "@babel/generator" "^7.23.6" - "@babel/helper-module-imports" "^7.22.15" - "@babel/types" "^7.23.6" - -solid-use@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/solid-use/-/solid-use-0.6.2.tgz#c9d997d5db3658693bf7436741439924f487d5c8" - integrity sha512-0ShJ5s+4PIN0pJB/BtsQucsZB+xnUeeTGaxErQDu6USn5jygZWXicAtOEvFbI8gv40xE751uY1Tz7Aib9lxL/Q== - -source-map-js@^1.0.1, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.3.2: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" - integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== - dependencies: - acorn "^8.10.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -time-zone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" - integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== - -tinybench@^2.5.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" - integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== - -tinypool@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.5.0.tgz#3861c3069bf71e4f1f5aa2d2e6b3aaacc278961e" - integrity sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ== - -tinyspy@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@^5.0.4: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -ufo@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" - integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unconfig@^0.3.7: - version "0.3.13" - resolved "https://registry.yarnpkg.com/unconfig/-/unconfig-0.3.13.tgz#8612d57811c1316f30d95f45bb96ce8ce8afc10c" - integrity sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng== - dependencies: - "@antfu/utils" "^0.7.7" - defu "^6.1.4" - jiti "^1.21.0" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici@^5.28.2: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== - dependencies: - "@fastify/busboy" "^2.0.0" - -unocss@^0.51.8: - version "0.51.13" - resolved "https://registry.yarnpkg.com/unocss/-/unocss-0.51.13.tgz#f41c0d186559f2375f319334f4811ed21b427b23" - integrity sha512-EAhuQ97D7E+EsTdlCL+xoWEsvz46Se9ZAtHhJ+1W+DzMky9qrDLRyR8Caf2TPbz8dw/z0qYhoPr6/aJARG4r0g== - dependencies: - "@unocss/astro" "0.51.13" - "@unocss/cli" "0.51.13" - "@unocss/core" "0.51.13" - "@unocss/extractor-arbitrary-variants" "0.51.13" - "@unocss/postcss" "0.51.13" - "@unocss/preset-attributify" "0.51.13" - "@unocss/preset-icons" "0.51.13" - "@unocss/preset-mini" "0.51.13" - "@unocss/preset-tagify" "0.51.13" - "@unocss/preset-typography" "0.51.13" - "@unocss/preset-uno" "0.51.13" - "@unocss/preset-web-fonts" "0.51.13" - "@unocss/preset-wind" "0.51.13" - "@unocss/reset" "0.51.13" - "@unocss/transformer-attributify-jsx" "0.51.13" - "@unocss/transformer-attributify-jsx-babel" "0.51.13" - "@unocss/transformer-compile-class" "0.51.13" - "@unocss/transformer-directives" "0.51.13" - "@unocss/transformer-variant-group" "0.51.13" - "@unocss/vite" "0.51.13" - -update-browserslist-db@^1.0.13: - version "1.0.15" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" - integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== - dependencies: - escalade "^3.1.2" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -v8-to-istanbul@^9.0.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-html-nesting@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/validate-html-nesting/-/validate-html-nesting-1.2.2.tgz#2d74de14b598a0de671fad01bd71deabb93b8aca" - integrity sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vite-node@0.31.4: - version "0.31.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.31.4.tgz#0437f76c35fa83f0a868d3fb5896ca9e164291f5" - integrity sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - mlly "^1.2.0" - pathe "^1.1.0" - picocolors "^1.0.0" - vite "^3.0.0 || ^4.0.0" - -vite-plugin-solid@^2.7.2: - version "2.10.2" - resolved "https://registry.yarnpkg.com/vite-plugin-solid/-/vite-plugin-solid-2.10.2.tgz#180f5ec9d8ac03d19160dd5728b313fe9b62ee0d" - integrity sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ== - dependencies: - "@babel/core" "^7.23.3" - "@types/babel__core" "^7.20.4" - babel-preset-solid "^1.8.4" - merge-anything "^5.1.7" - solid-refresh "^0.6.3" - vitefu "^0.2.5" - -"vite@^3.0.0 || ^4.0.0", vite@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" - integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg== - dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" - optionalDependencies: - fsevents "~2.3.2" - -vitefu@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" - integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== - -vitest@^0.31.4: - version "0.31.4" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.31.4.tgz#5abe02562675262949c10e40811f348a80f6b2a6" - integrity sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ== - dependencies: - "@types/chai" "^4.3.5" - "@types/chai-subset" "^1.3.3" - "@types/node" "*" - "@vitest/expect" "0.31.4" - "@vitest/runner" "0.31.4" - "@vitest/snapshot" "0.31.4" - "@vitest/spy" "0.31.4" - "@vitest/utils" "0.31.4" - acorn "^8.8.2" - acorn-walk "^8.2.0" - cac "^6.7.14" - chai "^4.3.7" - concordance "^5.0.4" - debug "^4.3.4" - local-pkg "^0.4.3" - magic-string "^0.30.0" - pathe "^1.1.0" - picocolors "^1.0.0" - std-env "^3.3.2" - strip-literal "^1.0.1" - tinybench "^2.5.0" - tinypool "^0.5.0" - vite "^3.0.0 || ^4.0.0" - vite-node "0.31.4" - why-is-node-running "^2.2.2" - -well-known-symbols@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" - integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" - integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From 3ab83b6c659e4aca129a120fed9e16fec530c697 Mon Sep 17 00:00:00 2001 From: Nick <10092581+NickLarsenNZ@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:06:54 +0200 Subject: [PATCH 10/12] feat: stacks and demo supports OCI helmCharts (#440) * chore: Add ChartSourceKind for oci/repo/local Note: Local isn't yet supported, but it is a fallback for when the URL doesn't match oci:// or http(s):// * feat: Add support for OCI repositories Note: Only non-OCI remote charts need the helm::add_repo() call. We emit an error if a Local (non oci:// or http(s)://) value is given. * test: Ensure ChartRepo::source_kind gives expected variants This seems trivial now in this set of changes, but is intended to catch future regressions * chore: Update changelog * chore: cargo update -p rustls-webpki * chore: Rename path to chart_source, and use the Debug impl * test: Use rstest Also use str::to_owned() --- Cargo.lock | 4 +- Cargo.nix | 4 +- rust/stackable-cockpit/src/helm.rs | 58 +++++++++++++++++++ .../src/platform/manifests.rs | 29 +++++++--- rust/stackablectl/CHANGELOG.md | 2 + 5 files changed, 86 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 100f6188..600b48dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3145,9 +3145,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.12" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", diff --git a/Cargo.nix b/Cargo.nix index db19601b..9abd0950 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -10491,9 +10491,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.103.12"; + version = "0.103.13"; edition = "2021"; - sha256 = "01nxzkfd1l96jzp04svc7iznlkarzx3wb9p63a0i17rc4y2vnyc2"; + sha256 = "0vkm7z9pnxz5qz66p2kmyy2pwx0g4jnsbqk5xzfhs4czcjl2ki31"; libName = "webpki"; dependencies = [ { diff --git a/rust/stackable-cockpit/src/helm.rs b/rust/stackable-cockpit/src/helm.rs index 76528584..baad9ee1 100644 --- a/rust/stackable-cockpit/src/helm.rs +++ b/rust/stackable-cockpit/src/helm.rs @@ -38,6 +38,40 @@ pub struct ChartRepo { pub url: String, } +/// The kind of source a chart repo URL refers to. +/// +/// [Self::Oci] and [Self::Local] don't need special handling, but [Self::Repo] +/// needs to call `helm::add_repo`. +/// +/// Note: We don't yet support local repositories, so an error should be emitted +/// if the source is [Self::Local]. +#[derive(Debug, PartialEq)] +pub enum ChartSourceKind { + /// OCI registry (url starts with `oci://`) + Oci, + + /// Traditional index.yaml-based repository (url starts with `http://` or `https://`) + Repo, + + /// Local filesystem path (not yet supported) + /// + /// This is the fallback if not oci or http(s). + Local, +} + +impl ChartRepo { + /// Determine the kind of chart source based on the URL scheme. + pub fn source_kind(&self) -> ChartSourceKind { + if self.url.starts_with("oci://") { + ChartSourceKind::Oci + } else if self.url.starts_with("http://") || self.url.starts_with("https://") { + ChartSourceKind::Repo + } else { + ChartSourceKind::Local + } + } +} + #[derive(Debug, Snafu)] pub enum Error { #[snafu(display("failed to parse URL"))] @@ -505,3 +539,27 @@ where serde_yaml::from_str(&index_file_content).context(DeserializeYamlSnafu) } + +#[cfg(test)] +mod tests { + use rstest::rstest; + + use super::*; + + #[rstest] + #[case("oci://oci.stackable.tech/sdp-charts", ChartSourceKind::Oci)] + #[case( + "https://repo.stackable.tech/repository/helm-stable", + ChartSourceKind::Repo + )] + #[case("http://example.com/charts", ChartSourceKind::Repo)] + #[case("./charts/my-chart", ChartSourceKind::Local)] + #[case("/absolute/path/to/chart", ChartSourceKind::Local)] + fn source_kind(#[case] url: &str, #[case] expected: ChartSourceKind) { + let repo = ChartRepo { + name: "test".to_owned(), + url: url.to_owned(), + }; + assert_eq!(repo.source_kind(), expected); + } +} diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index 6e5dd45d..36531ded 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -56,6 +56,10 @@ pub enum Error { source: helm::Error, }, + /// This error indicates that the Helm chart source kind is not supported. + #[snafu(display("local Helm chart sources are not yet supported (source: {chart_source:?})"))] + UnsupportedChartSource { chart_source: String }, + /// This error indicates that Helm chart options could not be serialized /// into YAML. #[snafu(display("failed to serialize Helm chart options"))] @@ -104,12 +108,23 @@ pub trait InstallManifestsExt { info!(helm_chart.name, helm_chart.version, "Installing Helm chart",); - // Assumption: that all manifest helm charts refer to repos not registries - helm::add_repo(&helm_chart.repo.name, &helm_chart.repo.url).context( - AddHelmRepositorySnafu { - repo_name: helm_chart.repo.name.clone(), - }, - )?; + let chart_source = match helm_chart.repo.source_kind() { + helm::ChartSourceKind::Repo => { + helm::add_repo(&helm_chart.repo.name, &helm_chart.repo.url).context( + AddHelmRepositorySnafu { + repo_name: helm_chart.repo.name.clone(), + }, + )?; + &helm_chart.repo.name + } + helm::ChartSourceKind::Oci => &helm_chart.repo.url, + helm::ChartSourceKind::Local => { + return UnsupportedChartSourceSnafu { + chart_source: helm_chart.repo.url.clone(), + } + .fail(); + } + }; // Serialize chart options to string let values_yaml = serde_yaml::to_string(&helm_chart.options) @@ -119,7 +134,7 @@ pub trait InstallManifestsExt { helm::upgrade_or_install_release_from_repo_or_registry( &helm_chart.release_name, helm::ChartVersion { - chart_source: &helm_chart.repo.name, + chart_source, chart_name: &helm_chart.name, chart_version: Some(&helm_chart.version), }, diff --git a/rust/stackablectl/CHANGELOG.md b/rust/stackablectl/CHANGELOG.md index bc493c58..91507e68 100644 --- a/rust/stackablectl/CHANGELOG.md +++ b/rust/stackablectl/CHANGELOG.md @@ -10,9 +10,11 @@ All notable changes to this project will be documented in this file. - Add `uninstall` subcommand for `demo`/`stack` commands ([#429]). - Add confirmation prompt to `install` subcommand for namespace selection ([#429]). - Add `--assume-yes` option for running commands non-interactively ([#429]). +- Support Helm charts sourced from OCI registries in demo/stack manifests ([#440]). [#429]: https://github.com/stackabletech/stackable-cockpit/pull/429 [#438]: https://github.com/stackabletech/stackable-cockpit/pull/438 +[#440]: https://github.com/stackabletech/stackable-cockpit/pull/440 ## [1.4.0] - 2026-03-18 From 42b93d859129ee3ffedc80fc2475108e9a618516 Mon Sep 17 00:00:00 2001 From: Benedikt Labrenz Date: Mon, 11 May 2026 09:08:39 +0200 Subject: [PATCH 11/12] chore: Remove old frontend docs (#441) * remove old frontend docs & clean up gh workflows * remove images of old frontend --- .github/workflows/pr_cockpit.yml | 1 - docs/antora.yml | 1 - docs/modules/ROOT/pages/index.adoc | 1 - docs/modules/cockpit/images/login-view.png | Bin 150892 -> 0 bytes .../modules/cockpit/images/stacklets-view.png | Bin 134286 -> 0 bytes docs/modules/cockpit/nav.adoc | 2 - docs/modules/cockpit/pages/index.adoc | 16 ------ docs/modules/cockpit/pages/installation.adoc | 51 ------------------ 8 files changed, 72 deletions(-) delete mode 100644 docs/modules/cockpit/images/login-view.png delete mode 100644 docs/modules/cockpit/images/stacklets-view.png delete mode 100644 docs/modules/cockpit/nav.adoc delete mode 100644 docs/modules/cockpit/pages/index.adoc delete mode 100644 docs/modules/cockpit/pages/installation.adoc diff --git a/.github/workflows/pr_cockpit.yml b/.github/workflows/pr_cockpit.yml index 1248c07b..599b4226 100644 --- a/.github/workflows/pr_cockpit.yml +++ b/.github/workflows/pr_cockpit.yml @@ -7,7 +7,6 @@ on: - ".github/workflows/pr_cockpit.yml" - "rust/stackable-cockpitd/**" - "rust/stackable-cockpit/**" - - "docs/modules/cockpit/**" - "docs/modules/ROOT/**" - "Cargo.lock" - "deploy/**" diff --git a/docs/antora.yml b/docs/antora.yml index 45968107..3578e46a 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -3,5 +3,4 @@ name: management title: SDP Management version: "nightly" nav: - - modules/cockpit/nav.adoc - modules/stackablectl/nav.adoc diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc index 6dd74e8c..6c54f67f 100644 --- a/docs/modules/ROOT/pages/index.adoc +++ b/docs/modules/ROOT/pages/index.adoc @@ -1,4 +1,3 @@ = Management Tools for the Stackable Data Platform -* xref:cockpit:index.adoc[] * xref:stackablectl:index.adoc[] diff --git a/docs/modules/cockpit/images/login-view.png b/docs/modules/cockpit/images/login-view.png deleted file mode 100644 index c9cc996c702894d3649626cbc3a1f936221c3857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150892 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 MxSUw2h~9_)1-8$+r~m)} diff --git a/docs/modules/cockpit/images/stacklets-view.png b/docs/modules/cockpit/images/stacklets-view.png deleted file mode 100644 index 9c76e034214e8f45862d4174f3459a47aed6ea21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134286 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 D633c5 diff --git a/docs/modules/cockpit/nav.adoc b/docs/modules/cockpit/nav.adoc deleted file mode 100644 index fd44482e..00000000 --- a/docs/modules/cockpit/nav.adoc +++ /dev/null @@ -1,2 +0,0 @@ -* xref:index.adoc[Cockpit] -** xref:installation.adoc[Installation] diff --git a/docs/modules/cockpit/pages/index.adoc b/docs/modules/cockpit/pages/index.adoc deleted file mode 100644 index 41139372..00000000 --- a/docs/modules/cockpit/pages/index.adoc +++ /dev/null @@ -1,16 +0,0 @@ -= Stackable Cockpit - -IMPORTANT: The Stackable Cockpit is currently an early preview, and is not yet a fully supported component of the -Stackable Data Platform. - -The `Cockpit` application is a browser-based management tool which interacts with the Stackable data platform. Currently -it can display deployed stacklets and their status. The display can be compared with the -xref:management:stackablectl:commands/stacklet.adoc#list-stacklets[`stackablectl stacklet list`] command output. - -The installation is described in the xref:installation.adoc[installation guide]. - -.Stackable Cockpit login page -image::login-view.png[Image of the Stackable Cockpit login page] - -.Stackable Cockpit Stacklet list page -image::stacklets-view.png[Image of the Stackable Cockpit Stacklet list page] diff --git a/docs/modules/cockpit/pages/installation.adoc b/docs/modules/cockpit/pages/installation.adoc deleted file mode 100644 index 09d2115a..00000000 --- a/docs/modules/cockpit/pages/installation.adoc +++ /dev/null @@ -1,51 +0,0 @@ -= Installation - -The Stackable Cockpit is normally installed using Helm. - -== Prerequisites - -You will need: - -* a Kubernetes cluster -* kubectl -* Helm -* htpasswd (from Apache HTTPD) - -Resource sizing depends on cluster type(s), usage and scope, but as a starting point we recommend a minimum of the -following resources for this service: - -* 0.2 cores (e.g. i5 or similar) -* 256MB RAM - -== Authentication - -The Stackable Cockpit authenticates users using a htpasswd database. This file can be -created and maintained using the `htpasswd` tool: - -[source,console] ----- -$ htpasswd -Bc my-htpasswd first-user -$ htpasswd -B my-htpasswd second-user ----- - -NOTE: Stackable Cockpit _only_ supports bcrypt passwords (controlled by the - `-B` flag). - -== Installing - -First ensure that you have installed the Stackable Operators Helm repository: - -[source,console] ----- -$ helm repo add stackable-dev https://repo.stackable.tech/repository/helm-dev/ ----- - -Then install the Stackable Cockpit: - -[source,console] ----- -$ helm upgrade stackable-cockpit stackable-dev/stackable-cockpit --install \ - --version 0.0.0-dev --set-file htpasswd=my-htpasswd ----- - -Helm will deploy the service in Kubernetes containers. You're now ready to access the cockpit! From d4ddda43fbcea284b0ea2033eef50b43ff72a252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCller?= Date: Mon, 1 Jun 2026 18:35:16 +0200 Subject: [PATCH 12/12] feat(stackablectl): check for namespace before attempting uninstall (#442) * feat(stackablectl): check for namespace before attempting uninstall * chore: extend changelog * Update rust/stackablectl/CHANGELOG.md Co-authored-by: Xenia --------- Co-authored-by: Xenia --- rust/stackablectl/CHANGELOG.md | 5 +++++ rust/stackablectl/src/cmds/demo.rs | 12 ++++++++++++ rust/stackablectl/src/cmds/stack.rs | 12 ++++++++++++ 3 files changed, 29 insertions(+) diff --git a/rust/stackablectl/CHANGELOG.md b/rust/stackablectl/CHANGELOG.md index 91507e68..25c586f9 100644 --- a/rust/stackablectl/CHANGELOG.md +++ b/rust/stackablectl/CHANGELOG.md @@ -12,9 +12,14 @@ All notable changes to this project will be documented in this file. - Add `--assume-yes` option for running commands non-interactively ([#429]). - Support Helm charts sourced from OCI registries in demo/stack manifests ([#440]). +### Changed + +- Abort early if `uninstall` is issued for `default` namespace ([#442]). + [#429]: https://github.com/stackabletech/stackable-cockpit/pull/429 [#438]: https://github.com/stackabletech/stackable-cockpit/pull/438 [#440]: https://github.com/stackabletech/stackable-cockpit/pull/440 +[#442]: https://github.com/stackabletech/stackable-cockpit/pull/442 ## [1.4.0] - 2026-03-18 diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index d01cf01b..2a7b5488 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -183,6 +183,11 @@ pub enum CmdError { demo_name: String, }, + #[snafu(display( + "demo {demo_name:?} cannot be uninstalled from the {DEFAULT_NAMESPACE:?} namespace, because Kubernetes does not allow deleting it. Pass --namespace if the demo was installed in a different namespace, or delete the demo's resources manually" + ))] + UninstallFromDefaultNamespace { demo_name: String }, + #[snafu(display("failed to build labels for demo resources"))] BuildLabels { source: LabelError }, @@ -525,6 +530,13 @@ async fn uninstall_cmd( // Init result output and progress output let mut output = Cli::result(); + ensure!( + args.namespaces.namespace != DEFAULT_NAMESPACE, + UninstallFromDefaultNamespaceSnafu { + demo_name: args.demo_name.clone(), + } + ); + let proceed_with_uninstall = args.prompt_args.assume_yes || { tracing_indicatif::suspend_tracing_indicatif(|| -> Result { diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 11b7452a..d57f60a4 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -178,6 +178,11 @@ pub enum CmdError { stack_name: String, }, + #[snafu(display( + "stack {stack_name:?} cannot be uninstalled from the {DEFAULT_NAMESPACE:?} namespace, because Kubernetes does not allow deleting it. Pass --namespace if the stack was installed in a different namespace, or delete the stack's resources manually" + ))] + UninstallFromDefaultNamespace { stack_name: String }, + #[snafu(display("failed to build labels for stack resources"))] BuildLabels { source: LabelError }, @@ -496,6 +501,13 @@ async fn uninstall_cmd( ) -> Result { let mut output = Cli::result(); + ensure!( + args.namespaces.namespace != DEFAULT_NAMESPACE, + UninstallFromDefaultNamespaceSnafu { + stack_name: args.stack_name.clone(), + } + ); + let proceed_with_uninstall = args.prompt_args.assume_yes || tracing_indicatif::suspend_tracing_indicatif(|| -> Result { Confirm::new()