From 9bb95fd13a9ac2dcb9b453eb3750bc0bc9af5ee5 Mon Sep 17 00:00:00 2001 From: Dawid Urbas Date: Tue, 23 Apr 2024 19:43:20 +0200 Subject: [PATCH 1/5] Move password to memory --- .../scripts/background.ts | 35 +++++++-- holo-key-manager-extension/scripts/helpers.ts | 15 ++-- .../src/lib/queries/extensionQueries.ts | 12 +--- .../src/lib/queries/password.ts | 72 +++++++++++-------- .../src/lib/services/manage-keys.ts | 4 +- holo-key-manager-js-client/README.md | 3 +- shared/const/messages.ts | 6 +- shared/const/query-keys.ts | 2 +- shared/const/secure-store.ts | 1 - shared/services/storage.ts | 17 +---- shared/types/message.ts | 24 +++++-- shared/types/storage-service.ts | 9 +-- 12 files changed, 112 insertions(+), 88 deletions(-) diff --git a/holo-key-manager-extension/scripts/background.ts b/holo-key-manager-extension/scripts/background.ts index e783ce6..d2c4b6c 100644 --- a/holo-key-manager-extension/scripts/background.ts +++ b/holo-key-manager-extension/scripts/background.ts @@ -1,11 +1,15 @@ import { + APP_NOT_AUTHENTICATED, BACKGROUND_SCRIPT_RECEIVED_DATA, + EXTENSION_NOT_AUTHENTICATED, GENERIC_ERROR, + IS_SESSION_SETTLED, NEEDS_SETUP, NO_KEY_FOR_HAPP, - NOT_AUTHENTICATED, SENDER_BACKGROUND_SCRIPT, SENDER_EXTENSION, + SESSION_STATUS, + SETUP_SESSION, SIGN_IN, SIGN_MESSAGE, SIGN_MESSAGE_SUCCESS, @@ -31,6 +35,8 @@ import { signMessageLogic } from './helpers'; let windowId: number | undefined; +let session: string | undefined; + type SendResponse = (response?: Message) => void; type SendResponseWithSender = (response: ActionPayload) => void; @@ -141,6 +147,9 @@ const processMessage = async (message: Message, sendResponse: SendResponse) => { if (!(await isSetupComplete())) { return updateOrCreateWindow(NEEDS_SETUP, sendResponseWithSender); } + if (!session && parsedMessage.data.sender !== SENDER_EXTENSION) { + return sendResponseWithSender({ action: EXTENSION_NOT_AUTHENTICATED }); + } switch (parsedMessage.data.action) { case SIGN_UP: @@ -156,17 +165,35 @@ const processMessage = async (message: Message, sendResponse: SendResponse) => { }) : sendResponseWithSender({ action: NO_KEY_FOR_HAPP }); case SIGN_MESSAGE: + if (!session) { + return sendResponseWithSender({ action: EXTENSION_NOT_AUTHENTICATED }); + } if (await isAuthenticated(parsedMessage.data.payload.happId)) { - const signedMessage = await signMessageLogic(parsedMessage.data.payload); + const signature = await signMessageLogic({ ...parsedMessage.data.payload, session }); return sendResponseWithSender({ action: SIGN_MESSAGE_SUCCESS, - payload: signedMessage + payload: signature }); } - return sendResponseWithSender({ action: NOT_AUTHENTICATED }); + return sendResponseWithSender({ action: APP_NOT_AUTHENTICATED }); case SIGN_OUT: signOut(parsedMessage.data.payload.happId); return sendResponseWithSender({ action: SIGN_OUT_SUCCESS }); + case SETUP_SESSION: + if (parsedMessage.data.sender === SENDER_EXTENSION) { + session = parsedMessage.data.payload; + } + return sendResponseWithSender({ + action: BACKGROUND_SCRIPT_RECEIVED_DATA + }); + case IS_SESSION_SETTLED: + if (parsedMessage.data.sender === SENDER_EXTENSION) { + return sendResponseWithSender({ + action: SESSION_STATUS, + payload: session !== undefined && session !== '' + }); + } + return; default: return sendResponseWithSender({ action: UNKNOWN_ACTION }); } diff --git a/holo-key-manager-extension/scripts/helpers.ts b/holo-key-manager-extension/scripts/helpers.ts index f8724ba..3ab2c9a 100644 --- a/holo-key-manager-extension/scripts/helpers.ts +++ b/holo-key-manager-extension/scripts/helpers.ts @@ -1,15 +1,15 @@ import { AUTHENTICATED_APPS_LIST, SESSION } from '@shared/const'; import { base64ToUint8Array, uint8ArrayToBase64 } from '@shared/helpers'; -import { getSessionKey, storageService } from '@shared/services'; +import { storageService } from '@shared/services'; import { AuthenticatedAppsListSchema, - type MessageToSign, + type SignMessage, SuccessMessageSignedSchema } from '@shared/types'; // @ts-expect-error no types for hcSeedBundle import * as hcSeedBundle from 'hcSeedBundle'; -export const signMessageLogic = async ({ message, happId }: MessageToSign) => { +export const signMessageLogic = async ({ message, happId, session }: SignMessage) => { const authenticatedAppsListData = await storageService.getWithoutCallback({ key: AUTHENTICATED_APPS_LIST, area: SESSION @@ -23,17 +23,10 @@ export const signMessageLogic = async ({ message, happId }: MessageToSign) => { } const index = parsedAuthenticatedAppsListData.data[happId]; - const sessionKey = await getSessionKey(); - - if (!sessionKey.success) { - throw new Error('Session data not found'); - } await hcSeedBundle.seedBundleReady; - const cipherList = hcSeedBundle.UnlockedSeedBundle.fromLocked( - base64ToUint8Array(sessionKey.data) - ); + const cipherList = hcSeedBundle.UnlockedSeedBundle.fromLocked(base64ToUint8Array(session)); if (!(cipherList[0] instanceof hcSeedBundle.LockedSeedCipherPwHash)) { throw new Error('Expecting PwHash'); diff --git a/holo-key-manager-extension/src/lib/queries/extensionQueries.ts b/holo-key-manager-extension/src/lib/queries/extensionQueries.ts index c2c1897..ab9469e 100644 --- a/holo-key-manager-extension/src/lib/queries/extensionQueries.ts +++ b/holo-key-manager-extension/src/lib/queries/extensionQueries.ts @@ -2,21 +2,11 @@ import { createMutation, createQuery, QueryClient } from '@tanstack/svelte-query import { handleSuccess } from '$helpers'; import { unlockKey } from '$services'; -import { DEVICE_KEY, LOCAL, PASSWORD, SESSION_DATA_KEY, SETUP_KEY } from '$shared/const'; +import { DEVICE_KEY, LOCAL, PASSWORD, SETUP_KEY } from '$shared/const'; import { getSessionKey, isSetupComplete, storageService } from '$shared/services'; import { EncryptedDeviceKeySchema, HashSaltSchema } from '$shared/types'; import { deviceKeyContentStore, passphraseStore } from '$stores'; -export function createSessionQuery() { - return createQuery({ - queryKey: [SESSION_DATA_KEY], - queryFn: async () => { - const parsedData = await getSessionKey(); - return parsedData.success; - } - }); -} - export function createSetupDeviceKeyQuery() { return createQuery({ queryKey: [SETUP_KEY], diff --git a/holo-key-manager-extension/src/lib/queries/password.ts b/holo-key-manager-extension/src/lib/queries/password.ts index d1735ec..7390d65 100644 --- a/holo-key-manager-extension/src/lib/queries/password.ts +++ b/holo-key-manager-extension/src/lib/queries/password.ts @@ -1,20 +1,27 @@ import { createMutation, createQuery, type QueryClient } from '@tanstack/svelte-query'; import { get } from 'svelte/store'; -import { getPassword, handleSuccess, hashPassword, verifyPassword } from '$helpers'; +import { + getPassword, + handleSuccess, + hashPassword, + sendMessageAndHandleResponse, + verifyPassword +} from '$helpers'; import { lockKey, unlockKey } from '$services'; import { DEVICE_KEY, + IS_SESSION_SETTLED, LOCAL, PASSWORD, + SENDER_EXTENSION, SESSION, - SESSION_DATA_KEY, - SESSION_STORAGE_KEY, SETUP_KEY, - SETUP_PASSWORD + SETUP_PASSWORD, + SETUP_SESSION } from '$shared/const'; -import { storageService } from '$shared/services'; -import { EncryptedDeviceKeySchema } from '$shared/types'; +import { sendMessage, storageService } from '$shared/services'; +import { EncryptedDeviceKeySchema, SessionStatusSchema } from '$shared/types'; import { deviceKeyContentStore, passphraseStore, passwordStore } from '$stores'; const storePassword = async (password: string) => { @@ -36,6 +43,21 @@ export function createSetupPasswordQuery() { }); } +export function isSignedInToExtensionQuery() { + return createQuery({ + queryKey: [SESSION], + queryFn: async () => { + const response = await sendMessage({ + sender: SENDER_EXTENSION, + action: IS_SESSION_SETTLED + }); + + const parsedResult = SessionStatusSchema.safeParse(response); + return parsedResult.success && parsedResult.data; + } + }); +} + export function createPasswordMutation(queryClient: QueryClient) { return createMutation({ mutationFn: storePassword, @@ -62,7 +84,11 @@ export function createPasswordAndStoreDeviceKeyMutation(queryClient: QueryClient deviceKeyContentStore.clean(); passphraseStore.clean(); passwordStore.reset(); - storageService.set({ key: SESSION_STORAGE_KEY, value: null, area: SESSION }); + await sendMessageAndHandleResponse({ + sender: SENDER_EXTENSION, + action: SETUP_SESSION, + payload: undefined + }); }, onSuccess: handleSuccess(queryClient, [SETUP_KEY]) }); @@ -75,24 +101,13 @@ export function createSignInMutation(queryClient: QueryClient) { if (!parsedResult.success || !(await verifyPassword(password, parsedResult.data))) throw new Error('Invalid password or data'); - const deviceKey = await storageService.getWithoutCallback({ - key: DEVICE_KEY, - area: LOCAL - }); - const parsedDeviceKey = EncryptedDeviceKeySchema.safeParse(deviceKey); - if (!parsedDeviceKey.success) throw new Error('Invalid device key'); - - const decryptedKey = await unlockKey(parsedDeviceKey.data, password); - - storageService.set({ - key: SESSION_STORAGE_KEY, - value: await lockKey(decryptedKey, SESSION), - area: SESSION + await sendMessageAndHandleResponse({ + sender: SENDER_EXTENSION, + action: SETUP_SESSION, + payload: password }); - - return decryptedKey.zero(); }, - onSuccess: handleSuccess(queryClient, [SESSION_DATA_KEY]) + onSuccess: handleSuccess(queryClient, [SESSION]) }); } @@ -129,13 +144,14 @@ export function createChangePasswordWithDeviceKeyMutation(queryClient: QueryClie area: LOCAL }); decryptedKey.zero(); - storageService.set({ - key: SESSION_STORAGE_KEY, - value: null, - area: SESSION + + await sendMessageAndHandleResponse({ + sender: SENDER_EXTENSION, + action: SETUP_SESSION, + payload: undefined }); }, - onSuccess: handleSuccess(queryClient, [SESSION_DATA_KEY]) + onSuccess: handleSuccess(queryClient, [SESSION]) }); } diff --git a/holo-key-manager-extension/src/lib/services/manage-keys.ts b/holo-key-manager-extension/src/lib/services/manage-keys.ts index 419dce3..58209a4 100644 --- a/holo-key-manager-extension/src/lib/services/manage-keys.ts +++ b/holo-key-manager-extension/src/lib/services/manage-keys.ts @@ -27,7 +27,9 @@ const deriveAndLock = ( generate_by: 'keymanager-v1.0' }); - return lock(root, passphrase); + lock(root, passphrase); + + return root.zero(); }; export async function generateKeys( diff --git a/holo-key-manager-js-client/README.md b/holo-key-manager-js-client/README.md index d3c3a57..d5cc09e 100644 --- a/holo-key-manager-js-client/README.md +++ b/holo-key-manager-js-client/README.md @@ -110,7 +110,8 @@ const getGenericErrorMessage = (error) => { NeedsSetup: 'Instruct the user to set up the extension, grant necessary permissions, and then reload the page.', NoKeyForHapp: 'No existing key found for this happ; initiate the signup flow.', - NotAuthenticated: 'User is not authenticated. Please sign in.' + AppNotAuthenticated: 'App is not authenticated. Please sign in.', + ExtensionNotAuthenticated: 'Extension is not authenticated. Please sign in to extension.' }; return ( diff --git a/shared/const/messages.ts b/shared/const/messages.ts index 486eabe..2454ed7 100644 --- a/shared/const/messages.ts +++ b/shared/const/messages.ts @@ -10,5 +10,9 @@ export const SIGN_OUT = 'SignOut'; export const SIGN_OUT_SUCCESS = 'SignOutSuccess'; export const SIGN_UP = 'SignUp'; export const SIGN_UP_SUCCESS = 'SignUpSuccess'; +export const SETUP_SESSION = 'SetupSession'; +export const IS_SESSION_SETTLED = 'IsSessionSettled'; +export const SESSION_STATUS = 'SessionStatus'; export const UNKNOWN_ACTION = 'UnknownAction'; -export const NOT_AUTHENTICATED = 'NotAuthenticated'; +export const APP_NOT_AUTHENTICATED = 'AppNotAuthenticated'; +export const EXTENSION_NOT_AUTHENTICATED = 'ExtensionNotAuthenticated'; diff --git a/shared/const/query-keys.ts b/shared/const/query-keys.ts index 663ba5e..fcfec67 100644 --- a/shared/const/query-keys.ts +++ b/shared/const/query-keys.ts @@ -1,4 +1,4 @@ -export const SESSION_DATA_KEY = 'sessionDataKey'; +export const SESSION = 'session'; export const SETUP_KEY = 'setupKey'; export const APPLICATION_KEYS = 'applicationKeys'; export const APPLICATION_SIGNED_IN_KEY = 'applicationSignedInKey'; diff --git a/shared/const/secure-store.ts b/shared/const/secure-store.ts index 6948788..ac73f05 100644 --- a/shared/const/secure-store.ts +++ b/shared/const/secure-store.ts @@ -1,6 +1,5 @@ export const SESSION = 'session'; export const LOCAL = 'local'; -export const SESSION_STORAGE_KEY = 'sessionStorageKey'; export const PASSWORD = 'password'; export const DEVICE_KEY = 'deviceKey'; export const APPS_LIST = 'appsList'; diff --git a/shared/services/storage.ts b/shared/services/storage.ts index 1f7c6e3..ea7aa2e 100644 --- a/shared/services/storage.ts +++ b/shared/services/storage.ts @@ -1,11 +1,4 @@ -import { - APPS_LIST, - AUTHENTICATED_APPS_LIST, - DEVICE_KEY, - LOCAL, - SESSION, - SESSION_STORAGE_KEY -} from '../const'; +import { APPS_LIST, AUTHENTICATED_APPS_LIST, DEVICE_KEY, LOCAL, SESSION } from '../const'; import { isChromeStorageSafe } from '../helpers'; import { AppsListSchema, @@ -111,11 +104,3 @@ export const signOut = async (happId: string) => { }); } }; - -export const getSessionKey = async () => { - const data = await storageService.getWithoutCallback({ - key: SESSION_STORAGE_KEY, - area: SESSION - }); - return SessionStateSchema.safeParse(data); -}; diff --git a/shared/types/message.ts b/shared/types/message.ts index 1e9fcf6..ba56415 100644 --- a/shared/types/message.ts +++ b/shared/types/message.ts @@ -1,15 +1,19 @@ import { z } from 'zod'; import { + APP_NOT_AUTHENTICATED, BACKGROUND_SCRIPT_RECEIVED_DATA, + EXTENSION_NOT_AUTHENTICATED, GENERIC_ERROR, HOLO_KEY_MANAGER_APP_ID, + IS_SESSION_SETTLED, NEEDS_SETUP, NO_KEY_FOR_HAPP, - NOT_AUTHENTICATED, SENDER_BACKGROUND_SCRIPT, SENDER_EXTENSION, SENDER_WEBAPP, + SESSION_STATUS, + SETUP_SESSION, SIGN_IN, SIGN_IN_SUCCESS, SIGN_MESSAGE, @@ -22,19 +26,25 @@ import { } from '../const'; import { HappDetailsSchema, HappIdSchema } from './general'; +export const SessionStatusSchema = z.boolean(); + +const SetupSessionPayload = z.string().optional(); + export const SuccessMessageSignedSchema = z.object({ signature: z.string() }); export type SuccessMessageSigned = z.infer; -export const MessageObjectSchema = z.object({ +export const MessageToSignSchema = HappIdSchema.extend({ message: z.string() }); -export const MessageToSignSchema = z.intersection(MessageObjectSchema, HappIdSchema); +export const SignMessageSchema = MessageToSignSchema.extend({ + session: SetupSessionPayload +}); -export type MessageToSign = z.infer; +export type SignMessage = z.infer; export const PubKeySchema = z.object({ pubKey: z.string() @@ -71,8 +81,12 @@ const ActionPayloadSchema = z.union([ z.object({ action: z.literal(GENERIC_ERROR) }), z.object({ action: z.literal(NEEDS_SETUP) }), z.object({ action: z.literal(NO_KEY_FOR_HAPP) }), - z.object({ action: z.literal(NOT_AUTHENTICATED) }), + z.object({ action: z.literal(APP_NOT_AUTHENTICATED) }), + z.object({ action: z.literal(EXTENSION_NOT_AUTHENTICATED) }), z.object({ action: z.literal(SIGN_MESSAGE), payload: MessageToSignSchema }), + z.object({ action: z.literal(SETUP_SESSION), payload: SetupSessionPayload }), + z.object({ action: z.literal(IS_SESSION_SETTLED) }), + z.object({ action: z.literal(SESSION_STATUS), payload: SessionStatusSchema }), z.object({ action: z.literal(SIGN_MESSAGE_SUCCESS), payload: SuccessMessageSignedSchema }), z.object({ action: z.literal(SIGN_IN), payload: HappIdSchema }), z.object({ action: z.literal(SIGN_IN_SUCCESS), payload: PubKeySchema }), diff --git a/shared/types/storage-service.ts b/shared/types/storage-service.ts index 30cafa2..1768c7e 100644 --- a/shared/types/storage-service.ts +++ b/shared/types/storage-service.ts @@ -6,8 +6,7 @@ import type { DEVICE_KEY, LOCAL, PASSWORD, - SESSION, - SESSION_STORAGE_KEY + SESSION } from '../const'; import { HappDetailsSchema } from './general'; @@ -37,10 +36,6 @@ export type AuthenticatedAppsList = z.infer; export type AreaName = typeof SESSION | typeof LOCAL | 'sync' | 'managed'; -export const SessionStateSchema = z.string(); - -export type SessionState = z.infer; - export type ChangesType = { [key: string]: unknown; }; @@ -57,14 +52,12 @@ type GetAction = { }; type StorageSetItem = - | SetAction | SetAction | SetAction | SetAction | SetAction; type StorageGetItem = - | GetAction | GetAction | GetAction | GetAction From 023a5e3c4e0843ccbc69fec1d88da7b7068f4b40 Mon Sep 17 00:00:00 2001 From: Dawid Urbas Date: Fri, 10 May 2024 11:55:00 +0200 Subject: [PATCH 2/5] Change to background script --- .../scripts/background.ts | 14 ++--- holo-key-manager-extension/scripts/helpers.ts | 4 +- .../src/lib/helpers/queries.ts | 46 ++++++++++++++-- .../src/lib/queries/extensionQueries.ts | 2 +- .../src/lib/queries/index.ts | 6 +-- .../src/lib/queries/password.ts | 52 ++++++++----------- .../src/routes/+page.svelte | 6 +-- .../routes/webapp-extension/+layout.svelte | 6 +-- shared/const/messages.ts | 6 +-- shared/const/query-keys.ts | 2 +- shared/helpers/other.ts | 7 ++- shared/services/storage.ts | 1 - shared/types/message.ts | 18 +++---- 13 files changed, 100 insertions(+), 70 deletions(-) diff --git a/holo-key-manager-extension/scripts/background.ts b/holo-key-manager-extension/scripts/background.ts index d2c4b6c..5453c2b 100644 --- a/holo-key-manager-extension/scripts/background.ts +++ b/holo-key-manager-extension/scripts/background.ts @@ -2,14 +2,14 @@ import { APP_NOT_AUTHENTICATED, BACKGROUND_SCRIPT_RECEIVED_DATA, EXTENSION_NOT_AUTHENTICATED, + EXTENSION_SESSION_INFO, GENERIC_ERROR, - IS_SESSION_SETTLED, + GET_EXTENSION_SESSION, NEEDS_SETUP, NO_KEY_FOR_HAPP, SENDER_BACKGROUND_SCRIPT, SENDER_EXTENSION, - SESSION_STATUS, - SETUP_SESSION, + SETUP_EXTENSION_SESSION, SIGN_IN, SIGN_MESSAGE, SIGN_MESSAGE_SUCCESS, @@ -179,18 +179,18 @@ const processMessage = async (message: Message, sendResponse: SendResponse) => { case SIGN_OUT: signOut(parsedMessage.data.payload.happId); return sendResponseWithSender({ action: SIGN_OUT_SUCCESS }); - case SETUP_SESSION: + case SETUP_EXTENSION_SESSION: if (parsedMessage.data.sender === SENDER_EXTENSION) { session = parsedMessage.data.payload; } return sendResponseWithSender({ action: BACKGROUND_SCRIPT_RECEIVED_DATA }); - case IS_SESSION_SETTLED: + case GET_EXTENSION_SESSION: if (parsedMessage.data.sender === SENDER_EXTENSION) { return sendResponseWithSender({ - action: SESSION_STATUS, - payload: session !== undefined && session !== '' + action: EXTENSION_SESSION_INFO, + payload: session }); } return; diff --git a/holo-key-manager-extension/scripts/helpers.ts b/holo-key-manager-extension/scripts/helpers.ts index 3ab2c9a..ae7b95d 100644 --- a/holo-key-manager-extension/scripts/helpers.ts +++ b/holo-key-manager-extension/scripts/helpers.ts @@ -18,8 +18,8 @@ export const signMessageLogic = async ({ message, happId, session }: SignMessage const parsedAuthenticatedAppsListData = AuthenticatedAppsListSchema.safeParse(authenticatedAppsListData); - if (!parsedAuthenticatedAppsListData.success) { - throw new Error('Failed to parse authenticated apps list data'); + if (!parsedAuthenticatedAppsListData.success || !session) { + throw new Error('Authentication failed: Unable to parse apps list or session missing'); } const index = parsedAuthenticatedAppsListData.data[happId]; diff --git a/holo-key-manager-extension/src/lib/helpers/queries.ts b/holo-key-manager-extension/src/lib/helpers/queries.ts index b2ad248..5932bf4 100644 --- a/holo-key-manager-extension/src/lib/helpers/queries.ts +++ b/holo-key-manager-extension/src/lib/helpers/queries.ts @@ -4,14 +4,19 @@ import { unlockKey } from '$services'; import { AUTHENTICATED_APPS_LIST, BACKGROUND_SCRIPT_RECEIVED_DATA, + DEVICE_KEY, + EXTENSION_SESSION_INFO, + GET_EXTENSION_SESSION, LOCAL, PASSWORD, + SENDER_EXTENSION, SESSION } from '$shared/const'; import { parseMessageSchema, uint8ArrayToBase64 } from '$shared/helpers'; -import { getSessionKey, sendMessage, storageService } from '$shared/services'; +import { sendMessage, storageService } from '$shared/services'; import { AuthenticatedAppsListSchema, + EncryptedDeviceKeySchema, HashSaltSchema, type Message, PubKeySchema @@ -57,14 +62,47 @@ export const sendMessageAndHandleResponse = async (message: Message) => { throw new Error('Error sending data to webapp'); }; +export const getExtensionSession = async () => { + const response = await sendMessage({ + sender: SENDER_EXTENSION, + action: GET_EXTENSION_SESSION + }); + + const parsedResponse = parseMessageSchema(response); + + if (!parsedResponse.success || parsedResponse.data.action !== EXTENSION_SESSION_INFO) { + throw new Error('Error getting extension session'); + } + + return parsedResponse.data.payload; +}; + +export const getDeviceKey = async () => { + const deviceKey = await storageService.getWithoutCallback({ + key: DEVICE_KEY, + area: LOCAL + }); + + const parsedDeviceKey = EncryptedDeviceKeySchema.safeParse(deviceKey); + + if (!parsedDeviceKey.success) { + throw new Error('Invalid device key'); + } + + return parsedDeviceKey.data; +}; + export const deriveSignPubKey = async (newIndex: number) => { - const sessionKey = await getSessionKey(); + const session = await getExtensionSession(); - if (!sessionKey.success) { + if (!session) { throw new Error('Session data not found'); } - const keyUnlocked = await unlockKey(sessionKey.data, SESSION); + const encryptedDeviceKey = await getDeviceKey(); + + const keyUnlocked = await unlockKey(encryptedDeviceKey, session); + const { signPubKey } = keyUnlocked.derive(newIndex); keyUnlocked.zero(); diff --git a/holo-key-manager-extension/src/lib/queries/extensionQueries.ts b/holo-key-manager-extension/src/lib/queries/extensionQueries.ts index ab9469e..6867e5b 100644 --- a/holo-key-manager-extension/src/lib/queries/extensionQueries.ts +++ b/holo-key-manager-extension/src/lib/queries/extensionQueries.ts @@ -3,7 +3,7 @@ import { createMutation, createQuery, QueryClient } from '@tanstack/svelte-query import { handleSuccess } from '$helpers'; import { unlockKey } from '$services'; import { DEVICE_KEY, LOCAL, PASSWORD, SETUP_KEY } from '$shared/const'; -import { getSessionKey, isSetupComplete, storageService } from '$shared/services'; +import { isSetupComplete, storageService } from '$shared/services'; import { EncryptedDeviceKeySchema, HashSaltSchema } from '$shared/types'; import { deviceKeyContentStore, passphraseStore } from '$stores'; diff --git a/holo-key-manager-extension/src/lib/queries/index.ts b/holo-key-manager-extension/src/lib/queries/index.ts index 520020c..04570a0 100644 --- a/holo-key-manager-extension/src/lib/queries/index.ts +++ b/holo-key-manager-extension/src/lib/queries/index.ts @@ -8,12 +8,12 @@ import { } from './applicationQueries'; import { createRecoverDeviceKeyMutation, - createSessionQuery, createSetupDeviceKeyQuery, createStoreDeviceKey } from './extensionQueries'; import { createChangePasswordWithDeviceKeyMutation, + createIsSignedInToExtensionQuery, createPasswordAndStoreDeviceKeyMutation, createPasswordMutation, createSetupPasswordQuery, @@ -26,7 +26,7 @@ export function appQueries() { createChangePasswordWithDeviceKeyMutation(queryClient); const createPassword = createPasswordMutation(queryClient); const signInWithKeyMutation = createSignInWithKeyMutation(queryClient); - const sessionQuery = createSessionQuery(); + const isSignedInToExtensionQuery = createIsSignedInToExtensionQuery(); const setupDeviceKeyQuery = createSetupDeviceKeyQuery(); const setupPasswordQuery = createSetupPasswordQuery(); const applicationKeysQueryFunction = createApplicationKeysQuery(); @@ -40,7 +40,7 @@ export function appQueries() { return { changePasswordWithDeviceKeyMutation, createPassword, - sessionQuery, + isSignedInToExtensionQuery, setupDeviceKeyQuery, setupPasswordQuery, signInMutation, diff --git a/holo-key-manager-extension/src/lib/queries/password.ts b/holo-key-manager-extension/src/lib/queries/password.ts index 7390d65..24072d1 100644 --- a/holo-key-manager-extension/src/lib/queries/password.ts +++ b/holo-key-manager-extension/src/lib/queries/password.ts @@ -2,6 +2,8 @@ import { createMutation, createQuery, type QueryClient } from '@tanstack/svelte- import { get } from 'svelte/store'; import { + getDeviceKey, + getExtensionSession, getPassword, handleSuccess, hashPassword, @@ -11,17 +13,15 @@ import { import { lockKey, unlockKey } from '$services'; import { DEVICE_KEY, - IS_SESSION_SETTLED, + EXTENSION_SESSION, LOCAL, PASSWORD, SENDER_EXTENSION, - SESSION, + SETUP_EXTENSION_SESSION, SETUP_KEY, - SETUP_PASSWORD, - SETUP_SESSION + SETUP_PASSWORD } from '$shared/const'; -import { sendMessage, storageService } from '$shared/services'; -import { EncryptedDeviceKeySchema, SessionStatusSchema } from '$shared/types'; +import { storageService } from '$shared/services'; import { deviceKeyContentStore, passphraseStore, passwordStore } from '$stores'; const storePassword = async (password: string) => { @@ -43,17 +43,16 @@ export function createSetupPasswordQuery() { }); } -export function isSignedInToExtensionQuery() { +export function createIsSignedInToExtensionQuery() { return createQuery({ - queryKey: [SESSION], + queryKey: [EXTENSION_SESSION], queryFn: async () => { - const response = await sendMessage({ - sender: SENDER_EXTENSION, - action: IS_SESSION_SETTLED - }); - - const parsedResult = SessionStatusSchema.safeParse(response); - return parsedResult.success && parsedResult.data; + try { + const session = await getExtensionSession(); + return !!session; + } catch (e) { + return false; + } } }); } @@ -86,7 +85,7 @@ export function createPasswordAndStoreDeviceKeyMutation(queryClient: QueryClient passwordStore.reset(); await sendMessageAndHandleResponse({ sender: SENDER_EXTENSION, - action: SETUP_SESSION, + action: SETUP_EXTENSION_SESSION, payload: undefined }); }, @@ -103,11 +102,11 @@ export function createSignInMutation(queryClient: QueryClient) { await sendMessageAndHandleResponse({ sender: SENDER_EXTENSION, - action: SETUP_SESSION, + action: SETUP_EXTENSION_SESSION, payload: password }); }, - onSuccess: handleSuccess(queryClient, [SESSION]) + onSuccess: handleSuccess(queryClient, [EXTENSION_SESSION]) }); } @@ -123,18 +122,9 @@ export function createChangePasswordWithDeviceKeyMutation(queryClient: QueryClie throw new Error('Invalid password'); } - const deviceKey = await storageService.getWithoutCallback({ - key: DEVICE_KEY, - area: LOCAL - }); - - const parsedDeviceKey = EncryptedDeviceKeySchema.safeParse(deviceKey); - - if (!parsedDeviceKey.success) { - throw new Error('Invalid device key'); - } + const deviceKey = await getDeviceKey(); - const decryptedKey = await unlockKey(parsedDeviceKey.data, mutationData.oldPassword); + const decryptedKey = await unlockKey(deviceKey, mutationData.oldPassword); await storePassword(mutationData.newPassword); @@ -147,11 +137,11 @@ export function createChangePasswordWithDeviceKeyMutation(queryClient: QueryClie await sendMessageAndHandleResponse({ sender: SENDER_EXTENSION, - action: SETUP_SESSION, + action: SETUP_EXTENSION_SESSION, payload: undefined }); }, - onSuccess: handleSuccess(queryClient, [SESSION]) + onSuccess: handleSuccess(queryClient, [EXTENSION_SESSION]) }); } diff --git a/holo-key-manager-extension/src/routes/+page.svelte b/holo-key-manager-extension/src/routes/+page.svelte index 0c5776d..637843b 100644 --- a/holo-key-manager-extension/src/routes/+page.svelte +++ b/holo-key-manager-extension/src/routes/+page.svelte @@ -5,9 +5,9 @@ import { appQueries } from '$queries'; import { isChromePermissionsSafe } from '$shared/helpers'; - const { sessionQuery, setupDeviceKeyQuery } = appQueries(); - $: isLoading = $sessionQuery.isFetching || $setupDeviceKeyQuery.isFetching; - $: hasSessionData = $sessionQuery.data; + const { isSignedInToExtensionQuery, setupDeviceKeyQuery } = appQueries(); + $: isLoading = $isSignedInToExtensionQuery.isFetching || $setupDeviceKeyQuery.isFetching; + $: hasSessionData = $isSignedInToExtensionQuery.data; $: hasSetupData = $setupDeviceKeyQuery.data; const openInNewTab = (url: string) => () => window.open(url, '_blank'); diff --git a/holo-key-manager-extension/src/routes/webapp-extension/+layout.svelte b/holo-key-manager-extension/src/routes/webapp-extension/+layout.svelte index 3ce9b87..49e0650 100644 --- a/holo-key-manager-extension/src/routes/webapp-extension/+layout.svelte +++ b/holo-key-manager-extension/src/routes/webapp-extension/+layout.svelte @@ -3,9 +3,9 @@ import { dismissWindow } from '$helpers'; import { appQueries } from '$queries'; - const { sessionQuery, setupDeviceKeyQuery } = appQueries(); - $: isLoading = $sessionQuery.isFetching || $setupDeviceKeyQuery.isFetching; - $: hasSessionData = $sessionQuery.data; + const { isSignedInToExtensionQuery, setupDeviceKeyQuery } = appQueries(); + $: isLoading = $isSignedInToExtensionQuery.isFetching || $setupDeviceKeyQuery.isFetching; + $: hasSessionData = $isSignedInToExtensionQuery.data; $: hasSetupData = $setupDeviceKeyQuery.data; diff --git a/shared/const/messages.ts b/shared/const/messages.ts index 2454ed7..a2a8fa3 100644 --- a/shared/const/messages.ts +++ b/shared/const/messages.ts @@ -10,9 +10,9 @@ export const SIGN_OUT = 'SignOut'; export const SIGN_OUT_SUCCESS = 'SignOutSuccess'; export const SIGN_UP = 'SignUp'; export const SIGN_UP_SUCCESS = 'SignUpSuccess'; -export const SETUP_SESSION = 'SetupSession'; -export const IS_SESSION_SETTLED = 'IsSessionSettled'; -export const SESSION_STATUS = 'SessionStatus'; +export const SETUP_EXTENSION_SESSION = 'SetupExtensionSession'; +export const EXTENSION_SESSION_INFO = 'ExtensionSessionInfo'; +export const GET_EXTENSION_SESSION = 'GetExtensionSession'; export const UNKNOWN_ACTION = 'UnknownAction'; export const APP_NOT_AUTHENTICATED = 'AppNotAuthenticated'; export const EXTENSION_NOT_AUTHENTICATED = 'ExtensionNotAuthenticated'; diff --git a/shared/const/query-keys.ts b/shared/const/query-keys.ts index fcfec67..1e2dd0a 100644 --- a/shared/const/query-keys.ts +++ b/shared/const/query-keys.ts @@ -1,4 +1,4 @@ -export const SESSION = 'session'; +export const EXTENSION_SESSION = 'extensionSession'; export const SETUP_KEY = 'setupKey'; export const APPLICATION_KEYS = 'applicationKeys'; export const APPLICATION_SIGNED_IN_KEY = 'applicationSignedInKey'; diff --git a/shared/helpers/other.ts b/shared/helpers/other.ts index 85e44b1..d1c6d7d 100644 --- a/shared/helpers/other.ts +++ b/shared/helpers/other.ts @@ -17,7 +17,12 @@ export const isChromePermissionsSafe = () => export const createQueryParams = (params: ActionPayload) => { const additionalParams = relevantKeys.reduce( (acc, key) => { - if ('payload' in params && params.payload && key in params.payload) { + if ( + 'payload' in params && + params.payload && + typeof params.payload === 'object' && + key in params.payload + ) { return { ...acc, [key]: String(params.payload[key as keyof typeof params.payload]) }; } return acc; diff --git a/shared/services/storage.ts b/shared/services/storage.ts index ea7aa2e..826c798 100644 --- a/shared/services/storage.ts +++ b/shared/services/storage.ts @@ -6,7 +6,6 @@ import { AuthenticatedAppsListSchema, type ChangesType, EncryptedDeviceKeySchema, - SessionStateSchema, type StorageService } from '../types'; diff --git a/shared/types/message.ts b/shared/types/message.ts index ba56415..0a0306b 100644 --- a/shared/types/message.ts +++ b/shared/types/message.ts @@ -4,16 +4,16 @@ import { APP_NOT_AUTHENTICATED, BACKGROUND_SCRIPT_RECEIVED_DATA, EXTENSION_NOT_AUTHENTICATED, + EXTENSION_SESSION_INFO, GENERIC_ERROR, + GET_EXTENSION_SESSION, HOLO_KEY_MANAGER_APP_ID, - IS_SESSION_SETTLED, NEEDS_SETUP, NO_KEY_FOR_HAPP, SENDER_BACKGROUND_SCRIPT, SENDER_EXTENSION, SENDER_WEBAPP, - SESSION_STATUS, - SETUP_SESSION, + SETUP_EXTENSION_SESSION, SIGN_IN, SIGN_IN_SUCCESS, SIGN_MESSAGE, @@ -26,9 +26,7 @@ import { } from '../const'; import { HappDetailsSchema, HappIdSchema } from './general'; -export const SessionStatusSchema = z.boolean(); - -const SetupSessionPayload = z.string().optional(); +const ExtensionSessionPayload = z.string().optional(); export const SuccessMessageSignedSchema = z.object({ signature: z.string() @@ -41,7 +39,7 @@ export const MessageToSignSchema = HappIdSchema.extend({ }); export const SignMessageSchema = MessageToSignSchema.extend({ - session: SetupSessionPayload + session: ExtensionSessionPayload }); export type SignMessage = z.infer; @@ -84,9 +82,9 @@ const ActionPayloadSchema = z.union([ z.object({ action: z.literal(APP_NOT_AUTHENTICATED) }), z.object({ action: z.literal(EXTENSION_NOT_AUTHENTICATED) }), z.object({ action: z.literal(SIGN_MESSAGE), payload: MessageToSignSchema }), - z.object({ action: z.literal(SETUP_SESSION), payload: SetupSessionPayload }), - z.object({ action: z.literal(IS_SESSION_SETTLED) }), - z.object({ action: z.literal(SESSION_STATUS), payload: SessionStatusSchema }), + z.object({ action: z.literal(SETUP_EXTENSION_SESSION), payload: ExtensionSessionPayload }), + z.object({ action: z.literal(GET_EXTENSION_SESSION) }), + z.object({ action: z.literal(EXTENSION_SESSION_INFO), payload: ExtensionSessionPayload }), z.object({ action: z.literal(SIGN_MESSAGE_SUCCESS), payload: SuccessMessageSignedSchema }), z.object({ action: z.literal(SIGN_IN), payload: HappIdSchema }), z.object({ action: z.literal(SIGN_IN_SUCCESS), payload: PubKeySchema }), From f5e294e7259c371da9975d13a14ab7c215c7c838 Mon Sep 17 00:00:00 2001 From: Dawid Urbas Date: Sun, 19 May 2024 09:26:20 +0200 Subject: [PATCH 3/5] Rewrite password to memory --- .../scripts/background.ts | 113 +++++++++++------- holo-key-manager-extension/scripts/helpers.ts | 10 +- .../scripts/rollup.config.js | 6 +- .../src/lib/helpers/navigation.ts | 3 +- .../src/lib/helpers/queries.ts | 35 +++--- .../src/lib/queries/applicationQueries.ts | 41 ++++--- .../src/lib/queries/password.ts | 3 +- .../src/lib/services/manage-keys.ts | 5 +- .../webapp-extension/create-key/+page.svelte | 1 + .../select-key-to-login/+page.svelte | 3 +- shared/const/app.ts | 3 +- shared/helpers/other.ts | 19 +-- shared/services/message.ts | 8 +- shared/services/storage.ts | 15 +++ 14 files changed, 158 insertions(+), 107 deletions(-) diff --git a/holo-key-manager-extension/scripts/background.ts b/holo-key-manager-extension/scripts/background.ts index 5453c2b..1f9d66e 100644 --- a/holo-key-manager-extension/scripts/background.ts +++ b/holo-key-manager-extension/scripts/background.ts @@ -9,13 +9,16 @@ import { NO_KEY_FOR_HAPP, SENDER_BACKGROUND_SCRIPT, SENDER_EXTENSION, + SENDER_WEBAPP, SETUP_EXTENSION_SESSION, SIGN_IN, + SIGN_IN_SUCCESS, SIGN_MESSAGE, SIGN_MESSAGE_SUCCESS, SIGN_OUT, SIGN_OUT_SUCCESS, SIGN_UP, + SIGN_UP_SUCCESS, UNKNOWN_ACTION } from '@shared/const'; import { createQueryParams } from '@shared/helpers'; @@ -23,6 +26,7 @@ import { isAppSignUpComplete, isAuthenticated, isSetupComplete, signOut } from ' import { type ActionPayload, type Message, + type MessageWithId, MessageWithIdSchema, type WindowProperties } from '@shared/types'; @@ -45,8 +49,8 @@ const handleError = (sendResponse: SendResponseWithSender) => { sendResponse({ action: GENERIC_ERROR }); }; -const createWindowProperties = (actionPayload?: ActionPayload): WindowProperties => ({ - url: `webapp-extension/setup.html${actionPayload ? `?${createQueryParams(actionPayload)}` : ''}`, +const createWindowProperties = (parsedMessage?: MessageWithId): WindowProperties => ({ + url: `webapp-extension/setup.html${parsedMessage ? `?${createQueryParams(parsedMessage)}` : ''}`, type: 'popup', height: 500, width: 375, @@ -87,8 +91,8 @@ const manageWindow = ( const updateOrCreateWindowCommon = ( handleWindowUpdateOrCreate: () => Promise, - actionPayload?: ActionPayload -) => manageWindow(createWindowProperties(actionPayload), handleWindowUpdateOrCreate); + parsedMessage?: MessageWithId +) => manageWindow(createWindowProperties(parsedMessage), handleWindowUpdateOrCreate); const updateOrCreateWindow = ( successAction: typeof NEEDS_SETUP, @@ -96,7 +100,6 @@ const updateOrCreateWindow = ( ) => updateOrCreateWindowCommon(async () => { if (chrome.runtime.lastError) return handleError(sendResponse); - try { sendResponse({ action: successAction }); } catch (error) { @@ -104,14 +107,14 @@ const updateOrCreateWindow = ( } }); -const waitForFormSubmission = (): Promise => +const waitForFormSubmission = (id: string): Promise => new Promise((resolve) => { const messageListener = ( - message: Message, + message: MessageWithId, sender: chrome.runtime.MessageSender, sendResponse: SendResponse ) => { - if (message.sender !== SENDER_EXTENSION) return; + if (message.sender !== SENDER_EXTENSION || message.id !== id) return; sendResponse({ action: BACKGROUND_SCRIPT_RECEIVED_DATA, sender: SENDER_BACKGROUND_SCRIPT @@ -124,52 +127,40 @@ const waitForFormSubmission = (): Promise => const createOrUpdateDataResponseWindow = ( sendResponse: SendResponseWithSender, - actionPayload: ActionPayload + parsedMessage: MessageWithId ) => updateOrCreateWindowCommon(async () => { if (chrome.runtime.lastError) return handleError(sendResponse); try { - const message = await waitForFormSubmission(); + const message = await waitForFormSubmission(parsedMessage.id); sendResponse(message); } catch (error) { handleError(sendResponse); } - }, actionPayload); - -const processMessage = async (message: Message, sendResponse: SendResponse) => { - const sendResponseWithSender = (response: ActionPayload) => - sendResponse({ ...response, sender: SENDER_BACKGROUND_SCRIPT }); - const parsedMessage = MessageWithIdSchema.safeParse(message); - if (!parsedMessage.success) return; + }, parsedMessage); +const processMessageWebApp = async ( + parsedMessage: MessageWithId, + sendResponseWithSender: SendResponseWithSender +) => { try { if (!(await isSetupComplete())) { return updateOrCreateWindow(NEEDS_SETUP, sendResponseWithSender); } - if (!session && parsedMessage.data.sender !== SENDER_EXTENSION) { - return sendResponseWithSender({ action: EXTENSION_NOT_AUTHENTICATED }); - } - - switch (parsedMessage.data.action) { + switch (parsedMessage.action) { case SIGN_UP: - return createOrUpdateDataResponseWindow(sendResponseWithSender, { - action: parsedMessage.data.action, - payload: parsedMessage.data.payload - }); + return createOrUpdateDataResponseWindow(sendResponseWithSender, parsedMessage); case SIGN_IN: - return (await isAppSignUpComplete(parsedMessage.data.payload.happId)) - ? createOrUpdateDataResponseWindow(sendResponseWithSender, { - action: parsedMessage.data.action, - payload: parsedMessage.data.payload - }) + return (await isAppSignUpComplete(parsedMessage.payload.happId)) + ? createOrUpdateDataResponseWindow(sendResponseWithSender, parsedMessage) : sendResponseWithSender({ action: NO_KEY_FOR_HAPP }); case SIGN_MESSAGE: if (!session) { return sendResponseWithSender({ action: EXTENSION_NOT_AUTHENTICATED }); } - if (await isAuthenticated(parsedMessage.data.payload.happId)) { - const signature = await signMessageLogic({ ...parsedMessage.data.payload, session }); + if (await isAuthenticated(parsedMessage.payload.happId)) { + const signature = await signMessageLogic({ ...parsedMessage.payload, session }); return sendResponseWithSender({ action: SIGN_MESSAGE_SUCCESS, payload: signature @@ -177,23 +168,35 @@ const processMessage = async (message: Message, sendResponse: SendResponse) => { } return sendResponseWithSender({ action: APP_NOT_AUTHENTICATED }); case SIGN_OUT: - signOut(parsedMessage.data.payload.happId); + signOut(parsedMessage.payload.happId); return sendResponseWithSender({ action: SIGN_OUT_SUCCESS }); + default: + return sendResponseWithSender({ action: UNKNOWN_ACTION }); + } + } catch (error) { + handleError(sendResponseWithSender); + } +}; + +const processMessageExtension = async ( + parsedMessage: MessageWithId, + sendResponseWithSender: SendResponseWithSender +) => { + try { + switch (parsedMessage.action) { case SETUP_EXTENSION_SESSION: - if (parsedMessage.data.sender === SENDER_EXTENSION) { - session = parsedMessage.data.payload; - } + session = parsedMessage.payload; return sendResponseWithSender({ action: BACKGROUND_SCRIPT_RECEIVED_DATA }); case GET_EXTENSION_SESSION: - if (parsedMessage.data.sender === SENDER_EXTENSION) { - return sendResponseWithSender({ - action: EXTENSION_SESSION_INFO, - payload: session - }); - } - return; + return sendResponseWithSender({ + action: EXTENSION_SESSION_INFO, + payload: session + }); + case SIGN_IN_SUCCESS: + case SIGN_UP_SUCCESS: + break; default: return sendResponseWithSender({ action: UNKNOWN_ACTION }); } @@ -203,6 +206,26 @@ const processMessage = async (message: Message, sendResponse: SendResponse) => { }; chrome.runtime.onMessage.addListener((message: Message, sender, sendResponse: SendResponse) => { - processMessage(message, sendResponse); + const sendResponseWithSender = (response: ActionPayload) => + sendResponse({ ...response, sender: SENDER_BACKGROUND_SCRIPT }); + + const parsedMessage = MessageWithIdSchema.safeParse(message); + if (!parsedMessage.success) return; + + const processMessage = (sender: string) => { + switch (sender) { + case SENDER_WEBAPP: + return processMessageWebApp; + case SENDER_EXTENSION: + return processMessageExtension; + default: + return null; + } + }; + + const handler = processMessage(parsedMessage.data.sender); + if (handler) { + handler(parsedMessage.data, sendResponseWithSender); + } return true; }); diff --git a/holo-key-manager-extension/scripts/helpers.ts b/holo-key-manager-extension/scripts/helpers.ts index ae7b95d..d9a26a4 100644 --- a/holo-key-manager-extension/scripts/helpers.ts +++ b/holo-key-manager-extension/scripts/helpers.ts @@ -1,6 +1,6 @@ import { AUTHENTICATED_APPS_LIST, SESSION } from '@shared/const'; import { base64ToUint8Array, uint8ArrayToBase64 } from '@shared/helpers'; -import { storageService } from '@shared/services'; +import { getDeviceKey, storageService } from '@shared/services'; import { AuthenticatedAppsListSchema, type SignMessage, @@ -10,6 +10,8 @@ import { import * as hcSeedBundle from 'hcSeedBundle'; export const signMessageLogic = async ({ message, happId, session }: SignMessage) => { + const encryptedDeviceKey = await getDeviceKey(); + const authenticatedAppsListData = await storageService.getWithoutCallback({ key: AUTHENTICATED_APPS_LIST, area: SESSION @@ -26,13 +28,15 @@ export const signMessageLogic = async ({ message, happId, session }: SignMessage await hcSeedBundle.seedBundleReady; - const cipherList = hcSeedBundle.UnlockedSeedBundle.fromLocked(base64ToUint8Array(session)); + const cipherList = hcSeedBundle.UnlockedSeedBundle.fromLocked( + base64ToUint8Array(encryptedDeviceKey) + ); if (!(cipherList[0] instanceof hcSeedBundle.LockedSeedCipherPwHash)) { throw new Error('Expecting PwHash'); } - const pw = new TextEncoder().encode(SESSION); + const pw = new TextEncoder().encode(session); const keyUnlocked = cipherList[0].unlock(hcSeedBundle.parseSecret(pw)); const appKey = keyUnlocked.derive(index); diff --git a/holo-key-manager-extension/scripts/rollup.config.js b/holo-key-manager-extension/scripts/rollup.config.js index ad5e7cf..6d6fcbd 100644 --- a/holo-key-manager-extension/scripts/rollup.config.js +++ b/holo-key-manager-extension/scripts/rollup.config.js @@ -2,7 +2,7 @@ import commonjs from '@rollup/plugin-commonjs'; import inject from '@rollup/plugin-inject'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import replace from '@rollup/plugin-replace'; -import terser from '@rollup/plugin-terser'; +// import terser from '@rollup/plugin-terser'; import nodePolyfills from 'rollup-plugin-node-polyfills'; import tscAlias from 'rollup-plugin-tsc-alias'; import typescript from 'rollup-plugin-typescript2'; @@ -26,8 +26,8 @@ const createConfig = (input, file) => ({ global: 'self', 'global.': 'self.' }), - typescript(), - terser() + typescript() + // terser() ] }); diff --git a/holo-key-manager-extension/src/lib/helpers/navigation.ts b/holo-key-manager-extension/src/lib/helpers/navigation.ts index 290e323..a6b0734 100644 --- a/holo-key-manager-extension/src/lib/helpers/navigation.ts +++ b/holo-key-manager-extension/src/lib/helpers/navigation.ts @@ -13,7 +13,8 @@ export const extractDetailsFromUrl = derived(page, ($page) => { happUiUrl: '', message: 'Unknown Message', requireEmail: false, - requireRegistrationCode: false + requireRegistrationCode: false, + messageId: '' }; const params = new URLSearchParams(new URL($page.url.href).search); diff --git a/holo-key-manager-extension/src/lib/helpers/queries.ts b/holo-key-manager-extension/src/lib/helpers/queries.ts index 5932bf4..bb92919 100644 --- a/holo-key-manager-extension/src/lib/helpers/queries.ts +++ b/holo-key-manager-extension/src/lib/helpers/queries.ts @@ -4,7 +4,6 @@ import { unlockKey } from '$services'; import { AUTHENTICATED_APPS_LIST, BACKGROUND_SCRIPT_RECEIVED_DATA, - DEVICE_KEY, EXTENSION_SESSION_INFO, GET_EXTENSION_SESSION, LOCAL, @@ -13,10 +12,15 @@ import { SESSION } from '$shared/const'; import { parseMessageSchema, uint8ArrayToBase64 } from '$shared/helpers'; -import { sendMessage, storageService } from '$shared/services'; +import { + createMessageWithId, + getDeviceKey, + responseToMessage, + sendMessage, + storageService +} from '$shared/services'; import { AuthenticatedAppsListSchema, - EncryptedDeviceKeySchema, HashSaltSchema, type Message, PubKeySchema @@ -53,8 +57,10 @@ export const fetchAuthenticatedAppsList = async (happId?: string) => { return parsedAuthenticatedAppsListData.data; }; -export const sendMessageAndHandleResponse = async (message: Message) => { - const response = await sendMessage(message); +export const sendMessageAndHandleResponse = async (message: Message, id?: string) => { + const messageWithId = id ? responseToMessage(message, id) : createMessageWithId(message); + + const response = await sendMessage(messageWithId); const parsedResponse = parseMessageSchema(response); @@ -63,11 +69,13 @@ export const sendMessageAndHandleResponse = async (message: Message) => { }; export const getExtensionSession = async () => { - const response = await sendMessage({ + const messageWithId = createMessageWithId({ sender: SENDER_EXTENSION, action: GET_EXTENSION_SESSION }); + const response = await sendMessage(messageWithId); + const parsedResponse = parseMessageSchema(response); if (!parsedResponse.success || parsedResponse.data.action !== EXTENSION_SESSION_INFO) { @@ -77,21 +85,6 @@ export const getExtensionSession = async () => { return parsedResponse.data.payload; }; -export const getDeviceKey = async () => { - const deviceKey = await storageService.getWithoutCallback({ - key: DEVICE_KEY, - area: LOCAL - }); - - const parsedDeviceKey = EncryptedDeviceKeySchema.safeParse(deviceKey); - - if (!parsedDeviceKey.success) { - throw new Error('Invalid device key'); - } - - return parsedDeviceKey.data; -}; - export const deriveSignPubKey = async (newIndex: number) => { const session = await getExtensionSession(); diff --git a/holo-key-manager-extension/src/lib/queries/applicationQueries.ts b/holo-key-manager-extension/src/lib/queries/applicationQueries.ts index 784525b..d41a7d5 100644 --- a/holo-key-manager-extension/src/lib/queries/applicationQueries.ts +++ b/holo-key-manager-extension/src/lib/queries/applicationQueries.ts @@ -27,6 +27,7 @@ export function createApplicationKeyMutation(queryClient: QueryClient) { happName: string; happLogo: string; happUiUrl: string; + messageId: string; email?: string; registrationCode?: string; }) => { @@ -69,15 +70,20 @@ export function createApplicationKeyMutation(queryClient: QueryClient) { area: SESSION }); - await sendMessageAndHandleResponse({ - sender: SENDER_EXTENSION, - action: SIGN_UP_SUCCESS, - payload: { - pubKey: pubKeyObject.pubKey, - ...(mutationData.email && { email: mutationData.email }), - ...(mutationData.registrationCode && { registrationCode: mutationData.registrationCode }) - } - }); + await sendMessageAndHandleResponse( + { + sender: SENDER_EXTENSION, + action: SIGN_UP_SUCCESS, + payload: { + pubKey: pubKeyObject.pubKey, + ...(mutationData.email && { email: mutationData.email }), + ...(mutationData.registrationCode && { + registrationCode: mutationData.registrationCode + }) + } + }, + mutationData.messageId + ); }, onSuccess: handleSuccess(queryClient, [APPLICATION_KEYS]) }); @@ -85,8 +91,8 @@ export function createApplicationKeyMutation(queryClient: QueryClient) { export function createSignInWithKeyMutation(queryClient: QueryClient) { return createMutation({ - mutationFn: async (signInData: { keyName: string; happId: string }) => { - const { keyName, happId } = signInData; + mutationFn: async (signInData: { keyName: string; happId: string; messageId: string }) => { + const { keyName, happId, messageId } = signInData; const currentAppsList = await fetchAndParseAppsList(); const appData = currentAppsList.find( @@ -114,11 +120,14 @@ export function createSignInWithKeyMutation(queryClient: QueryClient) { area: SESSION }); - await sendMessageAndHandleResponse({ - sender: SENDER_EXTENSION, - action: SIGN_IN_SUCCESS, - payload: pubKey - }); + await sendMessageAndHandleResponse( + { + sender: SENDER_EXTENSION, + action: SIGN_IN_SUCCESS, + payload: pubKey + }, + messageId + ); }, onSuccess: handleSuccess(queryClient, [APPLICATION_SIGNED_IN_KEY]) }); diff --git a/holo-key-manager-extension/src/lib/queries/password.ts b/holo-key-manager-extension/src/lib/queries/password.ts index 24072d1..19d492e 100644 --- a/holo-key-manager-extension/src/lib/queries/password.ts +++ b/holo-key-manager-extension/src/lib/queries/password.ts @@ -2,7 +2,6 @@ import { createMutation, createQuery, type QueryClient } from '@tanstack/svelte- import { get } from 'svelte/store'; import { - getDeviceKey, getExtensionSession, getPassword, handleSuccess, @@ -21,7 +20,7 @@ import { SETUP_KEY, SETUP_PASSWORD } from '$shared/const'; -import { storageService } from '$shared/services'; +import { getDeviceKey, storageService } from '$shared/services'; import { deviceKeyContentStore, passphraseStore, passwordStore } from '$stores'; const storePassword = async (password: string) => { diff --git a/holo-key-manager-extension/src/lib/services/manage-keys.ts b/holo-key-manager-extension/src/lib/services/manage-keys.ts index 58209a4..a7ca71d 100644 --- a/holo-key-manager-extension/src/lib/services/manage-keys.ts +++ b/holo-key-manager-extension/src/lib/services/manage-keys.ts @@ -27,9 +27,10 @@ const deriveAndLock = ( generate_by: 'keymanager-v1.0' }); - lock(root, passphrase); + const encodedBytes = lock(root, passphrase); + root.zero(); - return root.zero(); + return encodedBytes; }; export async function generateKeys( diff --git a/holo-key-manager-extension/src/routes/webapp-extension/create-key/+page.svelte b/holo-key-manager-extension/src/routes/webapp-extension/create-key/+page.svelte index e5f0bc4..36541db 100644 --- a/holo-key-manager-extension/src/routes/webapp-extension/create-key/+page.svelte +++ b/holo-key-manager-extension/src/routes/webapp-extension/create-key/+page.svelte @@ -66,6 +66,7 @@ happName: $extractDetailsFromUrl.happName, happLogo: $extractDetailsFromUrl.happLogo, happUiUrl: $extractDetailsFromUrl.happUiUrl, + messageId: $extractDetailsFromUrl.messageId, email, registrationCode }, diff --git a/holo-key-manager-extension/src/routes/webapp-extension/select-key-to-login/+page.svelte b/holo-key-manager-extension/src/routes/webapp-extension/select-key-to-login/+page.svelte index 6392298..f4686ec 100644 --- a/holo-key-manager-extension/src/routes/webapp-extension/select-key-to-login/+page.svelte +++ b/holo-key-manager-extension/src/routes/webapp-extension/select-key-to-login/+page.svelte @@ -56,7 +56,8 @@ $signInWithKeyMutation.mutate( { happId: $extractDetailsFromUrl.happId, - keyName: selectedKey + keyName: selectedKey, + messageId: $extractDetailsFromUrl.messageId }, { onSuccess: dismissWindow diff --git a/shared/const/app.ts b/shared/const/app.ts index 9a95efa..00a2391 100644 --- a/shared/const/app.ts +++ b/shared/const/app.ts @@ -12,5 +12,6 @@ export const relevantKeys = [ 'happLogo', 'requireEmail', 'requireRegistrationCode', - 'message' + 'message', + 'messageId' ] as const; diff --git a/shared/helpers/other.ts b/shared/helpers/other.ts index d1c6d7d..e0dcc81 100644 --- a/shared/helpers/other.ts +++ b/shared/helpers/other.ts @@ -1,5 +1,5 @@ import { relevantKeys } from '../const'; -import { type ActionPayload, MessageSchema, type MessageWithId } from '../types'; +import { MessageSchema, type MessageWithId } from '../types'; export const isChromeDefined = () => typeof chrome !== 'undefined'; export const isChromeStorageSafe = () => @@ -14,20 +14,23 @@ export const isChromePermissionsSafe = () => typeof chrome.permissions.request === 'function' && typeof chrome.permissions.getAll === 'function'; -export const createQueryParams = (params: ActionPayload) => { +export const createQueryParams = (parsedMessage: MessageWithId) => { const additionalParams = relevantKeys.reduce( (acc, key) => { if ( - 'payload' in params && - params.payload && - typeof params.payload === 'object' && - key in params.payload + 'payload' in parsedMessage && + parsedMessage.payload && + typeof parsedMessage.payload === 'object' && + key in parsedMessage.payload ) { - return { ...acc, [key]: String(params.payload[key as keyof typeof params.payload]) }; + return { + ...acc, + [key]: String(parsedMessage.payload[key as keyof typeof parsedMessage.payload]) + }; } return acc; }, - { action: params.action } + { action: parsedMessage.action, messageId: parsedMessage.id } ); return new URLSearchParams(additionalParams).toString(); diff --git a/shared/services/message.ts b/shared/services/message.ts index 78ff85b..51eb503 100644 --- a/shared/services/message.ts +++ b/shared/services/message.ts @@ -2,21 +2,21 @@ import { uid } from 'uid'; import { HOLO_KEY_MANAGER_APP_ID } from '../const'; import { isChromeMessageSafe } from '../helpers'; -import type { Message } from '../types'; +import type { Message, MessageWithId } from '../types'; -export const createMessageWithId = (message: Message) => ({ +export const createMessageWithId = (message: Message): MessageWithId => ({ ...message, id: uid(), appId: HOLO_KEY_MANAGER_APP_ID }); -export const responseToMessage = (message: Message, messageId: string) => ({ +export const responseToMessage = (message: Message, messageId: string): MessageWithId => ({ ...message, id: messageId, appId: HOLO_KEY_MANAGER_APP_ID }); -export const sendMessage = (message: Message) => { +export const sendMessage = (message: MessageWithId) => { if (isChromeMessageSafe()) { return chrome.runtime.sendMessage(message); } diff --git a/shared/services/storage.ts b/shared/services/storage.ts index 826c798..870bd1e 100644 --- a/shared/services/storage.ts +++ b/shared/services/storage.ts @@ -103,3 +103,18 @@ export const signOut = async (happId: string) => { }); } }; + +export const getDeviceKey = async () => { + const deviceKey = await storageService.getWithoutCallback({ + key: DEVICE_KEY, + area: LOCAL + }); + + const parsedDeviceKey = EncryptedDeviceKeySchema.safeParse(deviceKey); + + if (!parsedDeviceKey.success) { + throw new Error('Invalid device key'); + } + + return parsedDeviceKey.data; +}; From a1a27f8ce81ea9f51b9474084909f940ed445ee1 Mon Sep 17 00:00:00 2001 From: Dawid Urbas Date: Sun, 19 May 2024 09:41:17 +0200 Subject: [PATCH 4/5] Bump deps --- .../scripts/rollup.config.js | 6 +- .../static/manifest.json | 2 +- package.json | 16 +- pnpm-lock.yaml | 711 +++++++++--------- 4 files changed, 358 insertions(+), 377 deletions(-) diff --git a/holo-key-manager-extension/scripts/rollup.config.js b/holo-key-manager-extension/scripts/rollup.config.js index 6d6fcbd..ad5e7cf 100644 --- a/holo-key-manager-extension/scripts/rollup.config.js +++ b/holo-key-manager-extension/scripts/rollup.config.js @@ -2,7 +2,7 @@ import commonjs from '@rollup/plugin-commonjs'; import inject from '@rollup/plugin-inject'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import replace from '@rollup/plugin-replace'; -// import terser from '@rollup/plugin-terser'; +import terser from '@rollup/plugin-terser'; import nodePolyfills from 'rollup-plugin-node-polyfills'; import tscAlias from 'rollup-plugin-tsc-alias'; import typescript from 'rollup-plugin-typescript2'; @@ -26,8 +26,8 @@ const createConfig = (input, file) => ({ global: 'self', 'global.': 'self.' }), - typescript() - // terser() + typescript(), + terser() ] }); diff --git a/holo-key-manager-extension/static/manifest.json b/holo-key-manager-extension/static/manifest.json index 8880f52..268142b 100644 --- a/holo-key-manager-extension/static/manifest.json +++ b/holo-key-manager-extension/static/manifest.json @@ -1,7 +1,7 @@ { "name": "Holo key manager", "description": "A browser extension to manage holo keys", - "version": "0.0.54", + "version": "0.0.55", "manifest_version": 3, "action": { "default_title": "Holo key manager", diff --git a/package.json b/package.json index d3e4711..784d809 100644 --- a/package.json +++ b/package.json @@ -20,23 +20,23 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.2.3", - "@types/chrome": "^0.0.263", - "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", + "@types/chrome": "^0.0.268", + "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/parser": "^7.9.0", "concurrently": "^8.2.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-simple-import-sort": "^12.0.0", - "eslint-plugin-svelte": "^2.35.1", + "eslint-plugin-simple-import-sort": "^12.1.0", + "eslint-plugin-svelte": "^2.39.0", "husky": "^9.0.11", "lint-staged": "^15.2.2", "prettier": "^3.2.5", - "rollup": "^4.13.0", + "rollup": "^4.17.2", "rollup-plugin-tsc-alias": "^1.1.2", "rollup-plugin-typescript2": "^0.36.0", - "typescript": "^5.4.3" + "typescript": "^5.4.5" }, "dependencies": { - "zod": "^3.22.4" + "zod": "^3.23.8" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d895a4d..17319ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,21 +9,21 @@ importers: .: dependencies: zod: - specifier: ^3.22.4 - version: 3.22.4 + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.13.0) + version: 15.2.3(rollup@4.17.2) '@types/chrome': - specifier: ^0.0.263 - version: 0.0.263 + specifier: ^0.0.268 + version: 0.0.268 '@typescript-eslint/eslint-plugin': - specifier: ^7.3.1 - version: 7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3) + specifier: ^7.9.0 + version: 7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^7.3.1 - version: 7.3.1(eslint@8.57.0)(typescript@5.4.3) + specifier: ^7.9.0 + version: 7.9.0(eslint@8.57.0)(typescript@5.4.5) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -34,11 +34,11 @@ importers: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-plugin-simple-import-sort: - specifier: ^12.0.0 - version: 12.0.0(eslint@8.57.0) + specifier: ^12.1.0 + version: 12.1.0(eslint@8.57.0) eslint-plugin-svelte: - specifier: ^2.35.1 - version: 2.35.1(eslint@8.57.0) + specifier: ^2.39.0 + version: 2.39.0(eslint@8.57.0) husky: specifier: ^9.0.11 version: 9.0.11 @@ -49,26 +49,26 @@ importers: specifier: ^3.2.5 version: 3.2.5 rollup: - specifier: ^4.13.0 - version: 4.13.0 + specifier: ^4.17.2 + version: 4.17.2 rollup-plugin-tsc-alias: specifier: ^1.1.2 - version: 1.1.2(rollup@4.13.0) + version: 1.1.2(rollup@4.17.2) rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.13.0)(typescript@5.4.3) + version: 0.36.0(rollup@4.17.2)(typescript@5.4.5) typescript: - specifier: ^5.4.3 - version: 5.4.3 + specifier: ^5.4.5 + version: 5.4.5 holo-key-manager-extension: dependencies: '@tanstack/svelte-query': specifier: ^5.28.6 - version: 5.28.6(svelte@4.2.12) + version: 5.37.1(svelte@4.2.17) clsx: specifier: ^2.1.0 - version: 2.1.0 + version: 2.1.1 file-saver: specifier: ^2.0.5 version: 2.0.5 @@ -80,23 +80,23 @@ importers: version: 3.10.1 svelte: specifier: ^4.2.12 - version: 4.2.12 + version: 4.2.17 tailwindcss: specifier: ^3.4.1 - version: 3.4.1 + version: 3.4.3 tiny-glob: specifier: ^0.2.9 version: 0.2.9 devDependencies: '@sveltejs/adapter-static': specifier: ^3.0.1 - version: 3.0.1(@sveltejs/kit@2.5.4) + version: 3.0.1(@sveltejs/kit@2.5.9) '@sveltejs/kit': specifier: ^2.5.4 - version: 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.4) + version: 2.5.9(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.17)(vite@5.2.11) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.12)(vite@5.2.4) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11) '@types/file-saver': specifier: ^2.0.7 version: 2.0.7 @@ -111,40 +111,40 @@ importers: version: 8.4.38 prettier-plugin-svelte: specifier: ^3.2.2 - version: 3.2.2(prettier@3.2.5)(svelte@4.2.12) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) prettier-plugin-tailwindcss: specifier: ^0.5.11 - version: 0.5.12(prettier-plugin-svelte@3.2.2)(prettier@3.2.5) + version: 0.5.14(prettier-plugin-svelte@3.2.3)(prettier@3.2.5) svelte-check: specifier: ^3.6.8 - version: 3.6.8(postcss@8.4.38)(svelte@4.2.12) + version: 3.7.1(postcss@8.4.38)(svelte@4.2.17) svelte-file-dropzone: specifier: ^2.0.4 - version: 2.0.4(svelte@4.2.12) + version: 2.0.7(svelte@4.2.17) tslib: specifier: ^2.6.2 version: 2.6.2 vite: specifier: ^5.2.4 - version: 5.2.4 + version: 5.2.11 holo-key-manager-extension/scripts: devDependencies: '@rollup/plugin-commonjs': specifier: ^25.0.7 - version: 25.0.7(rollup@4.13.0) + version: 25.0.7(rollup@4.17.2) '@rollup/plugin-inject': specifier: ^5.0.5 - version: 5.0.5(rollup@4.13.0) + version: 5.0.5(rollup@4.17.2) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.13.0) + version: 15.2.3(rollup@4.17.2) '@rollup/plugin-replace': specifier: ^5.0.5 - version: 5.0.5(rollup@4.13.0) + version: 5.0.5(rollup@4.17.2) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.13.0) + version: 0.4.4(rollup@4.17.2) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -162,11 +162,6 @@ importers: packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -179,8 +174,8 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/runtime@7.24.5: + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -434,7 +429,7 @@ packages: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -446,8 +441,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true /@isaacs/cliui@8.0.2: @@ -531,7 +526,7 @@ packages: resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@4.13.0): + /@rollup/plugin-commonjs@25.0.7(rollup@4.17.2): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -540,16 +535,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.8 - rollup: 4.13.0 + magic-string: 0.30.10 + rollup: 4.17.2 dev: true - /@rollup/plugin-inject@5.0.5(rollup@4.13.0): + /@rollup/plugin-inject@5.0.5(rollup@4.17.2): resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -558,13 +553,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) estree-walker: 2.0.2 - magic-string: 0.30.8 - rollup: 4.13.0 + magic-string: 0.30.10 + rollup: 4.17.2 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.13.0): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.17.2): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -573,16 +568,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 - rollup: 4.13.0 + rollup: 4.17.2 dev: true - /@rollup/plugin-replace@5.0.5(rollup@4.13.0): + /@rollup/plugin-replace@5.0.5(rollup@4.17.2): resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -591,12 +586,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.13.0) - magic-string: 0.30.8 - rollup: 4.13.0 + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) + magic-string: 0.30.10 + rollup: 4.17.2 dev: true - /@rollup/plugin-terser@0.4.4(rollup@4.13.0): + /@rollup/plugin-terser@0.4.4(rollup@4.17.2): resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -605,10 +600,10 @@ packages: rollup: optional: true dependencies: - rollup: 4.13.0 + rollup: 4.17.2 serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.30.3 + terser: 5.31.0 dev: true /@rollup/pluginutils@4.2.1: @@ -619,7 +614,7 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.13.0): + /@rollup/pluginutils@5.1.0(rollup@4.17.2): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -631,123 +626,147 @@ packages: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.13.0 + rollup: 4.17.2 dev: true - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + /@rollup/rollup-android-arm-eabi@4.17.2: + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.13.0: - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + /@rollup/rollup-android-arm64@4.17.2: + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + /@rollup/rollup-darwin-arm64@4.17.2: + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.13.0: - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + /@rollup/rollup-darwin-x64@4.17.2: + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + /@rollup/rollup-linux-arm-musleabihf@4.17.2: + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.17.2: + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + /@rollup/rollup-linux-arm64-musl@4.17.2: + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.17.2: + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + /@rollup/rollup-linux-s390x-gnu@4.17.2: + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.17.2: + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + /@rollup/rollup-linux-x64-musl@4.17.2: + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + /@rollup/rollup-win32-arm64-msvc@4.17.2: + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + /@rollup/rollup-win32-ia32-msvc@4.17.2: + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + /@rollup/rollup-win32-x64-msvc@4.17.2: + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@sveltejs/adapter-static@3.0.1(@sveltejs/kit@2.5.4): + /@sveltejs/adapter-static@3.0.1(@sveltejs/kit@2.5.9): resolution: {integrity: sha512-6lMvf7xYEJ+oGeR5L8DFJJrowkefTK6ZgA4JiMqoClMkKq0s6yvsd3FZfCFvX1fQ0tpCD7fkuRVHsnUVgsHyNg==} peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.4) + '@sveltejs/kit': 2.5.9(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.17)(vite@5.2.11) dev: true - /@sveltejs/kit@2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.4): - resolution: {integrity: sha512-eDxK2d4EGzk99QsZNoPXe7jlzA5EGqfcCpUwZ912bhnalsZ2ZsG5wGRthkydupVjYyqdmzEanVKFhLxU2vkPSQ==} + /@sveltejs/kit@2.5.9(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.17)(vite@5.2.11): + resolution: {integrity: sha512-x8biUVHPQq075/ESH/UO+fwENtAcw0kg9+bloqqEnbLUNWcrWpmcL3vKrKJc4vaVh/CYKFXn47N98Sbt/Y3vKQ==} engines: {node: '>=18.13'} hasBin: true requiresBuild: true @@ -756,76 +775,76 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.4) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11) '@types/cookie': 0.6.0 cookie: 0.6.0 - devalue: 4.3.2 + devalue: 5.0.0 esm-env: 1.0.0 - import-meta-resolve: 4.0.0 + import-meta-resolve: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.8 + magic-string: 0.30.10 mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.12 + svelte: 4.2.17 tiny-glob: 0.2.9 - vite: 5.2.4 + vite: 5.2.11 dev: true - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.4): - resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} + /@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.17)(vite@5.2.11): + resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} engines: {node: ^18.0.0 || >=20} peerDependencies: '@sveltejs/vite-plugin-svelte': ^3.0.0 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.4) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11) debug: 4.3.4 - svelte: 4.2.12 - vite: 5.2.4 + svelte: 4.2.17 + vite: 5.2.11 transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.4): - resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} + /@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11): + resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.4) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.17)(vite@5.2.11) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.8 - svelte: 4.2.12 - svelte-hmr: 0.15.3(svelte@4.2.12) - vite: 5.2.4 - vitefu: 0.2.5(vite@5.2.4) + magic-string: 0.30.10 + svelte: 4.2.17 + svelte-hmr: 0.16.0(svelte@4.2.17) + vite: 5.2.11 + vitefu: 0.2.5(vite@5.2.11) transitivePeerDependencies: - supports-color dev: true - /@tanstack/query-core@5.28.6: - resolution: {integrity: sha512-hnhotV+DnQtvtR3jPvbQMPNMW4KEK0J4k7c609zJ8muiNknm+yoDyMHmxTWM5ZnlZpsz0zOxYFr+mzRJNHWJsA==} + /@tanstack/query-core@5.36.1: + resolution: {integrity: sha512-BteWYEPUcucEu3NBcDAgKuI4U25R9aPrHSP6YSf2NvaD2pSlIQTdqOfLRsxH9WdRYg7k0Uom35Uacb6nvbIMJg==} dev: false - /@tanstack/svelte-query@5.28.6(svelte@4.2.12): - resolution: {integrity: sha512-AOYzN3UfxhBdiO8lm9zYS0uM+6ByqxraGQgkYxfmveKXvXnzfNNKg4BomIheG0g91eVi/iQUmz0e/TniAzCi3Q==} + /@tanstack/svelte-query@5.37.1(svelte@4.2.17): + resolution: {integrity: sha512-2Z+QhGrVV+Nd4dVK41uFMg4l3TRzVBrgHopOeJiA9OVOEaeXp3E1Yvf6htjGhP2+0lyZ7KoyyX10iv7mUMVwGw==} peerDependencies: svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0 dependencies: - '@tanstack/query-core': 5.28.6 - svelte: 4.2.12 + '@tanstack/query-core': 5.36.1 + svelte: 4.2.17 dev: false - /@types/chrome@0.0.263: - resolution: {integrity: sha512-As0vzv99ov3M6ZR7R6VzhMWFZXkPMrFrCEXXVrMN576Cm70fTkj7Df2CF+qEo170JepX50pd11cX6O4DSAtl2Q==} + /@types/chrome@0.0.268: + resolution: {integrity: sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA==} dependencies: - '@types/filesystem': 0.0.35 + '@types/filesystem': 0.0.36 '@types/har-format': 1.2.15 dev: true @@ -840,8 +859,8 @@ packages: resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} dev: true - /@types/filesystem@0.0.35: - resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} + /@types/filesystem@0.0.36: + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} dependencies: '@types/filewriter': 0.0.33 dev: true @@ -854,10 +873,6 @@ packages: resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - /@types/pug@2.0.10: resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} dev: true @@ -866,12 +881,8 @@ packages: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - - /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==} + /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -882,25 +893,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4 + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==} + /@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -909,27 +918,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@7.3.1: - resolution: {integrity: sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==} + /@typescript-eslint/scope-manager@7.9.0: + resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 dev: true - /@typescript-eslint/type-utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==} + /@typescript-eslint/type-utils@7.9.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -938,23 +947,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) - '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@7.3.1: - resolution: {integrity: sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==} + /@typescript-eslint/types@7.9.0: + resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@7.3.1(typescript@5.4.3): - resolution: {integrity: sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==} + /@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5): + resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -962,43 +971,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==} + /@typescript-eslint/utils@7.9.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) eslint: 8.57.0 - semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@7.3.1: - resolution: {integrity: sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==} + /@typescript-eslint/visitor-keys@7.9.0: + resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.3.1 + '@typescript-eslint/types': 7.9.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1035,11 +1041,9 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} - dependencies: - type-fest: 3.13.1 dev: true /ansi-regex@5.0.1: @@ -1075,7 +1079,7 @@ packages: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} dependencies: - glob: 10.3.10 + glob: 10.3.15 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -1127,10 +1131,10 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001600 + caniuse-lite: 1.0.30001620 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true @@ -1157,8 +1161,8 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} /brace-expansion@1.1.11: @@ -1184,10 +1188,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.715 + caniuse-lite: 1.0.30001620 + electron-to-chromium: 1.4.774 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.0) dev: true /buffer-crc32@0.2.13: @@ -1225,8 +1229,8 @@ packages: engines: {node: '>= 6'} dev: false - /caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + /caniuse-lite@1.0.30001620: + resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} dev: true /chalk@4.1.2: @@ -1280,8 +1284,8 @@ packages: wrap-ansi: 7.0.0 dev: true - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} dev: false @@ -1396,7 +1400,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: mdn-data: 2.0.30 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -1407,7 +1411,7 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.5 dev: true /debug@4.3.4: @@ -1440,8 +1444,8 @@ packages: engines: {node: '>=8'} dev: true - /devalue@4.3.2: - resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + /devalue@5.0.0: + resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} dev: true /didyoumean@1.2.2: @@ -1469,8 +1473,8 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /electron-to-chromium@1.4.715: - resolution: {integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==} + /electron-to-chromium@1.4.774: + resolution: {integrity: sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==} dev: true /emoji-regex@10.3.0: @@ -1528,13 +1532,14 @@ packages: engines: {node: '>=10'} dev: true - /eslint-compat-utils@0.1.2(eslint@8.57.0): - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + /eslint-compat-utils@0.5.0(eslint@8.57.0): + resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' dependencies: eslint: 8.57.0 + semver: 7.6.2 dev: true /eslint-config-prettier@9.1.0(eslint@8.57.0): @@ -1546,20 +1551,20 @@ packages: eslint: 8.57.0 dev: true - /eslint-plugin-simple-import-sort@12.0.0(eslint@8.57.0): - resolution: {integrity: sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==} + /eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): + resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} peerDependencies: eslint: '>=5.0.0' dependencies: eslint: 8.57.0 dev: true - /eslint-plugin-svelte@2.35.1(eslint@8.57.0): - resolution: {integrity: sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==} + /eslint-plugin-svelte@2.39.0(eslint@8.57.0): + resolution: {integrity: sha512-FXktBLXsrxbA+6ZvJK2z/sQOrUKyzSg3fNWK5h0reSCjr2fjAsc9ai/s/JvSl4Hgvz3nYVtTIMwarZH5RcB7BA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 - svelte: ^3.37.0 || ^4.0.0 + eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 peerDependenciesMeta: svelte: optional: true @@ -1568,15 +1573,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 debug: 4.3.4 eslint: 8.57.0 - eslint-compat-utils: 0.1.2(eslint@8.57.0) + eslint-compat-utils: 0.5.0(eslint@8.57.0) esutils: 2.0.3 - known-css-properties: 0.29.0 + known-css-properties: 0.31.0 postcss: 8.4.38 postcss-load-config: 3.1.4(postcss@8.4.38) postcss-safe-parser: 6.0.0(postcss@8.4.38) postcss-selector-parser: 6.0.16 - semver: 7.6.0 - svelte-eslint-parser: 0.33.1 + semver: 7.6.2 + svelte-eslint-parser: 0.36.0 transitivePeerDependencies: - supports-color - ts-node @@ -1635,7 +1640,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -1875,16 +1880,16 @@ packages: dependencies: is-glob: 4.0.3 - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + /glob@10.3.15: + resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + engines: {node: '>=16 || 14 >=14.18'} hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + minimatch: 9.0.4 + minipass: 7.1.1 + path-scurry: 1.11.1 /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -1984,8 +1989,8 @@ packages: resolve-from: 4.0.0 dev: true - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} dev: true /imurmurhash@0.1.4: @@ -2007,7 +2012,7 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} @@ -2147,8 +2152,8 @@ packages: engines: {node: '>=6'} dev: true - /known-css-properties@0.29.0: - resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + /known-css-properties@0.31.0: + resolution: {integrity: sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==} dev: true /lazystream@1.0.1: @@ -2260,33 +2265,25 @@ packages: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} dependencies: - ansi-escapes: 6.2.0 + ansi-escapes: 6.2.1 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 dev: true - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -2343,8 +2340,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -2353,8 +2350,8 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + /minipass@7.1.1: + resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} engines: {node: '>=16 || 14 >=14.17'} /mkdirp@0.5.6: @@ -2450,16 +2447,16 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 dev: true /p-limit@2.3.0: @@ -2528,12 +2525,12 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.2.2 + minipass: 7.1.1 /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2547,8 +2544,8 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.2 - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2637,7 +2634,7 @@ packages: dependencies: lilconfig: 3.1.1 postcss: 8.4.38 - yaml: 2.4.1 + yaml: 2.4.2 dev: false /postcss-nested@6.0.1(postcss@8.4.38): @@ -2647,7 +2644,7 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.38 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: false /postcss-safe-parser@6.0.0(postcss@8.4.38): @@ -2668,21 +2665,12 @@ packages: postcss: 8.4.38 dev: true - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - /postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -2692,7 +2680,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 /prelude-ls@1.2.1: @@ -2700,24 +2688,25 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12): - resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} + /prettier-plugin-svelte@3.2.3(prettier@3.2.5)(svelte@4.2.17): + resolution: {integrity: sha512-wJq8RunyFlWco6U0WJV5wNCM7zpBFakS76UBSbmzMGpncpK98NZABaE+s7n8/APDCEVNHXC5Mpq+MLebQtsRlg==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 dependencies: prettier: 3.2.5 - svelte: 4.2.12 + svelte: 4.2.17 dev: true - /prettier-plugin-tailwindcss@0.5.12(prettier-plugin-svelte@3.2.2)(prettier@3.2.5): - resolution: {integrity: sha512-o74kiDBVE73oHW+pdkFSluHBL3cYEvru5YgEqNkBMFF7Cjv+w1vI565lTlfoJT4VLWDe0FMtZ7FkE/7a4pMXSQ==} + /prettier-plugin-tailwindcss@0.5.14(prettier-plugin-svelte@3.2.3)(prettier@3.2.5): + resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' '@prettier/plugin-pug': '*' '@shopify/prettier-plugin-liquid': '*' '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' @@ -2729,7 +2718,6 @@ packages: prettier-plugin-sort-imports: '*' prettier-plugin-style-order: '*' prettier-plugin-svelte: '*' - prettier-plugin-twig-melody: '*' peerDependenciesMeta: '@ianvs/prettier-plugin-sort-imports': optional: true @@ -2739,6 +2727,8 @@ packages: optional: true '@trivago/prettier-plugin-sort-imports': optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true prettier-plugin-astro: optional: true prettier-plugin-css-order: @@ -2759,11 +2749,9 @@ packages: optional: true prettier-plugin-svelte: optional: true - prettier-plugin-twig-melody: - optional: true dependencies: prettier: 3.2.5 - prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.12) + prettier-plugin-svelte: 3.2.3(prettier@3.2.5)(svelte@4.2.17) dev: true /prettier@3.2.5: @@ -2910,16 +2898,16 @@ packages: rollup-plugin-inject: 3.0.2 dev: true - /rollup-plugin-tsc-alias@1.1.2(rollup@4.13.0): + /rollup-plugin-tsc-alias@1.1.2(rollup@4.17.2): resolution: {integrity: sha512-4WBISEJ8fDMX7SM9XgfZUPYaCCiFefvCH6xdRj0/+ydDBPZz4F2rtlfp1YDcekjez4NKwa8SSeM6UNTVs3YaeA==} peerDependencies: rollup: '> 2.0' dependencies: - rollup: 4.13.0 - tsc-alias: 1.8.8 + rollup: 4.17.2 + tsc-alias: 1.8.10 dev: true - /rollup-plugin-typescript2@0.36.0(rollup@4.13.0)(typescript@5.4.3): + /rollup-plugin-typescript2@0.36.0(rollup@4.17.2)(typescript@5.4.5): resolution: {integrity: sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==} peerDependencies: rollup: '>=1.26.3' @@ -2928,10 +2916,10 @@ packages: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 4.13.0 - semver: 7.6.0 + rollup: 4.17.2 + semver: 7.6.2 tslib: 2.6.2 - typescript: 5.4.3 + typescript: 5.4.5 dev: true /rollup-pluginutils@2.8.2: @@ -2940,26 +2928,29 @@ packages: estree-walker: 0.6.1 dev: true - /rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + /rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 dev: true @@ -3002,12 +2993,10 @@ packages: hasBin: true dev: true - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 dev: true /serialize-javascript@6.0.2: @@ -3090,10 +3079,6 @@ packages: sander: 0.5.1 dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -3205,7 +3190,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.3.15 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -3230,8 +3215,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.8(postcss@8.4.38)(svelte@4.2.12): - resolution: {integrity: sha512-rhXU7YCDtL+lq2gCqfJDXKTxJfSsCgcd08d7VWBFxTw6IWIbMWSaASbAOD3N0VV9TYSSLUqEBiratLd8WxAJJA==} + /svelte-check@3.7.1(postcss@8.4.38)(svelte@4.2.17): + resolution: {integrity: sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 @@ -3240,11 +3225,11 @@ packages: chokidar: 3.6.0 fast-glob: 3.3.2 import-fresh: 3.3.0 - picocolors: 1.0.0 + picocolors: 1.0.1 sade: 1.8.1 - svelte: 4.2.12 - svelte-preprocess: 5.1.3(postcss@8.4.38)(svelte@4.2.12)(typescript@5.4.3) - typescript: 5.4.3 + svelte: 4.2.17 + svelte-preprocess: 5.1.4(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -3257,11 +3242,11 @@ packages: - sugarss dev: true - /svelte-eslint-parser@0.33.1: - resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} + /svelte-eslint-parser@0.36.0: + resolution: {integrity: sha512-/6YmUSr0FAVxW8dXNdIMydBnddPMHzaHirAZ7RrT21XYdgGGZMh0LQG6CZsvAFS4r2Y4ItUuCQc8TQ3urB30mQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 peerDependenciesMeta: svelte: optional: true @@ -3273,27 +3258,27 @@ packages: postcss-scss: 4.0.9(postcss@8.4.38) dev: true - /svelte-file-dropzone@2.0.4(svelte@4.2.12): - resolution: {integrity: sha512-MkCQ68cXJ4yCSn5Qo8O43cV1Yx9Hq6vJ9kIQk3QlrMzqik398UTXjHTgZpMt2OKtfeRdOFd474CjWpQDJOnCog==} + /svelte-file-dropzone@2.0.7(svelte@4.2.17): + resolution: {integrity: sha512-sykRq+Q8rXM9yqsD3T9yzb3syLe21Go01cxb5NTfKA9RgMWHT/gnjS8g36YFWw3jIdC7vbbmuwwgYdA0mlcMqw==} peerDependencies: svelte: ^3.54.0 || ^4.0.0 dependencies: file-selector: 0.6.0 - svelte: 4.2.12 + svelte: 4.2.17 dev: true - /svelte-hmr@0.15.3(svelte@4.2.12): - resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} + /svelte-hmr@0.16.0(svelte@4.2.17): + resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.2.12 + svelte: 4.2.17 dev: true - /svelte-preprocess@5.1.3(postcss@8.4.38)(svelte@4.2.12)(typescript@5.4.3): - resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} - engines: {node: '>= 16.0.0', pnpm: ^8.0.0} + /svelte-preprocess@5.1.4(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5): + resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} + engines: {node: '>= 16.0.0'} requiresBuild: true peerDependencies: '@babel/core': ^7.10.2 @@ -3331,16 +3316,16 @@ packages: dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 - magic-string: 0.30.8 + magic-string: 0.30.10 postcss: 8.4.38 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.12 - typescript: 5.4.3 + svelte: 4.2.17 + typescript: 5.4.5 dev: true - /svelte@4.2.12: - resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} + /svelte@4.2.17: + resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} engines: {node: '>=16'} dependencies: '@ampproject/remapping': 2.3.0 @@ -3355,11 +3340,11 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.8 + magic-string: 0.30.10 periscopic: 3.1.0 - /tailwindcss@3.4.1: - resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + /tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -3376,13 +3361,13 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) postcss-load-config: 4.0.2(postcss@8.4.38) postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -3397,8 +3382,8 @@ packages: streamx: 2.16.1 dev: true - /terser@5.30.3: - resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + /terser@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -3447,21 +3432,21 @@ packages: hasBin: true dev: true - /ts-api-utils@1.3.0(typescript@5.4.3): + /ts-api-utils@1.3.0(typescript@5.4.5): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.3 + typescript: 5.4.5 dev: true /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: false - /tsc-alias@1.8.8: - resolution: {integrity: sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==} + /tsc-alias@1.8.10: + resolution: {integrity: sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==} hasBin: true dependencies: chokidar: 3.6.0 @@ -3488,13 +3473,8 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true - - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -3511,15 +3491,15 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.0.16(browserslist@4.23.0): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: browserslist: 4.23.0 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 dev: true /uri-js@4.4.1: @@ -3531,8 +3511,8 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /vite@5.2.4: - resolution: {integrity: sha512-vjFghvHWidBTinu5TCymJk/lRHlR5ljqB83yugr0HA1xspUPdOZHqbqDLnZ8f9/jINrtFHTCYYyIUi+o+Q5iyg==} + /vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3561,12 +3541,12 @@ packages: dependencies: esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.13.0 + rollup: 4.17.2 optionalDependencies: fsevents: 2.3.3 dev: true - /vitefu@0.2.5(vite@5.2.4): + /vitefu@0.2.5(vite@5.2.11): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -3574,7 +3554,7 @@ packages: vite: optional: true dependencies: - vite: 5.2.4 + vite: 5.2.11 dev: true /which@2.0.2: @@ -3584,6 +3564,11 @@ packages: dependencies: isexe: 2.0.0 + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3618,10 +3603,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -3632,8 +3613,8 @@ packages: engines: {node: '>= 14'} dev: true - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} hasBin: true dev: false @@ -3670,8 +3651,8 @@ packages: readable-stream: 4.5.2 dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} dev: false github.com/mrruby/hcSeedBundle/b3dcecfc0906f49340a14ba6f9a77f5381d8bf8e: From 1c225e153b6d4ac433e39a697da9c7842c4c0ce2 Mon Sep 17 00:00:00 2001 From: Dawid Urbas Date: Sun, 19 May 2024 09:41:56 +0200 Subject: [PATCH 5/5] Bump js client version --- holo-key-manager-js-client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/holo-key-manager-js-client/package.json b/holo-key-manager-js-client/package.json index b8c05fd..dd6dd03 100644 --- a/holo-key-manager-js-client/package.json +++ b/holo-key-manager-js-client/package.json @@ -1,6 +1,6 @@ { "name": "@holo-host/holo-key-manager-js-client", - "version": "0.0.5", + "version": "0.0.6", "description": "A JavaScript client API for managing Holo keys", "main": "lib/index.js", "types": "lib/holo-key-manager-js-client/src/index.d.ts",