diff --git a/api/.gitignore b/api/.gitignore index b83d222..fc52778 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -1 +1,2 @@ /target/ +/sqlite.db diff --git a/api/Cargo.lock b/api/Cargo.lock index f2dba73..3565ae8 100644 --- a/api/Cargo.lock +++ b/api/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ahash" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" +dependencies = [ + "getrandom 0.2.3", + "once_cell", + "version_check", +] + [[package]] name = "autocfg" version = "1.0.1" @@ -75,6 +86,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fnv" version = "1.0.7" @@ -210,6 +233,18 @@ name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashlink" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +dependencies = [ + "hashbrown", +] [[package]] name = "headers" @@ -360,6 +395,16 @@ version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" +[[package]] +name = "libsqlite3-sys" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abd5850c449b40bacb498b2bbdfaff648b1b055630073ba8db499caf2d0ea9f2" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "lock_api" version = "0.4.5" @@ -481,6 +526,7 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" name = "packager-api" version = "0.1.0" dependencies = [ + "rusqlite", "serde", "serde_json", "tokio", @@ -551,6 +597,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" + [[package]] name = "ppv-lite86" version = "0.2.10" @@ -680,6 +732,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "rusqlite" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2aebd07fccf5c0d3f1458219965b0861d45f5db9f9b2617277fa7f85179213" +dependencies = [ + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "memchr", + "smallvec", + "uuid", +] + [[package]] name = "ryu" version = "1.0.5" @@ -1035,6 +1103,12 @@ dependencies = [ "serde", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.3" diff --git a/api/Cargo.toml b/api/Cargo.toml index 33a3d79..6962760 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -4,22 +4,37 @@ version = "0.1.0" authors = [ "Hannes Körber " ] -edition = "2021" +edition = "2018" readme = "README.md" repository = "https://github.com/hkoerber/packager/" license = "AGPL-3.0-only" publish = false +[profile.release] +lto = true + [lib] name = "packager" [dependencies] -tokio = { version = "1", features = ["full"] } warp = "0.3" - -serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -uuid = { version = "0.8", features = ["serde", "v4"] } +[dependencies.tokio] +version = "1" +features = ["full"] + + +[dependencies.serde] +version = "1.0" +features = ["derive"] + +[dependencies.uuid] +version = "0.8" +features = ["serde", "v4"] + +[dependencies.rusqlite] +version = "0.26.0" +features = ["uuid"] diff --git a/api/src/db.rs b/api/src/db.rs new file mode 100644 index 0000000..a7678a8 --- /dev/null +++ b/api/src/db.rs @@ -0,0 +1,1042 @@ +use rusqlite; +use uuid::Uuid; + +use super::Duration; +use super::ItemSize; +use super::ItemUsage; +use super::PackageItem; +use super::PackageList; +use super::Period; +use super::Preparation; +use super::PreparationStep; +use super::Trip; +use super::TripParameters; +use super::TripState; + +pub fn load() -> rusqlite::Result<()> { + let example_lists = vec![ + PackageList::new_from_items( + Uuid::parse_str("5f95d8c7-c4da-44bc-af30-2d10c479de8a").unwrap(), + String::from("EDC"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("48703b81-037a-401f-8f46-56c242bb16c3").unwrap(), + String::from("Rucksack"), + ), + PackageItem::new_simple( + Uuid::parse_str("39b26f98-0cbc-46d5-ac17-43d61ba1a503").unwrap(), + String::from("Regenhülle für Rucksack"), + ), + PackageItem::new_simple( + Uuid::parse_str("a5934361-bc5d-4092-bad4-95c15c875dca").unwrap(), + String::from("Normale Schuhe"), + ), + PackageItem::new_simple( + Uuid::parse_str("4b0a6dbb-652b-464a-b413-93dd4f010ce3").unwrap(), + String::from("Taschenmesser"), + ), + PackageItem::new( + Uuid::parse_str("9823e841-64d1-43ab-a05f-95606b89482c").unwrap(), + String::from("Taschentücher"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("a7eac657-e870-4181-a644-16fe229d917a").unwrap(), + String::from("Handy"), + ItemSize::None, + 1, + ItemUsage::Infinite, + Preparation::Steps(vec![ + PreparationStep::new( + Uuid::parse_str("36cf6bfe-d4d9-461b-84e9-6e52b941f8b9").unwrap(), + String::from("Vertrag überprüfen"), + Duration::Days(30), + ), + PreparationStep::new( + Uuid::parse_str("1f795db7-094f-440d-b29a-66eb93787697").unwrap(), + String::from("Aufladen"), + Duration::Days(1), + ), + ]), + ), + PackageItem::new( + Uuid::parse_str("c0d97e46-a9fe-4d20-a3e9-8cf7c69d2fbf").unwrap(), + String::from("Kopfhörer"), + ItemSize::None, + 1, + ItemUsage::Infinite, + Preparation::Steps(vec![PreparationStep::new( + Uuid::parse_str("9fa1a53e-4884-4324-b49f-3a390bfebf67").unwrap(), + String::from("Aufladen"), + Duration::Days(1), + )]), + ), + PackageItem::new( + Uuid::parse_str("9b04e117-1a61-4643-8238-55c401a2dd00").unwrap(), + String::from("Mundschutz"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Weekly(1)), + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("5efe30c7-896d-4c32-9976-81ac93ff6aa0").unwrap(), + String::from("Kokain"), + ItemSize::Gram(100), + 3, + ItemUsage::Periodic(Period::Weekly(1)), + Preparation::Steps(vec![PreparationStep::new( + Uuid::parse_str("ab3e49c1-cc46-4d25-a43a-0e18f4a6dd0b").unwrap(), + String::from("Beim Dealer kaufen"), + Duration::Days(3), + )]), + ), + PackageItem::new_simple( + Uuid::parse_str("8fb8d7ce-7766-4203-bc38-058fe2440519").unwrap(), + String::from("Ladekabel"), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("3ea0714e-3115-46c4-8ae0-f2a37398cc7a").unwrap(), + String::from("Geld & Karten"), + vec![ + PackageItem::new( + Uuid::parse_str("18ebb1bc-e01f-4dc7-bda7-919dd8f069c7").unwrap(), + String::from("Bargeld"), + ItemSize::Name(String::from("Euro")), + 100, + ItemUsage::Infinite, + Preparation::Steps(vec![PreparationStep::new( + Uuid::parse_str("bed380b8-b9fa-412d-b767-c57fbd9e5d94").unwrap(), + String::from("Abheben"), + Duration::Days(1), + )]), + ), + PackageItem::new_simple( + Uuid::parse_str("2aba4c22-9c3d-4b19-95b5-265f1846b8f9").unwrap(), + String::from("Kreditkarte"), + ), + PackageItem::new_simple( + Uuid::parse_str("aeec841e-0691-4af9-b719-16a6752c33d6").unwrap(), + String::from("Pass"), + ), + PackageItem::new_simple( + Uuid::parse_str("1a598c16-a238-4d02-baef-03208beb9509").unwrap(), + String::from("Krankenversicherungskarte"), + ), + PackageItem::new_simple( + Uuid::parse_str("584955e2-3bf4-459c-8c87-631414842571").unwrap(), + String::from("Krankenversicherungskarte (Zusatz)"), + ), + PackageItem::new_simple( + Uuid::parse_str("571dd7b6-0420-4f8f-8e83-fb430c6f1c23").unwrap(), + String::from("Auslandskrankenversicherungsnachweis"), + ), + PackageItem::new_simple( + Uuid::parse_str("25937e62-4ade-495b-9535-c4db1176fbab").unwrap(), + String::from("Notfalltelefonnummernliste"), + ), + PackageItem::new_simple( + Uuid::parse_str("6464f872-00f6-4621-9d37-ff6b75c8d79a").unwrap(), + String::from("ADAC-Karte"), + ), + PackageItem::new_simple( + Uuid::parse_str("0b9298b7-6bdb-4fdc-a171-1953654b160e").unwrap(), + String::from("Impfausweiß (EU)"), + ), + PackageItem::new_simple( + Uuid::parse_str("fac04399-e092-4aeb-bf61-edd081890fa6").unwrap(), + String::from("Führerschein"), + ), + PackageItem::new_simple( + Uuid::parse_str("17ef3d3a-010f-44c1-acae-ef0ea9a985b8").unwrap(), + String::from("Internationaler Führerschein"), + ), + PackageItem::new_simple( + Uuid::parse_str("b256cd9f-8c5c-45f2-9e08-04cc62800cfe").unwrap(), + String::from("Tagebuch"), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("4b2c2d4e-3014-48aa-95e0-39f352cb6494").unwrap(), + String::from("Waschzeug"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("c91e2295-7fa6-4165-bb6c-0de60069c410").unwrap(), + String::from("Waschbeutel"), + ), + PackageItem::new_simple( + Uuid::parse_str("005639bb-b336-4e7c-bb88-aeaca20fc488").unwrap(), + String::from("Sonnencreme"), + ), + PackageItem::new_simple( + Uuid::parse_str("9a907ab6-3e49-4cc0-af86-637821127354").unwrap(), + String::from("After-Sun"), + ), + PackageItem::new_simple( + Uuid::parse_str("7ed5be40-929e-4ae2-a723-61e6514e9592").unwrap(), + String::from("Nagelset"), + ), + PackageItem::new_simple( + Uuid::parse_str("40f9bc11-1e24-4a60-b183-7f9a2eab0e42").unwrap(), + String::from("Rasurbox"), + ), + PackageItem::new_simple( + Uuid::parse_str("c72126c8-5639-4952-b4a7-d588d636a6f0").unwrap(), + String::from("Rasierer"), + ), + PackageItem::new( + Uuid::parse_str("9f6e9c09-e550-411c-a89d-7f79608b1bb6").unwrap(), + String::from("Ersatzklingen"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new_simple( + Uuid::parse_str("547fb1cd-568b-44d2-9618-0f4de7ca2ca5").unwrap(), + String::from("Zahnbürste"), + ), + PackageItem::new( + Uuid::parse_str("09259ebe-407b-4808-9a19-db3b95f77846").unwrap(), + String::from("Zahnputztabletten"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Daily(2)), + Preparation::None, + ), + PackageItem::new_simple( + Uuid::parse_str("10342277-9984-4c9a-ad07-155e148f91fd").unwrap(), + String::from("Deo"), + ), + PackageItem::new_simple( + Uuid::parse_str("e323ca57-8487-4b3f-a3f9-6dd8e26ff0e4").unwrap(), + String::from("Duschgel / Shampoo"), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("4ba0462f-5c75-4926-9ca2-ea93ef5b66ef").unwrap(), + String::from("Apotheke"), + vec![ + PackageItem::new( + Uuid::parse_str("bdeea898-479b-41e9-8d33-1c79743b3011").unwrap(), + String::from("Blasenpflaster"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("2175fa92-0ef2-48a1-bea0-f70268b0ad68").unwrap(), + String::from("Erste-Hilfe-Set"), + ItemSize::None, + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("bad9f320-eaf8-4240-bfa6-890b755eb03a").unwrap(), + String::from("Paracetamol"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("b9d3f29d-4448-42ba-aeff-ba179542b4ae").unwrap(), + String::from("Autan"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("bfeb6d0f-5122-4f80-94e9-be54a1d1c838").unwrap(), + String::from("Pflaster"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("3f08c3e2-a0d9-40fb-b3fb-f4bb79815b9d").unwrap(), + String::from("Zeckenkarte"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("9aa4ee9f-2f00-42d2-980e-8fd1ede0283c").unwrap(), + String::from("Badesachen"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("879b9d32-0de5-45f3-bffb-0c1e73b5a7b8").unwrap(), + String::from("Badehose"), + ), + PackageItem::new_simple( + Uuid::parse_str("5610ab1f-308d-4ef9-b8e4-3721fa4c4172").unwrap(), + String::from("Badehandtuch"), + ), + PackageItem::new_simple( + Uuid::parse_str("e7e3c053-a269-4f0d-b6bd-99b48bf4573a").unwrap(), + String::from("Surfshirt (Lang)"), + ), + PackageItem::new_simple( + Uuid::parse_str("360c20f5-8142-48d1-add4-a8f2a48a242b").unwrap(), + String::from("Wasserschuhe"), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("1e0728d1-9dd9-48ff-a206-a73b604b9748").unwrap(), + String::from("Camping"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("fb6eec8c-a1ad-420f-b8de-9695e9ccb67d").unwrap(), + String::from("Schlafsack"), + ), + PackageItem::new_simple( + Uuid::parse_str("69a06abd-34f4-4991-9a41-b3ec50bcbbd7").unwrap(), + String::from("Zelt"), + ), + PackageItem::new_simple( + Uuid::parse_str("22169568-1976-43ab-8c40-37c7e6193e18").unwrap(), + String::from("Luftmatratze"), + ), + PackageItem::new_simple( + Uuid::parse_str("dd10738b-0162-4e0a-9db9-ea5e16ee5566").unwrap(), + String::from("Campingstuhl"), + ), + PackageItem::new_simple( + Uuid::parse_str("a88c14c1-8194-4fea-be6c-b532517bbf97").unwrap(), + String::from("Panzertape"), + ), + PackageItem::new_simple( + Uuid::parse_str("fb67fbf1-cd04-4b39-b0a3-bff4bf07f38e").unwrap(), + String::from("Tarp"), + ), + PackageItem::new_simple( + Uuid::parse_str("6de5825b-0e39-4693-9664-2edc7353db3b").unwrap(), + String::from("Hängematte"), + ), + PackageItem::new_simple( + Uuid::parse_str("c6f14fb7-c598-4a47-8b12-b96ff3856a21").unwrap(), + String::from("Topf"), + ), + PackageItem::new_simple( + Uuid::parse_str("2fb43b9c-c6ca-4fda-9e09-e1a83efdc4f7").unwrap(), + String::from("Teller"), + ), + PackageItem::new_simple( + Uuid::parse_str("a203f34c-e912-4479-ad8e-e16150122cad").unwrap(), + String::from("Messer"), + ), + PackageItem::new_simple( + Uuid::parse_str("63837c0a-7a8e-40ae-aced-818066bd9e89").unwrap(), + String::from("Gabel"), + ), + PackageItem::new_simple( + Uuid::parse_str("437a45d9-4fc5-459e-b790-7628945d7c38").unwrap(), + String::from("Löffel"), + ), + PackageItem::new_simple( + Uuid::parse_str("a461859f-b430-42da-bf52-8cdb3eb42d13").unwrap(), + String::from("Stirnlampe"), + ), + PackageItem::new_simple( + Uuid::parse_str("f109c12f-10dd-4249-a02e-c28aaa20a8f6").unwrap(), + String::from("Geschirrtuch"), + ), + PackageItem::new_simple( + Uuid::parse_str("1f2ffc7e-060a-4277-a15d-119b85481438").unwrap(), + String::from("Spüllappen"), + ), + PackageItem::new_simple( + Uuid::parse_str("bf6d49fe-25cc-4114-a374-3c4772cf5f3a").unwrap(), + String::from("Taschenlampe"), + ), + PackageItem::new_simple( + Uuid::parse_str("03994e35-f0f0-4ccd-bc24-0a331ffbba96").unwrap(), + String::from("Feuerzeug"), + ), + PackageItem::new_simple( + Uuid::parse_str("fc3ecdab-eb3a-4d27-8f95-cd78d37e063e").unwrap(), + String::from("Tasse"), + ), + PackageItem::new_simple( + Uuid::parse_str("8b55efae-6e18-4d7f-a5b7-83ba15c50995").unwrap(), + String::from("Grill"), + ), + PackageItem::new( + Uuid::parse_str("b6d821e5-3285-4bf2-bd71-be9154f94937").unwrap(), + String::from("Grillkohle"), + ItemSize::Gram(1500), + 1, + ItemUsage::Periodic(Period::Days(2)), + Preparation::None, + ), + PackageItem::new_simple( + Uuid::parse_str("d2338ac1-9995-4319-8ca5-12654a266266").unwrap(), + String::from("Campingkocher"), + ), + PackageItem::new( + Uuid::parse_str("4ff62940-f691-4982-b1fd-54a2850e06f4").unwrap(), + String::from("Campinggas"), + ItemSize::Pack(1), + 1, + ItemUsage::Periodic(Period::Days(3)), + Preparation::None, + ), + PackageItem::new_simple( + Uuid::parse_str("a024c67a-6e61-4749-b2a4-1ec8ca132184").unwrap(), + String::from("Kaffeekochaufsatz"), + ), + PackageItem::new( + Uuid::parse_str("054e1610-1e8e-421e-95ad-c76e88cb45ab").unwrap(), + String::from("Küchenrolle"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Days(5)), + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("181310a8-946c-4075-9f95-c7a82d0269fd").unwrap(), + String::from("Müllsäcke"), + ItemSize::Pack(1), + 1, + ItemUsage::Infinite, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("c823ce3f-922e-4300-95ad-21ff221cd896").unwrap(), + String::from("Teelichter"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Daily(3)), + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("e86bfb7c-a840-4b88-b216-afd3c173754b").unwrap(), + String::from("Klopapier"), + ItemSize::Name(String::from("Rolle")), + 1, + ItemUsage::Periodic(Period::Weekly(1)), + Preparation::None, + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("e5ecb3cc-a893-44cd-b4f8-4b41af003c96").unwrap(), + String::from("Essen"), + vec![PackageItem::new( + Uuid::parse_str("6ebf5d87-6b97-4d80-8e03-25fa62e641d9").unwrap(), + String::from("Kaffee"), + ItemSize::Gram(100), + 1, + ItemUsage::Periodic(Period::Days(3)), + Preparation::None, + )], + ), + PackageList::new_from_items( + Uuid::parse_str("4e9042db-1db8-4912-8179-d0a3ebb80876").unwrap(), + String::from("Wanderzeug"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("2eccd528-17a7-429f-b97a-70faae1b4dac").unwrap(), + String::from("Wanderschuhe"), + ), + PackageItem::new( + Uuid::parse_str("d8c52786-d50e-4a9f-b8c6-e9396c5be789").unwrap(), + String::from("Trinkblase"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::Steps(vec![PreparationStep::new( + Uuid::parse_str("50548e94-9a1c-4509-bbb5-eb5831b3c4c1").unwrap(), + String::from("Auffüllen"), + Duration::None, + )]), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("5b272c8e-bf54-4af6-94e0-63071c92a8e3").unwrap(), + String::from("Klamotten"), + vec![ + PackageItem::new( + Uuid::parse_str("d18215d2-9cf9-48c7-894b-b9680ba39879").unwrap(), + String::from("Cap"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("83c03986-cc34-4500-9cee-1cc1778f5cf3").unwrap(), + String::from("Regenjacke"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("00c116ba-840d-47c4-a081-5e256941d3b9").unwrap(), + String::from("Daunenjacke"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("35834bec-6c63-41df-825c-05b943e07bc8").unwrap(), + String::from("Pullover"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("127704a8-1e4d-4c49-b74f-34130ed08f83").unwrap(), + String::from("Lange Hose"), + ItemSize::None, + 2, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("e15a6772-3d5d-454d-8f7d-bf9066ba5d23").unwrap(), + String::from("Kurze Hose"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("09992e6d-408a-43e4-beee-1925e727415f").unwrap(), + String::from("Jogginghose"), + ItemSize::None, + 1, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("799f0fd4-2be7-44b5-b286-889242900be3").unwrap(), + String::from("Socken"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Daily(1)), + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("f57f3299-a46a-4ed3-aff0-ffc5d2627a6a").unwrap(), + String::from("Unterhose"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Daily(1)), + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("c100f7be-ceb7-46a6-aded-380a201bfe45").unwrap(), + String::from("T-Shirt"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Days(2)), + Preparation::None, + ), + PackageItem::new_simple( + Uuid::parse_str("22908312-a8d2-4005-893c-12e56d9af022").unwrap(), + String::from("Schmutzwäschebeutel"), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("929bc029-ec8f-4294-9484-ec32f0170f5c").unwrap(), + String::from("Fahrrad"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("d91ed4fd-ef9b-4ad5-849f-1481dbbc95b0").unwrap(), + String::from("Fahrrad"), + ), + PackageItem::new_simple( + Uuid::parse_str("2f2a09d7-2d97-4ff8-9fb1-ace86eaf6de5").unwrap(), + String::from("Fahrradhelm"), + ), + ], + ), + PackageList::new_from_items( + Uuid::parse_str("0103e348-b4e8-4cc9-95e6-4ef85b7c76ab").unwrap(), + String::from("Misc"), + vec![ + PackageItem::new_simple( + Uuid::parse_str("990c7121-7342-48a2-9abb-4d0e274b6759").unwrap(), + String::from("Trinkflasche"), + ), + PackageItem::new_simple( + Uuid::parse_str("0ead2b93-9b81-4e32-a856-0a562557598c").unwrap(), + String::from("Dyneemaschnur"), + ), + PackageItem::new_simple( + Uuid::parse_str("be5d49bc-9c06-4747-b954-9ca003694018").unwrap(), + String::from("Ladegerät"), + ), + PackageItem::new( + Uuid::parse_str("aab7b03b-19f9-4149-a23d-3c14d938cca4").unwrap(), + String::from("Powerbank"), + ItemSize::None, + 1, + ItemUsage::Infinite, + Preparation::Steps(vec![PreparationStep::new( + Uuid::parse_str("d9f040b0-4e60-4a70-8c47-3819294ed380").unwrap(), + String::from("Aufladen"), + Duration::Days(1), + )]), + ), + PackageItem::new( + Uuid::parse_str("c54deb17-fe62-4300-8297-c5dfc4773a02").unwrap(), + String::from("Desinfektionsgel"), + ItemSize::None, + 1, + ItemUsage::Periodic(Period::Weekly(1)), + Preparation::None, + ), + PackageItem::new( + Uuid::parse_str("3fb87c86-7155-4df5-8f7b-68c288ba1147").unwrap(), + String::from("Karabiner"), + ItemSize::None, + 3, + ItemUsage::Singleton, + Preparation::None, + ), + PackageItem::new_simple( + Uuid::parse_str("c965176c-9014-4e8f-8e99-8cd2e37a64ac").unwrap(), + String::from("Ersatzbrille"), + ), + PackageItem::new_simple( + Uuid::parse_str("b0909ce6-5a8c-42fa-a384-de108f19ee5d").unwrap(), + String::from("Sonnenbrille"), + ), + PackageItem::new_simple( + Uuid::parse_str("7ec347d4-0c28-48bb-9c32-558a1988a164").unwrap(), + String::from("Ohrenstöpsel"), + ), + ], + ), + ]; + + let example_trips = vec![ + Trip::from_package_list( + Uuid::parse_str("98dd50f9-b945-48e0-8fa9-41a3fd8b897e").unwrap(), + String::from("Campingtrip"), + String::from("2021-09-06"), + TripParameters { days: 5 }, + vec![ + (example_lists[0].id, example_lists[0].name.clone()), + (example_lists[1].id, example_lists[0].name.clone()), + ], + TripState::Active, + ), + Trip::from_package_list( + Uuid::parse_str("1a8e3f23-fb24-43f0-ad09-5945a1da708e").unwrap(), + String::from("Städtereise"), + String::from("2021-12-12"), + TripParameters { days: 2 }, + vec![ + (example_lists[0].id, example_lists[0].name.clone()), + (example_lists[2].id, example_lists[0].name.clone()), + (example_lists[3].id, example_lists[0].name.clone()), + ], + TripState::Planned, + ), + ]; + + print!("Loading data ... "); + + let conn = rusqlite::Connection::open("./sqlite.db")?; + + conn.execute( + "CREATE TABLE packagelists ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL + )", + [], + )?; + + conn.execute( + "CREATE TABLE packagelistitems ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + packagelist TEXT NOT NULL, + count INTEGER NOT NULL, + + FOREIGN KEY(packagelist) REFERENCES packagelists(id) + )", + [], + )?; + + conn.execute( + "CREATE TABLE preparation ( + id TEXT PRIMARY KEY, + packagelistitem TEXT NOT NULL, + + FOREIGN KEY(packagelistitem) REFERENCES packagelistitems(id) + )", + [], + )?; + + conn.execute( + "CREATE TABLE preparationstep ( + id TEXT PRIMARY KEY, + preparation TEXT NOT NULL, + name TEXT NOT NULL, + start_days INTEGER NOT NULL, + + FOREIGN KEY(preparation) REFERENCES preparation(id) + )", + [], + )?; + + conn.execute( + "CREATE TABLE trips ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + date TEXT NOT NULL, + days INTEGER NOT NULL, + state INTEGER NOT NULL + )", + [], + )?; + + conn.execute( + "CREATE TABLE trip_packagelist ( + trip_id TEXT NOT NULL, + packagelist_id TEXT NOT NULL, + + FOREIGN KEY(trip_id) REFERENCES trips(id) + FOREIGN KEY(packagelist_id) REFERENCES packagelists(id) + )", + [], + )?; + + for list in example_lists { + conn.execute( + "INSERT INTO + packagelists (id, name) + VALUES (?1, ?2)", + rusqlite::params![list.id, list.name], + )?; + + for item in list.items { + conn.execute( + "INSERT INTO + packagelistitems (id, name, packagelist, count) + VALUES (?1, ?2, ?3, ?4)", + rusqlite::params![item.id, item.name, list.id, item.count], + )?; + + let prep = item.preparation; + match prep { + Preparation::None => (), + Preparation::Steps(steps) => { + let prep_id = Uuid::new_v4(); + conn.execute( + "INSERT INTO + preparation (id, packagelistitem) + VALUES (?1, ?2)", + rusqlite::params![prep_id, item.id], + )?; + for step in steps { + let id = Uuid::new_v4(); + let start = match step.start { + Duration::None => 0, + Duration::Days(d) => d, + }; + conn.execute( + "INSERT INTO + preparationstep (id, name, start_days, preparation) + VALUES (?1, ?2, ?3, ?4)", + rusqlite::params![id, step.name, start, prep_id], + )?; + } + } + }; + } + } + + for trip in example_trips { + conn.execute( + "INSERT INTO + trips (id, name, date, days, state) + VALUES (?1, ?2, ?3, ?4, ?5)", + rusqlite::params![ + trip.id, + trip.name, + trip.date, + trip.parameters.days, + trip.state + ], + )?; + for package_list in trip.package_lists { + conn.execute( + "INSERT INTO + trip_packagelist (trip_id, packagelist_id) + VALUES (?1, ?2)", + rusqlite::params![trip.id, package_list.id], + )?; + } + } + + println!("Done!"); + + Ok(()) +} + +pub fn get_list(id: Uuid) -> rusqlite::Result> { + let conn = rusqlite::Connection::open("./sqlite.db")?; + + let mut statement = conn.prepare( + "SELECT + id, name + FROM packagelists + WHERE id = ?1", + )?; + + let packagelist_iter = statement.query_map(rusqlite::params![id], |row| { + Ok(PackageList::new(row.get(0)?, row.get(1)?)) + })?; + + let mut lists: Vec = packagelist_iter.map(|row| row.unwrap()).collect(); + + if lists.is_empty() { + return Ok(None); + } + + let i1: PackageList = lists.remove(0); + + Ok(Some(i1)) +} + +pub fn get_lists() -> rusqlite::Result> { + let conn = rusqlite::Connection::open("./sqlite.db")?; + + let mut statement = conn.prepare("SELECT id, name from packagelists")?; + + let packagelist_iter = + statement.query_map([], |row| Ok(PackageList::new(row.get(0)?, row.get(1)?)))?; + + let mut lists: Vec = Vec::new(); + for list in packagelist_iter { + let mut l = list.unwrap(); + let items = get_list_items(l.id).unwrap(); + l.set_items(items); + lists.push(l); + } + + Ok(lists) +} + +fn get_preparation_steps(item_id: Uuid) -> rusqlite::Result { + let conn = rusqlite::Connection::open("./sqlite.db")?; + let mut statement = conn.prepare( + "SELECT + pli.id AS packageitem_id, + pr.id AS preparation_id, + prs.id AS preparation_step_id, + prs.name AS preparation_step_name, + prs.start_days AS preparation_step_start_days + FROM packagelistitems AS pli + LEFT JOIN preparation AS pr + ON pr.packagelistitem = pli.id + LEFT JOIN preparationstep AS prs + ON prs.preparation = pr.id + WHERE pli.id = ?1", + )?; + + struct Prep { + id: Uuid, + name: Option, + start_days: Option, + } + + let preparation_steps: Vec = statement + .query_map(rusqlite::params![item_id], |row| { + let id: Option = row.get_unwrap(2); + let name: Option = row.get_unwrap(3); + let start_days: Option = row.get_unwrap(4); + match id { + None => Ok(None), + Some(id) => Ok(Some(Prep { + id, + name, + start_days, + })), + } + })? + .flatten() // Result + .flatten() // Option + .map(|step| PreparationStep { + id: step.id, + name: step.name.unwrap(), + start: Duration::Days(step.start_days.unwrap()), + }) + .collect(); + + Ok(Preparation::Steps(preparation_steps)) +} + +pub fn get_list_items(list_id: Uuid) -> rusqlite::Result> { + let conn = rusqlite::Connection::open("./sqlite.db")?; + let mut statement = conn.prepare( + "SELECT + pli.id AS packageitem_id, + pli.name AS packageitem_name, + pli.count AS packageitem_count + FROM packagelists AS pl + JOIN packagelistitems AS pli + ON pli.packagelist = pl.id + WHERE pl.id = ?1 + GROUP BY pli.id", + )?; + + let items_iter = statement.query_map(rusqlite::params![list_id], |row| { + let item_id = row.get_unwrap(0); + + Ok(PackageItem::new( + item_id, + row.get(1)?, + ItemSize::None, + row.get(2)?, + ItemUsage::Singleton, + get_preparation_steps(item_id)?, + )) + })?; + + let items: Vec = items_iter.map(|i| i.unwrap()).collect(); + + Ok(items) +} + +pub fn get_preparation(list_id: Uuid, item_id: Uuid) -> rusqlite::Result> { + let conn = rusqlite::Connection::open("./sqlite.db")?; + let mut statement = conn.prepare( + "SELECT + pr.id AS preparation_id, + prs.id AS preparation_step_id, + prs.name AS preparation_step_name, + prs.start_days AS preparation_step_start_days + FROM packagelists AS pl + JOIN packagelistitems as pli + ON pli.packagelist = pl.id + JOIN preparation AS pr + ON pr.packagelistitem = pli.id + JOIN preparationstep AS prs + ON prs.preparation = pr.id + WHERE + pl.id = ?1 + AND + pli.id = ?2 + ", + )?; + + let steps: Vec = statement + .query_map(rusqlite::params![list_id, item_id], |row| { + Ok(PreparationStep::new( + row.get_unwrap(1), + row.get_unwrap(2), + Duration::Days(row.get_unwrap(3)), + )) + })? + .flatten() + .collect(); + + Ok(steps) +} + +pub fn save_item(list_id: Uuid, item: PackageItem) -> rusqlite::Result { + let conn = rusqlite::Connection::open("./sqlite.db")?; + + conn.execute( + " + INSERT INTO + packagelistitems + ( + id, + name, + count, + packagelist + ) VALUES ( + ?2, + ?3, + ?4, + ?1 + ) + ", + rusqlite::params![list_id, item.id, item.name, item.count], + )?; + + Ok(item) +} + +pub fn get_trips() -> rusqlite::Result> { + let conn = rusqlite::Connection::open("./sqlite.db")?; + + let mut statement = conn.prepare( + "SELECT + trips.id AS trip_id, + trips.name AS trip_name, + trips.date AS trip_date, + trips.days AS trip_days, + trips.state AS trip_state + FROM trips + ", + )?; + + let mut trips: Vec = statement + .query_map(rusqlite::params![], |row| { + Ok(Trip::new( + row.get_unwrap(0), + row.get_unwrap(1), + row.get_unwrap(2), + TripParameters { + days: row.get_unwrap(3), + }, + row.get_unwrap(4), + )) + })? + .flatten() + .collect(); + + for trip in &mut trips { + let mut statement = conn.prepare( + "SELECT + trip_packagelist.packagelist_id as package_list_id, + packagelists.name as package_list_name + FROM trip_packagelist + INNER JOIN packagelists + ON packagelists.id == trip_packagelist.packagelist_id + WHERE + trip_packagelist.trip_id = ?1 + + ", + )?; + + let lists: Vec<(Uuid, String)> = statement + .query_map(rusqlite::params![trip.id], |row| { + Ok((row.get_unwrap(0), row.get_unwrap(1))) + })? + .flatten() + .collect(); + + trip.set_package_lists(lists); + } + + Ok(trips) +} diff --git a/api/src/lib.rs b/api/src/lib.rs index a830363..73acf88 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -1,646 +1,53 @@ +pub mod packagelist; + use uuid::Uuid; -pub mod packagelist; +pub use packagelist::Duration; +pub use packagelist::ItemSize; +pub use packagelist::ItemUsage; pub use packagelist::PackageItem; pub use packagelist::PackageList; +pub use packagelist::Period; +pub use packagelist::Preparation; +pub use packagelist::PreparationStep; pub mod router; +pub mod db; + pub mod trip; pub use trip::Trip; -pub use trip::TripList; +pub use trip::TripParameters; +pub use trip::TripState; pub fn get_list(id: Uuid) -> Option { - println!("Looking for id {}", id); - for list in get_lists() { - println!("Have {}", list.id); - if list.id == id { - println!("Found!"); - return Some(list); - } - } - println!("Not Found!"); - None -} - -pub fn get_trips() -> Vec { - let package_lists = get_lists(); - vec![ - Trip::from_package_list( - Uuid::parse_str("98dd50f9-b945-48e0-8fa9-41a3fd8b897e").unwrap(), - String::from("Campingtrip"), - String::from("2021-09-06"), - vec![ - package_lists[0].id, - package_lists[1].id, - ], - ) - ] + self::db::get_list(id).unwrap() } pub fn get_lists() -> Vec { - vec![ - packagelist::PackageList::new_from_items( - Uuid::parse_str("5f95d8c7-c4da-44bc-af30-2d10c479de8a").unwrap(), - String::from("EDC"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("48703b81-037a-401f-8f46-56c242bb16c3").unwrap(), - String::from("Rucksack"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("39b26f98-0cbc-46d5-ac17-43d61ba1a503").unwrap(), - String::from("Regenhülle für Rucksack"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("a5934361-bc5d-4092-bad4-95c15c875dca").unwrap(), - String::from("Normale Schuhe"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("4b0a6dbb-652b-464a-b413-93dd4f010ce3").unwrap(), - String::from("Taschenmesser"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("9823e841-64d1-43ab-a05f-95606b89482c").unwrap(), - String::from("Taschentücher"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("a7eac657-e870-4181-a644-16fe229d917a").unwrap(), - String::from("Handy"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::Steps(vec![packagelist::PreparationStep::new( - String::from("Aufladen"), - packagelist::Duration::Days(1), - )]), - ), - packagelist::PackageItem::new( - Uuid::parse_str("c0d97e46-a9fe-4d20-a3e9-8cf7c69d2fbf").unwrap(), - String::from("Kopfhörer"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::Steps(vec![packagelist::PreparationStep::new( - String::from("Aufladen"), - packagelist::Duration::Days(1), - )]), - ), - packagelist::PackageItem::new( - Uuid::parse_str("9b04e117-1a61-4643-8238-55c401a2dd00").unwrap(), - String::from("Mundschutz"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Weekly(1)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("5efe30c7-896d-4c32-9976-81ac93ff6aa0").unwrap(), - String::from("Kokain"), - packagelist::ItemSize::Gram(100), - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Weekly(1)), - packagelist::Preparation::Steps(vec![packagelist::PreparationStep::new( - String::from("Beim Dealer kaufen"), - packagelist::Duration::Days(1), - )]), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("8fb8d7ce-7766-4203-bc38-058fe2440519").unwrap(), - String::from("Ladekabel"), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("3ea0714e-3115-46c4-8ae0-f2a37398cc7a").unwrap(), - String::from("Geld & Karten"), - vec![ - packagelist::PackageItem::new( - Uuid::parse_str("18ebb1bc-e01f-4dc7-bda7-919dd8f069c7").unwrap(), - String::from("Bargeld"), - packagelist::ItemSize::Name(String::from("Euro")), - 100, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::Steps(vec![packagelist::PreparationStep::new( - String::from("Abheben"), - packagelist::Duration::Days(1), - )]), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("2aba4c22-9c3d-4b19-95b5-265f1846b8f9").unwrap(), - String::from("Kreditkarte"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("aeec841e-0691-4af9-b719-16a6752c33d6").unwrap(), - String::from("Pass"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("1a598c16-a238-4d02-baef-03208beb9509").unwrap(), - String::from("Krankenversicherungskarte"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("584955e2-3bf4-459c-8c87-631414842571").unwrap(), - String::from("Krankenversicherungskarte (Zusatz)"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("571dd7b6-0420-4f8f-8e83-fb430c6f1c23").unwrap(), - String::from("Auslandskrankenversicherungsnachweis"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("25937e62-4ade-495b-9535-c4db1176fbab").unwrap(), - String::from("Notfalltelefonnummernliste"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("6464f872-00f6-4621-9d37-ff6b75c8d79a").unwrap(), - String::from("ADAC-Karte"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("0b9298b7-6bdb-4fdc-a171-1953654b160e").unwrap(), - String::from("Impfausweiß (EU)"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("fac04399-e092-4aeb-bf61-edd081890fa6").unwrap(), - String::from("Führerschein"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("17ef3d3a-010f-44c1-acae-ef0ea9a985b8").unwrap(), - String::from("Internationaler Führerschein"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("b256cd9f-8c5c-45f2-9e08-04cc62800cfe").unwrap(), - String::from("Tagebuch"), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("4b2c2d4e-3014-48aa-95e0-39f352cb6494").unwrap(), - String::from("Waschzeug"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("c91e2295-7fa6-4165-bb6c-0de60069c410").unwrap(), - String::from("Waschbeutel"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("005639bb-b336-4e7c-bb88-aeaca20fc488").unwrap(), - String::from("Sonnencreme"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("9a907ab6-3e49-4cc0-af86-637821127354").unwrap(), - String::from("After-Sun"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("7ed5be40-929e-4ae2-a723-61e6514e9592").unwrap(), - String::from("Nagelset"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("40f9bc11-1e24-4a60-b183-7f9a2eab0e42").unwrap(), - String::from("Rasurbox"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("c72126c8-5639-4952-b4a7-d588d636a6f0").unwrap(), - String::from("Rasierer"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("9f6e9c09-e550-411c-a89d-7f79608b1bb6").unwrap(), - String::from("Ersatzklingen"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("547fb1cd-568b-44d2-9618-0f4de7ca2ca5").unwrap(), - String::from("Zahnbürste"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("09259ebe-407b-4808-9a19-db3b95f77846").unwrap(), - String::from("Zahnputztabletten"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Daily(2)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("10342277-9984-4c9a-ad07-155e148f91fd").unwrap(), - String::from("Deo"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("e323ca57-8487-4b3f-a3f9-6dd8e26ff0e4").unwrap(), - String::from("Duschgel / Shampoo"), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("4ba0462f-5c75-4926-9ca2-ea93ef5b66ef").unwrap(), - String::from("Apotheke"), - vec![ - packagelist::PackageItem::new( - Uuid::parse_str("bdeea898-479b-41e9-8d33-1c79743b3011").unwrap(), - String::from("Blasenpflaster"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("2175fa92-0ef2-48a1-bea0-f70268b0ad68").unwrap(), - String::from("Erste-Hilfe-Set"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("bad9f320-eaf8-4240-bfa6-890b755eb03a").unwrap(), - String::from("Paracetamol"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("b9d3f29d-4448-42ba-aeff-ba179542b4ae").unwrap(), - String::from("Autan"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("bfeb6d0f-5122-4f80-94e9-be54a1d1c838").unwrap(), - String::from("Pflaster"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("3f08c3e2-a0d9-40fb-b3fb-f4bb79815b9d").unwrap(), - String::from("Zeckenkarte"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("9aa4ee9f-2f00-42d2-980e-8fd1ede0283c").unwrap(), - String::from("Badesachen"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("879b9d32-0de5-45f3-bffb-0c1e73b5a7b8").unwrap(), - String::from("Badehose"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("5610ab1f-308d-4ef9-b8e4-3721fa4c4172").unwrap(), - String::from("Badehandtuch"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("e7e3c053-a269-4f0d-b6bd-99b48bf4573a").unwrap(), - String::from("Surfshirt (Lang)"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("360c20f5-8142-48d1-add4-a8f2a48a242b").unwrap(), - String::from("Wasserschuhe"), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("1e0728d1-9dd9-48ff-a206-a73b604b9748").unwrap(), - String::from("Camping"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("fb6eec8c-a1ad-420f-b8de-9695e9ccb67d").unwrap(), - String::from("Schlafsack"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("69a06abd-34f4-4991-9a41-b3ec50bcbbd7").unwrap(), - String::from("Zelt"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("22169568-1976-43ab-8c40-37c7e6193e18").unwrap(), - String::from("Luftmatratze"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("dd10738b-0162-4e0a-9db9-ea5e16ee5566").unwrap(), - String::from("Campingstuhl"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("a88c14c1-8194-4fea-be6c-b532517bbf97").unwrap(), - String::from("Panzertape"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("fb67fbf1-cd04-4b39-b0a3-bff4bf07f38e").unwrap(), - String::from("Tarp"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("6de5825b-0e39-4693-9664-2edc7353db3b").unwrap(), - String::from("Hängematte"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("c6f14fb7-c598-4a47-8b12-b96ff3856a21").unwrap(), - String::from("Topf"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("2fb43b9c-c6ca-4fda-9e09-e1a83efdc4f7").unwrap(), - String::from("Teller"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("a203f34c-e912-4479-ad8e-e16150122cad").unwrap(), - String::from("Messer"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("63837c0a-7a8e-40ae-aced-818066bd9e89").unwrap(), - String::from("Gabel"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("437a45d9-4fc5-459e-b790-7628945d7c38").unwrap(), - String::from("Löffel"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("a461859f-b430-42da-bf52-8cdb3eb42d13").unwrap(), - String::from("Stirnlampe"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("f109c12f-10dd-4249-a02e-c28aaa20a8f6").unwrap(), - String::from("Geschirrtuch"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("1f2ffc7e-060a-4277-a15d-119b85481438").unwrap(), - String::from("Spüllappen"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("bf6d49fe-25cc-4114-a374-3c4772cf5f3a").unwrap(), - String::from("Taschenlampe"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("03994e35-f0f0-4ccd-bc24-0a331ffbba96").unwrap(), - String::from("Feuerzeug"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("fc3ecdab-eb3a-4d27-8f95-cd78d37e063e").unwrap(), - String::from("Tasse"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("8b55efae-6e18-4d7f-a5b7-83ba15c50995").unwrap(), - String::from("Grill"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("b6d821e5-3285-4bf2-bd71-be9154f94937").unwrap(), - String::from("Grillkohle"), - packagelist::ItemSize::Gram(1500), - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Days(2)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("d2338ac1-9995-4319-8ca5-12654a266266").unwrap(), - String::from("Campingkocher"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("4ff62940-f691-4982-b1fd-54a2850e06f4").unwrap(), - String::from("Campinggas"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Days(3)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("a024c67a-6e61-4749-b2a4-1ec8ca132184").unwrap(), - String::from("Kaffeekochaufsatz"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("054e1610-1e8e-421e-95ad-c76e88cb45ab").unwrap(), - String::from("Küchenrolle"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Days(5)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("181310a8-946c-4075-9f95-c7a82d0269fd").unwrap(), - String::from("Müllsäcke"), - packagelist::ItemSize::Pack(1), - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("c823ce3f-922e-4300-95ad-21ff221cd896").unwrap(), - String::from("Teelichter"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Daily(3)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("e86bfb7c-a840-4b88-b216-afd3c173754b").unwrap(), - String::from("Klopapier"), - packagelist::ItemSize::Name(String::from("Rolle")), - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Weekly(1)), - packagelist::Preparation::None, - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("e5ecb3cc-a893-44cd-b4f8-4b41af003c96").unwrap(), - String::from("Essen"), - vec![packagelist::PackageItem::new( - Uuid::parse_str("6ebf5d87-6b97-4d80-8e03-25fa62e641d9").unwrap(), - String::from("Kaffee"), - packagelist::ItemSize::Gram(100), - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Days(3)), - packagelist::Preparation::None, - )], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("4e9042db-1db8-4912-8179-d0a3ebb80876").unwrap(), - String::from("Wanderzeug"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("2eccd528-17a7-429f-b97a-70faae1b4dac").unwrap(), - String::from("Wanderschuhe"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("d8c52786-d50e-4a9f-b8c6-e9396c5be789").unwrap(), - String::from("Trinkblase"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::Steps(vec![packagelist::PreparationStep::new( - String::from("Auffüllen"), - packagelist::Duration::None, - )]), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("5b272c8e-bf54-4af6-94e0-63071c92a8e3").unwrap(), - String::from("Klamotten"), - vec![ - packagelist::PackageItem::new( - Uuid::parse_str("d18215d2-9cf9-48c7-894b-b9680ba39879").unwrap(), - String::from("Cap"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("83c03986-cc34-4500-9cee-1cc1778f5cf3").unwrap(), - String::from("Regenjacke"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("00c116ba-840d-47c4-a081-5e256941d3b9").unwrap(), - String::from("Daunenjacke"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("35834bec-6c63-41df-825c-05b943e07bc8").unwrap(), - String::from("Pullover"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("127704a8-1e4d-4c49-b74f-34130ed08f83").unwrap(), - String::from("Lange Hose"), - packagelist::ItemSize::None, - 2, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("e15a6772-3d5d-454d-8f7d-bf9066ba5d23").unwrap(), - String::from("Kurze Hose"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("09992e6d-408a-43e4-beee-1925e727415f").unwrap(), - String::from("Jogginghose"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("799f0fd4-2be7-44b5-b286-889242900be3").unwrap(), - String::from("Socken"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Daily(1)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("f57f3299-a46a-4ed3-aff0-ffc5d2627a6a").unwrap(), - String::from("Unterhose"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Daily(1)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("c100f7be-ceb7-46a6-aded-380a201bfe45").unwrap(), - String::from("T-Shirt"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Days(2)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("22908312-a8d2-4005-893c-12e56d9af022").unwrap(), - String::from("Schmutzwäschebeutel"), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("929bc029-ec8f-4294-9484-ec32f0170f5c").unwrap(), - String::from("Fahrrad"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("d91ed4fd-ef9b-4ad5-849f-1481dbbc95b0").unwrap(), - String::from("Fahrrad"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("2f2a09d7-2d97-4ff8-9fb1-ace86eaf6de5").unwrap(), - String::from("Fahrradhelm"), - ), - ], - ), - packagelist::PackageList::new_from_items( - Uuid::parse_str("0103e348-b4e8-4cc9-95e6-4ef85b7c76ab").unwrap(), - String::from("Misc"), - vec![ - packagelist::PackageItem::new_simple( - Uuid::parse_str("990c7121-7342-48a2-9abb-4d0e274b6759").unwrap(), - String::from("Trinkflasche"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("0ead2b93-9b81-4e32-a856-0a562557598c").unwrap(), - String::from("Dyneemaschnur"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("be5d49bc-9c06-4747-b954-9ca003694018").unwrap(), - String::from("Ladegerät"), - ), - packagelist::PackageItem::new( - Uuid::parse_str("aab7b03b-19f9-4149-a23d-3c14d938cca4").unwrap(), - String::from("Powerbank"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Infinite, - packagelist::Preparation::Steps(vec![packagelist::PreparationStep::new( - String::from("Aufladen"), - packagelist::Duration::Days(1), - )]), - ), - packagelist::PackageItem::new( - Uuid::parse_str("c54deb17-fe62-4300-8297-c5dfc4773a02").unwrap(), - String::from("Desinfektionsgel"), - packagelist::ItemSize::None, - 1, - packagelist::ItemUsage::Periodic(packagelist::Period::Weekly(1)), - packagelist::Preparation::None, - ), - packagelist::PackageItem::new( - Uuid::parse_str("3fb87c86-7155-4df5-8f7b-68c288ba1147").unwrap(), - String::from("Karabiner"), - packagelist::ItemSize::None, - 3, - packagelist::ItemUsage::Singleton, - packagelist::Preparation::None, - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("c965176c-9014-4e8f-8e99-8cd2e37a64ac").unwrap(), - String::from("Ersatzbrille"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("b0909ce6-5a8c-42fa-a384-de108f19ee5d").unwrap(), - String::from("Sonnenbrille"), - ), - packagelist::PackageItem::new_simple( - Uuid::parse_str("7ec347d4-0c28-48bb-9c32-558a1988a164").unwrap(), - String::from("Ohrenstöpsel"), - ), - ], - ), - ] + self::db::get_lists().unwrap() +} + +pub fn get_packagelist_items(id: Uuid) -> Vec { + self::db::get_list_items(id).unwrap() +} + +pub fn get_preparation(list_id: Uuid, item_id: Uuid) -> Vec { + self::db::get_preparation(list_id, item_id).unwrap() +} + +pub fn new_item(list_id: Uuid, item_name: String, item_count: i32) -> packagelist::PackageItem { + let item = PackageItem::new( + Uuid::new_v4(), + item_name, + ItemSize::None, + item_count, + ItemUsage::Singleton, + Preparation::None, + ); + self::db::save_item(list_id, item).unwrap() +} + +pub fn get_trips() -> Vec { + self::db::get_trips().unwrap() } diff --git a/api/src/main.rs b/api/src/main.rs index 051f77e..f54284c 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -1,4 +1,4 @@ -use packager; +use std::env; #[tokio::main] async fn main() { @@ -32,7 +32,19 @@ async fn main() { // for item in &trip.list.items { // println!("{:?}", item); // } + let args: Vec = env::args().skip(1).collect(); + match args.get(0) { + None => (), + Some(cmd) => match cmd.as_ref() { + "--load-example-data" => { + packager::db::load().unwrap(); + } + _ => panic!("Unknown argument: \"{}\"", cmd), + }, + }; let router = packager::router::new(); + + println!("Initialization done, listening for connections"); warp::serve(router).run(([127, 0, 0, 1], 9000)).await; } diff --git a/api/src/packagelist.rs b/api/src/packagelist.rs index 2d5ae98..6955538 100644 --- a/api/src/packagelist.rs +++ b/api/src/packagelist.rs @@ -1,5 +1,5 @@ use serde::ser::{SerializeStruct, Serializer}; -use serde::{Serialize}; +use serde::Serialize; use uuid::Uuid; @@ -134,20 +134,20 @@ impl ItemSize { #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct PreparationStep { - name: String, + pub id: Uuid, + pub name: String, #[serde(skip_serializing_if = "Duration::is_none")] - start: Duration, + pub start: Duration, } impl PreparationStep { - pub fn new(name: String, start: Duration) -> PreparationStep { - PreparationStep { name, start } + pub fn new(id: Uuid, name: String, start: Duration) -> PreparationStep { + PreparationStep { id, name, start } } } -#[derive(Debug, Serialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug)] pub enum Preparation { None, Steps(Vec), @@ -159,19 +159,38 @@ impl Preparation { } } +impl Serialize for Preparation { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + Preparation::None => { + // serializer.serialize_unit_variant("Preparation", 0, "null") + let steps: Vec = vec![]; + serializer.serialize_newtype_variant("Preparation", 1, "steps", &steps) + // let mut s = serializer.serialize_seq(Some(0))?; + // s.end() + } + Preparation::Steps(steps) => { + serializer.serialize_newtype_variant("Preparation", 1, "steps", steps) + } + } + } +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct PackageItem { pub id: Uuid, - name: String, + pub name: String, #[serde(skip_serializing_if = "ItemSize::is_none")] size: ItemSize, - count: i32, + pub count: i32, usage: ItemUsage, - #[serde(skip_serializing_if = "Preparation::is_none")] - preparation: Preparation, + pub preparation: Preparation, } impl PackageItem { @@ -217,4 +236,16 @@ impl PackageList { pub fn new_from_items(id: Uuid, name: String, items: Vec) -> PackageList { PackageList { id, name, items } } + + pub fn new(id: Uuid, name: String) -> PackageList { + PackageList { + id, + name, + items: Vec::new(), + } + } + + pub fn set_items(&mut self, items: Vec) { + self.items = items; + } } diff --git a/api/src/router.rs b/api/src/router.rs index a4cf513..f7805a7 100644 --- a/api/src/router.rs +++ b/api/src/router.rs @@ -1,4 +1,4 @@ -use serde::Serialize; +use serde::{Deserialize, Serialize}; use std::convert::Infallible; use warp; @@ -19,9 +19,28 @@ struct ErrorMessage { message: String, } +#[derive(Deserialize, Clone)] +#[serde(deny_unknown_fields)] +struct JsonListItem { + name: String, + count: i32, +} + pub fn new() -> warp::filters::BoxedFilter<(impl warp::Reply,)> { let accept_json = warp::header::exact("accept", "application/json"); - let cors = warp::cors().allow_any_origin(); + let content_json = warp::header::exact("content-type", "application/json"); + let cors = warp::cors() + .allow_any_origin() + .allow_methods(&[ + warp::http::Method::GET, + warp::http::Method::POST, + warp::http::Method::DELETE, + ]) + .allow_headers(vec!["accept", "content-type"]); + + fn json_body() -> impl Filter + Clone { + warp::body::content_length_limit(1024 * 16).and(warp::body::json()) + } let root = warp::path::end().map(|| "Hi"); @@ -55,6 +74,56 @@ pub fn new() -> warp::filters::BoxedFilter<(impl warp::Reply,)> { }) .with(&cors); + let list_items = warp::path!("v1" / "lists" / String / "items") + .and(warp::path::end()) + .and(warp::get()) + .and(accept_json) + .and_then(|list_id: String| async move { + match Uuid::parse_str(&list_id) { + Ok(uuid) => { + let items = &super::get_packagelist_items(uuid); + Ok(warp::reply::json(items)) + } + Err(_) => Err(warp::reject::custom(InvalidUuid)), + } + }) + .with(&cors); + + let preparation = warp::path!("v1" / "lists" / String / "items" / String / "preparation") + .and(warp::path::end()) + .and(warp::get()) + .and(accept_json) + .and_then(|list_id: String, item_id: String| async move { + match Uuid::parse_str(&list_id) { + Ok(list_id) => match Uuid::parse_str(&item_id) { + Err(_) => Err(warp::reject::custom(InvalidUuid)), + Ok(item_id) => { + let items = &super::get_preparation(list_id, item_id); + Ok(warp::reply::json(items)) + } + }, + Err(_) => Err(warp::reject::custom(InvalidUuid)), + } + }) + .with(&cors); + + let new_item = warp::path!("v1" / "lists" / String / "items") + .and(warp::path::end()) + .and(warp::post()) + .and(accept_json) + .and(content_json) + .and(json_body()) + .and_then(|list_id: String, item: JsonListItem| async move { + match Uuid::parse_str(&list_id) { + Ok(list_id) => { + let new_item = &super::new_item(list_id, item.name, item.count); + Ok(warp::reply::json(new_item)) + } + Err(_) => Err(warp::reject::custom(InvalidUuid)), + } + }) + .with(&cors); + let trips = warp::path!("v1" / "trips") .and(warp::path::end()) .and(warp::get()) @@ -65,6 +134,9 @@ pub fn new() -> warp::filters::BoxedFilter<(impl warp::Reply,)> { root.or(v1) .or(lists) .or(list) + .or(new_item) + .or(list_items) + .or(preparation) .or(trips) .recover(handle_rejection) .boxed() @@ -81,10 +153,10 @@ async fn handle_rejection(err: warp::Rejection) -> Result() { + } else if err.find::().is_some() { message = "BAD_REQUEST"; code = StatusCode::BAD_REQUEST; - } else if let Some(_) = err.find::() { + } else if err.find::().is_some() { message = "METHOD_NOT_ALLOWED"; code = StatusCode::METHOD_NOT_ALLOWED; } else { diff --git a/api/src/trip.rs b/api/src/trip.rs index 5c24e83..df0df23 100644 --- a/api/src/trip.rs +++ b/api/src/trip.rs @@ -1,5 +1,5 @@ +use serde::Serialize; use uuid::Uuid; -use serde::{Serialize}; #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] @@ -11,42 +11,63 @@ pub enum TripItemStatus { #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] -pub struct TripItem<'a> { - pub id: Uuid, - - pub package_item: &'a super::PackageItem, - pub status: TripItemStatus, +pub struct TripParameters { + pub days: i32, } -impl TripItem<'_> { - pub fn from_package_item(id: Uuid, package_item: &super::PackageItem) -> TripItem { - TripItem { - id, - package_item, - status: TripItemStatus::Pending, +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct TripPackageList { + pub id: Uuid, + pub name: String, +} + +impl TripPackageList { + fn construct(item: (Uuid, String)) -> TripPackageList { + TripPackageList { + id: item.0, + name: item.1, } } - pub fn set_status(&mut self, status: TripItemStatus) { - self.status = status; + fn construct_vec(items: Vec<(Uuid, String)>) -> Vec { + items + .into_iter() + .map(TripPackageList::construct) + .collect() } } #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] -pub struct TripList<'a> { - pub id: Uuid, - pub items: Vec>, +pub enum TripState { + Planned, + Packing, + Active, + Finished, } -impl<'a> TripList<'a> { - pub fn from_package_list(id: Uuid, list: &'a super::PackageList) -> TripList<'a> { - let mut items = Vec::new(); - for item in &list.items { - items.push(TripItem::from_package_item(Uuid::new_v4(), item)); +impl rusqlite::types::FromSql for TripState { + fn column_result(value: rusqlite::types::ValueRef) -> rusqlite::types::FromSqlResult { + match value.as_i64()? { + 1 => Ok(TripState::Planned), + 2 => Ok(TripState::Packing), + 3 => Ok(TripState::Active), + 4 => Ok(TripState::Finished), + v => Err(rusqlite::types::FromSqlError::OutOfRange(v)), } + } +} - TripList { id, items } +impl rusqlite::types::ToSql for TripState { + fn to_sql(&self) -> rusqlite::Result { + let v = rusqlite::types::Value::Integer(match self { + TripState::Planned => 1, + TripState::Packing => 2, + TripState::Active => 3, + TripState::Finished => 4, + }); + rusqlite::Result::Ok(rusqlite::types::ToSqlOutput::Owned(v)) } } @@ -56,21 +77,50 @@ pub struct Trip { pub id: Uuid, pub name: String, pub date: String, - pub package_list_ids: Vec, + pub parameters: TripParameters, + pub package_lists: Vec, + pub state: TripState, } impl Trip { - pub fn from_package_list( + pub fn new( id: Uuid, name: String, date: String, - package_list_ids: Vec, + parameters: TripParameters, + state: TripState, ) -> Trip { Trip { id, name, date, - package_list_ids, + parameters, + package_lists: vec![], + state, } } + + pub fn from_package_list( + id: Uuid, + name: String, + date: String, + parameters: TripParameters, + package_lists: Vec<(Uuid, String)>, + state: TripState, + ) -> Trip { + let lists = TripPackageList::construct_vec(package_lists); + Trip { + id, + name, + date, + parameters, + package_lists: lists, + state, + } + } + + pub fn set_package_lists(&mut self, package_lists: Vec<(Uuid, String)>) { + let v = TripPackageList::construct_vec(package_lists); + self.package_lists = v; + } } diff --git a/ui/package-lock.json b/ui/package-lock.json index 9041921..99dba49 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -15,6 +15,7 @@ "@rollup/plugin-node-resolve": "^11.0.0", "@rollup/plugin-typescript": "^8.0.0", "@tsconfig/svelte": "^2.0.0", + "npm": "^8.0.0", "rollup": "^2.3.4", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-livereload": "^2.0.0", @@ -773,6 +774,2571 @@ "node": ">=0.10.0" } }, + "node_modules/npm": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.0.0.tgz", + "integrity": "sha512-bhZ8L73aloy8CEEhRjkyJp55icQzpsOqdWWA95xZyyLwL52ASgVOm8CsXKcZgIlrh4/cQTeJMuIK6krBju43HA==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "ansicolors", + "ansistyles", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "pacote", + "parse-conflict-json", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "*", + "@npmcli/arborist": "*", + "@npmcli/ci-detect": "*", + "@npmcli/config": "*", + "@npmcli/map-workspaces": "*", + "@npmcli/package-json": "*", + "@npmcli/run-script": "*", + "abbrev": "*", + "ansicolors": "*", + "ansistyles": "*", + "archy": "*", + "cacache": "*", + "chalk": "*", + "chownr": "*", + "cli-columns": "*", + "cli-table3": "*", + "columnify": "*", + "fastest-levenshtein": "*", + "glob": "*", + "graceful-fs": "*", + "hosted-git-info": "*", + "ini": "*", + "init-package-json": "*", + "is-cidr": "*", + "json-parse-even-better-errors": "*", + "libnpmaccess": "*", + "libnpmdiff": "*", + "libnpmexec": "*", + "libnpmfund": "*", + "libnpmhook": "*", + "libnpmorg": "*", + "libnpmpack": "*", + "libnpmpublish": "*", + "libnpmsearch": "*", + "libnpmteam": "*", + "libnpmversion": "*", + "make-fetch-happen": "*", + "minipass": "*", + "minipass-pipeline": "*", + "mkdirp": "*", + "mkdirp-infer-owner": "*", + "ms": "*", + "node-gyp": "*", + "nopt": "*", + "npm-audit-report": "*", + "npm-install-checks": "*", + "npm-package-arg": "*", + "npm-pick-manifest": "*", + "npm-profile": "*", + "npm-registry-fetch": "*", + "npm-user-validate": "*", + "npmlog": "*", + "opener": "*", + "pacote": "*", + "parse-conflict-json": "*", + "qrcode-terminal": "*", + "read": "*", + "read-package-json": "*", + "read-package-json-fast": "*", + "readdir-scoped-modules": "*", + "rimraf": "*", + "semver": "*", + "ssri": "*", + "tar": "*", + "text-table": "*", + "tiny-relative-date": "*", + "treeverse": "*", + "validate-npm-package-name": "*", + "which": "*", + "write-file-atomic": "*" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.0.1", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^2.0.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^2.0.0", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.5", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^11.0.0", + "pacote": "^12.0.0", + "parse-conflict-json": "^1.1.1", + "proc-log": "^1.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "ssri": "^8.0.1", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ini": "^2.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "semver": "^7.3.4", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^15.0.5", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^12.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "node_modules/npm/node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/npm/node_modules/agentkeepalive": { + "version": "4.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/ansicolors": { + "version": "0.3.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ansistyles": { + "version": "0.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "1.1.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/asap": { + "version": "2.0.6", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/cacache": { + "version": "15.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/code-point-at": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/colors": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.5.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/dezalgo": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/diff": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/gauge": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1 || ^2.0.0", + "strip-ansi": "^3.0.1 || ^4.0.0", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.8", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "2.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^8.1.5", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "^4.1.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.7.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "4.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/disparity-colors": "^1.0.1", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.0.0", + "minimatch": "^3.0.4", + "npm-package-arg": "^8.1.4", + "pacote": "^12.0.0", + "tar": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^3.0.0", + "@npmcli/ci-detect": "^1.3.0", + "@npmcli/run-script": "^2.0.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^8.1.2", + "pacote": "^12.0.0", + "proc-log": "^1.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "6.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/run-script": "^2.0.0", + "npm-package-arg": "^8.1.0", + "pacote": "^12.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "normalize-package-data": "^3.0.2", + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^11.0.0", + "semver": "^7.1.3", + "ssri": "^8.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^2.0.7", + "@npmcli/run-script": "^2.0.0", + "json-parse-even-better-errors": "^2.3.1", + "semver": "^7.3.5", + "stringify-package": "^1.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "3.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "1.4.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "8.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^8.0.14", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/aproba": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { + "version": "2.7.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "8.0.14", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { + "version": "4.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/string-width": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "2.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "8.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "2.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "6.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "5.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "11.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/npmlog": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/number-is-nan": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/opener": { + "version": "1.5.2", + "dev": true, + "inBundle": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "12.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, + "node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.6.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "6.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.10", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "8.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/stringify-package": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1998,6 +4564,1840 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "npm": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.0.0.tgz", + "integrity": "sha512-bhZ8L73aloy8CEEhRjkyJp55icQzpsOqdWWA95xZyyLwL52ASgVOm8CsXKcZgIlrh4/cQTeJMuIK6krBju43HA==", + "dev": true, + "requires": { + "@isaacs/string-locale-compare": "*", + "@npmcli/arborist": "*", + "@npmcli/ci-detect": "*", + "@npmcli/config": "*", + "@npmcli/map-workspaces": "*", + "@npmcli/package-json": "*", + "@npmcli/run-script": "*", + "abbrev": "*", + "ansicolors": "*", + "ansistyles": "*", + "archy": "*", + "cacache": "*", + "chalk": "*", + "chownr": "*", + "cli-columns": "*", + "cli-table3": "*", + "columnify": "*", + "fastest-levenshtein": "*", + "glob": "*", + "graceful-fs": "*", + "hosted-git-info": "*", + "ini": "*", + "init-package-json": "*", + "is-cidr": "*", + "json-parse-even-better-errors": "*", + "libnpmaccess": "*", + "libnpmdiff": "*", + "libnpmexec": "*", + "libnpmfund": "*", + "libnpmhook": "*", + "libnpmorg": "*", + "libnpmpack": "*", + "libnpmpublish": "*", + "libnpmsearch": "*", + "libnpmteam": "*", + "libnpmversion": "*", + "make-fetch-happen": "*", + "minipass": "*", + "minipass-pipeline": "*", + "mkdirp": "*", + "mkdirp-infer-owner": "*", + "ms": "*", + "node-gyp": "*", + "nopt": "*", + "npm-audit-report": "*", + "npm-install-checks": "*", + "npm-package-arg": "*", + "npm-pick-manifest": "*", + "npm-profile": "*", + "npm-registry-fetch": "*", + "npm-user-validate": "*", + "npmlog": "*", + "opener": "*", + "pacote": "*", + "parse-conflict-json": "*", + "qrcode-terminal": "*", + "read": "*", + "read-package-json": "*", + "read-package-json-fast": "*", + "readdir-scoped-modules": "*", + "rimraf": "*", + "semver": "*", + "ssri": "*", + "tar": "*", + "text-table": "*", + "tiny-relative-date": "*", + "treeverse": "*", + "validate-npm-package-name": "*", + "which": "*", + "write-file-atomic": "*" + }, + "dependencies": { + "@gar/promisify": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "@npmcli/arborist": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "@isaacs/string-locale-compare": "^1.0.1", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^2.0.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^2.0.0", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.5", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^11.0.0", + "pacote": "^12.0.0", + "parse-conflict-json": "^1.1.1", + "proc-log": "^1.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "ssri": "^8.0.1", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/ci-detect": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "@npmcli/config": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "ini": "^2.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "semver": "^7.3.4", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/disparity-colors": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.3.0" + } + }, + "@npmcli/fs": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/map-workspaces": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + } + }, + "@npmcli/metavuln-calculator": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "cacache": "^15.0.5", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^12.0.0", + "semver": "^7.3.2" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "@npmcli/node-gyp": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "@npmcli/package-json": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "bundled": true, + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.4", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "bin-links": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "15.3.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chalk": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^4.1.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "4.2.3", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "cli-table3": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "4.2.2", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "color-support": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colors": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "common-ancestor-path": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "debug": { + "version": "4.3.2", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "depd": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "err-code": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "bundled": true, + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1 || ^2.0.0", + "strip-ansi": "^3.0.1 || ^4.0.0", + "wide-align": "^1.1.2" + } + }, + "glob": { + "version": "7.2.0", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "bundled": true, + "dev": true + }, + "has": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore-walk": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^8.1.5", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "^4.1.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "ip": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "bundled": true, + "dev": true + }, + "is-cidr": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.7.0", + "bundled": true, + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "bundled": true, + "dev": true + }, + "json-stringify-nice": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "just-diff": { + "version": "3.1.1", + "bundled": true, + "dev": true + }, + "just-diff-apply": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "libnpmaccess": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^11.0.0" + } + }, + "libnpmdiff": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/disparity-colors": "^1.0.1", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.0.0", + "minimatch": "^3.0.4", + "npm-package-arg": "^8.1.4", + "pacote": "^12.0.0", + "tar": "^6.1.0" + } + }, + "libnpmexec": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/arborist": "^3.0.0", + "@npmcli/ci-detect": "^1.3.0", + "@npmcli/run-script": "^2.0.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^8.1.2", + "pacote": "^12.0.0", + "proc-log": "^1.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "walk-up-path": "^1.0.0" + } + }, + "libnpmfund": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/arborist": "^3.0.0" + } + }, + "libnpmhook": { + "version": "6.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^11.0.0" + } + }, + "libnpmorg": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^11.0.0" + } + }, + "libnpmpack": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/run-script": "^2.0.0", + "npm-package-arg": "^8.1.0", + "pacote": "^12.0.0" + } + }, + "libnpmpublish": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "normalize-package-data": "^3.0.2", + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^11.0.0", + "semver": "^7.1.3", + "ssri": "^8.0.1" + } + }, + "libnpmsearch": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "npm-registry-fetch": "^11.0.0" + } + }, + "libnpmteam": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^11.0.0" + } + }, + "libnpmversion": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/git": "^2.0.7", + "@npmcli/run-script": "^2.0.0", + "json-parse-even-better-errors": "^2.3.1", + "semver": "^7.3.5", + "stringify-package": "^1.0.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.1.5", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "bundled": true, + "dev": true + }, + "node-gyp": { + "version": "8.2.0", + "bundled": true, + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^8.0.14", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "make-fetch-happen": { + "version": "8.0.14", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-audit-report": { + "version": "2.1.5", + "bundled": true, + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "npm-bundled": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "8.1.5", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.2.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "bundled": true, + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "npm-profile": { + "version": "5.0.4", + "bundled": true, + "dev": true, + "requires": { + "npm-registry-fetch": "^11.0.0" + } + }, + "npm-registry-fetch": { + "version": "11.0.0", + "bundled": true, + "dev": true, + "requires": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "p-map": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pacote": { + "version": "12.0.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "parse-conflict-json": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "proc-log": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "promise-all-reject-late": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-call-limit": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "read-package-json": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "7.3.5", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + } + }, + "spdx-correct": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.10", + "bundled": true, + "dev": true + }, + "ssri": { + "version": "8.0.1", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "stringify-package": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.11", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "treeverse": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "walk-up-path": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/ui/package.json b/ui/package.json index 42b5d1c..172a231 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,6 +11,9 @@ "devDependencies": { "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-node-resolve": "^11.0.0", + "@rollup/plugin-typescript": "^8.0.0", + "@tsconfig/svelte": "^2.0.0", + "npm": "^8.0.0", "rollup": "^2.3.4", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-livereload": "^2.0.0", @@ -19,10 +22,8 @@ "svelte": "^3.0.0", "svelte-check": "^2.0.0", "svelte-preprocess": "^4.0.0", - "@rollup/plugin-typescript": "^8.0.0", - "typescript": "^4.0.0", "tslib": "^2.0.0", - "@tsconfig/svelte": "^2.0.0" + "typescript": "^4.0.0" }, "dependencies": { "sirv-cli": "^1.0.0" diff --git a/ui/src/App.svelte b/ui/src/App.svelte index ccec6bb..03fef9e 100644 --- a/ui/src/App.svelte +++ b/ui/src/App.svelte @@ -6,6 +6,8 @@ import Home from "./routes/Home.svelte"; import PackageLists from "./routes/PackageLists.svelte"; import PackageList from "./routes/PackageList.svelte"; + import Preparation from "./routes/Preparation.svelte"; + import Trips from "./routes/Trips.svelte"; function normalize(path) { return path.replace(/\/+$/, '') + "/"; @@ -27,10 +29,20 @@ } else if (urlParts[0] == "lists" && urlParts.length == 1) { console.log("=> PackageLists"); currentRoute = PackageLists; + } else if (urlParts[0] == "trips" && urlParts.length == 1) { + console.log("=> Trips"); + currentRoute = Trips; } else if (urlParts[0] == "lists" && urlParts.length == 2) { console.log("=> PackageList"); currentRoute = PackageList; data = {id: urlParts[1]}; + } else if (urlParts.length == 5 + && urlParts[0] == "lists" + && urlParts[2] == "items" + && urlParts[4] == "preparation") { + console.log("=> PackageList"); + currentRoute = Preparation; + data = {list_id: urlParts[1], item_id: urlParts[3]}; } else { console.log("No matching route found"); } diff --git a/ui/src/components/PackageItem.svelte b/ui/src/components/PackageItem.svelte index 1df209d..59e122c 100644 --- a/ui/src/components/PackageItem.svelte +++ b/ui/src/components/PackageItem.svelte @@ -2,9 +2,9 @@ export let data; -
+
{data.name} -
+ diff --git a/ui/src/components/PackageListTable.svelte b/ui/src/components/PackageListTable.svelte index 1565595..8a7f92b 100644 --- a/ui/src/components/PackageListTable.svelte +++ b/ui/src/components/PackageListTable.svelte @@ -1,11 +1,22 @@ -
+
@@ -16,41 +27,52 @@ {#if has_counts} {/if} + {#if has_preparations} + + {/if} - {#each list.items as item} - - - {#if has_sizes } - + + {#if has_sizes } + - {/if} - {#if has_counts} - - {/if} - + {:else} + {item.size.value} {item.size.type} + {/if} + + {/if} + {#if has_counts} + + {/if} + {#if has_preparations} + + {/if} + {/each}
CountPreparation Steps
{item.name} - {#if item.size.type == "None"} - {:else if item.size.type == "Gram"} - {#if item.size.value == 1} - {item.size.value} Gram - {:else} - {item.size.value} Grams - {/if} - {:else if item.size.type == "Pack"} - {#if item.size.value == 1} - {item.size.value} Pack - {:else} - {item.size.value} Packs - {/if} + {#each items as item} +
{item.name} + {#if item.size.type == "None"} + {:else if item.size.type == "Gram"} + {#if item.size.value == 1} + {item.size.value} Gram {:else} - {item.size.value} {item.size.type} + {item.size.value} Grams {/if} - - {#if item.count > 1} - {item.count} + {:else if item.size.type == "Pack"} + {#if item.size.value == 1} + {item.size.value} Pack + {:else} + {item.size.value} Packs {/if} -
+ {#if item.count > 1} + {item.count} + {/if} + + {#if item.preparation.steps.length > 0} + {item.preparation.steps.length} steps + + {/if} +
-
+ diff --git a/ui/src/routes/Home.svelte b/ui/src/routes/Home.svelte index d09b578..dedcebf 100644 --- a/ui/src/routes/Home.svelte +++ b/ui/src/routes/Home.svelte @@ -11,4 +11,5 @@ Welcome to Packager, your helper for your next trip! + diff --git a/ui/src/routes/PackageList.svelte b/ui/src/routes/PackageList.svelte index 473a70a..93449ea 100644 --- a/ui/src/routes/PackageList.svelte +++ b/ui/src/routes/PackageList.svelte @@ -1,35 +1,134 @@
- {#await getList()} -

Loading

- {:then list} -
-

{list.name}

- +

{list.name}

+
+
+ +
- {:catch error} -

Error: {error}

- {/await} +
+
+ {#if sidebarActive} +
+ + +
+
+ + +
+
+ {#each activeElement.preparationsteps as step} + {step} + {/each} +
+
+ + +
+ {/if} +
+
diff --git a/ui/src/routes/PackageLists.svelte b/ui/src/routes/PackageLists.svelte index 1457a28..d6823a5 100644 --- a/ui/src/routes/PackageLists.svelte +++ b/ui/src/routes/PackageLists.svelte @@ -20,19 +20,28 @@
-
- {#await getLists()} -

Loading

- {:then lists} -
- {#each lists as list} -
- redirect(url + e.detail.id)} /> -
- {/each} -
- {:catch error} -

Something went wrong

- {/await} +
+ + + + + + + + + {#await getLists()} +

Loading

+ {:then lists} + {#each lists as list} + redirect(url + list.id)}> + + + + {/each} + {:catch error} +

Error: {error}

+ {/await} + +
Name# Items
{list.name}{list.items.length}
diff --git a/ui/src/routes/Preparation.svelte b/ui/src/routes/Preparation.svelte new file mode 100644 index 0000000..687772b --- /dev/null +++ b/ui/src/routes/Preparation.svelte @@ -0,0 +1,41 @@ + + +
+ + + + + + + + + {#await getSteps()} +

Loading

+ {:then steps} + {#each steps as step} + + + + + {/each} + {:catch error} +

Error: {error}

+ {/await} + +
NameStart
{step.name}{step.start.days} days before
+
diff --git a/ui/src/routes/Trips.svelte b/ui/src/routes/Trips.svelte new file mode 100644 index 0000000..20049e7 --- /dev/null +++ b/ui/src/routes/Trips.svelte @@ -0,0 +1,64 @@ + + +
+
+

Trips

+ + + + + + + + + + + + {#await getTrips()} +

Loading

+ {:then trips} + {#each trips as trip} + redirect(url + trip.id)}> + + + + {#if trip.state == "active"} + + {:else if trip.state == "planned"} + + {:else} + + {/if} + + + {/each} + {:catch error} +

Error: {error}

+ {/await} + +
NameDateDaysStatePackage Lists
{trip.name}{trip.date}{trip.parameters.days}{trip.state}{trip.state}{trip.state} +
    + {#each trip.packageLists as list} +
  • + {/each} +
+
+
+