commit 19152008955d59137a3b8703807e37921c70a849 parent a5d14ecf48f13307bf88ec3f8d50aa4a7c51b673 Author: triesap <137732411+triesap@users.noreply.github.com> Date: Sat, 9 Aug 2025 19:17:56 +0000 Edit `indexer` adding author `nip-05` profile resolver, extending `listing` events indexing with author, npub and nip-05 keys, restructuring audit feature implementing environment-based configuration. Edit `app` adding listing events to static build loaders on `profile` routes. Diffstat:
21 files changed, 881 insertions(+), 515 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock @@ -1316,7 +1316,9 @@ dependencies = [ "clap", "config", "indexer-utils", + "once_cell", "radroots-common", + "regex", "serde", "serde_json", "thiserror 1.0.69", diff --git a/app/src/lib/types/page.ts b/app/src/lib/types/page.ts @@ -1,7 +1,17 @@ -import type { RadrootsMetadataEventData } from "@radroots/radroots-common-bindings"; +import type { RadrootsListingEventData, RadrootsMetadataEventData } from "@radroots/radroots-common-bindings"; export type PageLoadProfileData = { public_key: string; npub?: string; - metadata_event: RadrootsMetadataEventData; -} -\ No newline at end of file + events: PageLoadProfileDataEvents; +}; + +export type PageLoadProfileDataEvents = + ( + { + metadata: RadrootsMetadataEventData; + } | { + metadata: RadrootsMetadataEventData; + listings: RadrootsListingEventData[]; + } + ); diff --git a/app/src/lib/views/profile/profile-indexed.svelte b/app/src/lib/views/profile/profile-indexed.svelte @@ -12,7 +12,7 @@ $ndk.subscribe( { - kinds: [NDKKind.Metadata], + kinds: [NDKKind.Metadata, NDKKind.Classified], authors: [basis.index.public_key], }, undefined, @@ -36,9 +36,9 @@ const head_title = $derived( `${ - basis.index.metadata_event.metadata.display_name || - basis.index.metadata_event.metadata.name - } (@${basis.index.metadata_event.metadata.name}) ${head_title_suffix}`, + basis.index.events.metadata.metadata.display_name || + basis.index.events.metadata.metadata.name + } (@${basis.index.events.metadata.metadata.name}) ${head_title_suffix}`, ); </script> @@ -53,7 +53,7 @@ <div class={`flex flex-col w-full gap-12 justify-start items-start`}> <div class={`flex flex-col w-full gap-4 justify-start items-start`}> - {#each Object.entries(basis.index.metadata_event) as [k, v]} + {#each Object.entries(basis.index.events.metadata) as [k, v]} <div class={`flex flex-col w-full gap-2 justify-start items-start`}> <p class={`font-sans font-[400] text-base text-ly0-gl`}> {k} @@ -66,6 +66,18 @@ </div> {/each} </div> + {#if `listings` in basis.index.events} + <div class={`flex flex-col w-full gap-4 justify-start items-start`}> + {#each basis.index.events.listings as listing_event} + <div + class={`flex flex-col w-full gap-2 justify-start items-start break-all`} + > + {JSON.stringify(listing_event)} + </div> + {/each} + </div> + {/if} + <div class={`flex flex-col w-full gap-4 justify-start items-start`}> {#each ndk_events as ndk_event} <div diff --git a/app/src/routes/(market)/(listing)/+error.svelte b/app/src/routes/(market)/(listing)/+error.svelte @@ -0,0 +1,9 @@ +<script lang="ts"> + import { page } from "$app/state"; +</script> + +{#if page.error?.message} + {page.status}{` `}{page.error.message} +{:else} + {"missing page error message"} +{/if} diff --git a/app/src/routes/(market)/(listing)/[0=country]/+page.ts b/app/src/routes/(market)/(listing)/[0=country]/+page.ts @@ -1,5 +1,5 @@ import { PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL } from "$env/static/public"; -import type { RadrootsListingEventData, RadrootsListingIndexCountryManifest } from "@radroots/radroots-common-bindings"; +import type { RadrootsIndexManifest, RadrootsListingEventData } from "@radroots/radroots-common-bindings"; import { error } from "@sveltejs/kit"; import type { EntryGenerator, PageLoad } from "./$types"; @@ -16,7 +16,7 @@ export const entries: EntryGenerator = async () => { type PageLoadData = { country: string; - manifest: RadrootsListingIndexCountryManifest; + manifest: RadrootsIndexManifest; events: RadrootsListingEventData[]; }; @@ -31,7 +31,7 @@ export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { if (!res_country_manifest.ok) error(404, { message: `country:${country}` }); - const manifest: RadrootsListingIndexCountryManifest = await res_country_manifest.json(); + const manifest: RadrootsIndexManifest = await res_country_manifest.json(); let events: RadrootsListingEventData[] = []; if (manifest.shards.length > 0) { diff --git a/app/src/routes/(market)/(profile)/[0=nip05]/+page.ts b/app/src/routes/(market)/(profile)/[0=nip05]/+page.ts @@ -1,6 +1,6 @@ import { PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL } from "$env/static/public"; import type { PageLoadProfileData } from "$lib/types/page"; -import type { RadrootsMetadataEventData } from "@radroots/radroots-common-bindings"; +import type { RadrootsIndexManifest, RadrootsListingEventData, RadrootsMetadataEventData } from "@radroots/radroots-common-bindings"; import { lib_nostr_npub_encode } from "@radroots/utils-nostr"; import { error } from "@sveltejs/kit"; import type { EntryGenerator, PageLoad } from "./$types"; @@ -23,13 +23,25 @@ export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { const [ res_nip05_metadata, + res_nip05_listings_manifest, ] = await Promise.all([ - fetch(`${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/0/nip05/${nip05}/metadata.json`) + fetch(`${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/0/nip05/${nip05}/metadata.json`), + fetch(`${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/30402/nip05/${nip05}/manifest.json`) ]); if (!res_nip05_metadata.ok) error(404, { message: `nip05:${nip05}`, }); + if (!res_nip05_listings_manifest.ok) error(404, { message: `nip05:listing:manifest:${nip05}`, }); const metadata_event: RadrootsMetadataEventData = await res_nip05_metadata.json(); + const listings_manifest: RadrootsIndexManifest = await res_nip05_listings_manifest.json(); + + let listings_events: RadrootsListingEventData[] = []; + if (listings_manifest.shards.length > 0) { + const shard = listings_manifest.shards[0]; + const res_country_shard = await fetch(`${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/30402/nip05/${nip05}/${shard.file}?v=${shard.sha256}`); + if (!res_country_shard.ok) error(500, { message: `nip05:listing:shard:${nip05}:${shard.file}` }); + listings_events = await res_country_shard.json(); + } const public_key = metadata_event.public_key; const npub = lib_nostr_npub_encode(public_key); @@ -37,7 +49,10 @@ export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { const data: PageLoadData = { public_key, npub, - metadata_event + events: { + metadata: metadata_event, + listings: listings_events + } } return data; } diff --git a/app/src/routes/(market)/(profile)/profile/[0=npub]/+page.ts b/app/src/routes/(market)/(profile)/profile/[0=npub]/+page.ts @@ -35,7 +35,9 @@ export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { const data: PageLoadData = { public_key, npub, - metadata_event + events: { + metadata: metadata_event + } } return data; } diff --git a/app/src/routes/(market)/(profile)/profile/[0=public_key]/+page.ts b/app/src/routes/(market)/(profile)/profile/[0=public_key]/+page.ts @@ -36,7 +36,9 @@ export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { const data: PageLoadData = { public_key, npub, - metadata_event + events: { + metadata: metadata_event + } } return data; diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte @@ -1,26 +1,39 @@ <script lang="ts"> - import { PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL } from "$env/static/public"; - import { onMount } from "svelte"; + import type { PageProps } from "./$types"; - let nip05_profiles: any[] = $state([]); - - onMount(async () => { - const res = await fetch( - `${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/0/nip05/indexes.json`, - ); - if (res.ok) nip05_profiles = await res.json(); - }); + let { data }: PageProps = $props(); </script> <div class={`flex flex-col w-full gap-4 justify-start items-start`}> <div>radroots market</div> - <div class={`flex flex-col w-full gap-2 justify-start items-start`}> - {#each nip05_profiles as nip05_profile} - <a href={`/${nip05_profile}`}> - <p class={`font-sans font-[400] text-base text-ly0-gl`}> - {nip05_profile} - </p> - </a> - {/each} + + <div class={`flex flex-col w-full justify-start items-start`}> + <p class={`font-sans font-[400] text-base text-ly0-gl`}> + {`countries:`} + </p> + <div class={`flex flex-row gap-2 justify-start items-center`}> + {#each data.countries as country} + <a href={`/${country}`}> + <p class={`font-sans font-[400] text-base text-ly0-gl`}> + {country} + </p> + </a> + {/each} + </div> + </div> + + <div class={`flex flex-col w-full justify-start items-start`}> + <p class={`font-sans font-[400] text-base text-ly0-gl`}> + {`profiles:`} + </p> + <div class={`flex flex-col w-full gap-2 justify-start items-start`}> + {#each data.profiles as profile} + <a href={`/${profile}`}> + <p class={`font-sans font-[400] text-base text-ly0-gl`}> + {profile} + </p> + </a> + {/each} + </div> </div> </div> diff --git a/app/src/routes/+page.ts b/app/src/routes/+page.ts @@ -0,0 +1,33 @@ +import { PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL } from "$env/static/public"; +import { error } from "@sveltejs/kit"; +import type { PageLoad } from "./$types"; + +type PageLoadData = { + profiles: string[]; + countries: string[]; +}; + +export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { + + const [ + res_nip05_indexes, + res_country_indexes, + ] = await Promise.all([ + fetch(`${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/30402/nip05/indexes.json`), + fetch(`${PUBLIC_RADROOTS_MARKET_RELAY_INDEXES_URL}/events/30402/country/indexes.json`), + ]); + + if (!res_nip05_indexes.ok) error(404, { message: `nip05:indexes` }); + if (!res_country_indexes.ok) error(404, { message: `country:indexes` }); + + const profiles: string[] = await res_nip05_indexes.json(); + const countries: string[] = await res_country_indexes.json(); + + const data: PageLoadData = { + profiles, + countries, + } + return data; +} + +export const prerender = true; diff --git a/crates/indexer/Cargo.toml b/crates/indexer/Cargo.toml @@ -19,6 +19,8 @@ tokio = { version = "1", features = ["full"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] } tracing-appender = "0.2" +once_cell = "1" +regex = "1" [features] default = [] diff --git a/crates/indexer/config.toml b/crates/indexer/config.toml @@ -9,3 +9,4 @@ db_path = "data/nostr-rs-relay/nostr.db" [listings] country_shard_size = 1000 +profile_shard_size = 200 diff --git a/crates/indexer/src/audit.rs b/crates/indexer/src/audit.rs @@ -1,30 +1,264 @@ #![cfg(feature = "audit")] +use std::collections::HashSet; +use std::sync::RwLock; + +use indexer_utils::nostr::public_key_to_npub; +use once_cell::sync::Lazy; +use regex::Regex; use tracing::info; +use crate::domain::resolvers::profile::ProfileResolver; use crate::relay::event::RelayIndexerEvent; use radroots_common::models::events::{RadrootsListingEvent, RadrootsMetadataEvent}; -static AUDIT_PUBLIC_KEY: Option<&'static str> = option_env!("AUDIT_PUBLIC_KEY"); +#[derive(Clone, Debug)] +pub struct AuditFilter { + pub enabled: bool, + pub kinds: Option<HashSet<u64>>, + pub authors: HashSet<String>, + pub npubs: HashSet<String>, + pub nip05_full: HashSet<String>, + pub nip05_local: HashSet<String>, + pub content_re: Option<Regex>, + pub created_at_min: Option<u32>, + pub created_at_max: Option<u32>, +} -#[inline] -fn matches(pk: &str) -> bool { - match AUDIT_PUBLIC_KEY { - Some(w) => pk == w, - None => false, +impl Default for AuditFilter { + fn default() -> Self { + Self { + enabled: false, + kinds: None, + authors: HashSet::new(), + npubs: HashSet::new(), + nip05_full: HashSet::new(), + nip05_local: HashSet::new(), + content_re: None, + created_at_min: None, + created_at_max: None, + } + } +} + +impl AuditFilter { + pub fn from_env() -> Self { + let mut f = Self::default(); + + f.enabled = std::env::var("AUDIT_ENABLED") + .map(|v| v.eq_ignore_ascii_case("true") || v == "1") + .unwrap_or(false); + + if let Ok(v) = std::env::var("AUDIT_KINDS") { + let set = v + .split(',') + .filter_map(|s| s.trim().parse::<u64>().ok()) + .collect::<HashSet<_>>(); + if !set.is_empty() { + f.kinds = Some(set); + } + } + + let parse_set = |key: &str| -> HashSet<String> { + std::env::var(key) + .ok() + .map(|s| { + s.split(',') + .map(|x| x.trim().to_lowercase()) + .filter(|x| !x.is_empty()) + .collect() + }) + .unwrap_or_default() + }; + + f.authors = parse_set("AUDIT_AUTHORS"); + f.npubs = parse_set("AUDIT_NPUBS"); + f.nip05_full = parse_set("AUDIT_NIP05"); + f.nip05_local = parse_set("AUDIT_NIP05_LOCAL"); + + if let Ok(rx) = std::env::var("AUDIT_CONTENT_RE") { + if !rx.trim().is_empty() { + if let Ok(re) = Regex::new(&format!("(?i){}", rx)) { + f.content_re = Some(re); + } + } + } + + f.created_at_min = std::env::var("AUDIT_CREATED_AT_MIN") + .ok() + .and_then(|s| s.parse().ok()); + f.created_at_max = std::env::var("AUDIT_CREATED_AT_MAX") + .ok() + .and_then(|s| s.parse().ok()); + + f } } +#[derive(Clone)] +struct AuditState { + filter: AuditFilter, + resolver: Option<ProfileResolver>, +} + +static STATE: Lazy<RwLock<AuditState>> = Lazy::new(|| { + RwLock::new(AuditState { + filter: AuditFilter::from_env(), + resolver: None, + }) +}); + +pub fn reload_from_env() { + if let Ok(mut w) = STATE.write() { + w.filter = AuditFilter::from_env(); + } +} + +pub fn set_profile_resolver(resolver: ProfileResolver) { + if let Ok(mut w) = STATE.write() { + w.resolver = Some(resolver); + } +} + +fn nip05_parts_from_metadata(nip05: &str) -> (String, String) { + let lower = nip05.to_lowercase(); + if let Some((name, domain)) = lower.split_once('@') { + (format!("{name}@{domain}"), name.to_string()) + } else { + (lower.clone(), lower) + } +} + +fn should_log( + author_hex: &str, + kind_u64: u64, + created_at: u32, + content: &str, + npub_opt: Option<String>, + nip05_full_opt: Option<String>, + nip05_local_opt: Option<String>, +) -> bool { + let filter = STATE.read().ok().map(|s| s.filter.clone()); + let Some(f) = filter else { + return false; + }; + if !f.enabled { + return false; + } + + if let Some(kinds) = &f.kinds { + if !kinds.contains(&kind_u64) { + return false; + } + } + + if !f.authors.is_empty() && !f.authors.contains(&author_hex.to_lowercase()) { + return false; + } + + if !f.npubs.is_empty() { + let pass = npub_opt + .as_ref() + .map(|n| f.npubs.contains(&n.to_lowercase())) + .unwrap_or(false); + if !pass { + return false; + } + } + + if !f.nip05_full.is_empty() { + let pass = nip05_full_opt + .as_ref() + .map(|n| f.nip05_full.contains(&n.to_lowercase())) + .unwrap_or(false); + if !pass { + return false; + } + } + + if !f.nip05_local.is_empty() { + let pass = nip05_local_opt + .as_ref() + .map(|n| f.nip05_local.contains(&n.to_lowercase())) + .unwrap_or(false); + if !pass { + return false; + } + } + + if let Some(min) = f.created_at_min { + if created_at < min { + return false; + } + } + if let Some(max) = f.created_at_max { + if created_at > max { + return false; + } + } + + if let Some(re) = &f.content_re { + if !re.is_match(content) { + return false; + } + } + + true +} + #[inline] pub fn log_indexer_event(idx: &RelayIndexerEvent) { - if !matches(&idx.author) { + let need_npub = STATE + .read() + .ok() + .map(|s| !s.filter.npubs.is_empty()) + .unwrap_or(false); + let npub_opt = if need_npub { + public_key_to_npub(&idx.author).ok() + } else { + None + }; + + let (need_full, need_local) = STATE + .read() + .ok() + .map(|s| { + ( + !s.filter.nip05_full.is_empty(), + !s.filter.nip05_local.is_empty(), + ) + }) + .unwrap_or((false, false)); + + let (nip05_full_opt, nip05_local_opt) = if need_full || need_local { + if let Ok(s) = STATE.read() { + if let Some(res) = s.resolver.as_ref() { + let local = res.nip05_for_author(&idx.author).map(|s| s.to_string()); + (None, local) + } else { + (None, None) + } + } else { + (None, None) + } + } else { + (None, None) + }; + + if !should_log( + &idx.author, + idx.kind.as_u64(), + idx.created_at, + &idx.content, + npub_opt, + nip05_full_opt, + nip05_local_opt, + ) { return; } - let tags_json = match serde_json::to_string(&idx.tags) { - Ok(json) => json, - Err(_) => String::from("Error serializing tags"), - }; + let tags_json = + serde_json::to_string(&idx.tags).unwrap_or_else(|_| "Error serializing tags".into()); info!( target: "audit", kind = idx.kind.as_u64(), @@ -39,9 +273,40 @@ pub fn log_indexer_event(idx: &RelayIndexerEvent) { #[inline] pub fn log_metadata_event(evt: &RadrootsMetadataEvent) { - if !matches(&evt.event.author) { + let (nip05_full_opt, nip05_local_opt) = evt + .data + .metadata + .nip05 + .as_ref() + .map(|n| { + let (full, local) = nip05_parts_from_metadata(n); + (Some(full), Some(local)) + }) + .unwrap_or((None, None)); + + let need_npub = STATE + .read() + .ok() + .map(|s| !s.filter.npubs.is_empty()) + .unwrap_or(false); + let npub_opt = if need_npub { + public_key_to_npub(&evt.event.author).ok() + } else { + None + }; + + if !should_log( + &evt.event.author, + evt.event.kind.try_into().unwrap(), + evt.event.created_at, + &evt.event.content, + npub_opt, + nip05_full_opt, + nip05_local_opt, + ) { return; } + if let Ok(json) = serde_json::to_string(evt) { info!( target = "audit", @@ -57,9 +322,57 @@ pub fn log_metadata_event(evt: &RadrootsMetadataEvent) { #[inline] pub fn log_listing_event(evt: &RadrootsListingEvent) { - if !matches(&evt.event.author) { + let need_npub = STATE + .read() + .ok() + .map(|s| !s.filter.npubs.is_empty()) + .unwrap_or(false); + let npub_opt = if need_npub { + public_key_to_npub(&evt.event.author).ok() + } else { + None + }; + + let (need_full, need_local) = STATE + .read() + .ok() + .map(|s| { + ( + !s.filter.nip05_full.is_empty(), + !s.filter.nip05_local.is_empty(), + ) + }) + .unwrap_or((false, false)); + + let (nip05_full_opt, nip05_local_opt) = if need_full || need_local { + if let Ok(s) = STATE.read() { + if let Some(res) = s.resolver.as_ref() { + let local = res + .nip05_for_author(&evt.event.author) + .map(|s| s.to_string()); + (None, local) + } else { + (None, None) + } + } else { + (None, None) + } + } else { + (None, None) + }; + + if !should_log( + &evt.event.author, + evt.event.kind as u64, + evt.event.created_at, + &evt.event.content, + npub_opt, + nip05_full_opt, + nip05_local_opt, + ) { return; } + if let Ok(json) = serde_json::to_string(evt) { info!( target = "audit", diff --git a/crates/indexer/src/config.rs b/crates/indexer/src/config.rs @@ -27,6 +27,7 @@ pub struct Relay { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Listings { pub country_shard_size: usize, + pub profile_shard_size: usize, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/crates/indexer/src/domain/indexer/key.rs b/crates/indexer/src/domain/indexer/key.rs @@ -26,4 +26,10 @@ pub const METADATA_INDEX_DIRECTORY: [IndexerKey; 4] = [ IndexerKey::Npub, ]; -pub const LISTING_INDEX_DIRECTORY: [IndexerKey; 2] = [IndexerKey::Id, IndexerKey::Country]; +pub const LISTING_INDEX_DIRECTORY: [IndexerKey; 5] = [ + IndexerKey::Id, + IndexerKey::Country, + IndexerKey::Author, + IndexerKey::Npub, + IndexerKey::Nip05, +]; diff --git a/crates/indexer/src/domain/indexer/kind.rs b/crates/indexer/src/domain/indexer/kind.rs @@ -4,6 +4,7 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt; use std::path::PathBuf; +use crate::domain::indexer::key::LISTING_INDEX_DIRECTORY; use crate::domain::indexer::{IndexerKey, METADATA_INDEX_DIRECTORY}; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] @@ -25,7 +26,7 @@ impl IndexerEventKind { pub const fn paths(self) -> &'static [IndexerKey] { match self { IndexerEventKind::Metadata => &METADATA_INDEX_DIRECTORY, - IndexerEventKind::Listing => &METADATA_INDEX_DIRECTORY, + IndexerEventKind::Listing => &LISTING_INDEX_DIRECTORY, } } diff --git a/crates/indexer/src/domain/indexer/models/listing.rs b/crates/indexer/src/domain/indexer/models/listing.rs @@ -1,11 +1,12 @@ use indexer_utils::{ file::fs_mkdir, logs::truncate_log, + nostr::public_key_to_npub, write::{compute_hash, write_hash, write_json}, }; use radroots_common::models::{ events::{RadrootsListingEvent, RadrootsListingEventData}, - indexer::{RadrootsListingIndexCountryManifest, RadrootsListingIndexShardMetadata}, + indexer::{RadrootsIndexManifest, RadrootsIndexShardMetadata}, }; use std::{collections::BTreeMap, fs, path::PathBuf}; use tracing::{instrument, warn}; @@ -20,6 +21,7 @@ use crate::{ models::{EventIndexes, NostrEventsStaticError, WriteEventIndexes}, IndexerKey, }, + resolvers::profile::ProfileResolver, }, relay::event::RelayIndexerEvent, Settings, @@ -52,32 +54,48 @@ pub struct EventListingIndexes { events: Vec<RadrootsListingEvent>, events_id: BTreeMap<String, RadrootsListingEvent>, country_ids: BTreeMap<String, Vec<String>>, + author_ids: BTreeMap<String, Vec<String>>, + npub_ids: BTreeMap<String, Vec<String>>, + nip05_ids: BTreeMap<String, Vec<String>>, } -impl EventIndexes for EventListingIndexes { - type Event = RelayIndexerEvent; - - fn subdirs() -> &'static [IndexerKey] { - &LISTING_INDEX_DIRECTORY - } - - #[instrument(skip(raw_events), fields(event_count = raw_events.len()))] - fn build(raw_events: &[Self::Event]) -> Result<Self, NostrEventsStaticError> { +impl EventListingIndexes { + pub fn build_with_profiles( + raw_events: &[RelayIndexerEvent], + profiles: &ProfileResolver, + ) -> Result<Self, NostrEventsStaticError> { let mut events: Vec<RadrootsListingEvent> = Vec::with_capacity(raw_events.len()); let mut events_id: BTreeMap<String, RadrootsListingEvent> = BTreeMap::new(); let mut country_ids: BTreeMap<String, Vec<String>> = BTreeMap::new(); + let mut author_ids: BTreeMap<String, Vec<String>> = BTreeMap::new(); + let mut npub_ids: BTreeMap<String, Vec<String>> = BTreeMap::new(); + let mut nip05_ids: BTreeMap<String, Vec<String>> = BTreeMap::new(); for raw in raw_events { match raw.clone().to_radroots_listing_event() { Ok(evt) => { audit::log_listing_event(&evt); + let id = evt.event.id.clone(); - let country_code = evt.data.location_country.to_lowercase(); + let author = evt.event.author.to_lowercase(); + + let npub = public_key_to_npub(&author).map(|s| s.to_lowercase()).ok(); + let author_nip05 = profiles.nip05_for_author(&author).map(str::to_owned); + + let country = evt.data.location_country.to_lowercase(); events_id.insert(id.clone(), evt.clone()); events.push(evt.clone()); - country_ids.entry(country_code).or_default().push(id); + country_ids.entry(country).or_default().push(id.clone()); + author_ids.entry(author).or_default().push(id.clone()); + + if let Some(n) = npub { + npub_ids.entry(n).or_default().push(id.clone()); + } + if let Some(n05) = author_nip05 { + nip05_ids.entry(n05).or_default().push(id.clone()); + } } Err(err) => { warn!( @@ -93,7 +111,24 @@ impl EventIndexes for EventListingIndexes { } } - for (_cc, ids) in country_ids.iter_mut() { + let sort_ids = |ids: &mut Vec<String>, map: &BTreeMap<String, RadrootsListingEvent>| { + ids.sort_unstable_by(|a, b| { + let pa = map.get(a).map(|e| e.data.published_at).unwrap_or_default(); + let pb = map.get(b).map(|e| e.data.published_at).unwrap_or_default(); + pb.cmp(&pa).then(a.cmp(b)) + }); + }; + + for ids in country_ids.values_mut() { + sort_ids(ids, &events_id); + } + for ids in author_ids.values_mut() { + sort_ids(ids, &events_id); + } + for ids in npub_ids.values_mut() { + sort_ids(ids, &events_id); + } + for ids in nip05_ids.values_mut() { ids.sort_unstable_by(|a, b| { let pa = events_id .get(a) @@ -103,7 +138,6 @@ impl EventIndexes for EventListingIndexes { .get(b) .map(|e| e.data.published_at) .unwrap_or_default(); - pb.cmp(&pa).then(a.cmp(b)) }); } @@ -112,10 +146,27 @@ impl EventIndexes for EventListingIndexes { events, events_id, country_ids, + author_ids, + npub_ids, + nip05_ids, }) } } +impl EventIndexes for EventListingIndexes { + type Event = RelayIndexerEvent; + + fn subdirs() -> &'static [IndexerKey] { + &LISTING_INDEX_DIRECTORY + } + + #[instrument(skip(raw_events), fields(event_count = raw_events.len()))] + fn build(raw_events: &[Self::Event]) -> Result<Self, NostrEventsStaticError> { + let empty = ProfileResolver::default(); + Self::build_with_profiles(raw_events, &empty) + } +} + impl EventListingIndexes { fn format_shard_filename(ix: usize) -> String { format!("shards/{:06}.json", ix) @@ -191,7 +242,7 @@ impl WriteEventIndexes for EventListingIndexes { (0, 0) }; - let mut manifest = RadrootsListingIndexCountryManifest { + let mut manifest = RadrootsIndexManifest { country: cc.clone(), total: u32::try_from(data_items.len()).expect("too many data items for u32"), shard_size: u32::try_from(shard_size).expect("shard_size too large for u32"), @@ -226,7 +277,7 @@ impl WriteEventIndexes for EventListingIndexes { (fp.0, fp.1, lp.0, lp.1) }; - manifest.shards.push(RadrootsListingIndexShardMetadata { + manifest.shards.push(RadrootsIndexShardMetadata { file: file_rel, count: u32::try_from(chunk.len()).expect("chunk length too large for u32"), first_id, @@ -241,6 +292,262 @@ impl WriteEventIndexes for EventListingIndexes { } } + { + let sub_author = base.join(IndexerKey::Author.as_str()); + fs_mkdir(&[&sub_author])?; + let authors: Vec<String> = self.author_ids.keys().cloned().collect(); + write_if_stale!(sub_author.join("indexes.json"), authors, updated); + + for (author, ids) in &self.author_ids { + let dir = sub_author.join(author); + let shards_dir = dir.join("shards"); + fs_mkdir(&[&dir, &shards_dir])?; + + let mut data_items: Vec<RadrootsListingEventData> = Vec::with_capacity(ids.len()); + for id in ids { + if let Some(evt) = self.events_id.get(id) { + data_items.push(evt.data.clone()); + } + } + + let shard_size = settings.listings.profile_shard_size; + let shards = Self::shard_vec(&data_items, shard_size); + + let (first_pub, last_pub) = + if let (Some(f), Some(l)) = (data_items.first(), data_items.last()) { + (f.published_at, l.published_at) + } else { + (0, 0) + }; + + let mut manifest = RadrootsIndexManifest { + country: author.clone(), + total: u32::try_from(data_items.len()).expect("too many data items for u32"), + shard_size: u32::try_from(shard_size).expect("shard_size too large for u32"), + first_published_at: first_pub, + last_published_at: last_pub, + shards: Vec::with_capacity(shards.len()), + }; + + for (ix, chunk) in shards.into_iter().enumerate() { + let file_rel = Self::format_shard_filename(ix); + let file_abs = dir.join(&file_rel); + if let Some(parent) = file_abs.parent() { + fs_mkdir(&[&parent])?; + } + + let sha = write_if_stale!(file_abs, chunk, updated); + + let (first_id, first_published_at, last_id, last_published_at) = + if let (Some(f), Some(l)) = ( + data_items.get(ix * shard_size), + data_items.get(((ix + 1) * shard_size).saturating_sub(1)), + ) { + (f.id.clone(), f.published_at, l.id.clone(), l.published_at) + } else { + let fp = data_items + .get(ix * shard_size) + .map(|x| (x.id.clone(), x.published_at)) + .or_else(|| chunk.first().map(|x| (x.id.clone(), x.published_at))) + .unwrap_or_default(); + + let lp = data_items + .get(((ix + 1) * shard_size).saturating_sub(1)) + .map(|x| (x.id.clone(), x.published_at)) + .or_else(|| chunk.last().map(|x| (x.id.clone(), x.published_at))) + .unwrap_or_default(); + + (fp.0, fp.1, lp.0, lp.1) + }; + + manifest.shards.push(RadrootsIndexShardMetadata { + file: file_rel, + count: u32::try_from(std::cmp::min( + shard_size, + data_items.len().saturating_sub(ix * shard_size), + )) + .expect("chunk length too large for u32"), + first_id, + last_id, + first_published_at, + last_published_at, + sha256: sha, + }); + } + + write_if_stale!(dir.join("manifest.json"), manifest, updated); + } + } + + { + let sub_npub = base.join(IndexerKey::Npub.as_str()); + fs_mkdir(&[&sub_npub])?; + let npubs: Vec<String> = self.npub_ids.keys().cloned().collect(); + write_if_stale!(sub_npub.join("indexes.json"), npubs, updated); + + for (npub, ids) in &self.npub_ids { + let dir = sub_npub.join(npub); + let shards_dir = dir.join("shards"); + fs_mkdir(&[&dir, &shards_dir])?; + + let mut data_items: Vec<RadrootsListingEventData> = Vec::with_capacity(ids.len()); + for id in ids { + if let Some(evt) = self.events_id.get(id) { + data_items.push(evt.data.clone()); + } + } + + let shard_size = settings.listings.profile_shard_size; + let shards = Self::shard_vec(&data_items, shard_size); + + let (first_pub, last_pub) = + if let (Some(f), Some(l)) = (data_items.first(), data_items.last()) { + (f.published_at, l.published_at) + } else { + (0, 0) + }; + + let mut manifest = RadrootsIndexManifest { + country: npub.clone(), + total: u32::try_from(data_items.len()).expect("too many data items for u32"), + shard_size: u32::try_from(shard_size).expect("shard_size too large for u32"), + first_published_at: first_pub, + last_published_at: last_pub, + shards: Vec::with_capacity(shards.len()), + }; + + for (ix, chunk) in shards.into_iter().enumerate() { + let file_rel = Self::format_shard_filename(ix); + let file_abs = dir.join(&file_rel); + if let Some(parent) = file_abs.parent() { + fs_mkdir(&[&parent])?; + } + + let sha = write_if_stale!(file_abs, chunk, updated); + + let (first_id, first_published_at, last_id, last_published_at) = + if let (Some(f), Some(l)) = ( + data_items.get(ix * shard_size), + data_items.get(((ix + 1) * shard_size).saturating_sub(1)), + ) { + (f.id.clone(), f.published_at, l.id.clone(), l.published_at) + } else { + let fp = data_items + .get(ix * shard_size) + .map(|x| (x.id.clone(), x.published_at)) + .or_else(|| chunk.first().map(|x| (x.id.clone(), x.published_at))) + .unwrap_or_default(); + + let lp = data_items + .get(((ix + 1) * shard_size).saturating_sub(1)) + .map(|x| (x.id.clone(), x.published_at)) + .or_else(|| chunk.last().map(|x| (x.id.clone(), x.published_at))) + .unwrap_or_default(); + + (fp.0, fp.1, lp.0, lp.1) + }; + + manifest.shards.push(RadrootsIndexShardMetadata { + file: file_rel, + count: u32::try_from(std::cmp::min( + shard_size, + data_items.len().saturating_sub(ix * shard_size), + )) + .expect("chunk length too large for u32"), + first_id, + last_id, + first_published_at, + last_published_at, + sha256: sha, + }); + } + + write_if_stale!(dir.join("manifest.json"), manifest, updated); + } + + { + let sub_nip05 = base.join(IndexerKey::Nip05.as_str()); + fs_mkdir(&[&sub_nip05])?; + let names: Vec<String> = self.nip05_ids.keys().cloned().collect(); + write_if_stale!(sub_nip05.join("indexes.json"), names, updated); + + for (name, ids) in &self.nip05_ids { + let dir = sub_nip05.join(name); + let shards_dir = dir.join("shards"); + fs_mkdir(&[&dir, &shards_dir])?; + + let mut data_items = Vec::with_capacity(ids.len()); + for id in ids { + if let Some(evt) = self.events_id.get(id) { + data_items.push(evt.data.clone()); + } + } + + let shard_size = settings.listings.profile_shard_size; + let shards = Self::shard_vec(&data_items, shard_size); + + let (first_pub, last_pub) = + if let (Some(f), Some(l)) = (data_items.first(), data_items.last()) { + (f.published_at, l.published_at) + } else { + (0, 0) + }; + + let mut manifest = RadrootsIndexManifest { + country: name.clone(), + total: u32::try_from(data_items.len()).expect("u32 overflow"), + shard_size: u32::try_from(shard_size).expect("u32 overflow"), + first_published_at: first_pub, + last_published_at: last_pub, + shards: Vec::with_capacity(shards.len()), + }; + + for (ix, chunk) in shards.into_iter().enumerate() { + let file_rel = Self::format_shard_filename(ix); + let file_abs = dir.join(&file_rel); + if let Some(parent) = file_abs.parent() { + fs_mkdir(&[&parent])?; + } + + let sha = write_if_stale!(file_abs, chunk, updated); + + let (first_id, first_pub, last_id, last_pub) = if let (Some(f), Some(l)) = ( + data_items.get(ix * shard_size), + data_items.get(((ix + 1) * shard_size).saturating_sub(1)), + ) { + (f.id.clone(), f.published_at, l.id.clone(), l.published_at) + } else { + let fp = chunk + .first() + .map(|x| (x.id.clone(), x.published_at)) + .unwrap_or_default(); + let lp = chunk + .last() + .map(|x| (x.id.clone(), x.published_at)) + .unwrap_or_default(); + (fp.0, fp.1, lp.0, lp.1) + }; + + manifest.shards.push(RadrootsIndexShardMetadata { + file: file_rel, + count: u32::try_from(std::cmp::min( + shard_size, + data_items.len().saturating_sub(ix * shard_size), + )) + .expect("u32 overflow"), + first_id, + last_id, + first_published_at: first_pub, + last_published_at: last_pub, + sha256: sha, + }); + } + + write_if_stale!(dir.join("manifest.json"), manifest, updated); + } + } + } + Ok(()) } } diff --git a/crates/indexer/src/domain/resolvers/mod.rs b/crates/indexer/src/domain/resolvers/mod.rs @@ -0,0 +1 @@ +pub mod profile; diff --git a/crates/indexer/src/domain/resolvers/profile.rs b/crates/indexer/src/domain/resolvers/profile.rs @@ -0,0 +1,45 @@ +use crate::domain::events::ToRadrootsMetadataEvent; +use crate::relay::event::RelayIndexerEvent; +use std::collections::BTreeMap; + +#[derive(Default, Clone)] +pub struct ProfileResolver { + author_to_nip05: BTreeMap<String, String>, +} + +impl ProfileResolver { + pub fn from_metadata(raw_metadata: &[RelayIndexerEvent]) -> Self { + let mut latest: BTreeMap<String, (u32, String)> = BTreeMap::new(); + + for raw in raw_metadata { + if let Ok(evt) = raw.clone().to_radroots_metadata_event() { + if let Some(n) = &evt.data.metadata.nip05 { + let normalized = n.replace("@radroots.market", "").to_lowercase(); + if normalized.is_empty() { + continue; + } + + let author = evt.event.author.to_lowercase(); + let ts = evt.data.published_at; + match latest.get(&author) { + Some(&(old_ts, _)) if old_ts >= ts => {} + _ => { + latest.insert(author, (ts, normalized)); + } + } + } + } + } + + let author_to_nip05 = latest.into_iter().map(|(a, (_ts, n))| (a, n)).collect(); + + Self { author_to_nip05 } + } + + #[inline] + pub fn nip05_for_author(&self, author_hex: &str) -> Option<&str> { + self.author_to_nip05 + .get(&author_hex.to_lowercase()) + .map(|s| s.as_str()) + } +} diff --git a/crates/indexer/src/lib.rs b/crates/indexer/src/lib.rs @@ -15,6 +15,7 @@ pub mod telemetry; pub mod domain { pub mod events; pub mod indexer; + pub mod resolvers; } pub mod relay { pub mod event; @@ -32,9 +33,12 @@ pub mod audit { } use crate::{ - domain::indexer::{ - kind::IndexerEventKind, - models::{EventIndexes, EventListingIndexes, EventMetadataIndexes, WriteEventIndexes}, + domain::{ + indexer::{ + kind::IndexerEventKind, + models::{EventIndexes, EventListingIndexes, EventMetadataIndexes, WriteEventIndexes}, + }, + resolvers::profile::ProfileResolver, }, relay::event::RelayIndexerEvent, }; @@ -93,6 +97,8 @@ pub async fn run(settings: Settings) -> Result<()> { records_kind.entry(iev.kind).or_default().push(iev); } + let mut need_rebuild_listing = false; + if let Some(metadata_events) = records_kind.remove(&IndexerEventKind::Metadata) { if !metadata_events.is_empty() { for ev in &metadata_events { @@ -130,9 +136,14 @@ pub async fn run(settings: Settings) -> Result<()> { "Written {} index files", updated_indexes.len() ); + + need_rebuild_listing = true; } } + let raw_metadata_events: Vec<RelayIndexerEvent> = db_idx.get_all(tree_events_metadata)?; + let profiles = ProfileResolver::from_metadata(&raw_metadata_events); + if let Some(listing_events) = records_kind.remove(&IndexerEventKind::Listing) { if !listing_events.is_empty() { for ev in &listing_events { @@ -168,9 +179,24 @@ pub async fn run(settings: Settings) -> Result<()> { "Written {} listing index files", updated_listing.len() ); + + need_rebuild_listing = true; } } + if need_rebuild_listing { + let raw_listing_events: Vec<RelayIndexerEvent> = db_idx.get_all(tree_events_listing)?; + let listing_indexes = + EventListingIndexes::build_with_profiles(&raw_listing_events, &profiles)?; + let mut updated_listing = Vec::new(); + listing_indexes.write(&settings, &mut updated_listing)?; + info!( + written = updated_listing.len(), + "Written {} listing index files", + updated_listing.len() + ); + } + let elapsed = iteration_start.elapsed(); let interval = Duration::from_secs(settings.indexer.flush_interval); let delay = interval.saturating_sub(elapsed); diff --git a/yarn.lock b/yarn.lock @@ -44,161 +44,81 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727" integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA== -"@esbuild/android-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" - integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== - "@esbuild/android-arm64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6" integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w== -"@esbuild/android-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" - integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== - "@esbuild/android-arm@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059" integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw== -"@esbuild/android-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" - integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== - "@esbuild/android-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0" integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA== -"@esbuild/darwin-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" - integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== - "@esbuild/darwin-arm64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d" integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw== -"@esbuild/darwin-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" - integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== - "@esbuild/darwin-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2" integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg== -"@esbuild/freebsd-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" - integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== - "@esbuild/freebsd-arm64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada" integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA== -"@esbuild/freebsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" - integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== - "@esbuild/freebsd-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343" integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw== -"@esbuild/linux-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" - integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== - "@esbuild/linux-arm64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9" integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w== -"@esbuild/linux-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" - integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== - "@esbuild/linux-arm@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19" integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg== -"@esbuild/linux-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" - integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== - "@esbuild/linux-ia32@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d" integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg== -"@esbuild/linux-loong64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" - integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== - "@esbuild/linux-loong64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4" integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ== -"@esbuild/linux-mips64el@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" - integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== - "@esbuild/linux-mips64el@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340" integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw== -"@esbuild/linux-ppc64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" - integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== - "@esbuild/linux-ppc64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe" integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ== -"@esbuild/linux-riscv64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" - integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== - "@esbuild/linux-riscv64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083" integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg== -"@esbuild/linux-s390x@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" - integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== - "@esbuild/linux-s390x@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71" integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg== -"@esbuild/linux-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" - integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== - "@esbuild/linux-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz#9a4f78c75c051e8c060183ebb39a269ba936a2ac" @@ -209,11 +129,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0" integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw== -"@esbuild/netbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" - integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== - "@esbuild/netbsd-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c" @@ -224,11 +139,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45" integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ== -"@esbuild/openbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" - integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== - "@esbuild/openbsd-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc" @@ -239,41 +149,21 @@ resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a" integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg== -"@esbuild/sunos-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" - integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== - "@esbuild/sunos-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb" integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w== -"@esbuild/win32-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" - integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== - "@esbuild/win32-arm64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1" integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ== -"@esbuild/win32-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" - integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== - "@esbuild/win32-ia32@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4" integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg== -"@esbuild/win32-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" - integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== - "@esbuild/win32-x64@0.25.8": version "0.25.8" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c" @@ -351,7 +241,7 @@ dependencies: minipass "^7.0.4" -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.5": version "0.3.12" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== @@ -590,11 +480,6 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "@polka/url@^1.0.0-next.24": version "1.0.0-next.29" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" @@ -1107,11 +992,6 @@ ansis@^3.17.0: resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -1130,11 +1010,6 @@ aria-query@^5.3.1: resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - async@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -1203,18 +1078,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bundle-require@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.2.1.tgz#4c450a5807381d20ade987bde8ac391544257919" - integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA== - dependencies: - load-tsconfig "^0.2.3" - -cac@^6.7.12: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1320,11 +1183,6 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - convert@^5.5.1: version "5.12.0" resolved "https://registry.yarnpkg.com/convert/-/convert-5.12.0.tgz#7e654e937dfe113247747260ccc5f3bc361ebdbb" @@ -1342,7 +1200,7 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-spawn@^7.0.3, cross-spawn@^7.0.6: +cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -1370,7 +1228,7 @@ daisyui@^5.0.46: resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-5.0.50.tgz#764da931c9cdad22114e054c8af6d410326cc226" integrity sha512-c1PweK5RI1C76q58FKvbS4jzgyNJSP6CGTQ+KkZYzADdJoERnOxFoeLfDHmQgxLpjEzlYhFMXCeodQNLCC9bow== -debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1: +debug@^4.1.1, debug@^4.2.0, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== @@ -1424,13 +1282,6 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dotenv@^17.2.0: version "17.2.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.1.tgz#6f32e10faf014883515538dc922a0fb8765d9b32" @@ -1471,34 +1322,6 @@ enhanced-resolve@^5.18.1: graceful-fs "^4.2.4" tapable "^2.2.0" -esbuild@^0.17.6: - version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" - integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== - optionalDependencies: - "@esbuild/android-arm" "0.17.19" - "@esbuild/android-arm64" "0.17.19" - "@esbuild/android-x64" "0.17.19" - "@esbuild/darwin-arm64" "0.17.19" - "@esbuild/darwin-x64" "0.17.19" - "@esbuild/freebsd-arm64" "0.17.19" - "@esbuild/freebsd-x64" "0.17.19" - "@esbuild/linux-arm" "0.17.19" - "@esbuild/linux-arm64" "0.17.19" - "@esbuild/linux-ia32" "0.17.19" - "@esbuild/linux-loong64" "0.17.19" - "@esbuild/linux-mips64el" "0.17.19" - "@esbuild/linux-ppc64" "0.17.19" - "@esbuild/linux-riscv64" "0.17.19" - "@esbuild/linux-s390x" "0.17.19" - "@esbuild/linux-x64" "0.17.19" - "@esbuild/netbsd-x64" "0.17.19" - "@esbuild/openbsd-x64" "0.17.19" - "@esbuild/sunos-x64" "0.17.19" - "@esbuild/win32-arm64" "0.17.19" - "@esbuild/win32-ia32" "0.17.19" - "@esbuild/win32-x64" "0.17.19" - esbuild@^0.25.0: version "0.25.8" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.8.tgz#482d42198b427c9c2f3a81b63d7663aecb1dda07" @@ -1563,21 +1386,6 @@ esrap@^2.1.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -1587,7 +1395,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -fast-glob@^3.2.11, fast-glob@^3.2.9: +fast-glob@^3.2.11: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -1636,7 +1444,7 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -foreground-child@^3.1.0, foreground-child@^3.3.1: +foreground-child@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== @@ -1678,7 +1486,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -1695,18 +1503,6 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^11.0.0: version "11.0.3" resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" @@ -1719,18 +1515,6 @@ glob@^11.0.0: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -1741,11 +1525,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1758,11 +1537,6 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - import-meta-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" @@ -1865,11 +1639,6 @@ is-reference@^3.0.3: dependencies: "@types/estree" "^1.0.6" -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -1892,15 +1661,6 @@ iso-3166@4.3.0: resolved "https://registry.yarnpkg.com/iso-3166/-/iso-3166-4.3.0.tgz#3eb4cbf26f6baaddc1e1bd34a0bc27079d61b94a" integrity sha512-H4kM/sVbxTjSl9xnQCYOrNWdpN0R8Uz26j1BuXI9E6U+kw5wmd3HyPgr/v4+NCuvV/NcvwTfZxd5XZ4lPKvBNA== -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - jackspeak@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" @@ -1922,11 +1682,6 @@ jiti@^2.4.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.5.1.tgz#bd099c1c2be1c59bbea4e5adcd127363446759d0" integrity sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w== -joycon@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" - integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== - json-stringify-pretty-compact@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz#cf4844770bddee3cb89a6170fe4b00eee5dbf1d4" @@ -2036,36 +1791,16 @@ lightningcss@1.30.1: lightningcss-win32-arm64-msvc "1.30.1" lightningcss-win32-x64-msvc "1.30.1" -lilconfig@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-tsconfig@^0.2.3: - version "0.2.5" - resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" - integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== - locate-character@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2086,11 +1821,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - lru-cache@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" @@ -2141,12 +1871,7 @@ make-error@^1.1.1: supercluster "^8.0.1" tinyqueue "^3.0.0" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -2178,7 +1903,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4, minimatch@^9.0.5: +minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -2190,7 +1915,7 @@ minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2: +minipass@^7.0.4, minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== @@ -2232,15 +1957,6 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" @@ -2290,24 +2006,12 @@ nostr-wasm@0.1.0: resolved "https://registry.yarnpkg.com/nostr-wasm/-/nostr-wasm-0.1.0.tgz#17af486745feb2b7dd29503fdd81613a24058d94" integrity sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA== -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - observable-fns@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/observable-fns/-/observable-fns-0.6.1.tgz#636eae4fdd1132e88c0faf38d33658cc79d87e37" integrity sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg== -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -2352,19 +2056,11 @@ pascal-case@^3.1.1: no-case "^3.0.4" tslib "^2.0.3" -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" @@ -2373,11 +2069,6 @@ path-scurry@^2.0.0: lru-cache "^11.0.0" minipass "^7.1.2" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - pbf@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pbf/-/pbf-4.0.1.tgz#ad9015e022b235dcdbe05fc468a9acadf483f0d4" @@ -2400,11 +2091,6 @@ picomatch@^4.0.2, picomatch@^4.0.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== -pirates@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - pmtiles@^3.0.3: version "3.2.1" resolved "https://registry.yarnpkg.com/pmtiles/-/pmtiles-3.2.1.tgz#0ef79982ccf6052eeb9301ce7d161996c0b193de" @@ -2413,14 +2099,6 @@ pmtiles@^3.0.3: "@types/leaflet" "^1.9.8" fflate "^0.8.0" -postcss-load-config@^3.0.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - postcss@^8.5.6: version "8.5.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" @@ -2464,11 +2142,6 @@ publint@^0.3.2: picocolors "^1.1.1" sade "^1.8.1" -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2505,11 +2178,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-protobuf-schema@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" @@ -2543,13 +2211,6 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" -rollup@^3.2.5: - version "3.29.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" - integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== - optionalDependencies: - fsevents "~2.3.2" - rollup@^4.40.0: version "4.46.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.46.2.tgz#09b1a45d811e26d09bed63dc3ecfb6831c16ce32" @@ -2642,7 +2303,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -2671,13 +2332,6 @@ source-map-js@^1.2.1: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map@0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -2733,24 +2387,6 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -sucrase@^3.20.3: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - supercluster@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-8.0.1.tgz#9946ba123538e9e9ab15de472531f604e7372df5" @@ -2864,20 +2500,6 @@ tar@^7.4.3: mkdirp "^3.0.1" yallist "^5.0.0" -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - threads@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/threads/-/threads-1.7.0.tgz#d9e9627bfc1ef22ada3b733c2e7558bbe78e589c" @@ -2934,23 +2556,6 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -3007,26 +2612,6 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.8.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tsup@^6.2.3: - version "6.7.0" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-6.7.0.tgz#416f350f32a07b6ae86792ad7e52b0cafc566d64" - integrity sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ== - dependencies: - bundle-require "^4.0.0" - cac "^6.7.12" - chokidar "^3.5.1" - debug "^4.3.1" - esbuild "^0.17.6" - execa "^5.0.0" - globby "^11.0.3" - joycon "^3.0.1" - postcss-load-config "^3.0.1" - resolve-from "^5.0.0" - rollup "^3.2.5" - source-map "0.8.0-beta.0" - sucrase "^3.20.3" - tree-kill "^1.2.2" - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -3152,20 +2737,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -3242,11 +2813,6 @@ yallist@^5.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"