app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 7d56546a9d66db6ca73edf28458ef2919003677c
parent c010cbec62b7eaa74cd9c4f0f9abe0461f0504a1
Author: triesap <137732411+triesap@users.noreply.github.com>
Date:   Fri,  7 Mar 2025 09:59:22 +0000

Update app client to use locale messages from `@radroots/locales`, refactor library components, edit utils.

Diffstat:
Mapp/.env.example | 2+-
Mapp/package.json | 1+
Dapp/src/lib/locale/en/common.json | 168-------------------------------------------------------------------------------
Dapp/src/lib/locale/en/error.json | 10----------
Dapp/src/lib/locale/en/eula.json | 48------------------------------------------------
Dapp/src/lib/locale/en/icu.json | 85-------------------------------------------------------------------------------
Dapp/src/lib/locale/en/notify.json | 15---------------
Mapp/src/lib/locale/i18n.ts | 16+++++++++-------
Dapp/src/lib/locale/locales.json | 4----
Mapp/src/lib/util/index.ts | 6+++---
Mapp/src/routes/(app)/+layout.svelte | 4++--
Mapp/src/routes/(app)/+page.svelte | 2++
Mapp/src/routes/(cfg)/init/+page.svelte | 59++++++++++++++++++++++++++++-------------------------------
Mpnpm-lock.yaml | 184++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
14 files changed, 206 insertions(+), 398 deletions(-)

diff --git a/app/.env.example b/app/.env.example @@ -1,6 +1,6 @@ PUBLIC_NOSTR_RELAY_DEFAULTS= PUBLIC_RADROOTS_URL= PUBLIC_RADROOTS_NOSTR_PUBKEY= -VITE_PUBLIC_KV_NAME= +VITE_PUBLIC_IDB_NAME= VITE_PUBLIC_NDK_CACHE_NAME= VITE_PUBLIC_NDK_CLIENT_NAME= diff --git a/app/package.json b/app/package.json @@ -34,6 +34,7 @@ "@radroots/client": "workspace:*", "@radroots/geocoder": "workspace:*", "@radroots/lib-app": "workspace:*", + "@radroots/locales": "workspace:*", "@radroots/models": "workspace:*", "@radroots/nostr-util": "workspace:*", "svelte-maplibre": "workspace:*", diff --git a/app/src/lib/locale/en/common.json b/app/src/lib/locale/en/common.json @@ -1,167 +0,0 @@ -{ - "stop": "Stop", - "this_action_is_irreversible": "This action is irreversible", - "notifications": "Notifications", - "accept": "Accept", - "activation": "Activation", - "active": "Active", - "add": "Add", - "add_current_location": "Add current location", - "add_map_location": "Add map location", - "add_new": "Add new", - "add_new_location": "Add new location", - "agree": "Agree", - "all_accounts": "All accounts", - "area": "Area", - "at": "At", - "authenticated": "Authenticated", - "available_balance": "Available balance", - "back": "Back", - "bag": "Bag", - "bags": "Bags", - "bank_account": "Bank account", - "banner_photo": "Banner photo", - "bio": "Bio", - "business_name": "Business name", - "cancel": "Cancel", - "choose_a_profile_name": "Choose a profile name", - "climate": "Climate", - "close": "Close", - "color_mode": "Color mode", - "complete": "Complete", - "configure": "Configure", - "configure_your_device": "Configure your device", - "connect": "Connect", - "connected": "Connected", - "connection": "Connection", - "continue": "Continue", - "coordinates": "Coordinates", - "current_location": "Current location", - "dark": "Dark", - "date_created": "Date created", - "date_modified": "Date modified", - "delete": "Delete", - "description": "Description", - "details": "Details", - "device": "Device", - "disagree": "Disagree", - "disconnect": "Disconnect", - "do_you_want_to_continue_q": "Do you want to continue?", - "done": "Done", - "edit": "Edit", - "elevation": "Elevation", - "end_date": "End date", - "endpoint": "Endpoint", - "estate": "Estate", - "failure_to_process_the_request": "Failure to process the request", - "farm": "Farm", - "farm_land": "Farm land", - "file_name": "File name", - "file_size": "File size", - "filters": "Filters", - "from": "From", - "general": "General", - "hex": "Hex", - "highest_price": "Highest price", - "home": "Home", - "inbox": "Inbox", - "inflows": "Inflows", - "items": "Items", - "key": "Key", - "keypair": "Keypair", - "keys": "Keys", - "land_area": "Land area", - "land_plot": "Land plot", - "latitude": "Latitude", - "light": "Light", - "list": "List", - "listing": "Listing", - "location": "Location", - "locations": "Locations", - "longitude": "Longitude", - "lot": "Lot", - "lot_name": "Lot name", - "lowest_price": "Lowest price", - "make_primary": "Make primary", - "map": "Map", - "market": "Market", - "message": "Message", - "messages": "Messages", - "month": "Month", - "month_to_date": "Month to date", - "name": "Name", - "name_of_farm_or_estate": "Name of farm or estate", - "new": "New", - "no": "No", - "no_items_to_display": "No items to display", - "no_locations_saved": "No locations saved", - "nostr": "Nostr", - "not_connected": "Not connected", - "npub": "Npub", - "nsec": "Nsec", - "optional": "Optional", - "options": "Options", - "options_list": "Options list", - "order": "Order", - "origin": "Origin", - "other": "Other", - "outflows": "Outflows", - "overview": "Overview", - "page": "Page", - "per": "Per", - "personal": "Personal", - "photo": "Photo", - "photo_hosting": "Photo hosting", - "photos": "Photos", - "post": "Post", - "preview": "Preview", - "price": "Price", - "process": "Process", - "product": "Product", - "product_location": "Product location", - "product_name": "Product name", - "products": "Products", - "profile": "Profile", - "profile_name": "Profile name", - "profile_photo": "Profile photo", - "profiles": "Profiles", - "public_key": "Public key", - "publish": "Publish", - "quantity": "Quantity", - "quit": "Quit", - "reading": "Reading", - "relay": "Relay", - "relays": "Relays", - "reset": "Reset", - "return": "Return", - "review": "Review", - "search": "Search", - "secret_key": "Secret key", - "settings": "Settings", - "setup": "Setup", - "setup_for_farmer": "Setup for Farmer", - "skip": "Skip", - "socials": "Socials", - "soil": "Soil", - "start_date": "Start date", - "status": "Status", - "subject": "Subject", - "submit": "Submit", - "summary": "Summary", - "terms_of_use_agreement": "Terms of Use agreement", - "title": "Title", - "to": "To", - "unlock": "Unlock", - "update": "Update", - "upload_url": "Upload url", - "url": "url", - "username": "Username", - "using_public_key": "Using public key", - "value": "Value", - "view": "View", - "wallet": "Wallet", - "website": "Website", - "year": "Year", - "yes": "Yes", - "your_name": "Your name" -} -\ No newline at end of file diff --git a/app/src/lib/locale/en/error.json b/app/src/lib/locale/en/error.json @@ -1,9 +0,0 @@ -{ - "device": { - "configuration_failure": "There was an error configuring the device", - "public_key_not_derived": "Error deriving public key" - }, - "radroots": { - "profile_registered": "The profile has been registered" - } -} -\ No newline at end of file diff --git a/app/src/lib/locale/en/eula.json b/app/src/lib/locale/en/eula.json @@ -1,47 +0,0 @@ -{ - "acceptance_of_terms": { - "body": "By using our Application, you signify your acceptance of this EULA. If you do not agree to this EULA, you may not use our Application.", - "title": "Acceptance of Terms" - }, - "changes": { - "body": "We reserve the right to update or modify this EULA at any time and without prior notice. Your continued use of our application following any changes to this EULA will be deemed to be your acceptance of such changes.", - "title": "Changes to EULA" - }, - "consequences_of_violation": { - "body": "Any violation of this EULA, including the prohibited content and conduct outlined above, may result in the termination of your access to our application.", - "title": "Consequences of Violation" - }, - "contact": { - "body": "If you have any questions about this EULA, please contact us at info@radroots.market", - "title": "Contact Information" - }, - "disclaimer": { - "body": "Our application is provided \"as is\" and \"as available\" without warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. We do not guarantee that our application will be uninterrupted or error-free. In no event shall Radroots Inc. be liable for any damages whatsoever, including but not limited to direct, indirect, special, incidental, or consequential damages, arising out of or in connection with the use or inability to use our application.", - "title": "Disclaimer of Warranties and Limitation of Liability" - }, - "error": { - "required": "The user agreement is required to use the application" - }, - "introduction": { - "body": "This End User License Agreement (\"EULA\") is a legal agreement between you and Radroots Inc. for the use of our mobile application Radroots. By installing, accessing, or using our application, you agree to be bound by the terms and conditions of this EULA.", - "title": "Introduction" - }, - "prohibited_conduct": { - "body_li_0_0": "Harasses or bullies others", - "body_li_0_1": "Impersonates others", - "body_li_0_2": "Is intended to intimidate or threaten others", - "body_li_0_3": "Is intended to promote or incite violence", - "title": "You also agree not to engage in any conduct that:" - }, - "prohibited_content": { - "body_0_title": "You agree not to use our application to create, upload, post, send, or store any content that:", - "body_li_0_0": "Is illegal, infringing, or fraudulent", - "body_li_0_1": "Is pornographic, obscene, or offensive", - "body_li_0_2": "Is discriminatory or promotes hate speech", - "body_li_0_3": "Is harmful to minors", - "body_li_0_4": "Is intended to harass or bully others", - "body_li_0_5": "Is intended to impersonate others", - "title": "Prohibited Content and Conduct" - }, - "title": "End User License Agreement" -} -\ No newline at end of file diff --git a/app/src/lib/locale/en/icu.json b/app/src/lib/locale/en/icu.json @@ -1,84 +0,0 @@ -{ - "*_as": "{value} as", - "*_available": "{value} Available", - "*_copied": "{value} copied", - "*_description": "{value} description", - "*_details": "{value} details", - "*_failure": "{value} failure", - "*_list": "{value} list", - "*_month": "{value} month", - "*_name": "{value} name", - "*_order": "{value} order", - "*_price": "{value} price", - "*_quantity": "{value} quantity", - "*_sold": "{value} sold", - "*_summary": "{value} summary", - "*_the": "{value} the", - "*_title": "{value} title", - "*_total": "{value} total", - "*_your_device": "{value} your device", - "a_*_is_required": "A {value} is required", - "add_*": "Add {value}", - "add_a_*": "Add a {value}", - "add_existing_*": "Add existing {value}", - "as_*": "As {value}", - "choose_*": "Choose {value}", - "choose_a_*": "Choose a {}", - "choose_on_*": "Choose on {value}", - "click_to_*": "Click to {value}", - "click_to_add_a_*": "Click to add a {value}", - "configure_*": "Configure {value}", - "connect_*": "Connect {value}", - "connected_*": "Connected {value}", - "create_new_*": "Create new {value}", - "default_*": "Default {value}", - "delete_*": "Delete {value}", - "disconnect_*": "Disconnect {value}", - "edit_*": "Edit {value}", - "enter_*": "Enter {value}", - "enter_*_per_order": "Enter {value} per order", - "enter_a_*": "Enter a {value}", - "enter_new_*": "Enter new {value}", - "enter_the_*": "Enter the {value}", - "error_loading_*": "Error loading {value}", - "failure_*": "Failure {value}", - "failure_saving_*_to_the_database": "Failure saving {value} to the database", - "go_*": "Go {value}", - "invalid_*": "Invalid {value}", - "invalid_*_entry": "Invalid {value} entry", - "last_*": "Last {value}", - "listing_*": "Listing {value}", - "month_of_*": "Month of {value}", - "name_your_*": "Name your {value}", - "new_*": "New {value}", - "no_*": "No {value}", - "no_*_published": "No {value} published", - "no_*_selected": "No {value} selected", - "no_*_to_display": "No {value} to display", - "nostr_*": "Nostr {value}", - "post_*": "Post {value}", - "primary_*": "Primary {value}", - "reading_*": "Reading {value}", - "set_as_*": "Set as {value}", - "show_*": "Show {value}", - "the_*": "The {value}", - "the_*_is_available": "The {value} is available", - "the_*_is_incomplete": "The {value} is incomplete", - "the_*_is_missing": "The {value} is missing", - "the_*_is_registered": "The {value} is registered", - "the_*_is_required": "The {value} is missing", - "the_current_entry_*_will_be_deleted": "The current entry \"{value}\" will be deleted", - "the_listing_will_be_created_without_a_*": "The listing will be created without a {value}", - "there_was_a_failure_while_*": "There was a failure while {value}", - "this_*": "This {value}", - "toggle_*": "Toggle {value}", - "total_*": "Total {value}", - "unable_to_save_*": "Unable to save {value}", - "unconnected_*": "Unconnected {value}", - "uploading_*_photos": "Uploading {value} photos", - "use_existing_*": "Use existing {value}", - "valid_*": "Valid {value}", - "view_*": "View {value}", - "view_the_*": "View the {value}", - "your_*": "Your {value}" -} -\ No newline at end of file diff --git a/app/src/lib/locale/en/notify.json b/app/src/lib/locale/en/notify.json @@ -1,14 +0,0 @@ -{ - "message": { - "init_greeting": "Welcome to Radroots!", - "init_details": "Your device will be configured by the setup wizard", - "init_welcome": "Welcome! Your device was configured. To view or change your configuration go to Settings > Configuration", - "no_profile_config": "Your profile will be created without a name. You can change this later in Settings > Configuration > Profile" - }, - "device": { - "reset": "You are about to reset this device, which will erase all data including keys, profiles, and personal files" - }, - "profile": { - "name_update": "Updating your username will result in public links on your profile being updated" - } -} -\ No newline at end of file diff --git a/app/src/lib/locale/i18n.ts b/app/src/lib/locale/i18n.ts @@ -1,20 +1,19 @@ +import { iso639_1, locales_default } from '@radroots/locales'; import { i18n_conf } from '@radroots/util'; -import locales_keys from './locales.json'; -export type Locale = keyof typeof locales_keys; +export type Locale = (typeof locales_default)[number]; -const translations: Record<Locale, any> = { - en: { locales_keys }, -}; +const translations: Record<Locale, typeof iso639_1> = locales_default.reduce((acc, locale) => ({ ...acc, [locale as Locale]: iso639_1, }), {} as Record<Locale, typeof iso639_1>); +const locale_keys = Object.keys(translations); const i18n = i18n_conf<Locale>({ default_locale: `en`, translations, loaders: [ - ...Object.keys(translations).map((locale) => [`common`, `error`, `eula`, `icu`, `notify`].map(key => ({ + ...locale_keys.map((locale) => [`common`, `countries`, `error`, `eula`, `icu`, `notification`, `units`].map(key => ({ locale, key, - loader: async () => (await import(`./${locale}/${key}.json`)).default + loader: async () => (await import(`../../../../packages/locales/src/messages/${locale}/${key}.json`)).default }))), ].flat() }); @@ -27,4 +26,7 @@ const { loadTranslations: load_translations } = i18n; +translations_loading.subscribe(async (_loading) => { + if (_loading) await translations_loading.toPromise(); +}); export { load_translations, locale, locales, ls, translations, translations_loading }; diff --git a/app/src/lib/locale/locales.json b/app/src/lib/locale/locales.json @@ -1,3 +0,0 @@ -{ - "en": "English" -} -\ No newline at end of file diff --git a/app/src/lib/util/index.ts b/app/src/lib/util/index.ts @@ -4,9 +4,9 @@ import { ls } from "$lib/locale/i18n"; import { TauriClientDatabase, TauriClientDatastore, TauriClientFs, TauriClientGeolocation, TauriClientGui, TauriClientHttp, TauriClientKeys, TauriClientRadroots } from "@radroots/client"; import { Geocoder } from "@radroots/geocoder"; import { app_notify, get_store, handle_err } from "@radroots/lib-app"; +import { NostrEventService, NostrKeyService } from "@radroots/nostr-util"; import { encode_qp_route, type CallbackPromise, type NavigationParamTuple } from "@radroots/util"; import type { NavigationRoute } from "./routes"; -import { NostrKeyService, NostrEventService } from "@radroots/nostr-util"; export const db = new TauriClientDatabase(); export const datastore = new TauriClientDatastore(); @@ -47,13 +47,13 @@ export const reset = async (): Promise<void> => { try { const $ls = get_store(ls); const confirm = await gui.confirm({ - message: `${$ls(`notify.device.reset`)}. ${$ls(`common.this_action_is_irreversible`)}. ${$ls(`common.do_you_want_to_continue_q`)}` + message: `${$ls(`notification.device.reset`)}. ${$ls(`common.this_action_is_irreversible`)}. ${$ls(`common.do_you_want_to_continue_q`)}` }); if (!confirm) return; await keys.nostr_keystore_reset(); await db.reset(); goto(`/`) - app_notify.set(`Device reset complete.`); + app_notify.set(`${$ls(`notification.device.reset_complete`)}`); } catch (e) { await handle_err(e, `reset`); } diff --git a/app/src/routes/(app)/+layout.svelte b/app/src/routes/(app)/+layout.svelte @@ -3,7 +3,7 @@ import { app_splash, handle_err, - kv_init, + idb_init, ndk, ndk_user, nostr_ndk_configured, @@ -32,7 +32,7 @@ (CSS as any).paintWorklet.addModule(`/assets/squircle.min.js`); await http.init(); await datastore.init(); - await kv_init(); + await idb_init(); await nostr_init(); } catch (e) { await handle_err(e, `init`); diff --git a/app/src/routes/(app)/+page.svelte b/app/src/routes/(app)/+page.svelte @@ -1,4 +1,5 @@ <script lang="ts"> + import { ls } from "$lib/locale/i18n"; import { gui, route } from "$lib/util"; import { handle_err, Home } from "@radroots/lib-app"; import type { ResolveAccountInfo } from "@radroots/util"; @@ -7,6 +8,7 @@ </script> <Home + {ls} basis={{ data: data, lc_handle_farms: async () => { diff --git a/app/src/routes/(cfg)/init/+page.svelte b/app/src/routes/(cfg)/init/+page.svelte @@ -17,8 +17,8 @@ fmt_id, handle_err, idb, + IdbLib, Input, - KvLib, LabelDisplay, LoadSymbol, LogoCircle, @@ -27,8 +27,8 @@ import { el_id, form_fields, sleep } from "@radroots/util"; import { onMount } from "svelte"; - type KvKey = `nostr:key:add` | `nostr:profile` | `#key_nostrp`; - const kv = new KvLib<KvKey>(idb); + type IdbKey = `nostr:key:add` | `nostr:profile` | `#key_nostrp`; + const kv = new IdbLib<IdbKey>(idb); const page_carousel: Record<View, { max_index: number }> = { cfg_key: { @@ -80,6 +80,7 @@ const init = async (): Promise<void> => { const nostrkey_all = await keys.nostr_read_all(); if (`results` in nostrkey_all && nostrkey_all.results.length) { + console.log(`init EXISTING!`, nostrkey_all.results); handle_view(`eula`); } else { handle_view(view); @@ -132,7 +133,7 @@ const ks_key_nostr_add = await datastore.set(`key_nostr`, public_key); if (`err` in ks_key_nostr_add) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); }; @@ -140,7 +141,7 @@ const keys_nostr_create = await keys.nostr_gen(); if (`err` in keys_nostr_create) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); await kv.save(`#key_nostrp`, keys_nostr_create.public_key); }; @@ -148,9 +149,7 @@ const key_add = async (secret_key: string): Promise<void> => { const keys_nostr_add = await keys.nostr_add(secret_key); if (`err` in keys_nostr_add) - return void (await gui.alert( - `${$ls(`icu.invalid_*`, { value: `${$ls(`common.key`)}`.toLowerCase() })}`, - )); + return void (await gui.alert(`${$ls(`common.invalid_key`)}`)); await kv.save(`#key_nostrp`, keys_nostr_add.public_key); }; @@ -164,7 +163,7 @@ }); if (`err` in nostr_profile_add || `err_s` in nostr_profile_add) return void (await gui.alert( - `${$ls(`icu.failure_saving_*_to_the_database`, { value: `${$ls(`common.profile`)}`.toLowerCase() })}`, + `${$ls(`error.init.device_configuration_nostr_profile`)}`, )); for (const url of Array.from( new Set([...PUBLIC_NOSTR_RELAY_DEFAULTS.split(",")]), @@ -172,7 +171,7 @@ const nostr_relay_add = await db.nostr_relay_create({ url }); if (`err` in nostr_relay_add || `err_s` in nostr_relay_add) return void (await gui.alert( - `${$ls(`icu.failure_saving_*_to_the_database`, { value: `${$ls(`icu.default_*`, { value: `${$ls(`common.relays`)}` })}`.toLowerCase() })}`, + `${$ls(`error.init.device_configuration_nostr_relay`)}`, )); await db.nostr_profile_relay_set({ nostr_profile: { @@ -202,12 +201,12 @@ const nostrkey_add = await kv.read(`nostr:key:add`); if (!nostrkey_add) return void (await gui.alert( - `${$ls(`icu.enter_a_*`, { value: `${$ls(`icu.valid_*`, { value: `${$ls(`common.key`)}` })}`.toLowerCase() })}`, + `${$ls(`icu.enter_a_valid_*`, { value: `${$ls(`common.key`)}` })}`, )); const key_nostr_read = await keys.nostr_read(nostrkey_add); if (`err` in key_nostr_read) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); await key_add(key_nostr_read.secret_key); kv.del(`nostr:key:add`); @@ -223,12 +222,12 @@ const kv_keynostrp = await kv.read(`#key_nostrp`); if (!kv_keynostrp) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); //@todo const key_nostr_read = await keys.nostr_read(kv_keynostrp); if (`err` in key_nostr_read) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); //@todo const kv_profilename = await kv.read(`nostr:profile`); if (!kv_profilename) @@ -240,26 +239,24 @@ profile_name: kv_profilename, secret_key: key_nostr_read.secret_key, }); - if (`err` in profile_req) { - cfg_profile_profilename_loading = false; - return void (await gui.alert(profile_req.err)); - } + if (`err` in profile_req) + return void (await gui.alert( + `${$ls(profile_req.err, { default: `${$ls(`error.client.http.request_failure`)}` })}`, + )); const confirm = await gui.confirm({ - message: `${`${$ls(`icu.the_*_is_available`, { value: `${$ls(`common.profile_name`).toLowerCase()} "${kv_profilename}"` })}`}. Would you like to use it?`, //@todo + message: `${`${$ls(`icu.the_*_is_available`, { value: `${$ls(`common.profile_name`).toLowerCase()} "${kv_profilename}"` })}`}. ${`${$ls(`common.would_you_like_to_use_it_q`)}`}`, cancel: `${$ls(`common.no`)}`, ok: `${$ls(`common.yes`)}`, }); - if (!confirm) { - cfg_profile_profilename_loading = false; - return; - } + if (!confirm) return; const profile_create = await radroots.fetch_profile_create({ tok: profile_req.result, secret_key: key_nostr_read.secret_key, }); - cfg_profile_profilename_loading = false; if (`err` in profile_create) - return void (await gui.alert(profile_create.err)); + return void (await gui.alert( + `${$ls(profile_create.err, { default: `${$ls(`error.client.http.request_failure`)}` })}`, + )); await datastore.setp( `radroots_profile`, kv_keynostrp, @@ -327,12 +324,12 @@ const kv_keynostrp = await kv.read(`#key_nostrp`); if (!kv_keynostrp) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); //@todo const key_nostr_read = await keys.nostr_read(kv_keynostrp); if (`err` in key_nostr_read) return void (await reset( - `${$ls(`error.device.configuration_failure`)}`, + `${$ls(`error.init.configuration_failure`)}`, )); //@todo const radroots_profile = await datastore.getp( `radroots_profile`, @@ -348,7 +345,7 @@ kv_keynostrp, await kv.read(`nostr:profile`), ); - app_notify.set(`${$ls(`notify.message.init_welcome`)}`); + app_notify.set(`${$ls(`notification.init.on_complete`)}`); } catch (e) { await handle_err(e, `submit`); } finally { @@ -423,7 +420,7 @@ <p class={`font-mono font-[400] text-[1.1rem] text-layer-0-glyph`} > - {`${$ls(`notify.message.init_greeting`)}`} + {`${$ls(`notification.init.greeting_header`)}`} </p> </div> <div @@ -432,7 +429,7 @@ <p class={`font-mono font-[400] text-[1.1rem] text-layer-0-glyph`} > - {`${$ls(`notify.message.init_details`)}.`} + {`${$ls(`notification.init.greeting_subheader`)}.`} </p> </div> </div> @@ -671,7 +668,7 @@ callback: async () => { if ($carousel_index === 0) { const confirm = await gui.confirm({ - message: `${$ls(`notify.message.no_profile_config`)}`, + message: `${$ls(`notification.init.no_profile_option`)}`, cancel: `${$ls(`icu.add_*`, { value: `${$ls(`common.profile`)}` })}`, ok: `${$ls(`common.continue`)}`, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@radroots/lib-app': specifier: workspace:* version: link:../packages/lib-app + '@radroots/locales': + specifier: workspace:* + version: link:../packages/locales '@radroots/models': specifier: workspace:* version: link:../packages/models @@ -86,7 +89,7 @@ importers: version: 4.1.4(picomatch@4.0.2)(svelte@5.19.9)(typescript@5.7.3) tailwindcss: specifier: ^3.4.3 - version: 3.4.17 + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -184,7 +187,7 @@ importers: version: 1.4.9 tsup: specifier: ^6.2.3 - version: 6.7.0(postcss@8.5.1)(typescript@5.7.3) + version: 6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))(typescript@5.7.3) typescript: specifier: ^5.3.3 version: 5.7.3 @@ -200,18 +203,15 @@ importers: '@nostr-dev-kit/ndk-svelte': specifier: ^2.4.0 version: 2.4.0(svelte@5.19.9)(typescript@5.7.3) + '@radroots/locales': + specifier: workspace:* + version: link:../locales '@radroots/theme': specifier: workspace:* version: link:../theme '@radroots/util': specifier: workspace:* version: link:../util - '@sveltekit-i18n/base': - specifier: ^1.3.7 - version: 1.3.7(svelte@5.19.9) - '@sveltekit-i18n/parser-icu': - specifier: ^1.0.8 - version: 1.0.8 luxon: specifier: ^3.5.0 version: 3.5.0 @@ -253,6 +253,18 @@ importers: specifier: ^6.0.0 version: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(yaml@2.7.0) + packages/locales: + devDependencies: + '@types/node': + specifier: ^22.13.1 + version: 22.13.1 + tsup: + specifier: ^6.2.3 + version: 6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))(typescript@5.7.3) + typescript: + specifier: ^5.3.3 + version: 5.7.3 + packages/models: dependencies: zod: @@ -292,7 +304,7 @@ importers: version: 10.0.0 tsup: specifier: ^6.2.3 - version: 6.7.0(postcss@8.5.1)(typescript@5.7.3) + version: 6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))(typescript@5.7.3) typescript: specifier: ^5.3.3 version: 5.7.3 @@ -341,7 +353,7 @@ importers: version: 2.11.0(svelte@5.19.9) '@skeletonlabs/tw-plugin': specifier: ^0.4.0 - version: 0.4.1(tailwindcss@3.4.17) + version: 0.4.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))) '@sveltejs/adapter-vercel': specifier: ^5.4.6 version: 5.6.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.9)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.9)(vite@5.4.14(@types/node@22.13.1)))(rollup@4.34.6) @@ -392,7 +404,7 @@ importers: version: 9.1.0(eslint@9.20.0(jiti@1.21.7)) eslint-plugin-svelte: specifier: ^2.46.0 - version: 2.46.1(eslint@9.20.0(jiti@1.21.7))(svelte@5.19.9) + version: 2.46.1(eslint@9.20.0(jiti@1.21.7))(svelte@5.19.9)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) globals: specifier: ^15.12.0 version: 15.14.0 @@ -434,7 +446,7 @@ importers: version: 4.1.4(picomatch@4.0.2)(svelte@5.19.9)(typescript@5.7.3) tailwindcss: specifier: ^3.4.15 - version: 3.4.17 + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -455,7 +467,7 @@ importers: devDependencies: tsup: specifier: ^6.2.3 - version: 6.7.0(postcss@8.5.1)(typescript@5.7.3) + version: 6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))(typescript@5.7.3) typescript: specifier: ^5.3.3 version: 5.7.3 @@ -512,7 +524,7 @@ importers: version: 10.0.0 tsup: specifier: ^6.2.3 - version: 6.7.0(postcss@8.5.1)(typescript@5.7.3) + version: 6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))(typescript@5.7.3) typescript: specifier: ^5.3.3 version: 5.7.3 @@ -592,6 +604,10 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@deck.gl/core@9.1.0': resolution: {integrity: sha512-leocNGky9jZ0HUk8xm+HH4f+EL86PKiG8O4REpw4l/K1UbMssekR/L2moYwt7Bx98jSIibcUbhDWOBatKAUaTA==} @@ -1128,6 +1144,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} @@ -1632,6 +1651,18 @@ packages: '@tauri-apps/plugin-store@2.2.0': resolution: {integrity: sha512-hJTRtuJis4w5fW1dkcgftsYxKXK0+DbAqurZ3CURHG5WkAyyZgbxpeYctw12bbzF9ZbZREXZklPq8mocCC3Sgg==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -1856,6 +1887,10 @@ packages: peerDependencies: acorn: '>=8.9.0' + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -1899,6 +1934,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -2074,6 +2112,9 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2182,6 +2223,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2824,6 +2869,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + mapbox-gl@3.9.4: resolution: {integrity: sha512-IxfpdyNzjCMzkqj/q5OUamlF1QcS+IFEARteygEgao2B8l8+UF2ahpNRgHT2EpMSE8ma1bq4LKvr+EuJ6gqniw==} @@ -3636,6 +3684,20 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tseep@1.3.1: resolution: {integrity: sha512-ZPtfk1tQnZVyr7BPtbJ93qaAh2lZuIOpTMjhrYa4XctT8xe7t4SAW9LIxrySDuYMsfNNayE51E/WNGrNVgVicQ==} @@ -3751,6 +3813,9 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + vite-node@2.1.9: resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3947,6 +4012,10 @@ packages: engines: {node: '>= 14'} hasBin: true + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -4127,6 +4196,11 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + '@deck.gl/core@9.1.0': dependencies: '@loaders.gl/core': 4.3.3 @@ -4493,6 +4567,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + optional: true + '@kurkle/color@0.3.4': {} '@loaders.gl/core@4.3.3': @@ -4823,9 +4903,9 @@ snapshots: esm-env: 1.0.0 svelte: 5.19.9 - '@skeletonlabs/tw-plugin@0.4.1(tailwindcss@3.4.17)': + '@skeletonlabs/tw-plugin@0.4.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)))': dependencies: - tailwindcss: 3.4.17 + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(yaml@2.7.0)))': dependencies: @@ -5049,6 +5129,18 @@ snapshots: dependencies: '@tauri-apps/api': 2.0.3 + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@types/cookie@0.6.0': {} '@types/d3-color@3.1.3': {} @@ -5346,6 +5438,11 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + optional: true + acorn@8.14.0: {} agent-base@7.1.3: {} @@ -5380,6 +5477,9 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: + optional: true + arg@5.0.2: {} argparse@1.0.10: @@ -5533,6 +5633,9 @@ snapshots: cookie@0.6.0: {} + create-require@1.1.1: + optional: true + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -5610,6 +5713,9 @@ snapshots: didyoumean@1.2.2: {} + diff@4.0.2: + optional: true + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -5759,7 +5865,7 @@ snapshots: eslint-plugin-turbo: 2.4.0(eslint@9.20.0(jiti@1.21.7))(turbo@2.4.0) turbo: 2.4.0 - eslint-plugin-svelte@2.46.1(eslint@9.20.0(jiti@1.21.7))(svelte@5.19.9): + eslint-plugin-svelte@2.46.1(eslint@9.20.0(jiti@1.21.7))(svelte@5.19.9)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0(jiti@1.21.7)) '@jridgewell/sourcemap-codec': 1.5.0 @@ -5768,7 +5874,7 @@ snapshots: esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.5.1 - postcss-load-config: 3.1.4(postcss@8.5.1) + postcss-load-config: 3.1.4(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) postcss-safe-parser: 6.0.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 semver: 7.7.1 @@ -6320,6 +6426,9 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-error@1.3.6: + optional: true + mapbox-gl@3.9.4: dependencies: '@mapbox/jsonlint-lines-primitives': 2.0.2 @@ -6650,19 +6759,21 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.1 - postcss-load-config@3.1.4(postcss@8.5.1): + postcss-load-config@3.1.4(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.1 + ts-node: 10.9.2(@types/node@22.13.1)(typescript@5.7.3) - postcss-load-config@4.0.2(postcss@8.5.1): + postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.1 + ts-node: 10.9.2(@types/node@22.13.1)(typescript@5.7.3) postcss-nested@6.2.0(postcss@8.5.1): dependencies: @@ -6993,7 +7104,7 @@ snapshots: - supports-color - vite - tailwindcss@3.4.17: + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -7012,7 +7123,7 @@ snapshots: postcss: 8.5.1 postcss-import: 15.1.0(postcss@8.5.1) postcss-js: 4.0.1(postcss@8.5.1) - postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -7079,13 +7190,32 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.13.1 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + tseep@1.3.1: {} tslib@2.8.1: {} tstl@2.5.16: {} - tsup@6.7.0(postcss@8.5.1)(typescript@5.7.3): + tsup@6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3))(typescript@5.7.3): dependencies: bundle-require: 4.2.1(esbuild@0.17.19) cac: 6.7.14 @@ -7095,7 +7225,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4(postcss@8.5.1) + postcss-load-config: 3.1.4(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3)) resolve-from: 5.0.0 rollup: 3.29.5 source-map: 0.8.0-beta.0 @@ -7183,6 +7313,9 @@ snapshots: uuid@10.0.0: {} + v8-compile-cache-lib@3.0.1: + optional: true + vite-node@2.1.9(@types/node@22.13.1): dependencies: cac: 6.7.14 @@ -7354,6 +7487,9 @@ snapshots: yaml@2.7.0: {} + yn@3.1.1: + optional: true + yocto-queue@0.1.0: {} zimmerframe@1.1.2: {}