From 9a6e78ee9d4b2082302c127aa64bb256ca978af2 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 19 Jan 2026 11:53:24 -0700 Subject: [PATCH 01/43] remove unused custom filter for grids (which adds complexity) --- src/components/EntityGrid.vue | 37 ------------------- src/test/EntityGridFunctionPropTest.vue | 49 ------------------------- 2 files changed, 86 deletions(-) diff --git a/src/components/EntityGrid.vue b/src/components/EntityGrid.vue index dd825c5e..aa5e58f4 100644 --- a/src/components/EntityGrid.vue +++ b/src/components/EntityGrid.vue @@ -326,33 +326,6 @@ export default class EntityGrid extends Vue { @Prop({ default: "other party" }) conflictContext!: string; - /** - * Function to determine which entities to display (allows parent control) - * - * This function prop allows parent components to customize which entities - * are displayed in the grid, enabling advanced filtering and sorting. - * Note: Infinite scroll is disabled when this prop is provided. - * - * @param entities - The full array of entities (Contact[] or PlanData[]) - * @param entityType - The type of entities being displayed ("people" or "projects") - * @returns Filtered/sorted array of entities to display - * - * @example - * // Custom filtering: only show contacts with profile images - * :display-entities-function="(entities, type) => - * entities.filter(e => e.profileImageUrl)" - * - * @example - * // Custom sorting: sort projects by name - * :display-entities-function="(entities, type) => - * entities.sort((a, b) => a.name.localeCompare(b.name))" - */ - @Prop({ default: null }) - displayEntitiesFunction?: ( - entities: Contact[] | PlanData[], - entityType: "people" | "projects", - ) => Contact[] | PlanData[]; - /** * CSS classes for the empty state message */ @@ -397,11 +370,6 @@ export default class EntityGrid extends Vue { return this.filteredEntities.slice(0, this.displayedCount); } - // If custom function provided, use it (disables infinite scroll) - if (this.displayEntitiesFunction) { - return this.displayEntitiesFunction(this.entitiesToUse, this.entityType); - } - // Default: projects use infinite scroll if (this.entityType === "projects") { return (this.entitiesToUse as PlanData[]).slice(0, this.displayedCount); @@ -860,11 +828,6 @@ export default class EntityGrid extends Vue { * Determine if more entities can be loaded */ canLoadMore(): boolean { - if (this.displayEntitiesFunction) { - // Custom function disables infinite scroll - return false; - } - if (this.searchTerm.trim()) { // Search mode: check if more results available if (this.entityType === "projects") { diff --git a/src/test/EntityGridFunctionPropTest.vue b/src/test/EntityGridFunctionPropTest.vue index 3b10461a..bade6dd4 100644 --- a/src/test/EntityGridFunctionPropTest.vue +++ b/src/test/EntityGridFunctionPropTest.vue @@ -2,15 +2,6 @@

EntityGrid Function Prop Test

-
- - Current: {{ useCustomFunction ? "Custom" : "Default" }} -
-

People Grid ({{ people.length }} total, @@ -23,9 +14,6 @@ :all-my-dids="allMyDids" :all-contacts="people" :conflict-checker="conflictChecker" - :display-entities-function=" - useCustomFunction ? customPeopleFunction : undefined - " @entity-selected="handleEntitySelected" />

@@ -42,9 +30,6 @@ :all-my-dids="allMyDids" :all-contacts="people" :conflict-checker="conflictChecker" - :display-entities-function=" - useCustomFunction ? customProjectsFunction : undefined - " @entity-selected="handleEntitySelected" />
@@ -74,7 +59,6 @@ import { PlanData } from "../interfaces/records"; }, }) export default class EntityGridFunctionPropTest extends Vue { - useCustomFunction = false; selectedEntity: { type: "person" | "project" | "special"; entityType?: string; @@ -144,26 +128,6 @@ export default class EntityGridFunctionPropTest extends Vue { }, ]; - /** - * Custom function for people: only show those with profile images - */ - customPeopleFunction = ( - entities: Contact[], - _entityType: string, - ): Contact[] => { - return entities.filter((person) => person.profileImageUrl); - }; - - /** - * Custom function for projects: sort by name and limit to 3 - */ - customProjectsFunction = ( - entities: PlanData[], - _entityType: string, - ): PlanData[] => { - return entities.sort((a, b) => a.name.localeCompare(b.name)).slice(0, 3); - }; - /** * Simple conflict checker for testing */ @@ -171,13 +135,6 @@ export default class EntityGridFunctionPropTest extends Vue { return did === this.activeDid; }; - /** - * Toggle between custom and default display functions - */ - toggleCustomFunction(): void { - this.useCustomFunction = !this.useCustomFunction; - } - /** * Handle entity selection */ @@ -193,16 +150,10 @@ export default class EntityGridFunctionPropTest extends Vue { * Computed properties to show display counts */ get displayedPeopleCount(): number { - if (this.useCustomFunction) { - return this.customPeopleFunction(this.people, "people").length; - } return Math.min(10, this.people.length); // Initial batch size for infinite scroll } get displayedProjectsCount(): number { - if (this.useCustomFunction) { - return this.customProjectsFunction(this.projects, "projects").length; - } return Math.min(10, this.projects.length); // Initial batch size for infinite scroll } } From 29b2d9927deb14cb05acea08089983a25c54d9ab Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 19 Jan 2026 16:57:13 -0700 Subject: [PATCH 02/43] fix missing starred projects in gift selection, and highlight filter on home view if set --- src/components/EntityGrid.vue | 374 +++++++++++++------------ src/components/EntitySelectionStep.vue | 6 +- src/components/GiftedDialog.vue | 4 - src/utils/PlatformServiceMixin.ts | 11 +- src/views/HomeView.vue | 29 +- 5 files changed, 205 insertions(+), 219 deletions(-) diff --git a/src/components/EntityGrid.vue b/src/components/EntityGrid.vue index aa5e58f4..80c9d70d 100644 --- a/src/components/EntityGrid.vue +++ b/src/components/EntityGrid.vue @@ -139,17 +139,17 @@ projects, and special entities with selection. * * @author Matthew Raymer */ @@ -156,8 +156,8 @@ projects, and special entities with selection. * * @author Matthew Raymer */ :all-my-dids="allMyDids" :all-contacts="allContacts" :conflicted="isProjectConflicted(project.handleId)" - :notify="notify" :conflict-context="conflictContext" + :notify="notify" @project-selected="handleProjectSelected" /> @@ -177,8 +177,8 @@ projects, and special entities with selection. * * @author Matthew Raymer */ :all-my-dids="allMyDids" :all-contacts="allContacts" :conflicted="isProjectConflicted(project.handleId)" - :notify="notify" :conflict-context="conflictContext" + :notify="notify" @project-selected="handleProjectSelected" /> @@ -193,8 +193,8 @@ projects, and special entities with selection. * * @author Matthew Raymer */ :all-my-dids="allMyDids" :all-contacts="allContacts" :conflicted="isProjectConflicted(project.handleId)" - :notify="notify" :conflict-context="conflictContext" + :notify="notify" @project-selected="handleProjectSelected" /> diff --git a/src/components/EntitySelectionStep.vue b/src/components/EntitySelectionStep.vue index 40a31010..c10ee69b 100644 --- a/src/components/EntitySelectionStep.vue +++ b/src/components/EntitySelectionStep.vue @@ -29,9 +29,9 @@ properties * * @author Matthew Raymer */ :all-my-dids="allMyDids" :all-contacts="allContacts" :conflict-checker="conflictChecker" - :you-selectable="youSelectable" - :notify="notify" :conflict-context="conflictContext" + :notify="notify" + :you-selectable="youSelectable" @entity-selected="handleEntitySelected" /> From e1b312a402e6529af0ce6c6b97c3c3899545308f Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Tue, 20 Jan 2026 20:14:48 -0700 Subject: [PATCH 07/43] refactor: consolidate data checks & remove unused items --- src/components/EntitySelectionStep.vue | 33 +------------------------- src/components/EntitySummaryButton.vue | 11 +-------- src/components/GiftDetailsStep.vue | 29 +++++++--------------- src/components/GiftedDialog.vue | 8 ------- src/interfaces/common.ts | 10 ++++++++ src/views/GiftedDetailsView.vue | 12 ---------- 6 files changed, 21 insertions(+), 82 deletions(-) diff --git a/src/components/EntitySelectionStep.vue b/src/components/EntitySelectionStep.vue index c10ee69b..6a38de05 100644 --- a/src/components/EntitySelectionStep.vue +++ b/src/components/EntitySelectionStep.vue @@ -45,16 +45,7 @@ import EntityGrid from "./EntityGrid.vue"; import { Contact } from "../db/tables/contacts"; import { PlanData } from "../interfaces/records"; import { NotificationIface } from "../constants/app"; - -/** - * Entity data interface for giver/receiver - */ -interface EntityData { - did?: string; - handleId?: string; - name?: string; - image?: string; -} +import { EntityData } from "@/interfaces"; /** * Entity selection event data structure @@ -103,14 +94,6 @@ export default class EntitySelectionStep extends Vue { @Prop({ required: true }) conflictChecker!: (did: string) => boolean; - /** Project ID for context (giver) */ - @Prop({ default: "" }) - fromProjectId!: string; - - /** Project ID for context (recipient) */ - @Prop({ default: "" }) - toProjectId!: string; - /** Current giver entity for context */ @Prop() giver?: EntityData | null; @@ -119,20 +102,6 @@ export default class EntitySelectionStep extends Vue { @Prop() receiver?: EntityData | null; - /** Form field values to preserve when navigating to "Show All" */ - @Prop({ default: "" }) - description!: string; - - @Prop({ default: "0" }) - amountInput!: string; - - @Prop({ default: "HUR" }) - unitCode!: string; - - /** Offer ID for context when fulfilling an offer */ - @Prop({ default: "" }) - offerId!: string; - /** Notification function from parent component */ @Prop() notify?: (notification: NotificationIface, timeout?: number) => void; diff --git a/src/components/EntitySummaryButton.vue b/src/components/EntitySummaryButton.vue index 68a2baf4..cd874675 100644 --- a/src/components/EntitySummaryButton.vue +++ b/src/components/EntitySummaryButton.vue @@ -50,16 +50,7 @@ import EntityIcon from "./EntityIcon.vue"; import ProjectIcon from "./ProjectIcon.vue"; import { Contact } from "../db/tables/contacts"; import { UNNAMED_ENTITY_NAME } from "@/constants/entities"; - -/** - * Entity interface for both person and project entities - */ -interface EntityData { - did?: string; - handleId?: string; - name?: string; - image?: string; -} +import { EntityData } from "@/interfaces"; /** * EntitySummaryButton - Displays selected entity with edit capability diff --git a/src/components/GiftDetailsStep.vue b/src/components/GiftDetailsStep.vue index ef8fb25b..b6c38ec2 100644 --- a/src/components/GiftDetailsStep.vue +++ b/src/components/GiftDetailsStep.vue @@ -14,7 +14,6 @@ control over updates and validation * * @author Matthew Raymer */ @@ -22,7 +21,6 @@ control over updates and validation * * @author Matthew Raymer */ @@ -104,16 +102,7 @@ import { Component, Prop, Vue, Watch, Emit } from "vue-facing-decorator"; import EntitySummaryButton from "./EntitySummaryButton.vue"; import AmountInput from "./AmountInput.vue"; import { RouteLocationRaw } from "vue-router"; - -/** - * Entity data interface for giver/receiver - */ -interface EntityData { - did?: string; - handleId?: string; - name?: string; - image?: string; -} +import { EntityData } from "@/interfaces"; /** * GiftDetailsStep - Complete step 2 gift details form interface @@ -145,14 +134,6 @@ export default class GiftDetailsStep extends Vue { @Prop({ required: true }) receiver!: EntityData | null; - /** Type of giver entity: 'person' or 'project' */ - @Prop({ required: true }) - giverEntityType!: "person" | "project"; - - /** Type of recipient entity: 'person' or 'project' */ - @Prop({ required: true }) - recipientEntityType!: "person" | "project"; - /** Gift description */ @Prop({ default: "" }) description!: string; @@ -211,6 +192,14 @@ export default class GiftDetailsStep extends Vue { private localAmount: number = 0; private localUnitCode: string = "HUR"; + get giverEntityType(): string { + return this.giver?.handleId ? "project" : "person"; + } + + get recipientEntityType(): string { + return this.receiver?.handleId ? "project" : "person"; + } + /** * CSS classes for the photo & more options link */ diff --git a/src/components/GiftedDialog.vue b/src/components/GiftedDialog.vue index e8019681..252e6726 100644 --- a/src/components/GiftedDialog.vue +++ b/src/components/GiftedDialog.vue @@ -9,20 +9,12 @@ Date: Tue, 20 Jan 2026 20:20:10 -0700 Subject: [PATCH 08/43] fix some derived data that was removed elsewhere --- src/components/EntitySummaryButton.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/EntitySummaryButton.vue b/src/components/EntitySummaryButton.vue index cd874675..344b5bea 100644 --- a/src/components/EntitySummaryButton.vue +++ b/src/components/EntitySummaryButton.vue @@ -74,10 +74,6 @@ export default class EntitySummaryButton extends Vue { @Prop({ required: true }) entity!: EntityData | Contact | null; - /** Type of entity: 'person' or 'project' */ - @Prop({ required: true }) - entityType!: "person" | "project"; - /** Display label for the entity role */ @Prop({ required: true }) label!: string; @@ -92,6 +88,10 @@ export default class EntitySummaryButton extends Vue { entity: EntityData | Contact | null; }) => void | Promise; + get entityType(): string { + return this.entity && "handleId" in this.entity ? "project" : "person"; + } + /** * CSS classes for the main container */ From a0b99d5fcaadc6eb0eff7479e4439a29bc87ef18 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Tue, 20 Jan 2026 20:41:44 -0700 Subject: [PATCH 09/43] remove more duplicate data & consolidate interfaces --- src/components/EntitySelectionStep.vue | 6 ++-- src/components/EntitySummaryButton.vue | 6 ++-- src/components/GiftDetailsStep.vue | 14 ++++---- src/components/GiftedDialog.vue | 50 +++++++++++++------------- src/interfaces/common.ts | 10 ------ 5 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/components/EntitySelectionStep.vue b/src/components/EntitySelectionStep.vue index 6a38de05..2a7b146d 100644 --- a/src/components/EntitySelectionStep.vue +++ b/src/components/EntitySelectionStep.vue @@ -45,7 +45,7 @@ import EntityGrid from "./EntityGrid.vue"; import { Contact } from "../db/tables/contacts"; import { PlanData } from "../interfaces/records"; import { NotificationIface } from "../constants/app"; -import { EntityData } from "@/interfaces"; +import { GiverReceiverInputInfo } from "@/libs/util"; /** * Entity selection event data structure @@ -96,11 +96,11 @@ export default class EntitySelectionStep extends Vue { /** Current giver entity for context */ @Prop() - giver?: EntityData | null; + giver?: GiverReceiverInputInfo | null; /** Current receiver entity for context */ @Prop() - receiver?: EntityData | null; + receiver?: GiverReceiverInputInfo | null; /** Notification function from parent component */ @Prop() diff --git a/src/components/EntitySummaryButton.vue b/src/components/EntitySummaryButton.vue index 344b5bea..31285f34 100644 --- a/src/components/EntitySummaryButton.vue +++ b/src/components/EntitySummaryButton.vue @@ -50,7 +50,7 @@ import EntityIcon from "./EntityIcon.vue"; import ProjectIcon from "./ProjectIcon.vue"; import { Contact } from "../db/tables/contacts"; import { UNNAMED_ENTITY_NAME } from "@/constants/entities"; -import { EntityData } from "@/interfaces"; +import { GiverReceiverInputInfo } from "@/libs/util"; /** * EntitySummaryButton - Displays selected entity with edit capability @@ -72,7 +72,7 @@ import { EntityData } from "@/interfaces"; export default class EntitySummaryButton extends Vue { /** Entity data to display */ @Prop({ required: true }) - entity!: EntityData | Contact | null; + entity!: GiverReceiverInputInfo | Contact | null; /** Display label for the entity role */ @Prop({ required: true }) @@ -85,7 +85,7 @@ export default class EntitySummaryButton extends Vue { @Prop({ type: Function, default: () => {} }) onEditRequested!: (data: { entityType: string; - entity: EntityData | Contact | null; + entity: GiverReceiverInputInfo | Contact | null; }) => void | Promise; get entityType(): string { diff --git a/src/components/GiftDetailsStep.vue b/src/components/GiftDetailsStep.vue index b6c38ec2..4eb94400 100644 --- a/src/components/GiftDetailsStep.vue +++ b/src/components/GiftDetailsStep.vue @@ -102,7 +102,7 @@ import { Component, Prop, Vue, Watch, Emit } from "vue-facing-decorator"; import EntitySummaryButton from "./EntitySummaryButton.vue"; import AmountInput from "./AmountInput.vue"; import { RouteLocationRaw } from "vue-router"; -import { EntityData } from "@/interfaces"; +import { GiverReceiverInputInfo } from "@/libs/util"; /** * GiftDetailsStep - Complete step 2 gift details form interface @@ -128,11 +128,11 @@ import { EntityData } from "@/interfaces"; export default class GiftDetailsStep extends Vue { /** Giver entity data */ @Prop({ required: true }) - giver!: EntityData | null; + giver!: GiverReceiverInputInfo | null; /** Receiver entity data */ @Prop({ required: true }) - receiver!: EntityData | null; + receiver!: GiverReceiverInputInfo | null; /** Gift description */ @Prop({ default: "" }) @@ -321,7 +321,7 @@ export default class GiftDetailsStep extends Vue { */ handleEditGiver(_data: { entityType: string; - entity: EntityData | null; + entity: GiverReceiverInputInfo | null; }): void { this.emitEditEntity({ entityType: "giver", @@ -335,7 +335,7 @@ export default class GiftDetailsStep extends Vue { */ handleEditRecipient(_data: { entityType: string; - entity: EntityData | null; + entity: GiverReceiverInputInfo | null; }): void { this.emitEditEntity({ entityType: "recipient", @@ -375,8 +375,8 @@ export default class GiftDetailsStep extends Vue { @Emit("edit-entity") emitEditEntity(data: { entityType: string; - currentEntity: EntityData | null; - }): { entityType: string; currentEntity: EntityData | null } { + currentEntity: GiverReceiverInputInfo | null; + }): { entityType: string; currentEntity: GiverReceiverInputInfo | null } { return data; } diff --git a/src/components/GiftedDialog.vue b/src/components/GiftedDialog.vue index 252e6726..f26001c1 100644 --- a/src/components/GiftedDialog.vue +++ b/src/components/GiftedDialog.vue @@ -3,7 +3,7 @@
Date: Wed, 21 Jan 2026 19:36:33 -0700 Subject: [PATCH 10/43] fix the most recent contacts to show correctly on the gift details screen --- src/components/EntityGrid.vue | 17 ++++------------- src/db/tables/contacts.ts | 2 ++ src/views/GiftedDetailsView.vue | 6 ++---- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/components/EntityGrid.vue b/src/components/EntityGrid.vue index bb0916f8..fb101b9e 100644 --- a/src/components/EntityGrid.vue +++ b/src/components/EntityGrid.vue @@ -521,19 +521,10 @@ export default class EntityGrid extends Vue { } // Validate entities prop for people - if (this.entityType === "people" && !this.entities) { - logger.error( - "EntityGrid: entities prop is required when entityType is 'people'", - ); - if (this.notify) { - this.notify( - { - group: "alert", - type: "danger", - title: "Error", - text: "Contacts data is required but not provided.", - }, - TIMEOUTS.SHORT, + if (this.entityType === "people") { + if (!this.entities) { + logger.error( + "EntityGrid: entities prop or allContacts prop is required when entityType is 'people'", ); } } diff --git a/src/db/tables/contacts.ts b/src/db/tables/contacts.ts index 4da7b559..04817237 100644 --- a/src/db/tables/contacts.ts +++ b/src/db/tables/contacts.ts @@ -5,6 +5,8 @@ export type ContactMethod = { }; export type Contact = { + // id is a property in most contacts, but besides sorting from DB we don't need it + // // When adding a property: // - Consider whether it should be added when exporting & sharing contacts, eg. DataExportSection diff --git a/src/views/GiftedDetailsView.vue b/src/views/GiftedDetailsView.vue index 7d5e3533..29aedc6c 100644 --- a/src/views/GiftedDetailsView.vue +++ b/src/views/GiftedDetailsView.vue @@ -428,10 +428,8 @@ export default class GiftedDetails extends Vue { const activeIdentity = await (this as any).$getActiveIdentity(); this.activeDid = activeIdentity.activeDid || ""; - const dbContacts = await this.$dbQuery("SELECT * FROM contacts"); - this.allContacts = this.$mapQueryResultToValues( - dbContacts, - ) as unknown as Contact[]; + this.allContacts = await this.$contactsByDateAdded(); + this.allMyDids = await retrieveAccountDids(); if ( From a04730cd647c6edfd5f1d6d14a30451a2852be3a Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Wed, 21 Jan 2026 20:16:03 -0700 Subject: [PATCH 11/43] rename title and many places to "Gift Economies" --- package.json | 4 ++-- src/components/MembersList.vue | 2 +- src/components/OnboardingDialog.vue | 11 +++++++-- src/constants/app.ts | 4 ++-- .../platforms/CapacitorPlatformService.ts | 10 ++++---- src/views/DeepLinkRedirectView.vue | 19 ++++++++------- src/views/HelpNotificationsView.vue | 2 +- src/views/HelpOnboardingView.vue | 23 +------------------ src/views/HelpView.vue | 6 ++--- 9 files changed, 33 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index d6ad733b..90fd435f 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "timesafari", "version": "1.1.6-beta", - "description": "Time Safari Application", + "description": "Gift Economies Application", "author": { - "name": "Time Safari Team" + "name": "Gift Economies Team" }, "scripts": { "lint": "eslint --ext .js,.ts,.vue --ignore-path .gitignore src", diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue index d3ae2a88..318f7efa 100644 --- a/src/components/MembersList.vue +++ b/src/components/MembersList.vue @@ -486,7 +486,7 @@ export default class MembersList extends Vue { informAboutAdmission() { this.notify.info( - "This is to register people in Time Safari and to admit them to the meeting. A (+) symbol means they are not yet admitted and you can register and admit them. A (-) symbol means you can remove them, but they will stay registered.", + "This is to register people in the app and to admit them to the meeting. A (+) symbol means they are not yet admitted and you can register and admit them. A (-) symbol means you can remove them, but they will stay registered.", TIMEOUTS.VERY_LONG, ); } diff --git a/src/components/OnboardingDialog.vue b/src/components/OnboardingDialog.vue index 9c3f8f07..af70fda0 100644 --- a/src/components/OnboardingDialog.vue +++ b/src/components/OnboardingDialog.vue @@ -24,7 +24,7 @@

- Welcome to Time Safari + Welcome to {{ AppString.APP_NAME }}
- Showcase Impact & Magnify Time
@@ -199,7 +199,7 @@ import { Component, Vue } from "vue-facing-decorator"; import { Router } from "vue-router"; -import { NotificationIface } from "../constants/app"; +import { AppString, NotificationIface } from "../constants/app"; import { OnboardPage } from "../libs/util"; import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; @@ -226,6 +226,13 @@ export default class OnboardingDialog extends Vue { return OnboardPage; } + /** + * Returns AppString enum for template access + */ + get AppString() { + return AppString; + } + /** * CSS classes for primary action buttons (blue gradient) */ diff --git a/src/constants/app.ts b/src/constants/app.ts index 8a393b34..89276dbc 100644 --- a/src/constants/app.ts +++ b/src/constants/app.ts @@ -6,8 +6,8 @@ export enum AppString { // This is used in titles and verbiage inside the app. // There is also an app name without spaces, for packaging in the package.json file used in the manifest. - APP_NAME = "Time Safari", - APP_NAME_NO_SPACES = "TimeSafari", + APP_NAME = "Gift Economies", + APP_NAME_NO_SPACES = "GiftEconomies", PROD_ENDORSER_API_SERVER = "https://api.endorser.ch", TEST_ENDORSER_API_SERVER = "https://test-api.endorser.ch", diff --git a/src/services/platforms/CapacitorPlatformService.ts b/src/services/platforms/CapacitorPlatformService.ts index fe804f8e..7ec43d46 100644 --- a/src/services/platforms/CapacitorPlatformService.ts +++ b/src/services/platforms/CapacitorPlatformService.ts @@ -1055,8 +1055,8 @@ export class CapacitorPlatformService // Offer to share the file try { await Share.share({ - title: "TimeSafari Backup", - text: "Here is your TimeSafari backup file.", + title: "Backup", + text: "Here is your backup file.", url: writeResult.uri, dialogTitle: "Share your backup", }); @@ -1100,8 +1100,8 @@ export class CapacitorPlatformService // Then share the file to let user choose where to save it try { await Share.share({ - title: "TimeSafari Backup", - text: "Here is your TimeSafari backup file.", + title: "Backup", + text: "Here is your backup file.", url: writeResult.uri, dialogTitle: "Save your backup", }); @@ -1180,7 +1180,7 @@ export class CapacitorPlatformService }); await Share.share({ - title: "TimeSafari Backup", + title: "Backup", text: "Here is your backup file.", url: uri, dialogTitle: "Share your backup file", diff --git a/src/views/DeepLinkRedirectView.vue b/src/views/DeepLinkRedirectView.vue index b16ec5fa..f844145c 100644 --- a/src/views/DeepLinkRedirectView.vue +++ b/src/views/DeepLinkRedirectView.vue @@ -5,7 +5,7 @@

- Redirecting to Time Safari + Redirecting to app

@@ -15,11 +15,11 @@

{{ isIOS - ? "Opening Time Safari app on your iPhone..." - : "Opening Time Safari app on your Android device..." + ? "Opening on your iPhone..." + : "Opening on your Android device..." }}

-

Opening Time Safari app...

+

Opening the app...

If the app doesn't open automatically, use one of these @@ -36,8 +36,8 @@ class="inline-block bg-blue-600 text-white px-6 py-3 rounded-lg font-medium hover:bg-blue-700 transition-colors" @click="handleDeepLinkClick" > - Open in Time Safari App - Try Opening in Time Safari App + Open in App + Try Opening in App

@@ -61,8 +61,7 @@ {{ deepLinkUrl }}

- If you have the Time Safari app installed, you can also copy this - link: + If you have the app installed, you can also copy this link: {{ deepLinkUrl }}

@@ -177,13 +176,13 @@ export default class DeepLinkRedirectView extends Vue { "Fallback deep link failed: " + errorStringForLog(error), ); this.pageError = - "Redirecting to the Time Safari app failed. Please use a manual option below."; + "Redirecting to the app failed. Please use a manual option below."; } }, 100); } catch (error) { logger.error("Deep link redirect failed: " + errorStringForLog(error)); this.pageError = - "Unable to open the Time Safari app. Please use a manual option below."; + "Unable to open the app. Please use a manual option below."; } } diff --git a/src/views/HelpNotificationsView.vue b/src/views/HelpNotificationsView.vue index 4da4944f..a61f1492 100644 --- a/src/views/HelpNotificationsView.vue +++ b/src/views/HelpNotificationsView.vue @@ -234,7 +234,7 @@

Here are instructions to uninstall the app and clear out caches and storage. - Note that you should first ensure check that the browser tabs with Time Safari are closed. + Note that you should first ensure check that the browser tabs with this app are closed. (If any are open then that will interfere with your refresh.)

    diff --git a/src/views/HelpOnboardingView.vue b/src/views/HelpOnboardingView.vue index b377f19c..58b1394e 100644 --- a/src/views/HelpOnboardingView.vue +++ b/src/views/HelpOnboardingView.vue @@ -6,7 +6,7 @@

    - Time Safari Onboarding Instructions + Onboarding Instructions

    @@ -80,27 +80,6 @@ 4) Add yourself to their Contacts

- -

Install

-
-

- Have them visit TimeSafari.app in a browser, preferably Chrome or Safari, - and then look for the "Install" selection which adds this app to their desktop. - This enables other things, like the ability to "share" a photo from their - device directly to Time Safari, and it makes notifications more reliable. -

-
- -

Enable Notifications

-
-

- Enable notifications from the Account page . - Those notifications might show up on the device depending on your settings. - For the most reliable habits, set an alarm or do some other ritual to record gratitude - every day. -

-
-
diff --git a/src/views/HelpView.vue b/src/views/HelpView.vue index 11cda338..d48b6272 100644 --- a/src/views/HelpView.vue +++ b/src/views/HelpView.vue @@ -442,9 +442,9 @@ browser window and look at the version there.
  • - Close all tabs that have Time Safari open; it can be difficult to find them all, + Close all tabs that have this site open; it can be difficult to find them all, and you may have to close all your tabs. In addition, it may be running as an - installed app, so look for any Time Safari app that may be running outside a browser. + installed app, so look for any app that may be running outside a browser.
  • There may be a problem with your identity. Go to the Identity @@ -467,7 +467,7 @@ Search for instructions for other browsers.
  • - Then reload Time Safari. + Then reload the page.

    From b775c5b4c1c3c3ac8a64ae788259e24aaaaba67c Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Thu, 22 Jan 2026 19:45:57 -0700 Subject: [PATCH 12/43] bump version to 1.1.6 --- BUILDING.md | 6 +++--- CHANGELOG.md | 11 +++++++++++ android/app/build.gradle | 4 ++-- ios/App/App.xcodeproj/project.pbxproj | 16 ++++++++-------- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index e2de3962..084675ec 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1140,7 +1140,7 @@ export GEM_PATH=$shortened_path ##### 1. Bump the version in package.json & CHANGELOG.md for `MARKETING_VERSION`, then `grep CURRENT_PROJECT_VERSION ios/App/App.xcodeproj/project.pbxproj` and add 1 for the numbered version here: ```bash -cd ios/App && xcrun agvtool new-version 50 && perl -p -i -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 1.1.5;/g" App.xcodeproj/project.pbxproj && cd - +cd ios/App && xcrun agvtool new-version 51 && perl -p -i -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 1.1.6;/g" App.xcodeproj/project.pbxproj && cd - # Unfortunately this edits Info.plist directly. #xcrun agvtool new-marketing-version 0.4.5 ``` @@ -1298,8 +1298,8 @@ The recommended way to build for Android is using the automated build script: ##### 1. Bump the version in package.json, then update these versions & run: ```bash -perl -p -i -e 's/versionCode .*/versionCode 50/g' android/app/build.gradle -perl -p -i -e 's/versionName .*/versionName "1.1.5"/g' android/app/build.gradle +perl -p -i -e 's/versionCode .*/versionCode 51/g' android/app/build.gradle +perl -p -i -e 's/versionName .*/versionName "1.1.6"/g' android/app/build.gradle ``` ##### 2. Build diff --git a/CHANGELOG.md b/CHANGELOG.md index 2558cfd4..81b94506 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.1.6] - 2025.01.21 +### Added +- Labels on contacts +- Ability to switch giver & recipient on the gift-details page +### Changed +- Invitations now must be explicitly accepted +### Fixed +- Show all starred projects +- Incorrect contacts as "most recent" on gift-details page + + ## [1.1.5] - 2025.12.28 ### Fixed - Incorrect prompts in give-dialog on a project or offer diff --git a/android/app/build.gradle b/android/app/build.gradle index c1cc5439..98db4a9c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -31,8 +31,8 @@ android { applicationId "app.timesafari.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 50 - versionName "1.1.5" + versionCode 51 + versionName "1.1.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 3e976b0b..dd2ad3c0 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -524,7 +524,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = GM3FS5JQPH; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -534,7 +534,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.5; + MARKETING_VERSION = 1.1.6; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -552,7 +552,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = GM3FS5JQPH; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -562,7 +562,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.5; + MARKETING_VERSION = 1.1.6; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; @@ -580,7 +580,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = TimeSafariShareExtension/TimeSafariShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = GM3FS5JQPH; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -594,7 +594,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.1.5; + MARKETING_VERSION = 1.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.TimeSafariShareExtension; @@ -618,7 +618,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = TimeSafariShareExtension/TimeSafariShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = GM3FS5JQPH; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -632,7 +632,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.1.5; + MARKETING_VERSION = 1.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.TimeSafariShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 00f77df5..419014b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "1.1.6-beta", + "version": "1.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "1.1.6-beta", + "version": "1.1.6", "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2", diff --git a/package.json b/package.json index 90fd435f..49efe19a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "1.1.6-beta", + "version": "1.1.6", "description": "Gift Economies Application", "author": { "name": "Gift Economies Team" From df61e899daeff0b5ea7aa0baad658c870a36eac4 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Thu, 22 Jan 2026 19:47:24 -0700 Subject: [PATCH 13/43] bump version and add "-beta" --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 419014b8..09a32675 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "1.1.6", + "version": "1.1.7-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "1.1.6", + "version": "1.1.7-beta", "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2", diff --git a/package.json b/package.json index 49efe19a..b8c0f514 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "1.1.6", + "version": "1.1.7-beta", "description": "Gift Economies Application", "author": { "name": "Gift Economies Team" From 8991b2970539af0c502274ff737f4a9258662c07 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 26 Jan 2026 08:58:00 -0700 Subject: [PATCH 14/43] miscellany: save name if set during meeting setup, bump up meeting refresh, edit docs --- README.md | 2 +- src/components/MembersList.vue | 12 +++++++----- src/utils/PlatformServiceMixin.ts | 8 ++++---- src/views/OnboardMeetingSetupView.vue | 8 +++++++- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index dace396d..fef785c1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Quick start: ```bash npm install -npm run build:web:serve -- --test +npm run build:web:dev ``` To be able to take action on the platform: go to [the test page](http://localhost:8080/test) and click "Become User 0". diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue index 318f7efa..c00998a9 100644 --- a/src/components/MembersList.vue +++ b/src/components/MembersList.vue @@ -251,6 +251,8 @@ import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; import BulkMembersDialog from "./BulkMembersDialog.vue"; +const AUTO_REFRESH_INTERVAL = 15; + interface Member { admitted: boolean; content: string; @@ -296,7 +298,7 @@ export default class MembersList extends Vue { apiServer = ""; // Auto-refresh functionality - countdownTimer = 10; + countdownTimer = AUTO_REFRESH_INTERVAL; autoRefreshInterval: NodeJS.Timeout | null = null; lastRefreshTime = 0; previousMemberDidsIgnored: string[] = []; @@ -727,22 +729,22 @@ export default class MembersList extends Vue { startAutoRefresh() { this.stopAutoRefresh(); this.lastRefreshTime = Date.now(); - this.countdownTimer = 10; + this.countdownTimer = AUTO_REFRESH_INTERVAL; this.autoRefreshInterval = setInterval(() => { const now = Date.now(); const timeSinceLastRefresh = (now - this.lastRefreshTime) / 1000; - if (timeSinceLastRefresh >= 10) { + if (timeSinceLastRefresh >= AUTO_REFRESH_INTERVAL) { // Time to refresh this.refreshData(); this.lastRefreshTime = now; - this.countdownTimer = 10; + this.countdownTimer = AUTO_REFRESH_INTERVAL; } else { // Update countdown this.countdownTimer = Math.max( 0, - Math.round(10 - timeSinceLastRefresh), + Math.round(AUTO_REFRESH_INTERVAL - timeSinceLastRefresh), ); } }, 1000); // Update every second diff --git a/src/utils/PlatformServiceMixin.ts b/src/utils/PlatformServiceMixin.ts index bb17c00f..81519541 100644 --- a/src/utils/PlatformServiceMixin.ts +++ b/src/utils/PlatformServiceMixin.ts @@ -1115,8 +1115,8 @@ export const PlatformServiceMixin = { // ================================================= /** - * Save default settings - $saveSettings() - * Ultra-concise shortcut for updateDefaultSettings + * Save settings for currently active DID + * May be consolidated with $saveUserSettings() * * ✅ KEEP: This method will be the primary settings save method after consolidation * @@ -1204,8 +1204,8 @@ export const PlatformServiceMixin = { }, /** - * Save user-specific settings - $saveUserSettings() - * Ultra-concise shortcut for updateDidSpecificSettings + * Save DID-specific settings - $saveUserSettings() + * * @param did DID identifier * @param changes Settings changes to save * @returns Promise Success status diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index a3378330..f50a670b 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -7,7 +7,7 @@

    - Onboarding Meeting + Onboarding Meeting Admin

    @@ -589,6 +589,12 @@ export default class OnboardMeetingView extends Vue { ); return; } + if (!this.fullName) { + this.$saveSettings({ + firstName: this.newOrUpdatedMeetingInputs.userFullName, + }); + } + if (!this.newOrUpdatedMeetingInputs.password) { this.notify.warning( NOTIFY_MEETING_PASSWORD_REQUIRED.message, From cc7c7eb88b0e523fc757e3c450591b6af554901f Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 31 Jan 2026 17:59:52 -0700 Subject: [PATCH 15/43] add a toggle for generate-embeddings flags for admins, and label DID actions --- src/views/DIDView.vue | 287 ++++++++++++++++++++++++++++++------------ 1 file changed, 209 insertions(+), 78 deletions(-) diff --git a/src/views/DIDView.vue b/src/views/DIDView.vue index e3c648ab..6f41eabe 100644 --- a/src/views/DIDView.vue +++ b/src/views/DIDView.vue @@ -138,92 +138,110 @@
    -
    -
    - - - - - - - + + + See You +
    + +
    + + + Watch Them +
    + +
    + + Check +
    - + + Register +
    - + + Delete +
    Auto-Generated Icon
    @@ -263,6 +281,40 @@
    + +
    + +
    + + + {{ generateEmbedding ? "On" : "Off" }} + (loading…) + (saving…) + +
    +
    +
    Date: Sun, 1 Feb 2026 16:36:27 -0700 Subject: [PATCH 16/43] make a check for the user profile on the DID screen --- src/views/DIDView.vue | 85 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/src/views/DIDView.vue b/src/views/DIDView.vue index 6f41eabe..aea60dd4 100644 --- a/src/views/DIDView.vue +++ b/src/views/DIDView.vue @@ -136,6 +136,38 @@ />
    + + +
    +
    + + Loading… +
    +
    + {{ userProfileError }} +
    +
    +

    + {{ userProfileData.description }} +

    +

    No description.

    +
    +
    +
    @@ -422,6 +454,7 @@ import { } from "@/constants/notifications"; import { THAT_UNNAMED_PERSON } from "@/constants/entities"; import { getContactMethodLabel } from "@/constants/contacts"; +import type { UserProfile } from "@/libs/partnerServer"; /** * DIDView Component @@ -473,6 +506,11 @@ export default class DIDView extends Vue { showGeneralAdvanced = false; showLargeIdenticonId?: string; showLargeIdenticonUrl?: string; + showUserProfile = false; + userProfileData: UserProfile | null = null; + userProfileError: string | null = null; + userProfileFetched = false; + userProfileLoading = false; viewingDid?: string; capitalizeAndInsertSpacesBeforeCaps = capitalizeAndInsertSpacesBeforeCaps; @@ -624,7 +662,7 @@ export default class DIDView extends Vue { this.generateEmbeddingSaving = true; try { const headers = await getHeaders(this.activeDid); - const url = `${this.partnerApiServer}/api/partner/userProfile/${encodeURIComponent(this.viewingDid)}/generateEmbedding`; + const url = `${this.partnerApiServer}/api/partner/userProfileGenerateEmbedding/${encodeURIComponent(this.viewingDid)}`; await this.axios.put(url, { generateEmbedding: newValue }, { headers }); this.generateEmbedding = newValue; this.notify.success( @@ -676,6 +714,51 @@ export default class DIDView extends Vue { this.showDidDetails = !this.showDidDetails; } + /** + * Toggles the User Profile section and loads profile from server on first expand. + */ + toggleUserProfile() { + this.showUserProfile = !this.showUserProfile; + if (this.showUserProfile && !this.userProfileFetched) { + this.loadUserProfile(); + } + } + + /** + * Loads the user profile for the viewing DID from the partner API. + * Shows profile content or a message if the DID has no profile or it is not visible. + */ + async loadUserProfile() { + if (!this.viewingDid || !this.activeDid) return; + this.userProfileFetched = true; + this.userProfileLoading = true; + this.userProfileError = null; + this.userProfileData = null; + try { + const headers = await getHeaders(this.activeDid); + const url = `${this.partnerApiServer}/api/partner/userProfileForIssuer/${encodeURIComponent(this.viewingDid)}`; + const response = await this.axios.get(url, { headers }); + const data = response.data?.data; + if (data) { + this.userProfileData = data; + } + } catch (err: unknown) { + const axiosErr = err as { + response?: { status?: number; data?: { error?: string } }; + }; + const status = axiosErr.response?.status; + const message = axiosErr.response?.data?.error; + if (status === 404 && message) { + this.userProfileError = message; + } else { + this.userProfileError = + "This DID does not have a profile or doesn't make it visible to you."; + } + } finally { + this.userProfileLoading = false; + } + } + showLargeProfileImage() { this.showLargeIdenticonUrl = this.contactFromDid?.profileImageUrl; } From e38b752b2784ea7320f0bd64524b9b78bcdafa6d Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Wed, 4 Feb 2026 20:17:01 -0700 Subject: [PATCH 17/43] add organizer ability to generate matching pairs --- src/components/MembersList.vue | 3 +- src/interfaces/common.ts | 3 + src/libs/endorserServer.ts | 15 +- src/views/OnboardMeetingListView.vue | 9 +- src/views/OnboardMeetingMembersView.vue | 3 +- src/views/OnboardMeetingSetupView.vue | 293 +++++++++++++++++++++++- 6 files changed, 306 insertions(+), 20 deletions(-) diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue index c00998a9..fbe36189 100644 --- a/src/components/MembersList.vue +++ b/src/components/MembersList.vue @@ -259,6 +259,7 @@ interface Member { memberId: number; } +// there's a similar structure in OnboardMeetingSetupView.vue but without the member interface DecryptedMember { member: Member; name: string; @@ -488,7 +489,7 @@ export default class MembersList extends Vue { informAboutAdmission() { this.notify.info( - "This is to register people in the app and to admit them to the meeting. A (+) symbol means they are not yet admitted and you can register and admit them. A (-) symbol means you can remove them, but they will stay registered.", + "This is to register people in the app and to admit them to the meeting. A green (+) symbol means they are not yet admitted and you can register and admit them. A red (-) symbol means you can remove them, but they will stay registered.", TIMEOUTS.VERY_LONG, ); } diff --git a/src/interfaces/common.ts b/src/interfaces/common.ts index ec5226a7..06042437 100644 --- a/src/interfaces/common.ts +++ b/src/interfaces/common.ts @@ -55,6 +55,9 @@ export interface AxiosErrorResponse { response?: { data?: { error?: { + // This is in responses from endorser-ch server + userMessage?: string; + // This is the old approach from endorser-ch server; remove when we've removed all "error: { message: ... }" message?: string; }; [key: string]: unknown; diff --git a/src/libs/endorserServer.ts b/src/libs/endorserServer.ts index 8eb2cd68..a07711fc 100644 --- a/src/libs/endorserServer.ts +++ b/src/libs/endorserServer.ts @@ -676,15 +676,16 @@ export async function setPlanInCache( /** * Extracts user-friendly message from server error - * @param {any} error - Error thrown from Endorser server call + * @param {AxiosErrorResponse} error - Error thrown from Endorser server call * @returns {string|undefined} User-friendly message or undefined if none found */ -export function serverMessageForUser(error: unknown): string | undefined { - if (error && typeof error === "object" && "response" in error) { - const err = error as AxiosErrorResponse; - return err.response?.data?.error?.message; - } - return undefined; +export function serverMessageForUser( + error: AxiosErrorResponse, +): string | undefined { + return ( + error?.response?.data?.error?.userMessage || + error?.response?.data?.error?.message + ); } /** diff --git a/src/views/OnboardMeetingListView.vue b/src/views/OnboardMeetingListView.vue index 3c9aef71..b7e0b9b4 100644 --- a/src/views/OnboardMeetingListView.vue +++ b/src/views/OnboardMeetingListView.vue @@ -131,6 +131,7 @@ import { import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; import { NotificationIface } from "@/constants/app"; +import { AxiosErrorResponse } from "@/interfaces"; interface Meeting { name: string; @@ -209,11 +210,6 @@ export default class OnboardMeetingListView extends Vue { * 3. If not attending: Fetch all available meetings (groupsOnboarding endpoint) * 4. Handle loading states and error conditions * - * API Endpoints Used: - * - GET /api/partner/groupOnboardMember - Check current attendance - * - GET /api/partner/groupOnboard/{id} - Get meeting details - * - GET /api/partner/groupsOnboarding - Get all available meetings - * * State Management: * - Sets isLoading flag during API calls * - Updates attendingMeeting or meetings array @@ -271,7 +267,8 @@ export default class OnboardMeetingListView extends Vue { true, ); this.notify.error( - serverMessageForUser(error) || "There was a problem fetching meetings.", + serverMessageForUser(error as unknown as AxiosErrorResponse) || + "There was a problem fetching meetings.", TIMEOUTS.LONG, ); } finally { diff --git a/src/views/OnboardMeetingMembersView.vue b/src/views/OnboardMeetingMembersView.vue index 9dfba3d9..8f1bf53a 100644 --- a/src/views/OnboardMeetingMembersView.vue +++ b/src/views/OnboardMeetingMembersView.vue @@ -78,6 +78,7 @@ import { import { generateSaveAndActivateIdentity } from "../libs/util"; import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { NotificationIface } from "../constants/app"; +import { AxiosErrorResponse } from "@/interfaces"; @Component({ components: { @@ -178,7 +179,7 @@ export default class OnboardMeetingMembersView extends Vue { } } catch (error) { this.errorMessage = - serverMessageForUser(error) || + serverMessageForUser(error as unknown as AxiosErrorResponse) || "There was an error checking for that meeting. Reload or go back and try again."; this.$logAndConsole( "Error checking meeting: " + errorStringForLog(error), diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index f50a670b..01cd8b4a 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -64,7 +64,7 @@

    Share the password with the members. You can also send them the - "shortcut page for members" link below. + "Page for Members" link below.

    @@ -314,6 +314,88 @@ class="mt-4" @error="handleMembersError" /> + + +
    +

    Pairs

    +

    + Match members by profile similarity +

    +
    + + +
    +
    + + Loading matches… +
    +
      +
    • + Pair {{ pair.pairNumber }} + + (similarity {{ pair.similarity.toFixed(2) }}) +
        +
      • + {{ + p.decryptedContentObject?.name + ? p.decryptedContentObject.name + : "(No Name)" + }} + - + {{ + p.description + ? p.description.substring(0, 80) + + (p.description.length > 80 ? "…" : "") + : "(No Profile)" + }} +
      • +
      +
    • +
    +

    + No matches yet. Click “Get matches” to pair members by profile + similarity. +

    +
    { + if (!this.currentMeeting?.password) return; + this.isLoadingMatches = true; + try { + const headers = await getHeaders(this.activeDid); + const response = await this.axios.get( + this.apiServer + "/api/partner/groupOnboardMatch", + { headers }, + ); + const pairs = response?.data?.data?.pairs ?? null; + let tempMatchPairs: MatchPair[] | null = null; + if (Array.isArray(pairs)) { + tempMatchPairs = []; + // walk through pairs and decrypt the content for each participant + for (const pair of pairs) { + for (const participant of pair.participants) { + try { + const decryptedContent = await decryptMessage( + participant.content, + this.currentMeeting?.password || "", + ); + participant.decryptedContentObject = JSON.parse(decryptedContent); + } catch (error) { + this.$logAndConsole( + "Error decrypting participant content: " + + errorStringForLog(error), + true, + ); + participant.decryptedContentObject = null; + } + } + tempMatchPairs.push(pair); + } + } + this.matchPairs = tempMatchPairs; + if (tempMatchPairs?.length) { + this.mergePairsIntoPrevious(tempMatchPairs); + } + } catch (error) { + this.$logAndConsole( + "Error fetching match pairs: " + errorStringForLog(error), + true, + ); + this.matchPairs = null; + this.notify.error( + serverMessageForUser(error as unknown as AxiosErrorResponse) || + "Failed to load matches.", + TIMEOUTS.LONG, + ); + } finally { + this.isLoadingMatches = false; + } + } + + /** + * Normalize a pair of DIDs to a sorted tuple for deduplication. + */ + private normalizedPair(did1: string, did2: string): [string, string] { + return did1 <= did2 ? [did1, did2] : [did2, did1]; + } + + /** + * Append pairs from a match result into previousMatchedPairs (no duplicates). + */ + private mergePairsIntoPrevious(pairs: MatchPair[]): void { + for (const pair of pairs) { + if (pair.participants?.length !== 2) continue; + const [a, b] = pair.participants.map((p) => p.issuerDid); + const norm = this.normalizedPair(a, b); + const exists = this.previousMatchedPairs.some( + ([x, y]) => x === norm[0] && y === norm[1], + ); + if (!exists) { + this.previousMatchedPairs.push(norm); + } + } + } + + /** + * POST to groupOnboardMatch with optional body (excludedDids, excludedPairDids, previousPairDids). + * Organizer only; uses meeting for current user. + */ + async postMatch(body?: { + excludedDids?: string[]; + excludedPairDids?: [string, string][]; + previousPairDids?: [string, string][]; + }): Promise { + try { + const headers = await getHeaders(this.activeDid); + const response = await this.axios.post( + this.apiServer + "/api/partner/groupOnboardMatch", + body ?? {}, + { headers }, + ); + const pairs = response?.data?.data?.pairs ?? null; + return Array.isArray(pairs) ? pairs : null; + } catch (error) { + this.$logAndConsole( + "Error posting group onboard match: " + errorStringForLog(error), + true, + ); + const errorMessage = serverMessageForUser( + error as unknown as AxiosErrorResponse, + ); + this.notify.error( + errorMessage || "Failed to run matching.", + TIMEOUTS.LONG, + ); + return null; + } + } + + async postNewMatchesThenRefresh(): Promise { + this.isPostingMatch = true; + try { + const previousPairDids = this.previousMatchedPairs.length + ? this.previousMatchedPairs + : undefined; + const pairs = await this.postMatch( + previousPairDids ? { previousPairDids } : undefined, + ); + if (Array.isArray(pairs) && pairs.length > 0) { + const tempMatchPairs: MatchPair[] = []; + for (const pair of pairs) { + for (const participant of pair.participants) { + const decryptedContent = await decryptMessage( + participant.content, + this.currentMeeting?.password || "", + ); + participant.decryptedContentObject = JSON.parse(decryptedContent); + } + tempMatchPairs.push(pair); + } + this.matchPairs = tempMatchPairs; + this.mergePairsIntoPrevious(tempMatchPairs); + this.notify.success("New matches generated.", TIMEOUTS.STANDARD); + } + } finally { + this.isPostingMatch = false; + } + } + + async clearMatchesThenRefresh(): Promise { + try { + const headers = await getHeaders(this.activeDid); + await this.axios.delete( + this.apiServer + "/api/partner/groupOnboardMatch", + { headers }, + ); + this.matchPairs = null; + this.previousMatchedPairs = []; + this.notify.success("Matches cleared.", TIMEOUTS.STANDARD); + } catch (error) { + this.$logAndConsole( + "Error clearing matches: " + errorStringForLog(error), + true, + ); + this.notify.error( + serverMessageForUser(error as unknown as AxiosErrorResponse) || + "Failed to clear matches.", + TIMEOUTS.LONG, + ); + } + } + handleMembersError(message: string) { this.notify.error(message, TIMEOUTS.LONG); } From 1c3d449c855499b480d200f7829560bffd58b207 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 8 Feb 2026 13:45:27 -0700 Subject: [PATCH 18/43] allow meeting organizer to see info about embeddings, and add match to pages --- CODE_QUALITY_DEEP_ANALYSIS.md | 2 +- scripts/enhanced-migration-validator.sh | 2 +- scripts/simple-validator.sh | 2 +- scripts/validate-critical-files.sh | 2 +- src/components/MeetingMemberMatch.vue | 245 ++++++++++++++++++ ...MembersList.vue => MeetingMembersList.vue} | 14 +- src/constants/notifications.ts | 6 +- src/libs/partnerServer.ts | 2 + src/views/DIDView.vue | 101 ++++---- src/views/OnboardMeetingMembersView.vue | 18 +- src/views/OnboardMeetingSetupView.vue | 35 ++- vite.config.common.mts | 3 + 12 files changed, 355 insertions(+), 77 deletions(-) create mode 100644 src/components/MeetingMemberMatch.vue rename src/components/{MembersList.vue => MeetingMembersList.vue} (98%) diff --git a/CODE_QUALITY_DEEP_ANALYSIS.md b/CODE_QUALITY_DEEP_ANALYSIS.md index 6a22f202..810a9618 100644 --- a/CODE_QUALITY_DEEP_ANALYSIS.md +++ b/CODE_QUALITY_DEEP_ANALYSIS.md @@ -27,7 +27,7 @@ Large Components (>500 lines): 5 components (12.5%) ├── GiftedDialog.vue (670 lines) ⚠️ HIGH PRIORITY ├── PhotoDialog.vue (669 lines) ⚠️ HIGH PRIORITY ├── PushNotificationPermission.vue (660 lines) ⚠️ HIGH PRIORITY -└── MembersList.vue (550 lines) ⚠️ MODERATE PRIORITY +└── MeetingMembersList.vue (550 lines) ⚠️ MODERATE PRIORITY Medium Components (200-500 lines): 12 components (30%) ├── GiftDetailsStep.vue (450 lines) diff --git a/scripts/enhanced-migration-validator.sh b/scripts/enhanced-migration-validator.sh index 211754ce..ba283c99 100644 --- a/scripts/enhanced-migration-validator.sh +++ b/scripts/enhanced-migration-validator.sh @@ -116,7 +116,7 @@ echo "==============================" # Analyze critical files identified in the assessment critical_files=( - src/components/MembersList.vue" + src/components/MeetingMembersList.vue" "src/views/ContactsView.vue" src/views/OnboardMeetingSetupView.vue" src/db/databaseUtil.ts" diff --git a/scripts/simple-validator.sh b/scripts/simple-validator.sh index c16e578c..61bb1fad 100644 --- a/scripts/simple-validator.sh +++ b/scripts/simple-validator.sh @@ -93,7 +93,7 @@ echo "==========================" # Critical files from our assessment files=( - src/components/MembersList.vue" + src/components/MeetingMembersList.vue" "src/views/ContactsView.vue" src/views/OnboardMeetingSetupView.vue" src/db/databaseUtil.ts" diff --git a/scripts/validate-critical-files.sh b/scripts/validate-critical-files.sh index 547a5691..2bb19e98 100755 --- a/scripts/validate-critical-files.sh +++ b/scripts/validate-critical-files.sh @@ -93,7 +93,7 @@ echo "==========================" # Critical files from our assessment files=( - src/components/MembersList.vue" + src/components/MeetingMembersList.vue" "src/views/ContactsView.vue" src/views/OnboardMeetingSetupView.vue" src/db/databaseUtil.ts" diff --git a/src/components/MeetingMemberMatch.vue b/src/components/MeetingMemberMatch.vue new file mode 100644 index 00000000..7a279ab5 --- /dev/null +++ b/src/components/MeetingMemberMatch.vue @@ -0,0 +1,245 @@ + + + diff --git a/src/components/MembersList.vue b/src/components/MeetingMembersList.vue similarity index 98% rename from src/components/MembersList.vue rename to src/components/MeetingMembersList.vue index fbe36189..c233a0ce 100644 --- a/src/components/MembersList.vue +++ b/src/components/MeetingMembersList.vue @@ -49,9 +49,9 @@
    + always have at least one refresh button even without members in case the organizer + changes the password + -->
    @@ -319,31 +321,54 @@ class="mt-4 pt-4 border-t border-slate-300" data-testid="generateEmbeddingSection" > -
    + - {{ generateEmbedding ? "On" : "Off" }} - (loading…) + {{ + (generateEmbedding ?? userProfileData?.generateEmbedding) + ? "On" + : "Off" + }} + (loading…) (saving…) + + {{ + userProfileData?.embeddingIsForEmptyString == null + ? "" + : userProfileData?.embeddingIsForEmptyString + ? "- Embedding is for blank description" + : "- Embedding is for non-blank description" + }} +
    @@ -494,7 +519,7 @@ export default class DIDView extends Vue { contactLabels: string[] = []; contactYaml = ""; - generateEmbedding: boolean | null = null; + generateEmbedding: boolean | null = null; // used when there is no profile generateEmbeddingLoading = false; generateEmbeddingSaving = false; hitEnd = false; @@ -509,7 +534,6 @@ export default class DIDView extends Vue { showUserProfile = false; userProfileData: UserProfile | null = null; userProfileError: string | null = null; - userProfileFetched = false; userProfileLoading = false; viewingDid?: string; @@ -543,7 +567,7 @@ export default class DIDView extends Vue { await this.loadClaimsAbout(); await this.checkIfOwnDID(); if (this.showGeneralAdvanced && this.activeDid) { - await this.loadGenerateEmbeddingState(); + await this.loadUserProfile(); } } } @@ -623,48 +647,36 @@ export default class DIDView extends Vue { this.isMyDid = allAccountDids.includes(this.viewingDid); } - /** - * Loads partner profile generateEmbedding state for the viewed DID (when showGeneralAdvanced). - */ - private async loadGenerateEmbeddingState() { - if (!this.viewingDid || !this.activeDid) return; - this.generateEmbeddingLoading = true; - try { - const headers = await getHeaders(this.activeDid); - const url = `${this.partnerApiServer}/api/partner/userProfileForIssuer/${encodeURIComponent(this.viewingDid)}`; - const response = await this.axios.get(url, { headers }); - const data = response.data?.data; - this.generateEmbedding = - data && typeof data.generateEmbedding === "boolean" - ? data.generateEmbedding - : false; - } catch { - this.generateEmbedding = false; - } finally { - this.generateEmbeddingLoading = false; - } - } - /** * Toggles the "always generate embedding" flag for the viewed DID on the partner API. * Only permissioned (admin) users can change this; API returns 403 otherwise. */ async toggleGenerateEmbedding() { - if ( - !this.viewingDid || - !this.activeDid || - this.generateEmbeddingSaving || - this.generateEmbeddingLoading - ) { + if (!this.viewingDid || !this.activeDid) { return; } - const newValue = !this.generateEmbedding; + const newValue = !(this.userProfileData + ? this.userProfileData.generateEmbedding + : this.generateEmbedding); this.generateEmbeddingSaving = true; try { const headers = await getHeaders(this.activeDid); const url = `${this.partnerApiServer}/api/partner/userProfileGenerateEmbedding/${encodeURIComponent(this.viewingDid)}`; await this.axios.put(url, { generateEmbedding: newValue }, { headers }); - this.generateEmbedding = newValue; + if (this.userProfileData) { + this.userProfileData.generateEmbedding = newValue; + this.userProfileData.embeddingIsForEmptyString = newValue; // the server should have generated it or erased it + } else { + this.generateEmbedding = newValue; + if (newValue) { + this.userProfileData = { + description: "", + issuerDid: this.viewingDid, + generateEmbedding: newValue, + embeddingIsForEmptyString: true, + }; + } + } this.notify.success( newValue ? "Contact tagged to always generate embedding." @@ -719,7 +731,7 @@ export default class DIDView extends Vue { */ toggleUserProfile() { this.showUserProfile = !this.showUserProfile; - if (this.showUserProfile && !this.userProfileFetched) { + if (this.showUserProfile && !this.userProfileData) { this.loadUserProfile(); } } @@ -730,7 +742,6 @@ export default class DIDView extends Vue { */ async loadUserProfile() { if (!this.viewingDid || !this.activeDid) return; - this.userProfileFetched = true; this.userProfileLoading = true; this.userProfileError = null; this.userProfileData = null; diff --git a/src/views/OnboardMeetingMembersView.vue b/src/views/OnboardMeetingMembersView.vue index 8f1bf53a..e2a0d07d 100644 --- a/src/views/OnboardMeetingMembersView.vue +++ b/src/views/OnboardMeetingMembersView.vue @@ -40,8 +40,16 @@
    - - +
    + + + + +
    @@ -67,7 +75,8 @@ import { RouteLocationNormalizedLoaded, Router } from "vue-router"; import QuickNav from "../components/QuickNav.vue"; import TopMessage from "../components/TopMessage.vue"; -import MembersList from "../components/MembersList.vue"; +import MeetingMemberMatch from "../components/MeetingMemberMatch.vue"; +import MeetingMembersList from "../components/MeetingMembersList.vue"; import UserNameDialog from "../components/UserNameDialog.vue"; import { encryptMessage } from "../libs/crypto"; import { @@ -84,7 +93,8 @@ import { AxiosErrorResponse } from "@/interfaces"; components: { QuickNav, TopMessage, - MembersList, + MeetingMemberMatch, + MeetingMembersList, UserNameDialog, }, mixins: [PlatformServiceMixin], diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index 01cd8b4a..86e06800 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -278,6 +278,13 @@ @close="handleDialogClose" /> +
    + +
    +
    - +
    +
    -
    -

    Pairs

    -

    - Match members by profile similarity -

    +
    +

    Matching Pairs

    @@ -458,7 +452,7 @@ import { } from "@/constants/notifications"; import { PlanData } from "../interfaces/records"; import { Contact } from "../db/tables/contacts"; -import { AxiosErrorResponse } from "@/interfaces"; +import { AxiosErrorResponse, MatchPair } from "@/interfaces"; interface ServerMeeting { groupId: number; // from the server name: string; // to & from the server @@ -476,25 +470,6 @@ interface MeetingSetupInputs { projectLink: string; } -/** Pair from GET/POST /api/partner/groupOnboardMatch */ -interface MatchPairParticipant { - issuerDid: string; - content: string; - // there's a similar structure in MeetingMembersList.vue with extra Member info - decryptedContentObject: { - name: string; - did: string; - isRegistered: boolean; - }; - description: string; -} - -interface MatchPair { - pairNumber: number; - similarity: number; - participants: MatchPairParticipant[]; -} - @Component({ components: { QuickNav, From 0a927ccec56fe5d9610a52e7b49d7cfd1c34a300 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 8 Feb 2026 20:38:59 -0700 Subject: [PATCH 20/43] adjust to the new profile-embedding endpoint --- src/views/DIDView.vue | 95 ++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/src/views/DIDView.vue b/src/views/DIDView.vue index b3897dc8..0e741998 100644 --- a/src/views/DIDView.vue +++ b/src/views/DIDView.vue @@ -328,13 +328,11 @@ - {{ - (generateEmbedding ?? userProfileData?.generateEmbedding) - ? "On" - : "Off" - }} - (loading…) - (loading…) + (saving…) {{ - userProfileData?.embeddingIsForEmptyString == null + embeddingMetadata?.isForEmptyString == null ? "" - : userProfileData?.embeddingIsForEmptyString + : embeddingMetadata?.isForEmptyString ? "- Embedding is for blank description" : "- Embedding is for non-blank description" }} @@ -519,9 +513,12 @@ export default class DIDView extends Vue { contactLabels: string[] = []; contactYaml = ""; - generateEmbedding: boolean | null = null; // used when there is no profile - generateEmbeddingLoading = false; - generateEmbeddingSaving = false; + embeddingMetadata: { + generateEmbedding: boolean; + isForEmptyString: boolean; + } | null = null; + embeddingMetadataLoading = false; + embeddingMetadataSaving = false; hitEnd = false; isLoading = false; isMyDid = false; @@ -567,7 +564,7 @@ export default class DIDView extends Vue { await this.loadClaimsAbout(); await this.checkIfOwnDID(); if (this.showGeneralAdvanced && this.activeDid) { - await this.loadUserProfile(); + await this.loadUserProfileEmbeddingMetadata(); } } } @@ -655,28 +652,17 @@ export default class DIDView extends Vue { if (!this.viewingDid || !this.activeDid) { return; } - const newValue = !(this.userProfileData - ? this.userProfileData.generateEmbedding - : this.generateEmbedding); - this.generateEmbeddingSaving = true; + const currentValue = this.embeddingMetadata?.generateEmbedding ?? false; + const newValue = !currentValue; + this.embeddingMetadataSaving = true; try { const headers = await getHeaders(this.activeDid); const url = `${this.partnerApiServer}/api/partner/userProfileGenerateEmbedding/${encodeURIComponent(this.viewingDid)}`; await this.axios.put(url, { generateEmbedding: newValue }, { headers }); - if (this.userProfileData) { - this.userProfileData.generateEmbedding = newValue; - this.userProfileData.embeddingIsForEmptyString = newValue; // the server should have generated it or erased it - } else { - this.generateEmbedding = newValue; - if (newValue) { - this.userProfileData = { - description: "", - issuerDid: this.viewingDid, - generateEmbedding: newValue, - embeddingIsForEmptyString: true, - }; - } - } + + // Refresh embedding metadata from the dedicated endpoint + await this.loadUserProfileEmbeddingMetadata(); + this.notify.success( newValue ? "Contact tagged to always generate embedding." @@ -696,7 +682,7 @@ export default class DIDView extends Vue { ); } } finally { - this.generateEmbeddingSaving = false; + this.embeddingMetadataSaving = false; } } @@ -736,6 +722,39 @@ export default class DIDView extends Vue { } } + /** + * Loads embedding metadata (generateEmbedding, isForEmptyString) for the viewing DID + * from the partner API userProfileEmbeddingMetadata endpoint. + */ + async loadUserProfileEmbeddingMetadata() { + if (!this.viewingDid || !this.activeDid) return; + this.embeddingMetadataLoading = true; + this.embeddingMetadata = null; + try { + const headers = await getHeaders(this.activeDid); + const url = `${this.partnerApiServer}/api/partner/userProfileEmbeddingMetadata/${encodeURIComponent(this.viewingDid)}`; + const response = await this.axios.get(url, { headers }); + const data = response.data?.data; + if (data && typeof data.generateEmbedding === "boolean") { + this.embeddingMetadata = { + generateEmbedding: data.generateEmbedding, + isForEmptyString: !!data.isForEmptyString, + }; + } else { + this.embeddingMetadata = null; + } + } catch (err: unknown) { + const axiosErr = err as { response?: { status?: number } }; + if (axiosErr.response?.status === 404) { + this.embeddingMetadata = null; + } else { + logger.error("Failed to load user profile embedding metadata:", err); + } + } finally { + this.embeddingMetadataLoading = false; + } + } + /** * Loads the user profile for the viewing DID from the partner API. * Shows profile content or a message if the DID has no profile or it is not visible. From a910399cade693b8884ea843c80e2a7455855c85 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 15 Feb 2026 13:40:55 -0700 Subject: [PATCH 21/43] fix test for new item in feed --- test-playwright/30-record-gift.spec.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test-playwright/30-record-gift.spec.ts b/test-playwright/30-record-gift.spec.ts index 90af649c..4c684502 100644 --- a/test-playwright/30-record-gift.spec.ts +++ b/test-playwright/30-record-gift.spec.ts @@ -106,9 +106,9 @@ test('Record something given', async ({ page }) => { await page.waitForFunction(() => { return !document.querySelector('.dialog-overlay'); }, { timeout: 5000 }); - + await page.getByRole('button', { name: 'Thank' }).click(); - await page.getByRole('listitem').filter({ hasText: UNNAMED_ENTITY_NAME }).locator('svg').click(); + await page.getByRole('listitem').filter({ hasText: UNNAMED_ENTITY_NAME }).locator('svg').click(); await page.getByPlaceholder('What was given').fill(finalTitle); await page.getByRole('spinbutton').fill(randomNonZeroNumber.toString()); await page.getByRole('button', { name: 'Sign & Send' }).click(); @@ -130,8 +130,9 @@ test('Record something given', async ({ page }) => { // Verify the gift we just recorded appears in the activity feed await expect(page.getByText(finalTitle, { exact: false })).toBeVisible(); - // Click the specific gift item - const item = page.locator('li:first-child').filter({ hasText: finalTitle }); + // Click the specific gift item (find by title - don't assume first-child, + // since parallel tests or shared DB can add newer items above ours) + const item = page.locator('ul#listLatestActivity li').filter({ hasText: finalTitle }); await retryClick(page, item.locator('[data-testid="circle-info-link"]')); await expect(page.getByRole('heading', { name: 'Verifiable Claim Details' })).toBeVisible(); // Verify we're viewing the specific gift we recorded From bb9b0d3c2f39827008669aa4f63022bce2cd31c1 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 15 Feb 2026 13:44:04 -0700 Subject: [PATCH 22/43] remove some noise from debug logging --- src/views/HomeView.vue | 121 +++++++++++------------------------------ 1 file changed, 32 insertions(+), 89 deletions(-) diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 2c12b61d..038919e2 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -986,12 +986,12 @@ export default class HomeView extends Vue { * Called by FeedFilters component when filters change */ async reloadFeedOnChange() { - logger.debug("[HomeView] 🔄 reloadFeedOnChange() called - refreshing feed"); + logger.debug("[HomeView] reloadFeedOnChange() called - refreshing feed"); // Get current settings without overriding with defaults const settings = await this.$accountSettings(this.activeDid); - logger.debug("[HomeView] 📊 Current filter settings:", { + logger.debug("[HomeView] Current filter settings:", { filterFeedByVisible: settings.filterFeedByVisible, filterFeedByNearby: settings.filterFeedByNearby, searchBoxes: settings.searchBoxes?.length || 0, @@ -1001,7 +1001,7 @@ export default class HomeView extends Vue { this.isFeedFilteredByNearby = !!settings.filterFeedByNearby; this.isAnyFeedFilterOn = checkIsAnyFeedFilterOn(settings); - logger.debug("[HomeView] 🎯 Updated filter states:", { + logger.debug("[HomeView] Updated filter states:", { isFeedFilteredByVisible: this.isFeedFilteredByVisible, isFeedFilteredByNearby: this.isFeedFilteredByNearby, isAnyFeedFilterOn: this.isAnyFeedFilterOn, @@ -1035,17 +1035,9 @@ export default class HomeView extends Vue { /** * Checks if coordinates fall within any search box * - * @internal - * @callGraph - * Called by: shouldIncludeRecord() - * Calls: None - * * @chain * shouldIncludeRecord() -> latLongInAnySearchBox() * - * @requires - * - this.searchBoxes - * * @param lat Latitude to check * @param long Longitude to check * @returns true if coordinates are within any search box @@ -1070,29 +1062,11 @@ export default class HomeView extends Vue { * - Updates last viewed claim ID * - Handles paging if needed * - * @internal - * @callGraph - * Called by: loadFeedData(), manual refresh - * Calls: - * - retrieveGives() - * - processFeedResults() - * - updateFeedLastViewedId() - * - handleFeedError() - * * @chain * loadFeedData() -> updateAllFeed() -> retrieveGives() - * - * @requires - * - this.apiServer - * - this.feedPreviousOldestId - * - * @modifies - * - this.isFeedLoading - * - this.feedData (via processFeedResults) - * - this.feedLastViewedClaimId (via updateFeedLastViewedId) */ async updateAllFeed() { - logger.debug("[HomeView] 🚀 updateAllFeed() called", { + logger.debug("[HomeView] updateAllFeed() called", { isFeedLoading: this.isFeedLoading, currentFeedDataLength: this.feedData.length, isAnyFeedFilterOn: this.isAnyFeedFilterOn, @@ -1109,7 +1083,7 @@ export default class HomeView extends Vue { this.feedPreviousOldestId, ); - logger.debug("[HomeView] 📡 Retrieved gives from API", { + logger.debug("[HomeView] Retrieved gives from API", { resultsCount: results.data.length, endOfResults, }); @@ -1120,7 +1094,7 @@ export default class HomeView extends Vue { await this.processFeedResults(results.data); await this.updateFeedLastViewedId(results.data); - logger.debug("[HomeView] 📝 Processed feed results", { + logger.debug("[HomeView] Processed feed results", { processedCount: this.feedData.length, }); } @@ -1144,26 +1118,13 @@ export default class HomeView extends Vue { /** * Processes feed results and adds them to feedData * - * @internal - * @callGraph - * Called by: updateAllFeed() - * Calls: processRecord() - * * @chain * updateAllFeed() -> processFeedResults() * - * @requires - * - this.feedData - * - this.feedPreviousOldestId - * - * @modifies - * - this.feedData - * - this.feedPreviousOldestId - * * @param records Array of feed records to process */ private async processFeedResults(records: GiveSummaryRecord[]) { - logger.debug("[HomeView] 📝 Processing feed results:", { + logger.debug("[HomeView] Processing feed results:", { inputRecords: records.length, currentFilters: { isAnyFeedFilterOn: this.isAnyFeedFilterOn, @@ -1185,7 +1146,7 @@ export default class HomeView extends Vue { } } - logger.debug("[HomeView] 📊 Feed processing results:", { + logger.debug("[HomeView] Feed processing results:", { processed: processedCount, filtered: filteredCount, total: records.length, @@ -1198,32 +1159,9 @@ export default class HomeView extends Vue { /** * Processes a single record and returns it if it passes filters * - * @internal - * @callGraph - * Called by: processFeedResults() - * Calls: - * - extractClaim() - * - extractGiverDid() - * - extractRecipientDid() - * - getFulfillsPlan() - * - shouldIncludeRecord() - * - extractProvider() - * - getProvidedByPlan() - * - createFeedRecord() - * * @chain * updateAllFeed() -> processFeedResults() -> processRecord() * - * @requires - * - this.isAnyFeedFilterOn - * - this.isFeedFilteredByVisible - * - this.isFeedFilteredByNearby - * - this.activeDid - * - this.allContacts - * - * @modifies - * - this.feedData (via createFeedRecord) - * * @param record The record to process * @returns Processed record if it passes filters, null otherwise */ @@ -1237,7 +1175,7 @@ export default class HomeView extends Vue { const fulfillsPlan = await this.getFulfillsPlan(record); // Log record details for debugging - logger.debug("[HomeView] 🔍 Processing record:", { + logger.debug("[HomeView] Processing record:", { recordId: record.jwtId, hasFulfillsPlan: !!fulfillsPlan, fulfillsPlanHandleId: record.fulfillsPlanHandleId, @@ -1249,14 +1187,12 @@ export default class HomeView extends Vue { }); if (!this.shouldIncludeRecord(record, fulfillsPlan)) { - logger.debug("[HomeView] ❌ Record filtered out:", record.jwtId); return null; } const provider = this.extractProvider(claim); const providedByPlan = await this.getProvidedByPlan(provider); - logger.debug("[HomeView] ✅ Record included:", record.jwtId); return this.createFeedRecord( record, claim, @@ -1380,6 +1316,11 @@ export default class HomeView extends Vue { fulfillsPlan?: FulfillsPlan, ): boolean { if (this.blockedContactDids.includes(record.issuerDid)) { + logger.debug("[HomeView] Record filtered (blocked contact):", { + recordId: record.jwtId, + issuerDid: record.issuerDid, + hint: "This issuer is in your contacts with 'don't watch their activity'. Visit their DID page and tap the eye button to show their content.", + }); return false; } @@ -1406,24 +1347,26 @@ export default class HomeView extends Vue { } } - // Add debug logging for nearby filter + // Add debug logging for any other filter that causes hiding if (this.isFeedFilteredByNearby && record.fulfillsPlanHandleId) { - logger.debug("[HomeView] 🔍 Nearby filter check:", { - recordId: record.jwtId, - hasFulfillsPlan: !!fulfillsPlan, - hasLocation: !!(fulfillsPlan?.locLat && fulfillsPlan?.locLon), - location: fulfillsPlan - ? { lat: fulfillsPlan.locLat, lon: fulfillsPlan.locLon } - : null, - inSearchBox: - fulfillsPlan?.locLat && fulfillsPlan?.locLon - ? this.latLongInAnySearchBox( - fulfillsPlan.locLat, - fulfillsPlan.locLon, - ) + if (!anyMatch) { + logger.debug("[HomeView] Nearby filter check:", { + recordId: record.jwtId, + hasFulfillsPlan: !!fulfillsPlan, + hasLocation: !!(fulfillsPlan?.locLat && fulfillsPlan?.locLon), + location: fulfillsPlan + ? { lat: fulfillsPlan.locLat, lon: fulfillsPlan.locLon } : null, - finalResult: anyMatch, - }); + inSearchBox: + fulfillsPlan?.locLat && fulfillsPlan?.locLon + ? this.latLongInAnySearchBox( + fulfillsPlan.locLat, + fulfillsPlan.locLon, + ) + : null, + finalResult: anyMatch, + }); + } } return anyMatch; From 7838eea30f6b734740e7b6581a7327f68ffae7de Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 15 Feb 2026 19:29:23 -0700 Subject: [PATCH 23/43] fix problem with hidden contacts due to bad iViewContent values, and rename to hideTheirContent --- src/db-sql/migration.ts | 55 +++ src/db/tables/contacts.ts | 3 +- src/services/migrationService.ts | 464 +----------------- .../platforms/CapacitorPlatformService.ts | 18 +- src/utils/PlatformServiceMixin.ts | 14 +- src/views/DIDView.vue | 8 +- src/views/HomeView.vue | 2 +- 7 files changed, 93 insertions(+), 471 deletions(-) diff --git a/src/db-sql/migration.ts b/src/db-sql/migration.ts index bdc6abe3..2ca700e9 100644 --- a/src/db-sql/migration.ts +++ b/src/db-sql/migration.ts @@ -175,6 +175,7 @@ const MIGRATIONS = [ }, { name: "002_add_iViewContent_to_contacts", + // Note that many times iViewContent was set to null despite the DEFAULT setting. sql: ` ALTER TABLE contacts ADD COLUMN iViewContent BOOLEAN DEFAULT TRUE; `, @@ -213,6 +214,60 @@ const MIGRATIONS = [ CREATE INDEX idx_contact_labels_did ON contact_labels(did); `, }, + { + name: "007_add_hideTheirContent_to_contacts", + // Since we have problems where iViewContent is not set, let's default to show content. + // Add hideTheirContent: null/absent/false = show content (safe default) + sql: ` + ALTER TABLE contacts ADD COLUMN hideTheirContent BOOLEAN DEFAULT 0; + UPDATE contacts SET hideTheirContent = CASE WHEN iViewContent = 0 THEN 1 ELSE 0 END WHERE iViewContent IS NOT NULL; + `, + }, + { + name: "008_remove_iViewContent_from_contacts", + // Recreate contacts without iViewContent: backup, drop, recreate, restore + sql: ` + PRAGMA foreign_keys = OFF; + + CREATE TABLE _contact_labels_backup_008 AS SELECT * FROM contact_labels; + DROP TABLE IF EXISTS contact_labels; + + CREATE TABLE _contacts_backup_008 ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + did TEXT NOT NULL, + name TEXT, + contactMethods TEXT, + nextPubKeyHashB64 TEXT, + notes TEXT, + profileImageUrl TEXT, + publicKeyBase64 TEXT, + seesMe BOOLEAN, + registered BOOLEAN, + hideTheirContent BOOLEAN DEFAULT 0 + ); + INSERT INTO _contacts_backup_008 (id, did, name, contactMethods, nextPubKeyHashB64, notes, profileImageUrl, publicKeyBase64, seesMe, registered, hideTheirContent) + SELECT id, did, name, contactMethods, nextPubKeyHashB64, notes, profileImageUrl, publicKeyBase64, seesMe, registered, COALESCE(hideTheirContent, 0) FROM contacts; + + DROP TABLE contacts; + ALTER TABLE _contacts_backup_008 RENAME TO contacts; + + CREATE INDEX IF NOT EXISTS idx_contacts_did ON contacts(did); + CREATE INDEX IF NOT EXISTS idx_contacts_name ON contacts(name); + + CREATE TABLE contact_labels ( + did TEXT NOT NULL, + label TEXT NOT NULL, + PRIMARY KEY (did, label), + FOREIGN KEY (did) REFERENCES contacts(did) ON DELETE CASCADE + ); + CREATE INDEX idx_contact_labels_label ON contact_labels(label); + CREATE INDEX idx_contact_labels_did ON contact_labels(did); + INSERT INTO contact_labels SELECT * FROM _contact_labels_backup_008; + DROP TABLE _contact_labels_backup_008; + + PRAGMA foreign_keys = ON; + `, + }, ]; /** diff --git a/src/db/tables/contacts.ts b/src/db/tables/contacts.ts index 04817237..de6ab4a4 100644 --- a/src/db/tables/contacts.ts +++ b/src/db/tables/contacts.ts @@ -16,7 +16,8 @@ export type Contact = { did: string; contactMethods?: Array; - iViewContent?: boolean; + /** When true, hide this contact's activity from the feed. Default (null/undefined) = show. */ + hideTheirContent?: boolean; name?: string; nextPubKeyHashB64?: string; // base64-encoded SHA256 hash of next public key notes?: string; diff --git a/src/services/migrationService.ts b/src/services/migrationService.ts index e1369f5d..1e0a1ba8 100644 --- a/src/services/migrationService.ts +++ b/src/services/migrationService.ts @@ -12,9 +12,7 @@ * * 1. **Single Application**: Each migration runs exactly once per database * 2. **Tracked Execution**: All applied migrations are recorded in a migrations table - * 3. **Schema Validation**: Actual database schema is validated before and after migrations - * 4. **Graceful Recovery**: Handles cases where schema exists but tracking is missing - * 5. **Comprehensive Logging**: Detailed logging for debugging and monitoring + * 3. **Comprehensive Logging**: Detailed logging for debugging and monitoring * * ## Migration Flow * @@ -26,9 +24,7 @@ * b. Check if schema already exists * c. Skip if already applied * d. Apply migration SQL - * e. Validate schema was created - * f. Record migration as applied - * 4. Final validation of all migrations + * e. Record migration as applied * ``` * * ## Usage Example @@ -77,25 +73,6 @@ interface Migration { statements?: string[]; } -/** - * Migration validation result - * - * Contains the results of validating that a migration was successfully - * applied by checking the actual database schema. - * - * @interface MigrationValidation - */ -interface MigrationValidation { - /** Whether the migration validation passed overall */ - isValid: boolean; - /** Whether expected tables exist */ - tableExists: boolean; - /** Whether expected columns exist */ - hasExpectedColumns: boolean; - /** List of validation errors encountered */ - errors: string[]; -} - /** * Migration registry to store and manage database migrations * @@ -207,354 +184,6 @@ export function registerMigration(migration: Migration): void { migrationRegistry.registerMigration(migration); } -/** - * Validate that a migration was successfully applied by checking schema - * - * This function performs post-migration validation to ensure that the - * expected database schema changes were actually applied. It checks for - * the existence of tables, columns, and other schema elements that should - * have been created by the migration. - * - * @param migration - The migration to validate - * @param sqlQuery - Function to execute SQL queries - * @returns Promise resolving to validation results - * - * @example - * ```typescript - * const validation = await validateMigrationApplication(migration, sqlQuery); - * if (!validation.isValid) { - * console.error('Migration validation failed:', validation.errors); - * } - * ``` - */ -/** - * Helper function to check if a SQLite result indicates a table exists - * @param result - The result from a sqlite_master query - * @returns true if the table exists - */ -function checkSqliteTableResult(result: unknown): boolean { - return ( - (result as unknown as { values: unknown[][] })?.values?.length > 0 || - (Array.isArray(result) && result.length > 0) - ); -} - -/** - * Helper function to validate that a table exists in the database - * @param tableName - Name of the table to check - * @param sqlQuery - Function to execute SQL queries - * @returns Promise resolving to true if table exists - */ -async function validateTableExists( - tableName: string, - sqlQuery: (sql: string, params?: unknown[]) => Promise, -): Promise { - try { - const result = await sqlQuery( - `SELECT name FROM sqlite_master WHERE type='table' AND name='${tableName}'`, - ); - return checkSqliteTableResult(result); - } catch (error) { - logger.error(`❌ [Validation] Error checking table ${tableName}:`, error); - return false; - } -} - -/** - * Helper function to validate that a column exists in a table - * @param tableName - Name of the table - * @param columnName - Name of the column to check - * @param sqlQuery - Function to execute SQL queries - * @returns Promise resolving to true if column exists - */ -async function validateColumnExists( - tableName: string, - columnName: string, - sqlQuery: (sql: string, params?: unknown[]) => Promise, -): Promise { - try { - await sqlQuery(`SELECT ${columnName} FROM ${tableName} LIMIT 1`); - return true; - } catch (error) { - logger.error( - `❌ [Validation] Error checking column ${columnName} in ${tableName}:`, - error, - ); - return false; - } -} - -/** - * Helper function to validate multiple tables exist - * @param tableNames - Array of table names to check - * @param sqlQuery - Function to execute SQL queries - * @returns Promise resolving to array of validation results - */ -async function validateMultipleTables( - tableNames: string[], - sqlQuery: (sql: string, params?: unknown[]) => Promise, -): Promise<{ exists: boolean; missing: string[] }> { - const missing: string[] = []; - - for (const tableName of tableNames) { - const exists = await validateTableExists(tableName, sqlQuery); - if (!exists) { - missing.push(tableName); - } - } - - return { - exists: missing.length === 0, - missing, - }; -} - -/** - * Helper function to add validation error with consistent logging - * @param validation - The validation object to update - * @param message - Error message to add - * @param error - The error object for logging - */ -function addValidationError( - validation: MigrationValidation, - message: string, - error: unknown, -): void { - validation.isValid = false; - validation.errors.push(message); - logger.error(`❌ [Migration-Validation] ${message}:`, error); -} - -async function validateMigrationApplication( - migration: Migration, - sqlQuery: (sql: string, params?: unknown[]) => Promise, -): Promise { - const validation: MigrationValidation = { - isValid: true, - tableExists: false, - hasExpectedColumns: false, - errors: [], - }; - - try { - if (migration.name === "001_initial") { - // Validate core tables exist for initial migration - const tables = [ - "accounts", - "secret", - "settings", - "contacts", - "logs", - "temp", - ]; - - const tableValidation = await validateMultipleTables(tables, sqlQuery); - if (!tableValidation.exists) { - validation.isValid = false; - validation.errors.push( - `Missing tables: ${tableValidation.missing.join(", ")}`, - ); - logger.error( - `❌ [Migration-Validation] Missing tables:`, - tableValidation.missing, - ); - } - validation.tableExists = tableValidation.exists; - } else if (migration.name === "002_add_iViewContent_to_contacts") { - // Validate iViewContent column exists in contacts table - const columnExists = await validateColumnExists( - "contacts", - "iViewContent", - sqlQuery, - ); - if (!columnExists) { - addValidationError( - validation, - "Column iViewContent missing from contacts table", - new Error("Column not found"), - ); - } else { - validation.hasExpectedColumns = true; - } - } else if (migration.name === "004_active_identity_management") { - // Validate active_identity table exists and has correct structure - const activeIdentityExists = await validateTableExists( - "active_identity", - sqlQuery, - ); - - if (!activeIdentityExists) { - addValidationError( - validation, - "Table active_identity missing", - new Error("Table not found"), - ); - } else { - validation.tableExists = true; - - // Check that active_identity has the expected structure - const hasExpectedColumns = await validateColumnExists( - "active_identity", - "id, activeDid, lastUpdated", - sqlQuery, - ); - - if (!hasExpectedColumns) { - addValidationError( - validation, - "active_identity table missing expected columns", - new Error("Columns not found"), - ); - } else { - validation.hasExpectedColumns = true; - } - } - - // Check that hasBackedUpSeed column exists in settings table - // Note: This validation is included here because migration 004 is consolidated - // and includes the functionality from the original migration 003 - const hasBackedUpSeedExists = await validateColumnExists( - "settings", - "hasBackedUpSeed", - sqlQuery, - ); - - if (!hasBackedUpSeedExists) { - addValidationError( - validation, - "Column hasBackedUpSeed missing from settings table", - new Error("Column not found"), - ); - } - } - - // Add validation for future migrations here - // } else if (migration.name === "003_future_migration") { - // // Validate future migration schema changes - // } - } catch (error) { - validation.isValid = false; - validation.errors.push(`Validation error: ${error}`); - logger.error( - `❌ [Migration-Validation] Validation failed for ${migration.name}:`, - error, - ); - } - - return validation; -} - -/** - * Check if migration is already applied by examining actual schema - * - * This function performs schema introspection to determine if a migration - * has already been applied, even if it's not recorded in the migrations - * table. This is useful for handling cases where the database schema exists - * but the migration tracking got out of sync. - * - * @param migration - The migration to check - * @param sqlQuery - Function to execute SQL queries - * @returns Promise resolving to true if schema already exists - * - * @example - * ```typescript - * const schemaExists = await isSchemaAlreadyPresent(migration, sqlQuery); - * if (schemaExists) { - * console.log('Schema already exists, skipping migration'); - * } - * ``` - */ -async function isSchemaAlreadyPresent( - migration: Migration, - sqlQuery: (sql: string, params?: unknown[]) => Promise, -): Promise { - try { - if (migration.name === "001_initial") { - // Check if accounts table exists (primary indicator of initial migration) - const result = (await sqlQuery( - `SELECT name FROM sqlite_master WHERE type='table' AND name='accounts'`, - )) as unknown as { values: unknown[][] }; - const hasTable = - result?.values?.length > 0 || - (Array.isArray(result) && result.length > 0); - // Reduced logging - only log on error - return hasTable; - } else if (migration.name === "002_add_iViewContent_to_contacts") { - // Check if iViewContent column exists in contacts table - try { - await sqlQuery(`SELECT iViewContent FROM contacts LIMIT 1`); - // Reduced logging - only log on error - return true; - } catch (error) { - // Reduced logging - only log on error - return false; - } - } else if (migration.name === "003_add_hasBackedUpSeed_to_settings") { - // Check if hasBackedUpSeed column exists in settings table - try { - await sqlQuery(`SELECT hasBackedUpSeed FROM settings LIMIT 1`); - return true; - } catch (error) { - return false; - } - } else if (migration.name === "004_active_identity_management") { - // Check if active_identity table exists and has correct structure - try { - // Check that active_identity table exists - const activeIdentityResult = await sqlQuery( - `SELECT name FROM sqlite_master WHERE type='table' AND name='active_identity'`, - ); - const hasActiveIdentityTable = - (activeIdentityResult as unknown as { values: unknown[][] })?.values - ?.length > 0 || - (Array.isArray(activeIdentityResult) && - activeIdentityResult.length > 0); - - if (!hasActiveIdentityTable) { - return false; - } - - // Check that active_identity has the expected structure - try { - await sqlQuery( - `SELECT id, activeDid, lastUpdated FROM active_identity LIMIT 1`, - ); - - // Also check that hasBackedUpSeed column exists in settings - // This is included because migration 004 is consolidated - try { - await sqlQuery(`SELECT hasBackedUpSeed FROM settings LIMIT 1`); - return true; - } catch (error) { - return false; - } - } catch (error) { - return false; - } - } catch (error) { - logger.error( - `🔍 [Migration-Schema] Schema check failed for ${migration.name}, assuming not present:`, - error, - ); - return false; - } - } - - // Add schema checks for future migrations here - // } else if (migration.name === "003_future_migration") { - // // Check if future migration schema already exists - // } - } catch (error) { - logger.error( - `🔍 [Migration-Schema] Schema check failed for ${migration.name}, assuming not present:`, - error, - ); - return false; - } - - return false; -} - /** * Run all registered migrations against the database * @@ -600,7 +229,7 @@ export async function runMigrations( extractMigrationNames: (result: T) => Set, ): Promise { try { - logger.debug("📋 [Migration] Starting migration process..."); + logger.debug("[Migration] Starting migration process..."); // Create migrations table if it doesn't exist // Note: We use IF NOT EXISTS here because this is infrastructure, not a business migration @@ -628,7 +257,7 @@ export async function runMigrations( // Only log migration counts in development logger.debug( - `📊 [Migration] Found ${migrations.length} total migrations, ${appliedMigrations.size} already applied`, + `[Migration] Found ${migrations.length} total migrations, ${appliedMigrations.size} already applied`, ); let appliedCount = 0; @@ -645,70 +274,35 @@ export async function runMigrations( continue; } - // Check 2: Does the schema already exist in the database? - const isSchemaPresent = await isSchemaAlreadyPresent(migration, sqlQuery); - - // Handle case where schema exists but isn't recorded - if (isSchemaPresent) { - try { - await sqlExec("INSERT INTO migrations (name) VALUES (?)", [ - migration.name, - ]); - logger.debug( - `✅ [Migration] Marked existing schema as applied: ${migration.name}`, - ); - skippedCount++; - continue; - } catch (insertError) { - logger.warn( - `⚠️ [Migration] Could not record existing schema ${migration.name}:`, - insertError, - ); - // Continue with normal migration process as fallback - } - } - // Apply the migration - logger.debug(`🔄 [Migration] Applying migration: ${migration.name}`); + logger.debug(`[Migration] Applying migration: ${migration.name}`); try { // Execute the migration SQL as single atomic operation - logger.debug(`🔧 [Migration] Executing SQL for: ${migration.name}`); - logger.debug(`🔧 [Migration] SQL content: ${migration.sql}`); + logger.debug(`[Migration] Executing SQL for: ${migration.name}`); + logger.debug(`[Migration] SQL content: ${migration.sql}`); // Execute the migration SQL directly - it should be atomic // The SQL itself should handle any necessary transactions const execResult = await sqlExec(migration.sql); logger.debug( - `🔧 [Migration] SQL execution result: ${JSON.stringify(execResult)}`, + `[Migration] SQL execution result: ${JSON.stringify(execResult)}`, ); - // Validate the migration was applied correctly - const validation = await validateMigrationApplication( - migration, - sqlQuery, - ); - if (!validation.isValid) { - logger.warn( - `⚠️ [Migration] Validation failed for ${migration.name}:`, - validation.errors, - ); - } - // Record that the migration was applied await sqlExec("INSERT INTO migrations (name) VALUES (?)", [ migration.name, ]); - logger.debug(`🎉 [Migration] Successfully applied: ${migration.name}`); + logger.debug(`✅ [Migration] Successfully applied: ${migration.name}`); appliedCount++; } catch (error) { logger.error(`❌ [Migration] Error applying ${migration.name}:`, error); // Provide explicit rollback instructions for migration failures logger.error( - `🔄 [Migration] ROLLBACK INSTRUCTIONS for ${migration.name}:`, + `[Migration] ROLLBACK INSTRUCTIONS for ${migration.name}:`, ); logger.error(` 1. Stop the application immediately`); logger.error( @@ -740,41 +334,12 @@ export async function runMigrations( errorMessage.includes("already exists")) ) { logger.debug( - `⚠️ [Migration] ${migration.name} appears already applied (${errorMessage}). Validating and marking as complete.`, + `⚠️ [Migration] ${migration.name} appears already applied (${errorMessage}).`, ); - - // Validate the existing schema - const validation = await validateMigrationApplication( - migration, - sqlQuery, - ); - if (!validation.isValid) { - logger.warn( - `⚠️ [Migration] Schema validation failed for ${migration.name}:`, - validation.errors, - ); - // Don't mark as applied if validation fails - continue; - } - - // Mark the migration as applied since the schema change already exists - try { - await sqlExec("INSERT INTO migrations (name) VALUES (?)", [ - migration.name, - ]); - logger.debug(`✅ [Migration] Marked as applied: ${migration.name}`); - appliedCount++; - } catch (insertError) { - // If we can't insert the migration record, log it but don't fail - logger.warn( - `⚠️ [Migration] Could not record ${migration.name} as applied:`, - insertError, - ); - } } else { // For other types of errors, still fail the migration logger.error( - `❌ [Migration] Failed to apply ${migration.name}:`, + `❌ [Migration] Failed to apply ${migration.name}:`, error, ); throw new Error(`Migration ${migration.name} failed: ${error}`); @@ -800,11 +365,10 @@ export async function runMigrations( // Only show completion message in development logger.log( - `🎉 [Migration] Migration process complete! Summary: ${appliedCount} applied, ${skippedCount} skipped`, + `[Migration] Migration process complete. Summary: ${appliedCount} applied, ${skippedCount} skipped`, ); } catch (error) { - logger.error("\n💥 [Migration] Migration process failed:", error); - logger.error("[MigrationService] Migration process failed:", error); + logger.error("❌ [Migration] Migration process failed:", error); throw error; } } diff --git a/src/services/platforms/CapacitorPlatformService.ts b/src/services/platforms/CapacitorPlatformService.ts index 7ec43d46..784ee69d 100644 --- a/src/services/platforms/CapacitorPlatformService.ts +++ b/src/services/platforms/CapacitorPlatformService.ts @@ -714,7 +714,7 @@ export class CapacitorPlatformService * * For critical tables like `contacts`, the method validates: * - Table structure using `PRAGMA table_info` - * - Presence of important columns (e.g., `iViewContent`) + * - Presence of important columns (e.g., `hideTheirContent`) * - Column data types and constraints * * ## Error Handling: @@ -784,7 +784,7 @@ export class CapacitorPlatformService } } - // Step 3: Check contacts table schema (including iViewContent column) + // Step 3: Check contacts table schema (including hideTheirContent column) if (existingTables.includes("contacts")) { try { const contactsSchema = await this.db.query( @@ -795,23 +795,23 @@ export class CapacitorPlatformService contactsSchema, ); - // Check for iViewContent column specifically - const hasIViewContent = contactsSchema.values?.some( + // Check for hideTheirContent column specifically + const hasIHideContent = contactsSchema.values?.some( (col: unknown) => (typeof col === "object" && col !== null && "name" in col && - (col as { name: string }).name === "iViewContent") || - (Array.isArray(col) && col[1] === "iViewContent"), + (col as { name: string }).name === "hideTheirContent") || + (Array.isArray(col) && col[1] === "hideTheirContent"), ); - if (hasIViewContent) { + if (hasIHideContent) { logger.debug( - `✅ [DB-Integrity] iViewContent column exists in contacts table`, + `✅ [DB-Integrity] hideTheirContent column exists in contacts table`, ); } else { logger.error( - `❌ [DB-Integrity] iViewContent column missing from contacts table`, + `❌ [DB-Integrity] hideTheirContent column missing from contacts table`, ); } } catch (error) { diff --git a/src/utils/PlatformServiceMixin.ts b/src/utils/PlatformServiceMixin.ts index 81519541..d4375e70 100644 --- a/src/utils/PlatformServiceMixin.ts +++ b/src/utils/PlatformServiceMixin.ts @@ -296,7 +296,7 @@ export const PlatformServiceMixin = { column === "warnIfProdServer" || column === "warnIfTestServer" || // contacts - column === "iViewContent" || + column === "hideTheirContent" || column === "registered" || column === "seesMe" ) { @@ -911,7 +911,7 @@ export const PlatformServiceMixin = { // Create a new contact object with proper typing const normalizedContact: Contact = { did: contact.did, - iViewContent: contact.iViewContent, + hideTheirContent: contact.hideTheirContent, name: contact.name, nextPubKeyHashB64: contact.nextPubKeyHashB64, notes: contact.notes, @@ -1380,8 +1380,10 @@ export const PlatformServiceMixin = { ? contact.profileImageUrl : null, notes: contact.notes !== undefined ? contact.notes : null, - iViewContent: - contact.iViewContent !== undefined ? contact.iViewContent : null, + hideTheirContent: + contact.hideTheirContent !== undefined + ? contact.hideTheirContent + : null, contactMethods: contact.contactMethods !== undefined ? Array.isArray(contact.contactMethods) @@ -1392,7 +1394,7 @@ export const PlatformServiceMixin = { await this.$dbExec( `INSERT OR REPLACE INTO contacts - (did, name, publicKeyBase64, seesMe, registered, nextPubKeyHashB64, profileImageUrl, notes, iViewContent, contactMethods) + (did, name, publicKeyBase64, seesMe, registered, nextPubKeyHashB64, profileImageUrl, notes, hideTheirContent, contactMethods) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ safeContact.did, @@ -1403,7 +1405,7 @@ export const PlatformServiceMixin = { safeContact.nextPubKeyHashB64, safeContact.profileImageUrl, safeContact.notes, - safeContact.iViewContent, + safeContact.hideTheirContent, safeContact.contactMethods, ], ); diff --git a/src/views/DIDView.vue b/src/views/DIDView.vue index 0e741998..5116b033 100644 --- a/src/views/DIDView.vue +++ b/src/views/DIDView.vue @@ -204,7 +204,7 @@ class="flex flex-col items-center" >
    +
    Auto-Generated Icon
    @@ -305,6 +306,57 @@ />
    + + +
    +
    + + + + {{ (embeddingMetadata?.generateEmbedding ?? false) ? "On" : "Off" }} + (loading…) + (saving…) + + + {{ + embeddingMetadata?.isForEmptyString == null + ? "" + : embeddingMetadata?.isForEmptyString + ? "- Embedding is for blank description" + : "- Embedding is for non-blank description" + }} + +
    +
    @@ -315,57 +367,6 @@
    - -
    -
    - - - - {{ (embeddingMetadata?.generateEmbedding ?? false) ? "On" : "Off" }} - (loading…) - (saving…) - - - {{ - embeddingMetadata?.isForEmptyString == null - ? "" - : embeddingMetadata?.isForEmptyString - ? "- Embedding is for blank description" - : "- Embedding is for non-blank description" - }} - -
    -
    -
    Date: Fri, 20 Feb 2026 20:21:16 -0700 Subject: [PATCH 26/43] avoid problem with disabled 'erase' button and with console error about DOM insertion --- CHANGELOG.md | 14 +++++++++++--- src/views/OnboardMeetingSetupView.vue | 11 ++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b94506..bfec8932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.1.6] - 2025.01.21 +## [1.3.3] - 2026 +### Added +- People can be marked as vector-embeddings users. +- People can be matched during a meeting. +### Fixed +- Problem hiding new contacts in feed + + +## [1.1.6] - 2026.01.21 ### Added - Labels on contacts - Ability to switch giver & recipient on the gift-details page ### Changed -- Invitations now must be explicitly accepted +- Invitations now must be explicitly accepted. ### Fixed -- Show all starred projects +- Show all starred projects. - Incorrect contacts as "most recent" on gift-details page diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index 273440f6..909be68b 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -317,7 +317,10 @@ />
    -
    +

    Matching Pairs

    @@ -511,6 +514,7 @@ export default class OnboardMeetingView extends Vue { selectedProjectData: PlanData | null = null; showDeleteConfirm = false; + get minDateTime() { const now = new Date(); now.setMinutes(now.getMinutes() + 5); // Set minimum 5 minutes in the future @@ -896,7 +900,7 @@ export default class OnboardMeetingView extends Vue { this.newOrUpdatedMeetingInputs = null; if (this.currentMeeting?.password) { - this.$router.push({ + await this.$router.push({ name: "onboard-meeting-setup", query: { password: this.currentMeeting?.password }, }); @@ -977,7 +981,8 @@ export default class OnboardMeetingView extends Vue { "Error fetching match pairs: " + errorStringForLog(error), true, ); - this.matchPairs = null; + // Don't overwrite matchPairs on fetch error - preserve existing data so we don't wipe + // good matches on transient failures (e.g. after navigating away and back). this.notify.error( serverMessageForUser(error as unknown as AxiosErrorResponse) || "Failed to load matches.", From 59303010c10d4f72320e6d3714e7c4b7755e696e Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 15:07:40 -0700 Subject: [PATCH 27/43] remove unused imageUrl in localStorage (since temp table is being used) --- src/utils/PlatformServiceMixin.ts | 9 +++++---- src/views/AccountViewView.vue | 2 +- src/views/GiftedDetailsView.vue | 4 ---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/utils/PlatformServiceMixin.ts b/src/utils/PlatformServiceMixin.ts index d4375e70..54a4fef8 100644 --- a/src/utils/PlatformServiceMixin.ts +++ b/src/utils/PlatformServiceMixin.ts @@ -1732,8 +1732,9 @@ export const PlatformServiceMixin = { // ================================================= /** - * Get temporary data by ID - $getTemp() - * Retrieves temporary data from the temp table + * Get data from temp table by ID + * Currently set by main.capacitor.ts storeSharedImageInTempDB() + * * @param id Temporary storage ID * @returns Promise Temporary data or null if not found */ @@ -1747,8 +1748,8 @@ export const PlatformServiceMixin = { }, /** - * Delete temporary data by ID - $deleteTemp() - * Removes temporary data from the temp table + * Delete data from temp table by ID + * * @param id Temporary storage ID * @returns Promise Success status */ diff --git a/src/views/AccountViewView.vue b/src/views/AccountViewView.vue index 12ff331e..971db3f9 100644 --- a/src/views/AccountViewView.vue +++ b/src/views/AccountViewView.vue @@ -1520,7 +1520,7 @@ export default class AccountViewView extends Vue { } else { logger.error("Non-success deleting image:", response); this.notify.error(ACCOUNT_VIEW_CONSTANTS.ERRORS.IMAGE_DELETE_PROBLEM); - // keep the imageUrl in localStorage so the user can try again if they want + // keep the profileImageUrl so the user can try again if they want } } catch (error) { if (isApiError(error) && error.response?.status === 404) { diff --git a/src/views/GiftedDetailsView.vue b/src/views/GiftedDetailsView.vue index 29aedc6c..7bc405ba 100644 --- a/src/views/GiftedDetailsView.vue +++ b/src/views/GiftedDetailsView.vue @@ -401,7 +401,6 @@ export default class GiftedDetails extends Vue { this.imageUrl = ((this.$route.query["imageUrl"] as string) || this.prevCredToEdit?.claim?.image || - localStorage.getItem("imageUrl") || this.imageUrl) as string; // this is an endpoint for sharing project info to highlight something given @@ -577,7 +576,6 @@ export default class GiftedDetails extends Vue { return; } - localStorage.removeItem("imageUrl"); this.imageUrl = ""; } catch (error) { logger.error("Error deleting image:", error); @@ -585,7 +583,6 @@ export default class GiftedDetails extends Vue { if ((error as any)?.response?.status === 404) { logger.log("Weird: the image was already deleted.", error); - localStorage.removeItem("imageUrl"); this.imageUrl = ""; // it already doesn't exist so we won't say anything to the user @@ -749,7 +746,6 @@ export default class GiftedDetails extends Vue { logger.error("Error checking seed backup status:", error); } - localStorage.removeItem("imageUrl"); if (this.destinationPathAfter) { (this.$router as Router).push({ path: this.destinationPathAfter }); } else { From f3152fc414c7800e0e94cfa9136fc0b52b968b80 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 15:13:41 -0700 Subject: [PATCH 28/43] remove another localStorage usage --- src/views/OfferDetailsView.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/OfferDetailsView.vue b/src/views/OfferDetailsView.vue index 34d836cc..4004903f 100644 --- a/src/views/OfferDetailsView.vue +++ b/src/views/OfferDetailsView.vue @@ -699,7 +699,6 @@ export default class OfferDetailsView extends Vue { NOTIFY_OFFER_SUCCESS_RECORDED.message, TIMEOUTS.LONG, ); - localStorage.removeItem("imageUrl"); if (this.destinationPathAfter) { (this.$router as Router).push({ path: this.destinationPathAfter }); } else { From 07ebd1c32ff49a2bfb62c9c02b9dfb385c3e4457 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 15:14:00 -0700 Subject: [PATCH 29/43] cache the user-profile lookup results in a list --- src/libs/fontawesome.ts | 2 ++ src/router/index.ts | 5 +++++ src/utils/PlatformServiceMixin.ts | 4 ++-- src/views/ContactEditView.vue | 3 +++ src/views/ContactsView.vue | 27 +++++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/libs/fontawesome.ts b/src/libs/fontawesome.ts index 897f3f8e..35dbbbee 100644 --- a/src/libs/fontawesome.ts +++ b/src/libs/fontawesome.ts @@ -34,6 +34,7 @@ import { faCircleQuestion, faCircleRight, faCircleUser, + faCircleXmark, faClock, faCoins, faComment, @@ -135,6 +136,7 @@ library.add( faCircleQuestion, faCircleRight, faCircleUser, + faCircleXmark, faClock, faCoins, faComment, diff --git a/src/router/index.ts b/src/router/index.ts index 4660de52..6fcca363 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -62,6 +62,11 @@ const routes: Array = [ name: "contact-import", component: () => import("../views/ContactImportView.vue"), }, + { + path: "/contact-profile-check", + name: "contact-profile-check", + component: () => import("../views/ContactProfileCheckView.vue"), + }, { path: "/contact-qr", name: "contact-qr", diff --git a/src/utils/PlatformServiceMixin.ts b/src/utils/PlatformServiceMixin.ts index 54a4fef8..6448b647 100644 --- a/src/utils/PlatformServiceMixin.ts +++ b/src/utils/PlatformServiceMixin.ts @@ -1734,7 +1734,7 @@ export const PlatformServiceMixin = { /** * Get data from temp table by ID * Currently set by main.capacitor.ts storeSharedImageInTempDB() - * + * * @param id Temporary storage ID * @returns Promise Temporary data or null if not found */ @@ -1749,7 +1749,7 @@ export const PlatformServiceMixin = { /** * Delete data from temp table by ID - * + * * @param id Temporary storage ID * @returns Promise Success status */ diff --git a/src/views/ContactEditView.vue b/src/views/ContactEditView.vue index 377893a7..ce633f54 100644 --- a/src/views/ContactEditView.vue +++ b/src/views/ContactEditView.vue @@ -55,6 +55,9 @@
    +
    diff --git a/src/views/ContactsView.vue b/src/views/ContactsView.vue index 2ff35379..b4286efd 100644 --- a/src/views/ContactsView.vue +++ b/src/views/ContactsView.vue @@ -127,6 +127,20 @@
    + +
    + +
    +
      0 ? "text-md bg-gradient-to-b from-blue-400 to-blue-700 " + From 30c6df557c2dcd5dbb2c5c4d6dd0d536d04c4254 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 15:25:32 -0700 Subject: [PATCH 30/43] add missing file for contact-profile-checking & add info button for explanation --- src/components/ContactListHeader.vue | 2 +- src/views/ContactProfileCheckView.vue | 340 ++++++++++++++++++++++++++ src/views/ContactsView.vue | 18 +- 3 files changed, 355 insertions(+), 5 deletions(-) create mode 100644 src/views/ContactProfileCheckView.vue diff --git a/src/components/ContactListHeader.vue b/src/components/ContactListHeader.vue index cfb65be2..b6e511f3 100644 --- a/src/components/ContactListHeader.vue +++ b/src/components/ContactListHeader.vue @@ -21,7 +21,7 @@
    diff --git a/src/views/ContactProfileCheckView.vue b/src/views/ContactProfileCheckView.vue new file mode 100644 index 00000000..6145a26b --- /dev/null +++ b/src/views/ContactProfileCheckView.vue @@ -0,0 +1,340 @@ + + + diff --git a/src/views/ContactsView.vue b/src/views/ContactsView.vue index b4286efd..e1d2df82 100644 --- a/src/views/ContactsView.vue +++ b/src/views/ContactsView.vue @@ -80,7 +80,7 @@
    -
    +
    +
    @@ -617,6 +620,13 @@ export default class ContactsView extends Vue { /** * Navigate to profile check view with selected contacts */ + showProfileCheckInfo() { + this.notify.info( + "This User Profile visibility check is a useful report for meeting organizers when running meetings that match people based on common interests.", + TIMEOUTS.VERY_LONG, + ); + } + checkSelectedProfiles() { sessionStorage.setItem("profileCheckFresh", "true"); this.$router.push({ From 5809cd568adc1719a1372371846cf87350c9a4dd Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 15:54:21 -0700 Subject: [PATCH 31/43] fix web test --- test-playwright/40-add-contact.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-playwright/40-add-contact.spec.ts b/test-playwright/40-add-contact.spec.ts index bda4c41b..9c7d9b94 100644 --- a/test-playwright/40-add-contact.spec.ts +++ b/test-playwright/40-add-contact.spec.ts @@ -158,7 +158,7 @@ test('Add contact, record gift, confirm gift', async ({ page }) => { // Go to home view and look for gift await page.goto('./'); await page.getByTestId('closeOnboardingAndFinish').click(); - const giftLink = page.locator('li:first-child').filter({ hasText: finalTitle }).locator('[data-testid="circle-info-link"]'); + const giftLink = page.locator('li').filter({ hasText: finalTitle }).locator('[data-testid="circle-info-link"]'); await expect(giftLink).toBeVisible(); await giftLink.click(); From 0dc3e2e2516a613ab7cd8dd8bc120def06f4c60c Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 17:23:23 -0700 Subject: [PATCH 32/43] bump version to 1.3.3 --- BUILDING.md | 6 +- android/app/build.gradle | 4 +- ios/App/App.xcodeproj/project.pbxproj | 16 +- package-lock.json | 4249 ++++++++++++++----------- package.json | 2 +- src/libs/endorserServer.ts | 2 +- 6 files changed, 2385 insertions(+), 1894 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 084675ec..4bc43781 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1140,7 +1140,7 @@ export GEM_PATH=$shortened_path ##### 1. Bump the version in package.json & CHANGELOG.md for `MARKETING_VERSION`, then `grep CURRENT_PROJECT_VERSION ios/App/App.xcodeproj/project.pbxproj` and add 1 for the numbered version here: ```bash -cd ios/App && xcrun agvtool new-version 51 && perl -p -i -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 1.1.6;/g" App.xcodeproj/project.pbxproj && cd - +cd ios/App && xcrun agvtool new-version 57 && perl -p -i -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 1.3.3;/g" App.xcodeproj/project.pbxproj && cd - # Unfortunately this edits Info.plist directly. #xcrun agvtool new-marketing-version 0.4.5 ``` @@ -1298,8 +1298,8 @@ The recommended way to build for Android is using the automated build script: ##### 1. Bump the version in package.json, then update these versions & run: ```bash -perl -p -i -e 's/versionCode .*/versionCode 51/g' android/app/build.gradle -perl -p -i -e 's/versionName .*/versionName "1.1.6"/g' android/app/build.gradle +perl -p -i -e 's/versionCode .*/versionCode 57/g' android/app/build.gradle +perl -p -i -e 's/versionName .*/versionName "1.3.3"/g' android/app/build.gradle ``` ##### 2. Build diff --git a/android/app/build.gradle b/android/app/build.gradle index 98db4a9c..a62c9080 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -31,8 +31,8 @@ android { applicationId "app.timesafari.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 51 - versionName "1.1.6" + versionCode 57 + versionName "1.3.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index dd2ad3c0..6e8ff2bc 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -524,7 +524,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 57; DEVELOPMENT_TEAM = GM3FS5JQPH; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -534,7 +534,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.6; + MARKETING_VERSION = 1.3.3; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -552,7 +552,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 57; DEVELOPMENT_TEAM = GM3FS5JQPH; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -562,7 +562,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.6; + MARKETING_VERSION = 1.3.3; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; @@ -580,7 +580,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = TimeSafariShareExtension/TimeSafariShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 57; DEVELOPMENT_TEAM = GM3FS5JQPH; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -594,7 +594,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.1.6; + MARKETING_VERSION = 1.3.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.TimeSafariShareExtension; @@ -618,7 +618,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = TimeSafariShareExtension/TimeSafariShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 57; DEVELOPMENT_TEAM = GM3FS5JQPH; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -632,7 +632,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.1.6; + MARKETING_VERSION = 1.3.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.TimeSafariShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 09a32675..8581b404 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "1.1.7-beta", + "version": "1.3.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "1.1.7-beta", + "version": "1.3.3", "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2", @@ -209,13 +209,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "devOptional": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -224,11 +223,10 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -275,14 +273,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "devOptional": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -306,13 +303,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "devOptional": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -530,11 +526,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -602,10 +597,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "engines": { "node": ">=6.9.0" } @@ -753,12 +747,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1142,7 +1135,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1251,15 +1243,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "optional": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1269,15 +1260,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "optional": true, "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1343,7 +1333,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1362,7 +1351,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1376,14 +1364,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "optional": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1445,14 +1432,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "optional": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1462,18 +1448,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "optional": true, "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1521,7 +1506,6 @@ "version": "7.27.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1732,7 +1716,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1746,14 +1729,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "optional": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1767,7 +1749,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1873,33 +1854,31 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "devOptional": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "devOptional": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -1928,13 +1907,12 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1953,8 +1931,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@bitauth/libauth": { "version": "1.19.1", @@ -2535,11 +2512,10 @@ } }, "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2968,7 +2944,6 @@ "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "license": "MIT", "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" @@ -3800,10 +3775,9 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.18", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz", - "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==", - "license": "MIT", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", @@ -3820,7 +3794,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3830,7 +3803,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -3839,7 +3811,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3851,7 +3822,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", - "license": "MIT", "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", @@ -3865,7 +3835,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3876,67 +3845,67 @@ "node": ">=10" } }, - "node_modules/@electron/node-gyp": { - "version": "10.2.0-electron.1", - "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "integrity": "sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==", - "license": "MIT", + "node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dependencies": { + "debug": "^4.1.1", "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^8.1.0", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.2.1", - "nopt": "^6.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" }, "engines": { - "node": ">=12.13.0" + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" } }, - "node_modules/@electron/node-gyp/node_modules/glob": { + "node_modules/@electron/get/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6 <7 || >=8" } }, - "node_modules/@electron/node-gyp/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">=10" + "node": ">= 4.0.0" } }, "node_modules/@electron/notarize": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", @@ -3950,7 +3919,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3962,10 +3930,9 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "license": "BSD-2-Clause", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -3986,7 +3953,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4000,7 +3966,6 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -4009,54 +3974,321 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", - "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.3.tgz", + "integrity": "sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==", "dependencies": { - "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", "debug": "^4.1.1", "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", + "graceful-fs": "^4.2.11", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^11.2.0", "ora": "^5.1.0", "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", - "tar": "^6.0.5", + "tar": "^7.5.6", "yargs": "^17.0.1" }, "bin": { "electron-rebuild": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" + "node": ">=22.12.0" } }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", + "node_modules/@electron/rebuild/node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "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" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/rebuild/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@electron/rebuild/node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/rebuild/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@electron/rebuild/node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@electron/rebuild/node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@electron/rebuild/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@electron/rebuild/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@electron/rebuild/node_modules/node-abi": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.26.0.tgz", + "integrity": "sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/rebuild/node_modules/node-gyp": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/rebuild/node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/tar": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@electron/rebuild/node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@electron/rebuild/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" } }, "node_modules/@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", "dependencies": { - "@electron/asar": "^3.2.7", + "@electron/asar": "^3.3.1", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "dir-compare": "^4.2.0", @@ -4072,7 +4304,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -4090,34 +4321,31 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.4", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -5418,10 +5646,10 @@ } }, "node_modules/@expo/cli/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -5534,10 +5762,9 @@ } }, "node_modules/@expo/cli/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "optional": true, "peer": true, "dependencies": { @@ -5547,23 +5774,6 @@ "node": ">= 18" } }, - "node_modules/@expo/cli/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@expo/cli/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -5698,18 +5908,16 @@ } }, "node_modules/@expo/cli/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "optional": true, "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -5806,10 +6014,10 @@ } }, "node_modules/@expo/config-plugins/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -5920,10 +6128,10 @@ } }, "node_modules/@expo/config/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -6005,10 +6213,10 @@ } }, "node_modules/@expo/devcert/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -6109,10 +6317,10 @@ } }, "node_modules/@expo/fingerprint/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -6266,10 +6474,10 @@ } }, "node_modules/@expo/metro-config/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -6839,7 +7047,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT" + "optional": true }, "node_modules/@hexagon/base64": { "version": "1.1.28", @@ -7161,27 +7369,6 @@ "integrity": "sha512-Mkb/QcclrJxKC+vrcIFl297h52QcKh2Az/9A5vbWytbQt4225UWWWmIuSsKksdww9NkIeYcA7DkfftyLuC/JSg==", "license": "Apache-2.0 OR MIT" }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -7283,8 +7470,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -7297,8 +7482,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", - "optional": true, - "peer": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -7356,11 +7539,10 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "devOptional": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -7432,17 +7614,16 @@ } }, "node_modules/@jest/console": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", - "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -7450,39 +7631,38 @@ } }, "node_modules/@jest/core": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", - "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", + "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-resolve-dependencies": "30.0.5", - "jest-runner": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "jest-watcher": "30.0.5", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -7498,9 +7678,9 @@ } }, "node_modules/@jest/core/node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -7508,7 +7688,6 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } @@ -7573,93 +7752,86 @@ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/environment": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", - "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5" + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, - "license": "MIT", "dependencies": { - "expect": "30.0.5", - "jest-snapshot": "30.0.5" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1" + "@jest/get-type": "30.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", - "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/globals": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", - "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -7680,17 +7852,16 @@ } }, "node_modules/@jest/reporters": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", - "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", @@ -7703,9 +7874,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -7723,11 +7894,11 @@ } }, "node_modules/@jest/reporters/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -7748,7 +7919,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7760,11 +7930,10 @@ } }, "node_modules/@jest/reporters/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7783,13 +7952,12 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", - "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -7803,7 +7971,6 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", @@ -7814,14 +7981,13 @@ } }, "node_modules/@jest/test-result": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", - "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -7830,15 +7996,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", - "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", + "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -7846,23 +8011,22 @@ } }, "node_modules/@jest/transform": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", - "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", @@ -7900,11 +8064,10 @@ } }, "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7994,7 +8157,6 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], - "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -8006,7 +8168,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", @@ -8021,7 +8182,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -8043,7 +8203,6 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", @@ -8162,38 +8321,62 @@ "nostr-wasm": "0.1.0" } }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "license": "ISC", + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", + "optional": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "mkdirp": "^1.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/@npmcli/move-file/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", + "optional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -8201,22 +8384,6 @@ "node": ">=10" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@paralleldrive/cuid2": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", @@ -8369,13 +8536,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.54.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz", - "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright": "1.54.2" + "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -8438,25 +8604,23 @@ } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.5.tgz", - "integrity": "sha512-Rt/imdfqXihD/sn0xnV4flxxb1aLLjPtMF1QleQjEhJsTUPpH4TFlfOpoCvsrXoDl4OIcB1k4FVM24Ez92zf5w==", - "license": "MIT", + "version": "0.79.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.6.tgz", + "integrity": "sha512-CS5OrgcMPixOyUJ/Sk/HSsKsKgyKT5P7y3CojimOQzWqRZBmoQfxdST4ugj7n1H+ebM2IKqbgovApFbqXsoX0g==", "optional": true, "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.5" + "@react-native/codegen": "0.79.6" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.5.tgz", - "integrity": "sha512-GDUYIWslMLbdJHEgKNfrOzXk8EDKxKzbwmBXUugoiSlr6TyepVZsj3GZDLEFarOcTwH1EXXHJsixihk8DCRQDA==", - "license": "MIT", + "version": "0.79.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.6.tgz", + "integrity": "sha512-H+FRO+r2Ql6b5IwfE0E7D52JhkxjeGSBSUpCXAI5zQ60zSBJ54Hwh2bBJOohXWl4J+C7gKYSAd2JHMUETu+c/A==", "optional": true, "peer": true, "dependencies": { @@ -8501,7 +8665,7 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.79.5", + "@react-native/babel-plugin-codegen": "0.79.6", "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" @@ -8514,13 +8678,14 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.5.tgz", - "integrity": "sha512-FO5U1R525A1IFpJjy+KVznEinAgcs3u7IbnbRJUG9IH/MBXi2lEU2LtN+JarJ81MCfW4V2p0pg6t/3RGHFRrlQ==", - "license": "MIT", + "version": "0.79.6", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.6.tgz", + "integrity": "sha512-iRBX8Lgbqypwnfba7s6opeUwVyaR23mowh9ILw7EcT2oLz3RqMmjJdrbVpWhGSMGq2qkPfqAH7bhO8C7O+xfjQ==", "optional": true, "peer": true, "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", "glob": "^7.1.1", "hermes-parser": "0.25.1", "invariant": "^2.2.4", @@ -8760,16 +8925,15 @@ } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", - "integrity": "sha512-Mwovr4jJ3JTnbHEQLhdcMvS82LjijpqCydXl1aH2N16WVCrE5oSNFiqTt6NpZBw9zkJX7nijsY+xeCy6m+KK3Q==", - "license": "MIT", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.84.0.tgz", + "integrity": "sha512-jWRCISiaUusEP3L5R59TDwNDCrerSguVQtjAVdQkUP6RLlCi9mrlWuFzttxaMOoWLM8zr/NpxSFPEGa3hIZTAQ==", "optional": true, "peer": true, "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.81.0", - "hermes-parser": "0.29.1", + "@react-native/babel-preset": "0.84.0", + "hermes-parser": "0.32.0", "nullthrows": "^1.1.1" }, "engines": { @@ -8780,25 +8944,23 @@ } }, "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.0.tgz", - "integrity": "sha512-MEMlW91+2Kk9GiObRP1Nc6oTdiyvmSEbPMSC6kzUzDyouxnh5/x28uyNySmB2nb6ivcbmQ0lxaU059+CZSkKXQ==", - "license": "MIT", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.84.0.tgz", + "integrity": "sha512-8GGVqcfZQnpmaud1GBww/Z8tF5qaWvork5E+TTTQQm7l0p2WnYkzCDJdZOdISHwSO6ikAjh998c3CVPubij3rQ==", "optional": true, "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.0" + "@react-native/codegen": "0.84.0" }, "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-preset": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.0.tgz", - "integrity": "sha512-RKMgCUGsso/2b32kgg24lB68LJ6qr2geLoSQTbisY6Usye0uXeXCgbZZDbILIX9upL4uzU4staMldRZ0v08F1g==", - "license": "MIT", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.84.0.tgz", + "integrity": "sha512-X7QfJCRyvawFUzAwidKynOh9Wc36r/OK+lEweNGyRCmciqVxs/8J/HAnANBks/kM/z7XlepG0hU1D/VjHKA/6g==", "optional": true, "peer": true, "dependencies": { @@ -8808,27 +8970,19 @@ "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", @@ -8837,14 +8991,10 @@ "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.0", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "@react-native/babel-plugin-codegen": "0.84.0", + "babel-plugin-syntax-hermes-parser": "0.32.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -8856,17 +9006,18 @@ } }, "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/codegen": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.0.tgz", - "integrity": "sha512-gPFutgtj8YqbwKKt3YpZKamUBGd9YZJV51Jq2aiDZ9oThkg1frUBa20E+Jdi7jKn982wjBMxAklAR85QGQ4xMA==", - "license": "MIT", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.84.0.tgz", + "integrity": "sha512-TcTAO58JigCw9onYTrbE2yK2js5YNgqbmnpYyq9oXz2mofbX7JcK53kIi7fhqyJhie8RkY+X85zSOTWNs6S3CA==", "optional": true, "peer": true, "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.29.1", + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "hermes-parser": "0.32.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", + "tinyglobby": "^0.2.15", "yargs": "^17.6.2" }, "engines": { @@ -8877,52 +9028,661 @@ } }, "node_modules/@react-native/metro-babel-transformer/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", - "license": "MIT", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "optional": true, "peer": true, "dependencies": { - "hermes-parser": "0.29.1" + "hermes-parser": "0.32.0" } }, "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "optional": true, "peer": true }, "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", - "license": "MIT", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "optional": true, "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.32.0" } }, "node_modules/@react-native/metro-config": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.81.0.tgz", - "integrity": "sha512-5eqLP4TCERHGRYDJSZa//O98CGDFNNEwHVvhs65Msfy6hAoSdw5pAAuTrsQwmbTBp0Fkvu7Bx8BZDhiferZsHg==", - "license": "MIT", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.84.0.tgz", + "integrity": "sha512-s+7YFsH6e2xdvp+8vNu4lXKP3R0SA905/wbLnflDZhNon0EGxuYIj2225ehnY+sUgabBEM4cS088rFmTlHru8Q==", "optional": true, "peer": true, "dependencies": { - "@react-native/js-polyfills": "0.81.0", - "@react-native/metro-babel-transformer": "0.81.0", - "metro-config": "^0.83.1", - "metro-runtime": "^0.83.1" + "@react-native/js-polyfills": "0.84.0", + "@react-native/metro-babel-transformer": "0.84.0", + "metro-config": "^0.83.3", + "metro-runtime": "^0.83.3" }, "engines": { "node": ">= 20.19.4" } }, + "node_modules/@react-native/metro-config/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "optional": true, + "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "optional": true, + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/@react-native/js-polyfills": { + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.84.0.tgz", + "integrity": "sha512-xaxmzYWLgHH+2uAZQ0owEkDE58hOTWmuBKD/Gl+cDFD3mFfSK4lZpin/3hiXtE5LB4BwgqICsPN07zCAqx6Fpg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "optional": true, + "peer": true + }, + "node_modules/@react-native/metro-config/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "optional": true, + "peer": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@react-native/metro-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native/metro-config/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/metro-config/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "optional": true, + "peer": true + }, + "node_modules/@react-native/metro-config/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "optional": true, + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@react-native/metro-config/node_modules/hermes-estree": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", + "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", + "optional": true, + "peer": true + }, + "node_modules/@react-native/metro-config/node_modules/hermes-parser": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", + "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", + "optional": true, + "peer": true, + "dependencies": { + "hermes-estree": "0.33.3" + } + }, + "node_modules/@react-native/metro-config/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "optional": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/metro-config/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "optional": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.4.tgz", + "integrity": "sha512-eBkAtcob+YmvSLL+/rsFiK8dHNfDbQA2/pi0lnxg3E6LLtUpwDfdGJ9WBWXkj0PVeOhoWQyj9Rt7s/+6k/GXuA==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "accepts": "^2.0.0", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.33.3", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.4", + "metro-cache": "0.83.4", + "metro-cache-key": "0.83.4", + "metro-config": "0.83.4", + "metro-core": "0.83.4", + "metro-file-map": "0.83.4", + "metro-resolver": "0.83.4", + "metro-runtime": "0.83.4", + "metro-source-map": "0.83.4", + "metro-symbolicate": "0.83.4", + "metro-transform-plugins": "0.83.4", + "metro-transform-worker": "0.83.4", + "mime-types": "^3.0.1", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-babel-transformer": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.4.tgz", + "integrity": "sha512-xfNtsYIigybqm9xVL3ygTYYNFyYTMf2lGg/Wt+znVGtwcjXoRPG80WlL5SS09ZjYVei3MoE920i7MNr7ukSULA==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.33.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-cache": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.4.tgz", + "integrity": "sha512-Pm6CiksVms0cZNDDe/nFzYr1xpXzJLOSwvOjl4b3cYtXxEFllEjD6EeBgoQK5C8yk7U54PcuRaUAFSvJ+eCKbg==", + "optional": true, + "peer": true, + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.4" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-cache-key": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.4.tgz", + "integrity": "sha512-Y8E6mm1alkYIRzmfkOdrwXMzJ4HKANYiZE7J2d3iYTwmnLIQG+aoIpvla+bo6LRxH1Gm3qjEiOl+LbxvPCzIug==", + "optional": true, + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-config": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.4.tgz", + "integrity": "sha512-ydOgMNI9aT8l2LOTOugt1FvC7getPKG9uJo9Vclg9/RWJxbwkBF/FMBm6w5gH8NwJokSmQrbNkojXPn7nm0kGw==", + "optional": true, + "peer": true, + "dependencies": { + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.4", + "metro-cache": "0.83.4", + "metro-core": "0.83.4", + "metro-runtime": "0.83.4", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-core": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.4.tgz", + "integrity": "sha512-EE+j/imryd3og/6Ly9usku9vcTLQr2o4IDax/izsr6b0HRqZK9k6f5SZkGkOPqnsACLq6csPCx+2JsgF9DkVbw==", + "optional": true, + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.4" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-file-map": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.4.tgz", + "integrity": "sha512-RSZLpGQhW9topefjJ9dp77Ff7BP88b17sb/YjxLHC1/H0lJVYYC9Cgqua21Vxe4RUJK2z64hw72g+ySLGTCawA==", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-minify-terser": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.4.tgz", + "integrity": "sha512-KmZnpxfj0nPIRkbBNTc6xul5f5GPvWL5kQ1UkisB7qFkgh6+UiJG+L4ukJ2sK7St6+8Za/Cb68MUEYkUouIYcQ==", + "optional": true, + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-resolver": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.4.tgz", + "integrity": "sha512-drWdylyNqgdaJufz0GjU/ielv2hjcc6piegjjJwKn8l7A/72aLQpUpOHtP+GMR+kOqhSsD4MchhJ6PSANvlSEw==", + "optional": true, + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-runtime": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.4.tgz", + "integrity": "sha512-sWj9KN311yG22Zv0kVbAp9dorB9HtTThvQKsAn6PLxrVrz+1UBsLrQSxjE/s4PtzDi1HABC648jo4K9Euz/5jw==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-source-map": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.4.tgz", + "integrity": "sha512-pPbmQwS0zgU+/0u5KPkuvlsQP0V+WYQ9qNshqupIL720QRH0vS3QR25IVVtbunofEDJchI11Q4QtIbmUyhpOBw==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.4", + "nullthrows": "^1.1.1", + "ob1": "0.83.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-symbolicate": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.4.tgz", + "integrity": "sha512-clyWAXDgkDHPwvldl95pcLTrJIqUj9GbZayL8tfeUs69ilsIUBpVym2lRd/8l3/8PIHCInxL868NvD2Y7OqKXg==", + "optional": true, + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.4", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-transform-plugins": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.4.tgz", + "integrity": "sha512-c0ROVcyvdaGPUFIg2N5nEQF4xbsqB2p1PPPhVvK1d/Y7ZhBAFiwQ75so0SJok32q+I++lc/hq7IdPCp2frPGQg==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/metro-transform-worker": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.4.tgz", + "integrity": "sha512-6I81IZLeU/0ww7OBgCPALFl0OE0FQwvIuKCtuViSiKufmislF7kVr7IHH9GYtQuZcnualQ82gYeQ11KzZQTouw==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.4", + "metro-babel-transformer": "0.83.4", + "metro-cache": "0.83.4", + "metro-cache-key": "0.83.4", + "metro-minify-terser": "0.83.4", + "metro-source-map": "0.83.4", + "metro-transform-plugins": "0.83.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "optional": true, + "peer": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@react-native/metro-config/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "optional": true, + "peer": true + }, + "node_modules/@react-native/metro-config/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@react-native/metro-config/node_modules/ob1": { + "version": "0.83.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.4.tgz", + "integrity": "sha512-9JiflaRKCkxKzH8uuZlax72cHzZ8iFLsNIORFOAKDgZUOfvfwYWOVS0ezGLzPp/yEhVktD+PTTImC0AAehSOBw==", + "optional": true, + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/metro-config/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@react-native/metro-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "optional": true, + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@react-native/metro-config/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@react-native/normalize-colors": { "version": "0.79.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.5.tgz", @@ -9325,7 +10085,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -9361,7 +10120,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -9610,7 +10368,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -9619,12 +10376,12 @@ } }, "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/@transmute/credentials-context": { @@ -9885,9 +10642,9 @@ } }, "node_modules/@trapezedev/project/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -9969,11 +10726,10 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -10037,7 +10793,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -10101,10 +10856,9 @@ } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", @@ -10168,7 +10922,6 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -10265,7 +11018,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "license": "MIT", "optional": true, "dependencies": { "@types/node": "*", @@ -10295,7 +11047,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -10386,7 +11137,6 @@ "version": "1.10.11", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "license": "MIT", "optional": true }, "node_modules/@types/web-bluetooth": { @@ -10655,7 +11405,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -10669,7 +11418,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -10683,7 +11431,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -10697,7 +11444,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -10711,7 +11457,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -10725,7 +11470,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10739,7 +11483,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10753,7 +11496,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10767,7 +11509,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10781,7 +11522,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10795,7 +11535,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10809,7 +11548,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10823,7 +11561,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10837,7 +11574,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10851,7 +11587,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -10865,7 +11600,6 @@ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" @@ -10882,7 +11616,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -10896,7 +11629,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -10910,7 +11642,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -11835,14 +12566,14 @@ "node_modules/7zip-bin": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "license": "MIT" + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==" }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -11888,8 +12619,9 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "devOptional": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -11961,6 +12693,7 @@ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "license": "MIT", + "optional": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -11972,6 +12705,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "devOptional": true, "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -11982,10 +12716,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12001,7 +12734,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -12078,10 +12810,9 @@ } }, "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", - "license": "ISC", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", "engines": { "node": ">=14" } @@ -12123,71 +12854,111 @@ "node_modules/app-builder-bin": { "version": "5.0.0-alpha.12", "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", - "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", - "license": "MIT" + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==" }, "node_modules/app-builder-lib": { - "version": "26.0.12", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.0.12.tgz", - "integrity": "sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==", - "license": "MIT", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/asar": "3.2.18", + "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", - "@electron/osx-sign": "1.3.1", - "@electron/rebuild": "3.7.0", - "@electron/universal": "2.0.1", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "builder-util": "26.0.11", - "builder-util-runtime": "9.3.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", - "config-file-ts": "0.2.8-rc1", + "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "26.0.11", + "electron-publish": "26.8.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^10.0.0", + "minimatch": "^10.0.3", "plist": "3.1.0", + "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", - "semver": "^7.3.8", - "tar": "^6.1.12", + "semver": "~7.7.3", + "tar": "^7.5.7", "temp-file": "^3.4.0", - "tiny-async-pool": "1.3.0" + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "26.0.12", - "electron-builder-squirrel-windows": "26.0.12" + "dmg-builder": "26.8.1", + "electron-builder-squirrel-windows": "26.8.1" } }, "node_modules/app-builder-lib/node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/app-builder-lib/node_modules/balanced-match": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/brace-expansion": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "engines": { + "node": ">=18" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, "node_modules/app-builder-lib/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -12197,21 +12968,92 @@ "node": ">=12" } }, + "node_modules/app-builder-lib/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "engines": { + "node": ">=18" + } + }, + "node_modules/app-builder-lib/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/app-builder-lib/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "license": "ISC", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/app-builder-lib/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/app-builder-lib/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/app-builder-lib/node_modules/tar": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/app-builder-lib/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/app-builder-lib/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" + } + }, "node_modules/app-root-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", @@ -12353,10 +13195,9 @@ } }, "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "optional": true }, "node_modules/asn1js": { @@ -12383,7 +13224,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", "optional": true, "engines": { "node": ">=0.8" @@ -12412,7 +13252,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -12494,13 +13333,12 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "license": "MIT", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -12532,16 +13370,15 @@ } }, "node_modules/babel-jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", - "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/transform": "30.0.5", + "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -12550,15 +13387,14 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", - "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -12571,14 +13407,11 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", "@types/babel__core": "^7.20.5" }, "engines": { @@ -12653,7 +13486,6 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz", "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -12699,10 +13531,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.3.tgz", - "integrity": "sha512-wQJn92lqj8GKR7Ojg/aW4+GkqI6ZdDNTDyOqhhl7A9bAqk6t0ukUOWLDXQb4p0qKJjMDV1F6gNWasI2KUbuVTQ==", - "license": "MIT", + "version": "13.2.5", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.5.tgz", + "integrity": "sha512-YjVkP1bOLO2OgR2fyCedruYMPR7GFbAtCvvWITBW1UAp6e3ACYZtN6uoqkXgXP6PHQkb6M7qf2vZreBPEZK38A==", "optional": true, "peer": true, "dependencies": { @@ -12720,7 +13551,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.79.5", + "@react-native/babel-preset": "0.79.6", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", @@ -12749,20 +13580,19 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, - "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/balanced-match": { @@ -13033,10 +13863,9 @@ "license": "MIT" }, "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "license": "MIT" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==" }, "node_modules/boolbase": { "version": "1.0.0", @@ -13045,6 +13874,13 @@ "dev": true, "license": "ISC" }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "optional": true + }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -13314,25 +14150,23 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "dev": true, - "license": "ISC", "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", + "elliptic": "^6.6.1", "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", + "parse-asn1": "^5.1.9", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 0.12" + "node": ">= 0.10" } }, "node_modules/browserify-sign/node_modules/isarray": { @@ -13519,22 +14353,20 @@ "license": "MIT" }, "node_modules/builder-util": { - "version": "26.0.11", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.0.11.tgz", - "integrity": "sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==", - "license": "MIT", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", "app-builder-bin": "5.0.0-alpha.12", - "builder-util-runtime": "9.3.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", - "is-ci": "^3.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", @@ -13544,10 +14376,9 @@ } }, "node_modules/builder-util-runtime": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz", - "integrity": "sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==", - "license": "MIT", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -13560,7 +14391,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -13574,78 +14404,48 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "license": "ISC", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 10" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, "dependencies": { - "brace-expansion": "^2.0.1" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" @@ -13655,7 +14455,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", + "optional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -13668,7 +14468,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", + "optional": true, "dependencies": { "glob": "^7.1.3" }, @@ -13679,54 +14479,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/cacache/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "license": "MIT", "engines": { "node": ">=10.6.0" } @@ -13735,7 +14491,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -13999,7 +14754,6 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -14165,8 +14919,7 @@ "node_modules/chromium-pickle-js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "license": "MIT" + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==" }, "node_modules/ci-info": { "version": "3.9.0", @@ -14179,6 +14932,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -14197,11 +14952,10 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", - "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", - "dev": true, - "license": "MIT" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true }, "node_modules/class-transformer": { "version": "0.5.1", @@ -14213,6 +14967,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -14259,7 +15014,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "license": "MIT", "optional": true, "dependencies": { "slice-ansi": "^3.0.0", @@ -14276,7 +15030,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "license": "MIT", "optional": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -14332,7 +15085,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -14345,18 +15097,16 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true }, "node_modules/color": { "version": "4.2.3", @@ -14455,7 +15205,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14484,9 +15233,8 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", @@ -14504,9 +15252,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14515,17 +15262,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "optional": true, - "peer": true + "devOptional": true, + "license": "MIT" }, "node_modules/compression/node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -14636,73 +15381,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/config-file-ts": { - "version": "0.2.8-rc1", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", - "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", - "license": "MIT", - "dependencies": { - "glob": "^10.3.12", - "typescript": "^5.4.3" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "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" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/config-file-ts/node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -15077,10 +15755,9 @@ } }, "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "optional": true, "peer": true, "dependencies": { @@ -15121,7 +15798,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "license": "MIT", "optional": true, "dependencies": { "buffer": "^5.1.0" @@ -15145,7 +15821,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "optional": true, "dependencies": { "base64-js": "^1.3.1", @@ -15164,11 +15839,10 @@ } }, "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true }, "node_modules/create-hash": { "version": "1.2.0", @@ -15266,7 +15940,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", - "license": "MIT", "optional": true, "peer": true }, @@ -15443,10 +16116,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==" }, "node_modules/debug": { "version": "4.3.4", @@ -15543,10 +16215,9 @@ } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", - "license": "MIT", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -15598,7 +16269,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", "engines": { "node": ">=10" } @@ -15640,6 +16310,32 @@ "node": ">=8" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties/node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -15754,11 +16450,16 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "optional": true + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -15879,9 +16580,9 @@ "license": "Apache-2.0" }, "node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "engines": { "node": ">=0.3.1" } @@ -15899,11 +16600,10 @@ } }, "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -15915,7 +16615,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "license": "MIT", "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " @@ -15925,7 +16624,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15935,7 +16633,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15964,14 +16661,12 @@ "license": "MIT" }, "node_modules/dmg-builder": { - "version": "26.0.12", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.0.12.tgz", - "integrity": "sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==", - "license": "MIT", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", "dependencies": { - "app-builder-lib": "26.0.12", - "builder-util": "26.0.11", - "builder-util-runtime": "9.3.1", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -15984,7 +16679,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -15998,7 +16692,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "license": "MIT", "optional": true, "os": [ "darwin" @@ -16188,7 +16881,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -16200,18 +16892,17 @@ } }, "node_modules/electron-builder": { - "version": "26.0.12", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.12.tgz", - "integrity": "sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==", - "license": "MIT", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", "dependencies": { - "app-builder-lib": "26.0.12", - "builder-util": "26.0.11", - "builder-util-runtime": "9.3.1", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", - "dmg-builder": "26.0.12", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" @@ -16225,17 +16916,30 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "26.0.12", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.12.tgz", - "integrity": "sha512-kpwXM7c/ayRUbYVErQbsZ0nQZX4aLHQrPEG9C4h9vuJCXylwFH8a7Jgi2VpKIObzCXO7LKHiCw4KdioFLFOgqA==", - "license": "MIT", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", "peer": true, "dependencies": { - "app-builder-lib": "26.0.12", - "builder-util": "26.0.11", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", "electron-winstaller": "5.4.0" } }, + "node_modules/electron-builder/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -16289,16 +16993,15 @@ } }, "node_modules/electron-publish": { - "version": "26.0.11", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.0.11.tgz", - "integrity": "sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==", - "license": "MIT", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "26.0.11", - "builder-util-runtime": "9.3.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", - "form-data": "^4.0.0", + "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" @@ -16308,7 +17011,6 @@ "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -16317,7 +17019,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -16339,7 +17040,6 @@ "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", "hasInstallScript": true, - "license": "MIT", "peer": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -16359,7 +17059,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -16374,7 +17073,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -16384,7 +17082,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -16424,17 +17121,15 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT" + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16608,6 +17303,12 @@ "node": ">= 0.4" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", @@ -17342,7 +18043,6 @@ "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -17357,18 +18057,17 @@ } }, "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -17607,10 +18306,10 @@ } }, "node_modules/expo/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "optional": true, "peer": true, "dependencies": { @@ -17680,7 +18379,6 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT", "optional": true }, "node_modules/fast-deep-equal": { @@ -17799,6 +18497,22 @@ "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -17853,7 +18567,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -17862,7 +18575,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -18077,10 +18789,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -18471,7 +19182,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -18646,6 +19356,50 @@ "node": "*" } }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-agent/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -18682,6 +19436,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -18719,7 +19489,6 @@ "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -18902,7 +19671,6 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "license": "MIT", "optional": true, "peer": true }, @@ -18910,7 +19678,6 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -18956,8 +19723,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/http-cache-semantics": { "version": "4.2.0", @@ -18998,7 +19764,6 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -19011,7 +19776,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -19048,6 +19812,7 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", + "optional": true, "dependencies": { "ms": "^2.0.0" } @@ -19072,7 +19837,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "license": "MIT", "optional": true, "os": [ "darwin" @@ -19179,7 +19943,6 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -19207,6 +19970,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -19222,7 +19986,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC" + "optional": true }, "node_modules/inflight": { "version": "1.0.6", @@ -19262,10 +20026,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "license": "MIT", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "engines": { "node": ">= 12" } @@ -19347,18 +20110,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -19436,7 +20187,6 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -19488,7 +20238,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/is-number": { "version": "7.0.0", @@ -19631,10 +20382,9 @@ "license": "MIT" }, "node_modules/isbinaryfile": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz", - "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==", - "license": "MIT", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", "engines": { "node": ">= 18.0.0" }, @@ -19709,7 +20459,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -19724,7 +20473,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", @@ -19739,7 +20487,6 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -19767,7 +20514,6 @@ "version": "10.9.4", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "license": "Apache-2.0", "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", @@ -19783,8 +20529,7 @@ "node_modules/jake/node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/jdenticon": { "version": "3.3.0", @@ -19815,16 +20560,15 @@ } }, "node_modules/jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", - "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", "import-local": "^3.2.0", - "jest-cli": "30.0.5" + "jest-cli": "30.2.0" }, "bin": { "jest": "bin/jest.js" @@ -19842,14 +20586,13 @@ } }, "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "p-limit": "^3.1.0" }, "engines": { @@ -19857,29 +20600,28 @@ } }, "node_modules/jest-circus": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", - "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "p-limit": "^3.1.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -19889,21 +20631,20 @@ } }, "node_modules/jest-cli": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", - "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "yargs": "^17.7.2" }, "bin": { @@ -19922,34 +20663,33 @@ } }, "node_modules/jest-config": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", - "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.0.5", - "@jest/types": "30.0.5", - "babel-jest": "30.0.5", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-circus": "30.0.5", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-runner": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -19974,9 +20714,9 @@ } }, "node_modules/jest-config/node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -19984,17 +20724,16 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-config/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -20015,7 +20754,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20027,37 +20765,34 @@ } }, "node_modules/jest-config/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, - "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, - "license": "MIT", "dependencies": { "detect-newline": "^3.1.0" }, @@ -20066,36 +20801,34 @@ } }, "node_modules/jest-each": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", - "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", - "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5" + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -20113,20 +20846,19 @@ } }, "node_modules/jest-haste-map": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", - "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, @@ -20138,49 +20870,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", - "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "pretty-format": "30.0.5" + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -20189,15 +20918,14 @@ } }, "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "30.0.5" + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -20208,7 +20936,6 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -20232,18 +20959,17 @@ } }, "node_modules/jest-resolve": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", - "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -20252,46 +20978,44 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", - "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, - "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.0.5" + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", - "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/environment": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-leak-detector": "30.0.5", - "jest-message-util": "30.0.5", - "jest-resolve": "30.0.5", - "jest-runtime": "30.0.5", - "jest-util": "30.0.5", - "jest-watcher": "30.0.5", - "jest-worker": "30.0.5", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -20304,39 +21028,37 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/jest-runtime": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", - "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/globals": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -20345,11 +21067,11 @@ } }, "node_modules/jest-runtime/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -20370,7 +21092,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20382,41 +21103,39 @@ } }, "node_modules/jest-runtime/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/jest-snapshot": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", - "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "@jest/snapshot-utils": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.0.5", + "expect": "30.2.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -20425,13 +21144,12 @@ } }, "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -20472,18 +21190,17 @@ } }, "node_modules/jest-validate": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", - "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -20494,7 +21211,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -20503,19 +21219,18 @@ } }, "node_modules/jest-watcher": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", - "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "string-length": "^4.0.2" }, "engines": { @@ -20523,15 +21238,14 @@ } }, "node_modules/jest-worker": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", - "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -20544,7 +21258,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -20695,7 +21408,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/json5": { @@ -20746,26 +21459,76 @@ } }, "node_modules/jsonld-signatures": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/jsonld-signatures/-/jsonld-signatures-11.5.0.tgz", - "integrity": "sha512-Kdto+e8uvY/5u3HYkmAbpy52bplWX9uqS8fmqdCv6oxnCFwCTM0hMt6r4rWqlhw5/aHoCHJIRxwYb4QKGC69Jw==", - "license": "BSD-3-Clause", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/jsonld-signatures/-/jsonld-signatures-11.6.0.tgz", + "integrity": "sha512-hzYNZXnfy4cUFf9aiFBtduUz+cknbfBLWtTKvoqVyP2ECPwqfsfkHWFlhccWfAKV/LJkPLyKZRwC1B4T5LO4ZQ==", "optional": true, "dependencies": { "@digitalbazaar/security-context": "^1.0.0", - "jsonld": "^8.0.0", - "rdf-canonize": "^4.0.1", + "jsonld": "^9.0.0", + "rdf-canonize": "^5.0.0", "serialize-error": "^8.1.0" }, "engines": { "node": ">=18" } }, + "node_modules/jsonld-signatures/node_modules/@digitalbazaar/http-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", + "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "optional": true, + "dependencies": { + "ky": "^1.14.2", + "undici": "^6.23.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/jsonld-signatures/node_modules/jsonld": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-9.0.0.tgz", + "integrity": "sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==", + "optional": true, + "dependencies": { + "@digitalbazaar/http-client": "^4.2.0", + "canonicalize": "^2.1.0", + "lru-cache": "^6.0.0", + "rdf-canonize": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsonld-signatures/node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/jsonld-signatures/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsonld-signatures/node_modules/rdf-canonize": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-4.0.1.tgz", - "integrity": "sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==", - "license": "BSD-3-Clause", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", + "integrity": "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==", "optional": true, "dependencies": { "setimmediate": "^1.0.5" @@ -21067,8 +21830,7 @@ "node_modules/lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "license": "MIT" + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" }, "node_modules/leaflet": { "version": "1.9.4", @@ -21673,7 +22435,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" @@ -22150,10 +22911,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -22524,7 +23284,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -22565,7 +23324,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -22584,37 +23342,37 @@ "license": "ISC" }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "license": "ISC", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", + "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^0.6.2", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 10" } }, "node_modules/make-fetch-happen/node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", + "optional": true, "dependencies": { "debug": "4" }, @@ -22623,12 +23381,12 @@ } }, "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -22640,7 +23398,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", + "optional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -22650,12 +23408,15 @@ } }, "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/makeerror": { @@ -22685,7 +23446,6 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1", @@ -23067,6 +23827,18 @@ "optional": true, "peer": true }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -23091,7 +23863,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, "license": "MIT" }, "node_modules/memoize-one": { @@ -24728,17 +25499,15 @@ } }, "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -24803,7 +25572,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -24886,6 +25654,7 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "license": "ISC", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -24894,20 +25663,20 @@ } }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "license": "MIT", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^3.1.0", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" }, "optionalDependencies": { - "encoding": "^0.1.13" + "encoding": "^0.1.12" } }, "node_modules/minipass-flush": { @@ -24938,7 +25707,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -25067,11 +25835,10 @@ "license": "MIT" }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, - "license": "MIT", "bin": { "napi-postinstall": "lib/cli.js" }, @@ -25144,6 +25911,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", + "optional": true, "engines": { "node": ">= 0.6" } @@ -25179,14 +25947,12 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "license": "MIT", "optional": true }, "node_modules/node-api-version": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", - "license": "MIT", "dependencies": { "semver": "^7.3.5" } @@ -25233,10 +25999,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "optional": true, "peer": true, "engines": { @@ -25294,186 +26059,6 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/node-gyp/node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-gyp/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-gyp/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/node-gyp/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-gyp/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "license": "ISC", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-gyp/node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -25507,54 +26092,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/node-gyp/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/node-gyp/node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/node-gyp/node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "license": "ISC", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/node-html-parser": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", @@ -25581,18 +26118,25 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "license": "ISC", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nopt/node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/normalize-package-data": { @@ -25635,7 +26179,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -25855,9 +26398,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -25997,7 +26539,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -26037,6 +26578,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "devOptional": true, "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -26090,17 +26632,15 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", "dev": true, - "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", + "pbkdf2": "^3.1.5", "safe-buffer": "^5.2.1" }, "engines": { @@ -26120,11 +26660,10 @@ } }, "node_modules/parse-asn1/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true }, "node_modules/parse-entities": { "version": "4.0.2", @@ -26281,58 +26820,25 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", - "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", - "license": "MIT", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "dependencies": { - "create-hash": "~1.1.3", + "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "ripemd160": "=2.0.1", + "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", - "sha.js": "^2.4.11", - "to-buffer": "^1.2.0" + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">=0.12" - } - }, - "node_modules/pbkdf2/node_modules/create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" - } - }, - "node_modules/pbkdf2/node_modules/hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/pbkdf2/node_modules/ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", - "license": "MIT", - "dependencies": { - "hash-base": "^2.0.0", - "inherits": "^2.0.1" + "node": ">= 0.10" } }, "node_modules/pe-library": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", - "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" @@ -26471,7 +26977,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -26484,7 +26989,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -26498,7 +27002,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -26511,7 +27014,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -26527,7 +27029,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -26536,13 +27037,12 @@ } }, "node_modules/playwright": { - "version": "1.54.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz", - "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.54.2" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -26555,11 +27055,10 @@ } }, "node_modules/playwright-core": { - "version": "1.54.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz", - "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", "dev": true, - "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -26573,7 +27072,6 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -26778,7 +27276,6 @@ "version": "1.0.0-alpha.6", "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -26795,7 +27292,6 @@ "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", "optional": true, "peer": true, "engines": { @@ -26882,11 +27378,10 @@ } }, "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -26910,12 +27405,11 @@ } }, "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "license": "ISC", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/process": { @@ -26938,8 +27432,6 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -26959,7 +27451,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC" + "optional": true }, "node_modules/promise-retry": { "version": "2.0.1", @@ -26996,6 +27488,16 @@ "node": ">=6" } }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/protons-runtime": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", @@ -27036,11 +27538,10 @@ } }, "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true }, "node_modules/pump": { "version": "3.0.3", @@ -27065,7 +27566,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -27085,8 +27585,7 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/pvtsutils": { "version": "1.3.6", @@ -27385,7 +27884,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -28138,7 +28636,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -28834,7 +29331,6 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", - "license": "MIT", "dependencies": { "pe-library": "^0.4.1" }, @@ -28871,15 +29367,13 @@ "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -28892,7 +29386,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -28953,7 +29446,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -29021,16 +29513,37 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "node_modules/rimraf/node_modules/balanced-match": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "dev": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -29072,16 +29585,15 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, - "license": "ISC", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -29115,15 +29627,68 @@ } }, "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" } }, + "node_modules/ripemd160/node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/ripemd160/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ripemd160/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/rlp": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", @@ -29136,6 +29701,29 @@ "rlp": "bin/rlp" } }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, "node_modules/rollup": { "version": "4.46.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.4.tgz", @@ -29384,7 +29972,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -29437,10 +30024,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "bin": { "semver": "bin/semver.js" }, @@ -29448,6 +30034,12 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true + }, "node_modules/send": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", @@ -29568,11 +30160,10 @@ } }, "node_modules/serve": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", - "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.5.tgz", + "integrity": "sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA==", "dev": true, - "license": "MIT", "dependencies": { "@zeit/schemas": "2.36.0", "ajv": "8.12.0", @@ -29581,7 +30172,7 @@ "chalk": "5.0.1", "chalk-template": "0.4.0", "clipboardy": "3.0.0", - "compression": "1.7.4", + "compression": "1.8.1", "is-port-reachable": "4.0.0", "serve-handler": "6.1.6", "update-check": "1.5.4" @@ -29824,16 +30415,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/serve/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/serve/node_modules/chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", @@ -29847,35 +30428,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/serve/node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/serve/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -29883,30 +30435,6 @@ "dev": true, "license": "MIT" }, - "node_modules/serve/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/serve/node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -29996,11 +30524,10 @@ "license": "MIT" }, "node_modules/sharp/node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "devOptional": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -30238,7 +30765,6 @@ "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" @@ -30249,10 +30775,10 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "license": "MIT", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -30266,7 +30792,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", + "optional": true, "dependencies": { "debug": "4" }, @@ -30442,15 +30968,15 @@ "license": "MIT" }, "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "license": "ISC", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, "dependencies": { "minipass": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 8" } }, "node_modules/stack-utils": { @@ -30513,7 +31039,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -30608,7 +31133,6 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -30683,7 +31207,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -30779,11 +31302,11 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "devOptional": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -30825,6 +31348,17 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -30937,10 +31471,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -31044,7 +31577,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "license": "MIT", "peer": true, "dependencies": { "mkdirp": "^0.5.1", @@ -31068,7 +31600,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "license": "MIT", "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" @@ -31078,7 +31609,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -31093,7 +31623,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -31318,7 +31847,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", - "license": "MIT", "dependencies": { "semver": "^5.5.0" } @@ -31327,11 +31855,36 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", "bin": { "semver": "bin/semver" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", @@ -31433,7 +31986,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -31459,11 +32011,10 @@ "license": "Apache-2.0" }, "node_modules/ts-jest": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", - "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", @@ -31471,7 +32022,7 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.2", + "semver": "^7.7.3", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -31586,11 +32137,10 @@ "license": "MIT" }, "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "devOptional": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -31734,22 +32284,22 @@ "license": "MIT" }, "node_modules/typeorm": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.26.tgz", - "integrity": "sha512-o2RrBNn3lczx1qv4j+JliVMmtkPSqEGpG0UuZkt9tCfWkoXKu8MZnjvp2GjWPll1SehwemQw6xrbVRhmOglj8Q==", - "license": "MIT", + "version": "0.3.28", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.28.tgz", + "integrity": "sha512-6GH7wXhtfq2D33ZuRXYwIsl/qM5685WZcODZb7noOOcRMteM9KF2x2ap3H0EBjnSV0VO4gNAfJT5Ukp0PkOlvg==", "dependencies": { "@sqltools/formatter": "^1.2.5", - "ansis": "^3.17.0", + "ansis": "^4.2.0", "app-root-path": "^3.1.0", "buffer": "^6.0.3", - "dayjs": "^1.11.13", - "debug": "^4.4.0", - "dedent": "^1.6.0", - "dotenv": "^16.4.7", - "glob": "^10.4.5", - "sha.js": "^2.4.11", - "sql-highlight": "^6.0.0", + "dayjs": "^1.11.19", + "debug": "^4.4.3", + "dedent": "^1.7.0", + "dotenv": "^16.6.1", + "glob": "^10.5.0", + "reflect-metadata": "^0.2.2", + "sha.js": "^2.4.12", + "sql-highlight": "^6.1.0", "tslib": "^2.8.1", "uuid": "^11.1.0", "yargs": "^17.7.2" @@ -31766,19 +32316,18 @@ "url": "https://opencollective.com/typeorm" }, "peerDependencies": { - "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0", + "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@sap/hana-client": "^2.14.22", "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", "ioredis": "^5.0.4", "mongodb": "^5.8.0 || ^6.0.0", - "mssql": "^9.1.1 || ^10.0.1 || ^11.0.1", + "mssql": "^9.1.1 || ^10.0.0 || ^11.0.0 || ^12.0.0", "mysql2": "^2.2.5 || ^3.0.1", "oracledb": "^6.3.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", "redis": "^3.1.1 || ^4.0.0 || ^5.0.14", - "reflect-metadata": "^0.1.14 || ^0.2.0", "sql.js": "^1.4.0", "sqlite3": "^5.0.3", "ts-node": "^10.7.0", @@ -31836,10 +32385,9 @@ } }, "node_modules/typeorm/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { "ms": "^2.1.3" }, @@ -31853,10 +32401,10 @@ } }, "node_modules/typeorm/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -31876,7 +32424,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -31888,10 +32435,9 @@ } }, "node_modules/typeorm/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -31899,8 +32445,12 @@ "node_modules/typeorm/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/typeorm/node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, "node_modules/typeorm/node_modules/tslib": { "version": "2.8.1", @@ -31975,7 +32525,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, "license": "MIT" }, "node_modules/uglify-js": { @@ -32027,12 +32576,10 @@ "license": "Apache-2.0 OR MIT" }, "node_modules/undici": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", - "license": "MIT", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "optional": true, - "peer": true, "engines": { "node": ">=18.17" } @@ -32105,27 +32652,21 @@ } }, "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "license": "ISC", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "unique-slug": "^2.0.0" } }, "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "license": "ISC", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, "dependencies": { "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/unique-string": { @@ -32167,7 +32708,6 @@ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -32265,8 +32805,7 @@ "node_modules/utf8-byte-length": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" }, "node_modules/util-deprecate": { "version": "1.0.2", @@ -32310,7 +32849,6 @@ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -32343,10 +32881,9 @@ } }, "node_modules/validator": { - "version": "13.15.15", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", - "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", - "license": "MIT", + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", "engines": { "node": ">= 0.10" } @@ -32365,7 +32902,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "license": "MIT", "optional": true, "dependencies": { "assert-plus": "^1.0.0", @@ -32377,11 +32913,10 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -32940,60 +33475,16 @@ } }, "node_modules/vue-markdown-render": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vue-markdown-render/-/vue-markdown-render-2.2.1.tgz", - "integrity": "sha512-XkYnC0PMdbs6Vy6j/gZXSvCuOS0787Se5COwXlepRqiqPiunyCIeTPQAO2XnB4Yl04EOHXwLx5y6IuszMWSgyQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vue-markdown-render/-/vue-markdown-render-2.3.0.tgz", + "integrity": "sha512-ZWVVKba8t0tKBlaUGaWmNynIk38gE7Bt3psC/iN2NsqpdGY15VGfBeBvF0A8cEmwHnjNVJo2IzUUqkhhfldhtg==", "dependencies": { - "markdown-it": "^13.0.2" + "markdown-it": "^14.1.0" }, "peerDependencies": { "vue": "^3.3.4" } }, - "node_modules/vue-markdown-render/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/vue-markdown-render/node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/vue-markdown-render/node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/vue-markdown-render/node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/vue-markdown-render/node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, "node_modules/vue-picture-cropper": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/vue-picture-cropper/-/vue-picture-cropper-0.7.0.tgz", @@ -33548,7 +34039,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index b8c0f514..5f36ea8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "1.1.7-beta", + "version": "1.3.3", "description": "Gift Economies Application", "author": { "name": "Gift Economies Team" diff --git a/src/libs/endorserServer.ts b/src/libs/endorserServer.ts index a07711fc..19021857 100644 --- a/src/libs/endorserServer.ts +++ b/src/libs/endorserServer.ts @@ -1263,7 +1263,7 @@ export async function createAndSubmitClaim( }); const errorMessage: string = - serverMessageForUser(error) || + serverMessageForUser(error as unknown as AxiosErrorResponse) || (error && typeof error === "object" && "message" in error ? String(error.message) : undefined) || From 41e50bdf954fa849c8cbba955e6163af69ecb99a Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 21 Feb 2026 17:24:20 -0700 Subject: [PATCH 33/43] bump version and add "-beta" --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8581b404..3017eb91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "1.3.3", + "version": "1.3.5-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "1.3.3", + "version": "1.3.5-beta", "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2", diff --git a/package.json b/package.json index 5f36ea8f..1298dfe6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "1.3.3", + "version": "1.3.5-beta", "description": "Gift Economies Application", "author": { "name": "Gift Economies Team" From e7e283080724a0de86da9277b650f943fdd308e0 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 22 Feb 2026 15:40:21 -0700 Subject: [PATCH 34/43] toggle embeddings on list screen, distinguish between empty profile description and hidden profile --- src/views/ContactProfileCheckView.vue | 299 +++++++++++++++++++++++--- src/views/ContactsView.vue | 34 +-- 2 files changed, 291 insertions(+), 42 deletions(-) diff --git a/src/views/ContactProfileCheckView.vue b/src/views/ContactProfileCheckView.vue index 6145a26b..02a45dde 100644 --- a/src/views/ContactProfileCheckView.vue +++ b/src/views/ContactProfileCheckView.vue @@ -37,6 +37,59 @@ />
    +
    +
    +
    +
    + {{ fullyReadyCount }} + of {{ contactResults.length }} + {{ contactResults.length === 1 ? "contact" : "contacts" }} + fully ready +
    +
      +
    • + {{ + blankProfileCount + }} + {{ blankProfileCount === 1 ? "profile" : "profiles" }} with + blank description +
    • +
    • + {{ + noProfileOrHiddenCount + }} + no profile or not visible +
    • +
    • + {{ + noEmbeddingOrHiddenCount + }} + no embedding or not visible +
    • +
    • + {{ errorCount }} + {{ errorCount === 1 ? "check" : "checks" }} failed +
    • +
    +
    + +
    +
    +
    • - + + + + Has profile + + Has profile with blank description + - No profile + No profile or not visible {{ result.profileDescription }}
    + +
    + + + Embedding: + {{ + (result.embeddingMetadata?.generateEmbedding ?? false) + ? "On" + : "Off" + }} + (saving…) + +
    - -
    -

    Summary

    -
    -
    - {{ profileCount }} - {{ profileCount === 1 ? "contact has" : "contacts have" }} a profile -
    -
    - {{ noProfileCount }} - {{ noProfileCount === 1 ? "contact has" : "contacts have" }} no - profile or it's not visible to you -
    -
    - {{ errorCount }} - {{ errorCount === 1 ? "check" : "checks" }} failed -
    -
    -
    @@ -166,11 +268,23 @@ import { logger } from "../utils/logger"; import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; +interface EmbeddingMetadata { + generateEmbedding: boolean; + isForEmptyString: boolean; +} + interface ContactCheckResult { did: string; name: string; - status: "pending" | "checking" | "has-profile" | "no-profile" | "error"; + status: + | "pending" + | "checking" + | "has-profile" + | "blank-profile" + | "no-profile" + | "error"; profileDescription?: string; + embeddingMetadata?: EmbeddingMetadata | null; error?: string; } @@ -186,12 +300,13 @@ export default class ContactProfileCheckView extends Vue { $notify!: (notification: NotificationIface, timeout?: number) => void; $route!: RouteLocationNormalizedLoaded; $router!: Router; - notify!: ReturnType; activeDid = ""; partnerApiServer = DEFAULT_PARTNER_API_SERVER; contactResults: ContactCheckResult[] = []; + embeddingSavingDids: Set = new Set(); + isRefreshing = false; created() { this.notify = createNotifyHelpers(this.$notify); @@ -271,7 +386,12 @@ export default class ContactProfileCheckView extends Vue { return this.contactResults.filter((r) => r.status === "has-profile").length; } - get noProfileCount(): number { + get blankProfileCount(): number { + return this.contactResults.filter((r) => r.status === "blank-profile") + .length; + } + + get noProfileOrHiddenCount(): number { return this.contactResults.filter((r) => r.status === "no-profile").length; } @@ -279,6 +399,24 @@ export default class ContactProfileCheckView extends Vue { return this.contactResults.filter((r) => r.status === "error").length; } + get noEmbeddingOrHiddenCount(): number { + return this.contactResults.filter( + (r) => + r.status !== "pending" && + r.status !== "checking" && + !r.embeddingMetadata?.generateEmbedding, + ).length; + } + + get fullyReadyCount(): number { + return this.contactResults.filter( + (r) => + r.status === "has-profile" && + r.embeddingMetadata?.generateEmbedding && + !r.embeddingMetadata?.isForEmptyString, + ).length; + } + private async runChecks() { if (!this.activeDid) { this.notify.error("No active identity.", TIMEOUTS.LONG); @@ -300,6 +438,8 @@ export default class ContactProfileCheckView extends Vue { if (data && data.description) { this.contactResults[i].status = "has-profile"; this.contactResults[i].profileDescription = data.description; + } else if (data && typeof data.description === "string") { + this.contactResults[i].status = "blank-profile"; } else { this.contactResults[i].status = "no-profile"; } @@ -320,6 +460,32 @@ export default class ContactProfileCheckView extends Vue { } } + try { + const headers = await getHeaders(this.activeDid); + const embUrl = + `${this.partnerApiServer}/api/partner/userProfileEmbeddingMetadata/` + + encodeURIComponent(this.contactResults[i].did); + const embResponse = await this.axios.get(embUrl, { headers }); + const embData = embResponse.data?.data; + if (embData && typeof embData.generateEmbedding === "boolean") { + this.contactResults[i].embeddingMetadata = { + generateEmbedding: embData.generateEmbedding, + isForEmptyString: !!embData.isForEmptyString, + }; + } else { + this.contactResults[i].embeddingMetadata = null; + } + } catch (embErr: unknown) { + const axiosErr = embErr as { response?: { status?: number } }; + if (axiosErr.response?.status !== 404) { + logger.error( + `Failed to load embedding metadata for ${this.contactResults[i].did}:`, + embErr, + ); + } + this.contactResults[i].embeddingMetadata = null; + } + this.contactResults = [...this.contactResults]; } @@ -333,6 +499,89 @@ export default class ContactProfileCheckView extends Vue { } } + async refreshChecks() { + this.isRefreshing = true; + for (let i = 0; i < this.contactResults.length; i++) { + this.contactResults[i].status = "pending"; + this.contactResults[i].profileDescription = undefined; + this.contactResults[i].embeddingMetadata = undefined; + this.contactResults[i].error = undefined; + } + this.contactResults = [...this.contactResults]; + await this.runChecks(); + this.isRefreshing = false; + } + + async toggleEmbedding(did: string) { + const idx = this.contactResults.findIndex((r) => r.did === did); + if (idx === -1 || !this.activeDid) return; + + const current = + this.contactResults[idx].embeddingMetadata?.generateEmbedding ?? false; + const newValue = !current; + + this.embeddingSavingDids = new Set(this.embeddingSavingDids).add(did); + try { + const headers = await getHeaders(this.activeDid); + const url = + `${this.partnerApiServer}/api/partner/userProfileGenerateEmbedding/` + + encodeURIComponent(did); + await this.axios.put(url, { generateEmbedding: newValue }, { headers }); + + try { + const embUrl = + `${this.partnerApiServer}/api/partner/userProfileEmbeddingMetadata/` + + encodeURIComponent(did); + const embResponse = await this.axios.get(embUrl, { headers }); + const embData = embResponse.data?.data; + if (embData && typeof embData.generateEmbedding === "boolean") { + this.contactResults[idx].embeddingMetadata = { + generateEmbedding: embData.generateEmbedding, + isForEmptyString: !!embData.isForEmptyString, + }; + } + } catch (refreshErr) { + logger.error( + "Failed to refresh embedding metadata", + !newValue + ? "- where a 404 is expected when embedding is turned off:" + : ":", + refreshErr, + ); + this.contactResults[idx].embeddingMetadata = { + generateEmbedding: newValue, + isForEmptyString: + this.contactResults[idx].embeddingMetadata?.isForEmptyString ?? + true, + }; + } + this.contactResults = [...this.contactResults]; + + this.notify.success( + newValue + ? "Embedding generation enabled." + : "Embedding generation disabled.", + TIMEOUTS.STANDARD, + ); + } catch (err: unknown) { + const error = (err as { response?: { data?: { error?: string } } }) + ?.response?.data?.error; + if (error) { + this.notify.error(error, TIMEOUTS.LONG); + } else { + logger.error("Failed to update generate-embedding flag:", err); + this.notify.error( + "Failed to update embedding flag. Try again.", + TIMEOUTS.LONG, + ); + } + } finally { + const updated = new Set(this.embeddingSavingDids); + updated.delete(did); + this.embeddingSavingDids = updated; + } + } + goBack() { this.$router.back(); } diff --git a/src/views/ContactsView.vue b/src/views/ContactsView.vue index e1d2df82..c4f3773d 100644 --- a/src/views/ContactsView.vue +++ b/src/views/ContactsView.vue @@ -127,23 +127,6 @@
    - -
    - - -
    -
      + +
      + + +
      + Date: Sun, 22 Feb 2026 15:42:53 -0700 Subject: [PATCH 35/43] fix error on mobile startup with SQL for contacts foreign key --- src/db-sql/migration.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/db-sql/migration.ts b/src/db-sql/migration.ts index 2ca700e9..052b3bdc 100644 --- a/src/db-sql/migration.ts +++ b/src/db-sql/migration.ts @@ -251,7 +251,8 @@ const MIGRATIONS = [ DROP TABLE contacts; ALTER TABLE _contacts_backup_008 RENAME TO contacts; - CREATE INDEX IF NOT EXISTS idx_contacts_did ON contacts(did); + -- UNIQUE is important on 'did' because the foreign key from contact_labels fails on mobile without it. + CREATE UNIQUE INDEX IF NOT EXISTS idx_contacts_did ON contacts(did); CREATE INDEX IF NOT EXISTS idx_contacts_name ON contacts(name); CREATE TABLE contact_labels ( From 47ead0ced2d4efddf6e4614a822d4f5dc2feb82e Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sun, 22 Feb 2026 16:05:24 -0700 Subject: [PATCH 36/43] add better support info when there's an error on startup --- src/constants/app.ts | 2 ++ src/router/index.ts | 12 ++++++++ src/views/DeepLinkErrorView.vue | 3 +- src/views/HelpView.vue | 8 +++--- src/views/StartView.vue | 49 ++++++++++++++++++++++++++++++--- 5 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/constants/app.ts b/src/constants/app.ts index 89276dbc..d60da0e9 100644 --- a/src/constants/app.ts +++ b/src/constants/app.ts @@ -49,6 +49,8 @@ export const DEFAULT_PUSH_SERVER = export const IMAGE_TYPE_PROFILE = "profile"; +export const SUPPORT_EMAIL = "info@TimeSafari.app"; + export const PASSKEYS_ENABLED = !!import.meta.env.VITE_PASSKEYS_ENABLED || false; diff --git a/src/router/index.ts b/src/router/index.ts index 6fcca363..0f00ceb4 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -412,6 +412,18 @@ router.beforeEach(async (to, _from, next) => { timestamp: new Date().toISOString(), }); + // Store error details so StartView can display them + const errorMessage = error instanceof Error ? error.message : String(error); + const errorStack = error instanceof Error ? error.stack || "" : ""; + try { + sessionStorage.setItem( + "startupError", + JSON.stringify({ message: errorMessage, stack: errorStack }), + ); + } catch { + // sessionStorage may be unavailable + } + // Redirect to start page if identity creation fails // This allows users to manually create an identity or troubleshoot logger.info( diff --git a/src/views/DeepLinkErrorView.vue b/src/views/DeepLinkErrorView.vue index 57bbd00c..e0385cd8 100644 --- a/src/views/DeepLinkErrorView.vue +++ b/src/views/DeepLinkErrorView.vue @@ -59,6 +59,7 @@ import { } from "../interfaces/deepLinks"; import { logConsoleAndDb } from "../db/databaseUtil"; import { logger } from "../utils/logger"; +import { SUPPORT_EMAIL } from "../constants/app"; const route = useRoute(); const router = useRouter(); @@ -105,7 +106,7 @@ const goHome = () => router.replace({ name: "home" }); const reportIssue = () => { // Open a support form or email window.open( - "mailto:support@timesafari.app?subject=Invalid Deep Link&body=" + + `mailto:${SUPPORT_EMAIL}?subject=Invalid Deep Link&body=` + encodeURIComponent( `I encountered an error with a deep link: timesafari://${originalPath.value}\nError: ${errorMessage.value}`, ), diff --git a/src/views/HelpView.vue b/src/views/HelpView.vue index d48b6272..ac2aa9d6 100644 --- a/src/views/HelpView.vue +++ b/src/views/HelpView.vue @@ -552,8 +552,8 @@

      Contact us at - info@TimeSafari.app{{ SUPPORT_EMAIL }}

      @@ -591,7 +591,7 @@ import { copyToClipboard } from "../services/ClipboardService"; import * as Package from "../../package.json"; import QuickNav from "../components/QuickNav.vue"; -import { APP_SERVER, NotificationIface } from "../constants/app"; +import { APP_SERVER, NotificationIface, SUPPORT_EMAIL } from "../constants/app"; import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { QRNavigationService } from "@/services/QRNavigationService"; import { UNNAMED_ENTITY_NAME } from "@/constants/entities"; @@ -643,7 +643,7 @@ export default class HelpView extends Vue { showVerifiable = false; APP_SERVER = APP_SERVER; - // Capacitor reference removed - using QRNavigationService instead + SUPPORT_EMAIL = SUPPORT_EMAIL; /** * Initialize notification helpers diff --git a/src/views/StartView.vue b/src/views/StartView.vue index e6871cae..613fdee0 100644 --- a/src/views/StartView.vue +++ b/src/views/StartView.vue @@ -26,6 +26,31 @@
    + +
    +

    Startup Error

    +

    + The app encountered a critical error during startup. This is often + caused by a database problem. Please send the details below to + {{ + SUPPORT_EMAIL + }} + so we can help resolve it. +

    +
    + + Error details + +
    {{ startupError }}
    +
    +
    +
    @@ -139,7 +164,7 @@ import { Component, Vue } from "vue-facing-decorator"; import { Router } from "vue-router"; -import { AppString, PASSKEYS_ENABLED } from "../constants/app"; +import { AppString, PASSKEYS_ENABLED, SUPPORT_EMAIL } from "../constants/app"; import { PlatformServiceMixin } from "../utils/PlatformServiceMixin"; import { logger } from "../utils/logger"; @@ -157,10 +182,12 @@ export default class StartView extends Vue { // Feature flags and application constants PASSKEYS_ENABLED = PASSKEYS_ENABLED; + SUPPORT_EMAIL = SUPPORT_EMAIL; // Component state for identity generation givenName = ""; numAccounts = 0; + startupError = ""; /** * Computed property for primary action button styling @@ -201,11 +228,26 @@ export default class StartView extends Vue { */ async mounted() { try { - // Load user settings using platform service + const raw = sessionStorage.getItem("startupError"); + if (raw) { + sessionStorage.removeItem("startupError"); + try { + const parsed = JSON.parse(raw); + const parts = [parsed.message, parsed.stack].filter(Boolean); + this.startupError = parts.length > 0 ? parts.join("\n\n") : raw; + logger.error("[StartView] Displaying startup error to user", parsed); + } catch { + this.startupError = raw; + } + } + } catch { + // sessionStorage or JSON parse may fail; non-critical + } + + try { const settings = await this.$accountSettings(); this.givenName = settings.firstName || ""; - // Load account count for display logic this.numAccounts = await retrieveAccountCount(); logger.debug("[StartView] Component mounted", { @@ -215,7 +257,6 @@ export default class StartView extends Vue { }); } catch (error) { logger.error("[StartView] Failed to load initialization data", error); - // Continue with default behavior if settings load fails this.givenName = ""; this.numAccounts = 0; } From cbd71b7efd9d79597d92f473fcb270b749a7b02a Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Tue, 24 Feb 2026 19:51:48 -0700 Subject: [PATCH 37/43] bump to v 1.3.5, and fix some web help links --- BUILDING.md | 6 +++--- CHANGELOG.md | 9 ++++++++- android/app/build.gradle | 4 ++-- ios/App/App.xcodeproj/project.pbxproj | 16 ++++++++-------- package-lock.json | 4 ++-- package.json | 2 +- src/views/StartView.vue | 7 ++----- 7 files changed, 26 insertions(+), 22 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 4bc43781..71a7393c 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1140,7 +1140,7 @@ export GEM_PATH=$shortened_path ##### 1. Bump the version in package.json & CHANGELOG.md for `MARKETING_VERSION`, then `grep CURRENT_PROJECT_VERSION ios/App/App.xcodeproj/project.pbxproj` and add 1 for the numbered version here: ```bash -cd ios/App && xcrun agvtool new-version 57 && perl -p -i -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 1.3.3;/g" App.xcodeproj/project.pbxproj && cd - +cd ios/App && xcrun agvtool new-version 58 && perl -p -i -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 1.3.5;/g" App.xcodeproj/project.pbxproj && cd - # Unfortunately this edits Info.plist directly. #xcrun agvtool new-marketing-version 0.4.5 ``` @@ -1298,8 +1298,8 @@ The recommended way to build for Android is using the automated build script: ##### 1. Bump the version in package.json, then update these versions & run: ```bash -perl -p -i -e 's/versionCode .*/versionCode 57/g' android/app/build.gradle -perl -p -i -e 's/versionName .*/versionName "1.3.3"/g' android/app/build.gradle +perl -p -i -e 's/versionCode .*/versionCode 58/g' android/app/build.gradle +perl -p -i -e 's/versionName .*/versionName "1.3.5"/g' android/app/build.gradle ``` ##### 2. Build diff --git a/CHANGELOG.md b/CHANGELOG.md index bfec8932..f33a560a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.3.3] - 2026 +## [1.3.5] - 2026.02.22 +### Fixed +- SQL error on startup (contact_labels -> contacts foreign key) +### Added +- Ability to toggle embeddings on list of contacts + + +## [1.3.3] - 2026.02.17 ### Added - People can be marked as vector-embeddings users. - People can be matched during a meeting. diff --git a/android/app/build.gradle b/android/app/build.gradle index a62c9080..5f6d32f7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -31,8 +31,8 @@ android { applicationId "app.timesafari.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 57 - versionName "1.3.3" + versionCode 58 + versionName "1.3.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 6e8ff2bc..5eaba331 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -524,7 +524,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 57; + CURRENT_PROJECT_VERSION = 58; DEVELOPMENT_TEAM = GM3FS5JQPH; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -534,7 +534,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3.3; + MARKETING_VERSION = 1.3.5; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -552,7 +552,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 57; + CURRENT_PROJECT_VERSION = 58; DEVELOPMENT_TEAM = GM3FS5JQPH; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -562,7 +562,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3.3; + MARKETING_VERSION = 1.3.5; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; @@ -580,7 +580,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = TimeSafariShareExtension/TimeSafariShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 57; + CURRENT_PROJECT_VERSION = 58; DEVELOPMENT_TEAM = GM3FS5JQPH; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -594,7 +594,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.3.3; + MARKETING_VERSION = 1.3.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.TimeSafariShareExtension; @@ -618,7 +618,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = TimeSafariShareExtension/TimeSafariShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 57; + CURRENT_PROJECT_VERSION = 58; DEVELOPMENT_TEAM = GM3FS5JQPH; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -632,7 +632,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.3.3; + MARKETING_VERSION = 1.3.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.TimeSafariShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 3017eb91..b69af4a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "1.3.5-beta", + "version": "1.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "1.3.5-beta", + "version": "1.3.5", "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2", diff --git a/package.json b/package.json index 1298dfe6..634f3849 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "1.3.5-beta", + "version": "1.3.5", "description": "Gift Economies Application", "author": { "name": "Gift Economies Team" diff --git a/src/views/StartView.vue b/src/views/StartView.vue index 613fdee0..f012cbb1 100644 --- a/src/views/StartView.vue +++ b/src/views/StartView.vue @@ -60,10 +60,7 @@

    A passkey is easy to manage, though it is less interoperable with other systems for advanced uses. - +

    @@ -71,7 +68,7 @@ A new seed allows you full control over the keys, though you are responsible for backups. From 3c657848c5396710fa6c50d3b1ca338e19cc9d46 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Tue, 24 Feb 2026 19:56:16 -0700 Subject: [PATCH 38/43] bump version and add "-beta" --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b69af4a7..97ad91e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "1.3.5", + "version": "1.3.7-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "1.3.5", + "version": "1.3.7-beta", "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2", diff --git a/package.json b/package.json index 634f3849..bb890479 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "1.3.5", + "version": "1.3.7-beta", "description": "Gift Economies Application", "author": { "name": "Gift Economies Team" From a45f605c5fe0b4ea0173a05841bb60f6ba9e25bb Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 2 Mar 2026 18:57:53 -0700 Subject: [PATCH 39/43] ensure contact import from deep-link or paste all act consistently --- .env.development | 7 +- src/libs/contactImportPayload.ts | 155 +++++++++++++++++++++++++++++++ src/views/ContactImportView.vue | 84 ++++++++++------- src/views/ContactsView.vue | 94 ++++++++++--------- 4 files changed, 258 insertions(+), 82 deletions(-) create mode 100644 src/libs/contactImportPayload.ts diff --git a/.env.development b/.env.development index 726f3b7a..40b221fe 100644 --- a/.env.development +++ b/.env.development @@ -6,10 +6,13 @@ VITE_LOG_LEVEL=debug # iOS doesn't like spaces in the app title. TIME_SAFARI_APP_TITLE="TimeSafari_Dev" VITE_APP_SERVER=http://localhost:8080 -# This is the claim ID for actions in the BVC project, with the JWT ID on this environment (not - +# This is the claim ID for actions in the BVC project, with the JWT ID on the environment +# test server VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01HWE8FWHQ1YGP7GFZYYPS272F +# production server +#VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01GXYPFF7FA03NXKPYY142PY4H + VITE_DEFAULT_ENDORSER_API_SERVER=http://localhost:3000 # Using shared server by default to ease setup, which works for shared test users. VITE_DEFAULT_IMAGE_API_SERVER=https://test-image-api.timesafari.app diff --git a/src/libs/contactImportPayload.ts b/src/libs/contactImportPayload.ts new file mode 100644 index 00000000..54b56965 --- /dev/null +++ b/src/libs/contactImportPayload.ts @@ -0,0 +1,155 @@ +import { Contact } from "../db/tables/contacts"; +import { getContactJwtFromJwtUrl } from "./crypto"; +import { decodeEndorserJwt } from "./crypto/vc"; + +export type ContactImportParseErrorCode = + | "not_contact_import_format" + | "truncated_data" + | "invalid_jwt" + | "unsupported_payload"; + +export type ContactImportParseResult = + | { + kind: "single"; + jwt: string; + contact: Contact; + } + | { + kind: "multi"; + jwt: string; + contacts: Contact[]; + } + | { + kind: "error"; + code: ContactImportParseErrorCode; + message: string; + }; + +function mapSingleContact(payload: Record): Contact | null { + const own = payload.own as Record | undefined; + if (!own || typeof own !== "object") { + return null; + } + + const didFromOwn = typeof own.did === "string" ? own.did : undefined; + const didFromIss = typeof payload.iss === "string" ? payload.iss : undefined; + const did = didFromOwn || didFromIss; + if (!did) { + return null; + } + + const contact: Contact = { + did, + name: typeof own.name === "string" ? own.name : undefined, + registered: Boolean(own.registered), + }; + + const nextPubKeyHashB64 = + (typeof own.nextPublicEncKeyHash === "string" && + own.nextPublicEncKeyHash) || + (typeof own.nextPubKeyHashB64 === "string" && own.nextPubKeyHashB64) || + undefined; + if (nextPubKeyHashB64) { + contact.nextPubKeyHashB64 = nextPubKeyHashB64; + } + + const publicKeyBase64 = + (typeof own.publicEncKey === "string" && own.publicEncKey) || + (typeof own.publicKeyBase64 === "string" && own.publicKeyBase64) || + undefined; + if (publicKeyBase64) { + contact.publicKeyBase64 = publicKeyBase64; + } + + if (typeof own.profileImageUrl === "string" && own.profileImageUrl) { + contact.profileImageUrl = own.profileImageUrl; + } + + return contact; +} + +export function parseContactImportInput( + rawInput: string, +): ContactImportParseResult { + const input = rawInput.trim(); + if (!input) { + return { + kind: "error", + code: "not_contact_import_format", + message: "No contact import data was found in that input.", + }; + } + + const looksLikeJwt = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/.test( + input, + ); + const hasContactHint = + input.includes("/contact-import") || + input.includes("contactJwt=") || + input.includes("/contact?jwt="); + + if ( + input.endsWith("contact-import") || + input.endsWith("contact-import/") || + input.endsWith("/deep-link") + ) { + return { + kind: "error", + code: "truncated_data", + message: + "That is only part of the contact-import data; it's missing data at the end. Try another way to get the full data.", + }; + } + + if (!hasContactHint && !looksLikeJwt) { + return { + kind: "error", + code: "not_contact_import_format", + message: "No contact import data was found in that input.", + }; + } + + const jwt = getContactJwtFromJwtUrl(input); + if (!jwt) { + return { + kind: "error", + code: "invalid_jwt", + message: + "That contact-import data could not be decoded. Ask for a fresh link or QR code.", + }; + } + + try { + const payload = decodeEndorserJwt(jwt).payload as Record; + if (Array.isArray(payload.contacts)) { + return { + kind: "multi", + jwt, + contacts: payload.contacts as Contact[], + }; + } + + const singleContact = mapSingleContact(payload); + if (singleContact) { + return { + kind: "single", + jwt, + contact: singleContact, + }; + } + } catch (_error) { + return { + kind: "error", + code: "invalid_jwt", + message: + "That contact-import data could not be decoded. Ask for a fresh link or QR code.", + }; + } + + return { + kind: "error", + code: "unsupported_payload", + message: + "That contact-import format is not supported yet. Ask the sender to share again.", + }; +} diff --git a/src/views/ContactImportView.vue b/src/views/ContactImportView.vue index 9164f87f..79f83fb0 100644 --- a/src/views/ContactImportView.vue +++ b/src/views/ContactImportView.vue @@ -291,7 +291,7 @@ import { RouteLocationNormalizedLoaded, Router } from "vue-router"; import QuickNav from "../components/QuickNav.vue"; import EntityIcon from "../components/EntityIcon.vue"; import OfferDialog from "../components/OfferDialog.vue"; -import { APP_SERVER, AppString, NotificationIface } from "../constants/app"; +import { AppString, NotificationIface } from "../constants/app"; import { Contact, ContactWithLabels, @@ -303,8 +303,7 @@ import { errorStringForLog, setVisibilityUtil, } from "../libs/endorserServer"; -import { getContactJwtFromJwtUrl } from "../libs/crypto"; -import { decodeEndorserJwt } from "../libs/crypto/vc"; +import { parseContactImportInput } from "../libs/contactImportPayload"; import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; import { ContactLabel } from "@/db/tables/contactLabels"; @@ -495,27 +494,29 @@ export default class ContactImportView extends Vue { * Processes JWT from URL path and handles different JWT formats */ private async processJwtFromPath() { - // JWT tokens always start with 'ey' (base64url encoded header) - const JWT_PATTERN = /\/contact-import\/(ey.+)$/; - const jwt = window.location.pathname.match(JWT_PATTERN)?.[1]; + const parsedImport = parseContactImportInput(window.location.pathname); + if (parsedImport.kind === "error") { + return; + } - if (jwt) { - const parsedJwt = decodeEndorserJwt(jwt); - const contacts: Array = - parsedJwt.payload.contacts || - (Array.isArray(parsedJwt.payload) ? parsedJwt.payload : undefined); + if (parsedImport.kind === "single") { + this.$router.push({ + name: "contacts", + query: { contactJwt: parsedImport.jwt }, + }); + return; + } - if (!contacts && parsedJwt.payload.own) { - this.$router.push({ - name: "contacts", - query: { contactJwt: jwt }, - }); - return; - } + if (parsedImport.contacts.length === 1) { + this.$router.push({ + name: "contacts", + query: { contactJwt: parsedImport.jwt }, + }); + return; + } - if (contacts) { - await this.setContactsSelected(contacts); - } + if (parsedImport.contacts.length > 0) { + await this.setContactsSelected(parsedImport.contacts); } } @@ -595,16 +596,12 @@ export default class ContactImportView extends Vue { * @param jwtInput JWT string to validate */ async checkContactJwt(jwtInput: string) { + const parsedImport = parseContactImportInput(jwtInput); if ( - jwtInput.endsWith(APP_SERVER) || - jwtInput.endsWith(APP_SERVER + "/") || - jwtInput.endsWith("contact-import") || - jwtInput.endsWith("contact-import/") + parsedImport.kind === "error" && + parsedImport.code === "truncated_data" ) { - this.notify.error( - "That is only part of the contact-import data; it's missing data at the end. Try another way to get the full data.", - TIMEOUTS.LONG, - ); + this.notify.error(parsedImport.message, TIMEOUTS.LONG); } } @@ -616,14 +613,29 @@ export default class ContactImportView extends Vue { this.checkingImports = true; try { - const jwt: string = getContactJwtFromJwtUrl(jwtInput) || ""; - const payload = decodeEndorserJwt(jwt).payload; - - if (Array.isArray(payload.contacts)) { - await this.setContactsSelected(payload.contacts); - } else { - throw new Error("Invalid contact-import JWT or URL: " + jwtInput); + const parsedImport = parseContactImportInput(jwtInput); + if (parsedImport.kind === "error") { + this.notify.error(parsedImport.message, TIMEOUTS.STANDARD); + return; } + + if (parsedImport.kind === "single") { + await this.$router.push({ + name: "contacts", + query: { contactJwt: parsedImport.jwt }, + }); + return; + } + + if (parsedImport.contacts.length === 1) { + await this.$router.push({ + name: "contacts", + query: { contactJwt: parsedImport.jwt }, + }); + return; + } + + await this.setContactsSelected(parsedImport.contacts); } catch (error) { const fullError = "Error importing contacts: " + errorStringForLog(error); this.$logAndConsole(fullError, true); diff --git a/src/views/ContactsView.vue b/src/views/ContactsView.vue index c4f3773d..87cf90e9 100644 --- a/src/views/ContactsView.vue +++ b/src/views/ContactsView.vue @@ -223,8 +223,11 @@ import LargeIdenticonModal from "../components/LargeIdenticonModal.vue"; import { AppString, NotificationIface } from "../constants/app"; // Legacy logging import removed - using PlatformServiceMixin methods import { Contact } from "../db/tables/contacts"; -import { getContactJwtFromJwtUrl } from "../libs/crypto"; import { decodeEndorserJwt } from "../libs/crypto/vc"; +import { + parseContactImportInput, + ContactImportParseResult, +} from "../libs/contactImportPayload"; import { CONTACT_CSV_HEADER, createEndorserJwtForDid, @@ -233,15 +236,8 @@ import { isDid, register, setVisibilityUtil, - CONTACT_IMPORT_CONFIRM_URL_PATH_TIME_SAFARI, - CONTACT_IMPORT_ONE_URL_PATH_TIME_SAFARI, - CONTACT_URL_PATH_ENDORSER_CH_OLD, } from "../libs/endorserServer"; -import { - GiveSummaryRecord, - UserInfo, - VerifiableCredential, -} from "@/interfaces"; +import { GiveSummaryRecord, VerifiableCredential } from "@/interfaces"; import * as libsUtil from "../libs/util"; import { generateSaveAndActivateIdentity } from "../libs/util"; import { logger } from "../utils/logger"; @@ -416,20 +412,8 @@ export default class ContactsView extends Vue { // because that will do better error checking for things like missing data on iOS platforms. const importedContactJwt = this.$route.query["contactJwt"] as string; if (importedContactJwt) { - // really should fully verify contents - const { payload } = decodeEndorserJwt(importedContactJwt); - const userInfo = payload["own"] as UserInfo; - const newContact = { - did: userInfo.did || payload["iss"], // ".did" is reliable as of v 0.3.49 - name: userInfo.name, - nextPubKeyHashB64: userInfo.nextPublicEncKeyHash, - profileImageUrl: userInfo.profileImageUrl, - publicKeyBase64: userInfo.publicEncKey, - registered: userInfo.registered, - } as Contact; - await this.addContact(newContact); - // if we're here, they haven't redirected anywhere, so we'll redirect here without a query parameter - this.$router.push({ path: "/contacts" }); + const parsedImport = parseContactImportInput(importedContactJwt); + await this.handleParsedContactImport(parsedImport); } } @@ -787,7 +771,7 @@ export default class ContactsView extends Vue { } // Try different parsing methods in order - if (await this.tryParseJwtContact(contactInput)) return; + if (await this.tryParseContactImport(contactInput)) return; if (await this.tryParseCsvContacts(contactInput)) return; if (await this.tryParseDidContact(contactInput)) return; if (await this.tryParseJsonContacts(contactInput)) return; @@ -799,29 +783,51 @@ export default class ContactsView extends Vue { /** * Parse contact from JWT URL format */ - private async tryParseJwtContact(contactInput: string): Promise { + private async tryParseContactImport(contactInput: string): Promise { + const parsedImport = parseContactImportInput(contactInput); if ( - contactInput.includes(CONTACT_IMPORT_CONFIRM_URL_PATH_TIME_SAFARI) || - contactInput.includes(CONTACT_IMPORT_ONE_URL_PATH_TIME_SAFARI) || - contactInput.includes(CONTACT_URL_PATH_ENDORSER_CH_OLD) + parsedImport.kind === "error" && + parsedImport.code === "not_contact_import_format" ) { - const jwt = getContactJwtFromJwtUrl(contactInput); - if (jwt) { - const { payload } = decodeEndorserJwt(jwt); - const userInfo = payload["own"] as UserInfo; - const newContact = { - did: userInfo.did || payload["iss"], - name: userInfo.name, - nextPubKeyHashB64: userInfo.nextPublicEncKeyHash, - profileImageUrl: userInfo.profileImageUrl, - publicKeyBase64: userInfo.publicEncKey, - registered: userInfo.registered, - } as Contact; - await this.addContact(newContact); - return true; - } + return false; } - return false; + await this.handleParsedContactImport(parsedImport); + return true; + } + + private async handleParsedContactImport( + parsedImport: ContactImportParseResult, + ): Promise { + if (parsedImport.kind === "error") { + this.notify.error(parsedImport.message, TIMEOUTS.LONG); + return; + } + + if (parsedImport.kind === "single") { + await this.addOrEditImportedContact(parsedImport.contact); + return; + } + + if (parsedImport.contacts.length === 1) { + await this.addOrEditImportedContact(parsedImport.contacts[0]); + return; + } + + await this.$router.push({ + name: "contact-import", + params: { jwt: parsedImport.jwt }, + }); + } + + private async addOrEditImportedContact(contact: Contact): Promise { + const existingContact = await this.$getContact(contact.did); + if (!existingContact) { + await this.addContact(contact); + } + await this.$router.push({ + name: "contact-edit", + params: { did: contact.did }, + }); } /** From 4f89869a8728ad87613929597bf1ff5c239ab041 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 2 Mar 2026 19:23:22 -0700 Subject: [PATCH 40/43] fix & enhance web tests for new contact import functionality --- CHANGELOG.md | 5 ++ test-playwright/40-add-contact.spec.ts | 93 ++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f33a560a..6c222e42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.7] +### Fixed +- Contact deep-links clicked or pasted act consistenly + + ## [1.3.5] - 2026.02.22 ### Fixed - SQL error on startup (contact_labels -> contacts foreign key) diff --git a/test-playwright/40-add-contact.spec.ts b/test-playwright/40-add-contact.spec.ts index 9c7d9b94..691ea7f2 100644 --- a/test-playwright/40-add-contact.spec.ts +++ b/test-playwright/40-add-contact.spec.ts @@ -290,8 +290,8 @@ test('Copy contact to clipboard, then import ', async ({ page, context }, testIn await page.locator('button', { hasText: 'Import' }).click(); await page.goto('./contacts'); - // Copy contact details - await page.getByTestId('contactCheckAllTop').click(); + // Select and copy exactly one contact (single-contact deep link flow) + await page.getByTestId('contactCheckOne').first().click(); const isChromium = await page.evaluate(() => { return navigator.userAgent.includes('Chrome') || navigator.userAgent.includes('Chromium'); @@ -333,8 +333,89 @@ test('Copy contact to clipboard, then import ', async ({ page, context }, testIn await expect(page.locator('div[role="alert"]')).toBeHidden({ timeout: 7000 }); await page.goto(clipboardText); - // we're on the contact-import page - await expect(page.getByRole('heading', { name: "Contact Import" })).toBeVisible(); - // For some reason, Chromium shows 1 contact the same but Firefox shows 4. - await expect(page.locator('span', { hasText: 'the same as' })).toBeVisible(); + // single-contact payload now auto-adds and routes to contact-edit + await expect(page).toHaveURL(/\/contact-edit\//); + await expect(page.getByTestId('contactName').locator('input')).toBeVisible(); +}); + +test('Copied deep link with multiple contacts opens Contact Import', async ({ page, context }, testInfo) => { + await importUser(page, '00'); + + await page.goto('./contacts'); + + // Add contact #111 + await page + .getByPlaceholder('URL or DID, Name, Public Key') + .fill('did:ethr:0x111d15564f824D56C7a07b913aA7aDd03382aA39, User #111'); + await page.locator('button > svg.fa-plus').click(); + await expect(page.getByRole('alert').filter({ hasText: 'Success' })).toBeVisible(); + await page.locator('div[role="alert"] button > svg.fa-xmark').click(); + await expect(page.getByRole('button', { name: 'No', exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'No', exact: true }).click(); + await expect(page.getByRole('button', { name: 'No, Not Yet', exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'No, Not Yet', exact: true }).click(); + await expect(page.locator('div[role="alert"]')).toHaveCount(0); + + // Add contact #222 + await page + .getByPlaceholder('URL or DID, Name, Public Key') + .fill('did:ethr:0x222BB77E6Ff3774d34c751f3c1260866357B677b, User #222'); + await page.locator('button > svg.fa-plus').click(); + await expect(page.getByRole('alert').filter({ hasText: 'Success' })).toBeVisible(); + await page.locator('div[role="alert"] button > svg.fa-xmark').click(); + await expect(page.getByRole('button', { name: 'No', exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'No', exact: true }).click(); + await expect(page.getByRole('button', { name: 'No, Not Yet', exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'No, Not Yet', exact: true }).click(); + await expect(page.locator('div[role="alert"]')).toHaveCount(0); + + const isWebkit = await page.evaluate(() => { + return navigator.userAgent.includes('Macintosh') || navigator.userAgent.includes('iPhone'); + }); + if (isWebkit) { + console.log("Haven't found a way to access clipboard text in Webkit. Skipping."); + return; + } + + const isChromium = await page.evaluate(() => { + return navigator.userAgent.includes('Chrome') || navigator.userAgent.includes('Chromium'); + }); + if (isChromium) { + await context.grantPermissions(['clipboard-read']); + } + + await expect(page.getByTestId('contactListItem')).toHaveCount(2); + await page.getByTestId('contactCheckAllTop').click(); + await page.getByTestId('copySelectedContactsButtonTop').click(); + await page.waitForTimeout(100); + + const clipboardText = await page.evaluate(async () => { + try { + return await navigator.clipboard.readText(); + } catch (error) { + console.error('Clipboard read failed:', error); + return null; + } + }); + + const webServer = testInfo.config.webServer; + const clientServerUrl = webServer?.url; + const PATH_PART = clientServerUrl + '/deep-link/contact-import/'; + await expect(clipboardText).toContain(PATH_PART); + + // Delete one contact so import has at least one new contact + await page.getByTestId('contactListItem').nth(1).locator('h2 > a').click(); + await expect(page.getByRole('heading', { name: 'Identifier Details' })).toBeVisible(); + await page.locator('button > svg.fa-trash-can').click(); + await page.locator('div[role="alert"] button:has-text("Yes")').click(); + await expect(page.locator('div[role="alert"] button:has-text("Yes")')).toBeHidden(); + await page.locator('div[role="alert"] button > svg.fa-xmark').click(); + await page.goto('./contacts'); + await expect(page.getByTestId('contactListItem')).toHaveCount(1); + + await page.goto(clipboardText as string); + await expect(page.getByRole('heading', { name: 'Contact Import' })).toBeVisible(); + await expect(page.locator('button', { hasText: 'Import Contacts' })).toBeVisible(); + await page.locator('button', { hasText: 'Import Contacts' }).click(); + await expect(page.getByTestId('contactListItem')).toHaveCount(2); }); From 41149ad28a9c1cc78f134fa292f8b681b5a22605 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 2 Mar 2026 21:14:02 -0700 Subject: [PATCH 41/43] add a way to copy a list of contacts with a shorter URL --- src/views/ContactImportView.vue | 98 +++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 11 deletions(-) diff --git a/src/views/ContactImportView.vue b/src/views/ContactImportView.vue index 79f83fb0..75d59174 100644 --- a/src/views/ContactImportView.vue +++ b/src/views/ContactImportView.vue @@ -197,16 +197,30 @@ Import Contacts -

    - All those contacts are already in your list with the same information. - -

    +
    +

    + All those contacts are already in your list with the same information. +

    +
    + + + +
    +
    There are no contacts in that import. If some were sent, try again to get the full text and paste it. (Note that iOS cuts off data in text @@ -291,7 +305,8 @@ import { RouteLocationNormalizedLoaded, Router } from "vue-router"; import QuickNav from "../components/QuickNav.vue"; import EntityIcon from "../components/EntityIcon.vue"; import OfferDialog from "../components/OfferDialog.vue"; -import { AppString, NotificationIface } from "../constants/app"; +import { APP_SERVER, AppString, NotificationIface } from "../constants/app"; +import { copyToClipboard } from "../services/ClipboardService"; import { Contact, ContactWithLabels, @@ -647,6 +662,52 @@ export default class ContactImportView extends Vue { this.checkingImports = false; } + private buildUnsignedImportLink(): string { + const contactsForLink: Array = this.contactsImporting.map((c) => { + const contact: Contact = { + did: c.did, + }; + if (c.name) { + contact.name = c.name; + } + if (c.nextPubKeyHashB64) { + contact.nextPubKeyHashB64 = c.nextPubKeyHashB64; + } + if (c.profileImageUrl) { + contact.profileImageUrl = c.profileImageUrl; + } + if (c.publicKeyBase64) { + contact.publicKeyBase64 = c.publicKeyBase64; + } + if (typeof c.registered === "boolean") { + contact.registered = c.registered; + } + return contact; + }); + const contactsParam = encodeURIComponent(JSON.stringify(contactsForLink)); + return `${APP_SERVER}/deep-link/contact-import?contacts=${contactsParam}`; + } + + async copyUnsignedImportLink() { + if (this.contactsImporting.length === 0) { + this.notify.error( + "No contacts are loaded to build a link.", + TIMEOUTS.SHORT, + ); + return; + } + try { + const link = this.buildUnsignedImportLink(); + await copyToClipboard(link); + this.notify.copied("unsigned contact import link", TIMEOUTS.STANDARD); + } catch (error) { + const fullError = + "Error copying unsigned import link: " + errorStringForLog(error); + this.$logAndConsole(fullError, true); + this.notify.error("Failed to copy link to clipboard.", TIMEOUTS.STANDARD); + } + } + /** * Adds a new label to the selected labels list */ @@ -803,5 +864,20 @@ export default class ContactImportView extends Vue { ); this.$router.push({ name: "contacts" }); } + + private get canApplyLabelsToExisting(): boolean { + return this.applyLabelsToExisting && this.selectedLabels.length > 0; + } + + private async handleApplyLabelsToExistingClick() { + if (!this.canApplyLabelsToExisting) { + this.notify.warning( + `You must choose some labels and check the "Apply" checkbox to use this.`, + TIMEOUTS.LONG, + ); + return; + } + await this.importContacts(); + } } From b4b7d71330761d85735521e7289083eb00e0ec64 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Tue, 3 Mar 2026 20:39:33 -0700 Subject: [PATCH 42/43] meeting matches: add the ability to exclude individuals altogether or groups from matching one another --- src/components/MeetingExclusionGroups.vue | 249 +++++++++++++++ src/components/MeetingMembersList.vue | 76 ++++- src/interfaces/user.ts | 13 + src/views/OnboardMeetingSetupView.vue | 368 ++++++++++++++++++++-- 4 files changed, 675 insertions(+), 31 deletions(-) create mode 100644 src/components/MeetingExclusionGroups.vue diff --git a/src/components/MeetingExclusionGroups.vue b/src/components/MeetingExclusionGroups.vue new file mode 100644 index 00000000..7ffadd48 --- /dev/null +++ b/src/components/MeetingExclusionGroups.vue @@ -0,0 +1,249 @@ + + + diff --git a/src/components/MeetingMembersList.vue b/src/components/MeetingMembersList.vue index d31b0942..7fff0fec 100644 --- a/src/components/MeetingMembersList.vue +++ b/src/components/MeetingMembersList.vue @@ -36,6 +36,15 @@ to add/remove them to/from the meeting. +
  • + Click + + to exclude someone from matching. +
  • @@ -168,8 +182,31 @@ v-if=" showOrganizerTools && isOrganizer && member.did !== activeDid " - class="flex items-center gap-1.5" + class="flex items-center gap-6" > +
  • @@ -329,7 +333,7 @@ type="button" class="px-3 py-2 text-sm bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed" :disabled="isPostingMatch" - @click="postNewMatchesThenRefresh()" + @click="promptPreMatchConfirm()" >
    + +
    +

    + Do Not Pair Together +

    +

    + People in the same group will not be matched with each other. +

    +

    + Erase matches to change restrictions. +

    + +
    +
    Loading matches… @@ -395,9 +422,123 @@ v-else-if="matchPairs && matchPairs.length === 0" class="text-sm text-gray-500 py-2" > - No matches yet. Click “Get matches” to pair members by profile + No matches yet. Click "Make New Matches" to pair members by profile similarity.

    +
    +

    + Not Paired ({{ unmatchedMembers.length }}) +

    +
      +
    • + {{ m.name }} — + {{ m.reason }} +
    • +
    +
    +
    +
    + + +
    +
    +

    Confirm Matching

    + +
    +

    + Will be matched ({{ includedMembers.length }}) +

    +
    + + {{ member.name }} + + + No participants + +
    +
    + +
    +

    + Excluded ({{ excludedDids.length }}) +

    +
    + + {{ getMemberNameByDid(did) }} + +
    +
    + +
    +

    + Do Not Pair Groups +

    +
    +
    + {{ + group.name || "Unnamed group" + }}: + {{ + group.memberDids.map((d) => getMemberNameByDid(d)).join(", ") + }} +
    +
    +
    + +
    + {{ previousMatchedPairs.length }} previous pair(s) will be avoided. +
    + +
    + + +
    @@ -433,6 +574,7 @@ import QuickNav from "../components/QuickNav.vue"; import TopMessage from "../components/TopMessage.vue"; import MeetingMembersList from "../components/MeetingMembersList.vue"; import MeetingMemberMatch from "../components/MeetingMemberMatch.vue"; +import MeetingExclusionGroups from "../components/MeetingExclusionGroups.vue"; import MeetingProjectDialog from "../components/MeetingProjectDialog.vue"; import ProjectIcon from "../components/ProjectIcon.vue"; import { @@ -455,7 +597,12 @@ import { } from "@/constants/notifications"; import { PlanData } from "../interfaces/records"; import { Contact } from "../db/tables/contacts"; -import { AxiosErrorResponse, MatchPair } from "@/interfaces"; +import { + AxiosErrorResponse, + DoNotPairGroup, + MatchPair, + MeetingExclusionState, +} from "@/interfaces"; interface ServerMeeting { groupId: number; // from the server name: string; // to & from the server @@ -479,6 +626,7 @@ interface MeetingSetupInputs { TopMessage, MeetingMembersList, MeetingMemberMatch, + MeetingExclusionGroups, MeetingProjectDialog, ProjectIcon, }, @@ -512,6 +660,10 @@ export default class OnboardMeetingView extends Vue { /** Accumulated pair DIDs from every match run; sent as previousPairDids on future posts. */ previousMatchedPairs: [string, string][] = []; + excludedDids: string[] = []; + doNotPairGroups: DoNotPairGroup[] = []; + showPreMatchConfirm = false; + selectedProjectData: PlanData | null = null; showDeleteConfirm = false; @@ -521,6 +673,86 @@ export default class OnboardMeetingView extends Vue { return this.formatDateForInput(now); } + private static readonly EXCLUSION_STORAGE_KEY = "meeting-exclusion-state"; + + get meetingGroupIdStr(): string { + return this.currentMeeting?.groupId?.toString() || ""; + } + + get hasActiveMatches(): boolean { + return Array.isArray(this.matchPairs) && this.matchPairs.length > 0; + } + + admittedMembers: Array<{ did: string; name: string }> = []; + + get includedMembers(): Array<{ did: string; name: string }> { + return this.admittedMembers.filter( + (m) => !this.excludedDids.includes(m.did), + ); + } + + get unmatchedMembers(): Array<{ did: string; name: string; reason: string }> { + if (!this.matchPairs?.length || !this.admittedMembers.length) return []; + const matchedDids = new Set(); + for (const pair of this.matchPairs) { + for (const p of pair.participants) { + matchedDids.add(p.issuerDid); + } + } + return this.admittedMembers + .filter((m) => !matchedDids.has(m.did)) + .map((m) => { + let reason = "not paired (odd number of participants)"; + if (this.excludedDids.includes(m.did)) { + reason = "individually excluded"; + } else { + const inGroup = this.doNotPairGroups.find((g) => + g.memberDids.includes(m.did), + ); + if (inGroup) { + reason = `in do-not-pair group "${inGroup.name || "Unnamed"}"`; + } + } + return { did: m.did, name: m.name, reason }; + }); + } + + get excludedPairDids(): [string, string][] { + const pairs: [string, string][] = []; + for (const group of this.doNotPairGroups) { + for (let i = 0; i < group.memberDids.length; i++) { + for (let j = i + 1; j < group.memberDids.length; j++) { + pairs.push([group.memberDids[i], group.memberDids[j]]); + } + } + } + return pairs; + } + + /** + * Computed property for selected project + * Returns the separately stored selected project data + */ + get selectedProject(): PlanData | null { + return this.selectedProjectData; + } + + /** + * Computed property for selected project issuer display name + * Uses didInfo to format the issuer name similar to ProjectCard + */ + get selectedProjectIssuerName(): string { + if (!this.selectedProject) { + return ""; + } + return didInfo( + this.selectedProject.issuerDid, + this.activeDid, + this.allMyDids, + this.allContacts, + ); + } + async created() { this.notify = createNotifyHelpers( this.$notify as Parameters[0], @@ -547,6 +779,7 @@ export default class OnboardMeetingView extends Vue { await this.fetchMatchPairs(); } + this.loadExclusionState(); this.isLoading = false; } @@ -1051,14 +1284,51 @@ export default class OnboardMeetingView extends Vue { } } + promptPreMatchConfirm(): void { + this.refreshAdmittedMembers(); + this.showPreMatchConfirm = true; + } + + refreshAdmittedMembers(): void { + const membersList = this.$refs.membersList as MeetingMembersList; + this.admittedMembers = membersList?.getAdmittedMembers() ?? []; + } + + cancelPreMatchConfirm(): void { + this.showPreMatchConfirm = false; + } + + getMemberNameByDid(did: string): string { + const member = this.admittedMembers.find((m) => m.did === did); + return member?.name || did.substring(0, 16) + "…"; + } + + async confirmAndMatch(): Promise { + this.showPreMatchConfirm = false; + await this.postNewMatchesThenRefresh(); + } + async postNewMatchesThenRefresh(): Promise { this.isPostingMatch = true; try { - const previousPairDids = this.previousMatchedPairs.length - ? this.previousMatchedPairs - : undefined; + const body: { + excludedDids?: string[]; + excludedPairDids?: [string, string][]; + previousPairDids?: [string, string][]; + } = {}; + + if (this.excludedDids.length > 0) { + body.excludedDids = this.excludedDids; + } + if (this.excludedPairDids.length > 0) { + body.excludedPairDids = this.excludedPairDids; + } + if (this.previousMatchedPairs.length > 0) { + body.previousPairDids = this.previousMatchedPairs; + } + const pairs = await this.postMatch( - previousPairDids ? { previousPairDids } : undefined, + Object.keys(body).length > 0 ? body : undefined, ); if (Array.isArray(pairs) && pairs.length > 0) { const tempMatchPairs: MatchPair[] = []; @@ -1081,6 +1351,24 @@ export default class OnboardMeetingView extends Vue { } } + handleEraseClick(): void { + if (this.isPostingMatch) { + this.notify.warning( + "Matching is currently in progress. Please wait for it to finish.", + TIMEOUTS.LONG, + ); + return; + } + if (!this.matchPairs?.length) { + this.notify.warning( + "There are no matches to erase. Run matching first to create pairs.", + TIMEOUTS.LONG, + ); + return; + } + this.clearMatchesThenRefresh(); + } + async clearMatchesThenRefresh(): Promise { try { const headers = await getHeaders(this.activeDid); @@ -1120,30 +1408,52 @@ export default class OnboardMeetingView extends Vue { } } - /** - * Computed property for selected project - * Returns the separately stored selected project data - */ - get selectedProject(): PlanData | null { - return this.selectedProjectData; + loadExclusionState(): void { + if (!this.meetingGroupIdStr) return; + try { + const raw = localStorage.getItem( + OnboardMeetingView.EXCLUSION_STORAGE_KEY, + ); + if (!raw) return; + const state: MeetingExclusionState = JSON.parse(raw); + if (state.meetingGroupId !== this.meetingGroupIdStr) { + localStorage.removeItem(OnboardMeetingView.EXCLUSION_STORAGE_KEY); + return; + } + this.excludedDids = state.excludedDids || []; + this.doNotPairGroups = state.doNotPairGroups || []; + } catch { + this.excludedDids = []; + this.doNotPairGroups = []; + } } - /** - * Computed property for selected project issuer display name - * Uses didInfo to format the issuer name similar to ProjectCard - */ - get selectedProjectIssuerName(): string { - if (!this.selectedProject) { - return ""; - } - return didInfo( - this.selectedProject.issuerDid, - this.activeDid, - this.allMyDids, - this.allContacts, + saveExclusionState(): void { + if (!this.meetingGroupIdStr) return; + const state: MeetingExclusionState = { + meetingGroupId: this.meetingGroupIdStr, + excludedDids: this.excludedDids, + doNotPairGroups: this.doNotPairGroups, + }; + localStorage.setItem( + OnboardMeetingView.EXCLUSION_STORAGE_KEY, + JSON.stringify(state), ); } + toggleExclusion(did: string): void { + if (this.excludedDids.includes(did)) { + this.excludedDids = this.excludedDids.filter((d) => d !== did); + } else { + this.excludedDids = [...this.excludedDids, did]; + } + this.saveExclusionState(); + } + + handleDoNotPairGroupsUpdate(): void { + this.saveExclusionState(); + } + /** * Open the project link selection dialog */ From 099eac594f74814f5ffb5e8de1abb85a19e32f9a Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Thu, 5 Mar 2026 20:10:58 -0700 Subject: [PATCH 43/43] make tweaks to meeting exclusions & do-not-pair for consistency & helpful info --- CHANGELOG.md | 2 + src/components/MeetingExclusionGroups.vue | 108 ++++++++++++++-------- src/components/MeetingMembersList.vue | 2 +- src/views/OnboardMeetingSetupView.vue | 10 ++ 4 files changed, 82 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c222e42..e0e6c972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.3.7] +### Added +- Attendee exclusion and do-not-pair groups for meeting matching. ### Fixed - Contact deep-links clicked or pasted act consistenly diff --git a/src/components/MeetingExclusionGroups.vue b/src/components/MeetingExclusionGroups.vue index 7ffadd48..240aeef7 100644 --- a/src/components/MeetingExclusionGroups.vue +++ b/src/components/MeetingExclusionGroups.vue @@ -34,10 +34,14 @@ /> @@ -54,9 +58,12 @@ > {{ getMemberName(did) }} @@ -69,50 +76,57 @@ - + +