diff --git a/Dockerfile b/Dockerfile index c581f7f1d..56c197835 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE=node:20.18.0 +ARG BASE=node:20.18.1-bookworm-slim FROM ${BASE} AS base WORKDIR /app diff --git a/README.md b/README.md index 95868b6a4..7c5dc31bd 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,12 @@ This fork of Bolt.new (oTToDev) allows you to choose the LLM that you use for each prompt! Currently, you can use OpenAI, Anthropic, Ollama, OpenRouter, Gemini, LMStudio, Mistral, xAI, HuggingFace, DeepSeek, or Groq models - and it is easily extended to use any other model supported by the Vercel AI SDK! See the instructions below for running this locally and extending it to include more models. - ## Join the community for oTToDev! [Please join our community here to stay update with the latest!](https://thinktank.ottomator.ai) ## Bolt.new: AI-Powered Full-Stack Web Development in the Browser - Bolt.new is an AI-powered web development agent that allows you to prompt, run, edit, and deploy full-stack applications directly from your browser—no local setup required. If you're here to build your own AI-powered web dev agent using the Bolt open source codebase, [click here to get started!](./CONTRIBUTING.md) ## What Makes Bolt.new Different diff --git a/app/components/chat/Chat.client.tsx b/app/components/chat/Chat.client.tsx index 984182072..6cbd96202 100644 --- a/app/components/chat/Chat.client.tsx +++ b/app/components/chat/Chat.client.tsx @@ -6,19 +6,20 @@ import { useStore } from '@nanostores/react'; import type { Message } from 'ai'; import { useChat } from 'ai/react'; import { useAnimate } from 'framer-motion'; -import { memo, useEffect, useRef, useState } from 'react'; +import { memo, useCallback, useEffect, useRef, useState } from 'react'; import { cssTransition, toast, ToastContainer } from 'react-toastify'; import { useMessageParser, usePromptEnhancer, useShortcuts, useSnapScroll } from '~/lib/hooks'; import { description, useChatHistory } from '~/lib/persistence'; import { chatStore } from '~/lib/stores/chat'; import { workbenchStore } from '~/lib/stores/workbench'; import { fileModificationsToHTML } from '~/utils/diff'; -import { DEFAULT_MODEL, DEFAULT_PROVIDER, PROVIDER_LIST } from '~/utils/constants'; +import { DEFAULT_MODEL, DEFAULT_PROVIDER, PROMPT_COOKIE_KEY, PROVIDER_LIST } from '~/utils/constants'; import { cubicEasingFn } from '~/utils/easings'; import { createScopedLogger, renderLogger } from '~/utils/logger'; import { BaseChat } from './BaseChat'; import Cookies from 'js-cookie'; import type { ProviderInfo } from '~/utils/types'; +import { debounce } from '~/utils/debounce'; const toastAnimation = cssTransition({ enter: 'animated fadeInRight', @@ -120,6 +121,7 @@ export const ChatImpl = memo( logger.debug('Finished streaming'); }, initialMessages, + initialInput: Cookies.get(PROMPT_COOKIE_KEY) || '', }); const { enhancingPrompt, promptEnhanced, enhancePrompt, resetEnhancer } = usePromptEnhancer(); @@ -225,12 +227,33 @@ export const ChatImpl = memo( } setInput(''); + Cookies.remove(PROMPT_COOKIE_KEY); resetEnhancer(); textareaRef.current?.blur(); }; + /** + * Handles the change event for the textarea and updates the input state. + * @param event - The change event from the textarea. + */ + const onTextareaChange = (event: React.ChangeEvent) => { + handleInputChange(event); + }; + + /** + * Debounced function to cache the prompt in cookies. + * Caches the trimmed value of the textarea input after a delay to optimize performance. + */ + const debouncedCachePrompt = useCallback( + debounce((event: React.ChangeEvent) => { + const trimmedValue = event.target.value.trim(); + Cookies.set(PROMPT_COOKIE_KEY, trimmedValue, { expires: 30 }); + }, 1000), + [], + ); + const [messageRef, scrollRef] = useSnapScroll(); useEffect(() => { @@ -268,7 +291,10 @@ export const ChatImpl = memo( setProvider={handleProviderChange} messageRef={messageRef} scrollRef={scrollRef} - handleInputChange={handleInputChange} + handleInputChange={(e) => { + onTextareaChange(e); + debouncedCachePrompt(e); + }} handleStop={abort} description={description} importChat={importChat} diff --git a/app/components/chat/Markdown.spec.ts b/app/components/chat/Markdown.spec.ts new file mode 100644 index 000000000..238177892 --- /dev/null +++ b/app/components/chat/Markdown.spec.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from 'vitest'; +import { stripCodeFenceFromArtifact } from './Markdown'; + +describe('stripCodeFenceFromArtifact', () => { + it('should remove code fences around artifact element', () => { + const input = "```xml\n
\n```"; + const expected = "\n
\n"; + expect(stripCodeFenceFromArtifact(input)).toBe(expected); + }); + + it('should handle code fence with language specification', () => { + const input = "```typescript\n
\n```"; + const expected = "\n
\n"; + expect(stripCodeFenceFromArtifact(input)).toBe(expected); + }); + + it('should not modify content without artifacts', () => { + const input = '```\nregular code block\n```'; + expect(stripCodeFenceFromArtifact(input)).toBe(input); + }); + + it('should handle empty input', () => { + expect(stripCodeFenceFromArtifact('')).toBe(''); + }); + + it('should handle artifact without code fences', () => { + const input = "
"; + expect(stripCodeFenceFromArtifact(input)).toBe(input); + }); + + it('should handle multiple artifacts but only remove fences around them', () => { + const input = [ + 'Some text', + '```typescript', + "
", + '```', + '```', + 'regular code', + '```', + ].join('\n'); + + const expected = ['Some text', '', "
", '', '```', 'regular code', '```'].join( + '\n', + ); + + expect(stripCodeFenceFromArtifact(input)).toBe(expected); + }); +}); diff --git a/app/components/chat/Markdown.tsx b/app/components/chat/Markdown.tsx index a91df43d3..07b6a6730 100644 --- a/app/components/chat/Markdown.tsx +++ b/app/components/chat/Markdown.tsx @@ -68,7 +68,51 @@ export const Markdown = memo(({ children, html = false, limitedMarkdown = false remarkPlugins={remarkPlugins(limitedMarkdown)} rehypePlugins={rehypePlugins(html)} > - {children} + {stripCodeFenceFromArtifact(children)} ); }); + +/** + * Removes code fence markers (```) surrounding an artifact element while preserving the artifact content. + * This is necessary because artifacts should not be wrapped in code blocks when rendered for rendering action list. + * + * @param content - The markdown content to process + * @returns The processed content with code fence markers removed around artifacts + * + * @example + * // Removes code fences around artifact + * const input = "```xml\n
\n```"; + * stripCodeFenceFromArtifact(input); + * // Returns: "\n
\n" + * + * @remarks + * - Only removes code fences that directly wrap an artifact (marked with __boltArtifact__ class) + * - Handles code fences with optional language specifications (e.g. ```xml, ```typescript) + * - Preserves original content if no artifact is found + * - Safely handles edge cases like empty input or artifacts at start/end of content + */ +export const stripCodeFenceFromArtifact = (content: string) => { + if (!content || !content.includes('__boltArtifact__')) { + return content; + } + + const lines = content.split('\n'); + const artifactLineIndex = lines.findIndex((line) => line.includes('__boltArtifact__')); + + // Return original content if artifact line not found + if (artifactLineIndex === -1) { + return content; + } + + // Check previous line for code fence + if (artifactLineIndex > 0 && lines[artifactLineIndex - 1]?.trim().match(/^```\w*$/)) { + lines[artifactLineIndex - 1] = ''; + } + + if (artifactLineIndex < lines.length - 1 && lines[artifactLineIndex + 1]?.trim().match(/^```$/)) { + lines[artifactLineIndex + 1] = ''; + } + + return lines.join('\n'); +}; diff --git a/app/components/sidebar/Menu.client.tsx b/app/components/sidebar/Menu.client.tsx index d753d242e..ca99d6f4c 100644 --- a/app/components/sidebar/Menu.client.tsx +++ b/app/components/sidebar/Menu.client.tsx @@ -8,6 +8,7 @@ import { cubicEasingFn } from '~/utils/easings'; import { logger } from '~/utils/logger'; import { HistoryItem } from './HistoryItem'; import { binDates } from './date-binning'; +import { useSearchFilter } from '~/lib/hooks/useSearchFilter'; const menuVariants = { closed: { @@ -39,6 +40,11 @@ export function Menu() { const [open, setOpen] = useState(false); const [dialogContent, setDialogContent] = useState(null); + const { filteredItems: filteredList, handleSearchChange } = useSearchFilter({ + items: list, + searchFields: ['description'], + }); + const loadEntries = useCallback(() => { if (db) { getAll(db) @@ -115,11 +121,11 @@ export function Menu() { initial="closed" animate={open ? 'open' : 'closed'} variants={menuVariants} - className="flex flex-col side-menu fixed top-0 w-[350px] h-full bg-bolt-elements-background-depth-2 border-r rounded-r-3xl border-bolt-elements-borderColor z-sidebar shadow-xl shadow-bolt-elements-sidebar-dropdownShadow text-sm" + className="flex selection-accent flex-col side-menu fixed top-0 w-[350px] h-full bg-bolt-elements-background-depth-2 border-r rounded-r-3xl border-bolt-elements-borderColor z-sidebar shadow-xl shadow-bolt-elements-sidebar-dropdownShadow text-sm" >
{/* Placeholder */}
-
+ +
+
+ +
+
Your Chats
- {list.length === 0 &&
No previous conversations
} + {filteredList.length === 0 && ( +
+ {list.length === 0 ? 'No previous conversations' : 'No matches found'} +
+ )} - {binDates(list).map(({ category, items }) => ( + {binDates(filteredList).map(({ category, items }) => (
{category} diff --git a/app/components/workbench/EditorPanel.tsx b/app/components/workbench/EditorPanel.tsx index 0a18658ce..f68e030e8 100644 --- a/app/components/workbench/EditorPanel.tsx +++ b/app/components/workbench/EditorPanel.tsx @@ -1,6 +1,6 @@ import { useStore } from '@nanostores/react'; -import { memo, useEffect, useMemo, useRef, useState } from 'react'; -import { Panel, PanelGroup, PanelResizeHandle, type ImperativePanelHandle } from 'react-resizable-panels'; +import { memo, useMemo } from 'react'; +import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels'; import { CodeMirrorEditor, type EditorDocument, @@ -9,21 +9,17 @@ import { type OnSaveCallback as OnEditorSave, type OnScrollCallback as OnEditorScroll, } from '~/components/editor/codemirror/CodeMirrorEditor'; -import { IconButton } from '~/components/ui/IconButton'; import { PanelHeader } from '~/components/ui/PanelHeader'; import { PanelHeaderButton } from '~/components/ui/PanelHeaderButton'; -import { shortcutEventEmitter } from '~/lib/hooks'; import type { FileMap } from '~/lib/stores/files'; import { themeStore } from '~/lib/stores/theme'; -import { workbenchStore } from '~/lib/stores/workbench'; -import { classNames } from '~/utils/classNames'; import { WORK_DIR } from '~/utils/constants'; -import { logger, renderLogger } from '~/utils/logger'; +import { renderLogger } from '~/utils/logger'; import { isMobile } from '~/utils/mobile'; import { FileBreadcrumb } from './FileBreadcrumb'; import { FileTree } from './FileTree'; -import { Terminal, type TerminalRef } from './terminal/Terminal'; -import React from 'react'; +import { DEFAULT_TERMINAL_SIZE, TerminalTabs } from './terminal/TerminalTabs'; +import { workbenchStore } from '~/lib/stores/workbench'; interface EditorPanelProps { files?: FileMap; @@ -38,8 +34,6 @@ interface EditorPanelProps { onFileReset?: () => void; } -const MAX_TERMINALS = 3; -const DEFAULT_TERMINAL_SIZE = 25; const DEFAULT_EDITOR_SIZE = 100 - DEFAULT_TERMINAL_SIZE; const editorSettings: EditorSettings = { tabSize: 2 }; @@ -62,13 +56,6 @@ export const EditorPanel = memo( const theme = useStore(themeStore); const showTerminal = useStore(workbenchStore.showTerminal); - const terminalRefs = useRef>([]); - const terminalPanelRef = useRef(null); - const terminalToggledByShortcut = useRef(false); - - const [activeTerminal, setActiveTerminal] = useState(0); - const [terminalCount, setTerminalCount] = useState(1); - const activeFileSegments = useMemo(() => { if (!editorDocument) { return undefined; @@ -81,48 +68,6 @@ export const EditorPanel = memo( return editorDocument !== undefined && unsavedFiles?.has(editorDocument.filePath); }, [editorDocument, unsavedFiles]); - useEffect(() => { - const unsubscribeFromEventEmitter = shortcutEventEmitter.on('toggleTerminal', () => { - terminalToggledByShortcut.current = true; - }); - - const unsubscribeFromThemeStore = themeStore.subscribe(() => { - for (const ref of Object.values(terminalRefs.current)) { - ref?.reloadStyles(); - } - }); - - return () => { - unsubscribeFromEventEmitter(); - unsubscribeFromThemeStore(); - }; - }, []); - - useEffect(() => { - const { current: terminal } = terminalPanelRef; - - if (!terminal) { - return; - } - - const isCollapsed = terminal.isCollapsed(); - - if (!showTerminal && !isCollapsed) { - terminal.collapse(); - } else if (showTerminal && isCollapsed) { - terminal.resize(DEFAULT_TERMINAL_SIZE); - } - - terminalToggledByShortcut.current = false; - }, [showTerminal]); - - const addTerminal = () => { - if (terminalCount < MAX_TERMINALS) { - setTerminalCount(terminalCount + 1); - setActiveTerminal(terminalCount); - } - }; - return ( @@ -181,118 +126,7 @@ export const EditorPanel = memo( - { - if (!terminalToggledByShortcut.current) { - workbenchStore.toggleTerminal(true); - } - }} - onCollapse={() => { - if (!terminalToggledByShortcut.current) { - workbenchStore.toggleTerminal(false); - } - }} - > -
-
-
- {Array.from({ length: terminalCount + 1 }, (_, index) => { - const isActive = activeTerminal === index; - - return ( - - {index == 0 ? ( - - ) : ( - - - - )} - - ); - })} - {terminalCount < MAX_TERMINALS && } - workbenchStore.toggleTerminal(false)} - /> -
- {Array.from({ length: terminalCount + 1 }, (_, index) => { - const isActive = activeTerminal === index; - - if (index == 0) { - logger.info('Starting bolt terminal'); - - return ( - { - terminalRefs.current.push(ref); - }} - onTerminalReady={(terminal) => workbenchStore.attachBoltTerminal(terminal)} - onTerminalResize={(cols, rows) => workbenchStore.onTerminalResize(cols, rows)} - theme={theme} - /> - ); - } - - return ( - { - terminalRefs.current.push(ref); - }} - onTerminalReady={(terminal) => workbenchStore.attachTerminal(terminal)} - onTerminalResize={(cols, rows) => workbenchStore.onTerminalResize(cols, rows)} - theme={theme} - /> - ); - })} -
-
-
+ ); }, diff --git a/app/components/workbench/terminal/Terminal.tsx b/app/components/workbench/terminal/Terminal.tsx index b9b84dc87..337a72a6d 100644 --- a/app/components/workbench/terminal/Terminal.tsx +++ b/app/components/workbench/terminal/Terminal.tsx @@ -16,71 +16,74 @@ export interface TerminalProps { className?: string; theme: Theme; readonly?: boolean; + id: string; onTerminalReady?: (terminal: XTerm) => void; onTerminalResize?: (cols: number, rows: number) => void; } export const Terminal = memo( - forwardRef(({ className, theme, readonly, onTerminalReady, onTerminalResize }, ref) => { - const terminalElementRef = useRef(null); - const terminalRef = useRef(); - - useEffect(() => { - const element = terminalElementRef.current!; - - const fitAddon = new FitAddon(); - const webLinksAddon = new WebLinksAddon(); - - const terminal = new XTerm({ - cursorBlink: true, - convertEol: true, - disableStdin: readonly, - theme: getTerminalTheme(readonly ? { cursor: '#00000000' } : {}), - fontSize: 12, - fontFamily: 'Menlo, courier-new, courier, monospace', - }); - - terminalRef.current = terminal; - - terminal.loadAddon(fitAddon); - terminal.loadAddon(webLinksAddon); - terminal.open(element); - - const resizeObserver = new ResizeObserver(() => { - fitAddon.fit(); - onTerminalResize?.(terminal.cols, terminal.rows); - }); - - resizeObserver.observe(element); - - logger.info('Attach terminal'); - - onTerminalReady?.(terminal); - - return () => { - resizeObserver.disconnect(); - terminal.dispose(); - }; - }, []); - - useEffect(() => { - const terminal = terminalRef.current!; - - // we render a transparent cursor in case the terminal is readonly - terminal.options.theme = getTerminalTheme(readonly ? { cursor: '#00000000' } : {}); - - terminal.options.disableStdin = readonly; - }, [theme, readonly]); - - useImperativeHandle(ref, () => { - return { - reloadStyles: () => { - const terminal = terminalRef.current!; - terminal.options.theme = getTerminalTheme(readonly ? { cursor: '#00000000' } : {}); - }, - }; - }, []); - - return
; - }), + forwardRef( + ({ className, theme, readonly, id, onTerminalReady, onTerminalResize }, ref) => { + const terminalElementRef = useRef(null); + const terminalRef = useRef(); + + useEffect(() => { + const element = terminalElementRef.current!; + + const fitAddon = new FitAddon(); + const webLinksAddon = new WebLinksAddon(); + + const terminal = new XTerm({ + cursorBlink: true, + convertEol: true, + disableStdin: readonly, + theme: getTerminalTheme(readonly ? { cursor: '#00000000' } : {}), + fontSize: 12, + fontFamily: 'Menlo, courier-new, courier, monospace', + }); + + terminalRef.current = terminal; + + terminal.loadAddon(fitAddon); + terminal.loadAddon(webLinksAddon); + terminal.open(element); + + const resizeObserver = new ResizeObserver(() => { + fitAddon.fit(); + onTerminalResize?.(terminal.cols, terminal.rows); + }); + + resizeObserver.observe(element); + + logger.debug(`Attach [${id}]`); + + onTerminalReady?.(terminal); + + return () => { + resizeObserver.disconnect(); + terminal.dispose(); + }; + }, []); + + useEffect(() => { + const terminal = terminalRef.current!; + + // we render a transparent cursor in case the terminal is readonly + terminal.options.theme = getTerminalTheme(readonly ? { cursor: '#00000000' } : {}); + + terminal.options.disableStdin = readonly; + }, [theme, readonly]); + + useImperativeHandle(ref, () => { + return { + reloadStyles: () => { + const terminal = terminalRef.current!; + terminal.options.theme = getTerminalTheme(readonly ? { cursor: '#00000000' } : {}); + }, + }; + }, []); + + return
; + }, + ), ); diff --git a/app/components/workbench/terminal/TerminalTabs.tsx b/app/components/workbench/terminal/TerminalTabs.tsx new file mode 100644 index 000000000..cecc5dc9f --- /dev/null +++ b/app/components/workbench/terminal/TerminalTabs.tsx @@ -0,0 +1,186 @@ +import { useStore } from '@nanostores/react'; +import React, { memo, useEffect, useRef, useState } from 'react'; +import { Panel, type ImperativePanelHandle } from 'react-resizable-panels'; +import { IconButton } from '~/components/ui/IconButton'; +import { shortcutEventEmitter } from '~/lib/hooks'; +import { themeStore } from '~/lib/stores/theme'; +import { workbenchStore } from '~/lib/stores/workbench'; +import { classNames } from '~/utils/classNames'; +import { Terminal, type TerminalRef } from './Terminal'; +import { createScopedLogger } from '~/utils/logger'; + +const logger = createScopedLogger('Terminal'); + +const MAX_TERMINALS = 3; +export const DEFAULT_TERMINAL_SIZE = 25; + +export const TerminalTabs = memo(() => { + const showTerminal = useStore(workbenchStore.showTerminal); + const theme = useStore(themeStore); + + const terminalRefs = useRef>([]); + const terminalPanelRef = useRef(null); + const terminalToggledByShortcut = useRef(false); + + const [activeTerminal, setActiveTerminal] = useState(0); + const [terminalCount, setTerminalCount] = useState(1); + + const addTerminal = () => { + if (terminalCount < MAX_TERMINALS) { + setTerminalCount(terminalCount + 1); + setActiveTerminal(terminalCount); + } + }; + + useEffect(() => { + const { current: terminal } = terminalPanelRef; + + if (!terminal) { + return; + } + + const isCollapsed = terminal.isCollapsed(); + + if (!showTerminal && !isCollapsed) { + terminal.collapse(); + } else if (showTerminal && isCollapsed) { + terminal.resize(DEFAULT_TERMINAL_SIZE); + } + + terminalToggledByShortcut.current = false; + }, [showTerminal]); + + useEffect(() => { + const unsubscribeFromEventEmitter = shortcutEventEmitter.on('toggleTerminal', () => { + terminalToggledByShortcut.current = true; + }); + + const unsubscribeFromThemeStore = themeStore.subscribe(() => { + for (const ref of Object.values(terminalRefs.current)) { + ref?.reloadStyles(); + } + }); + + return () => { + unsubscribeFromEventEmitter(); + unsubscribeFromThemeStore(); + }; + }, []); + + return ( + { + if (!terminalToggledByShortcut.current) { + workbenchStore.toggleTerminal(true); + } + }} + onCollapse={() => { + if (!terminalToggledByShortcut.current) { + workbenchStore.toggleTerminal(false); + } + }} + > +
+
+
+ {Array.from({ length: terminalCount + 1 }, (_, index) => { + const isActive = activeTerminal === index; + + return ( + + {index == 0 ? ( + + ) : ( + + + + )} + + ); + })} + {terminalCount < MAX_TERMINALS && } + workbenchStore.toggleTerminal(false)} + /> +
+ {Array.from({ length: terminalCount + 1 }, (_, index) => { + const isActive = activeTerminal === index; + + logger.debug(`Starting bolt terminal [${index}]`); + + if (index == 0) { + return ( + { + terminalRefs.current.push(ref); + }} + onTerminalReady={(terminal) => workbenchStore.attachBoltTerminal(terminal)} + onTerminalResize={(cols, rows) => workbenchStore.onTerminalResize(cols, rows)} + theme={theme} + /> + ); + } else { + return ( + { + terminalRefs.current.push(ref); + }} + onTerminalReady={(terminal) => workbenchStore.attachTerminal(terminal)} + onTerminalResize={(cols, rows) => workbenchStore.onTerminalResize(cols, rows)} + theme={theme} + /> + ); + } + })} +
+
+
+ ); +}); diff --git a/app/lib/hooks/useSearchFilter.ts b/app/lib/hooks/useSearchFilter.ts new file mode 100644 index 000000000..ec576cbeb --- /dev/null +++ b/app/lib/hooks/useSearchFilter.ts @@ -0,0 +1,52 @@ +import { useState, useMemo, useCallback } from 'react'; +import { debounce } from '~/utils/debounce'; +import type { ChatHistoryItem } from '~/lib/persistence'; + +interface UseSearchFilterOptions { + items: ChatHistoryItem[]; + searchFields?: (keyof ChatHistoryItem)[]; + debounceMs?: number; +} + +export function useSearchFilter({ + items = [], + searchFields = ['description'], + debounceMs = 300, +}: UseSearchFilterOptions) { + const [searchQuery, setSearchQuery] = useState(''); + + const debouncedSetSearch = useCallback(debounce(setSearchQuery, debounceMs), []); + + const handleSearchChange = useCallback( + (event: React.ChangeEvent) => { + debouncedSetSearch(event.target.value); + }, + [debouncedSetSearch], + ); + + const filteredItems = useMemo(() => { + if (!searchQuery.trim()) { + return items; + } + + const query = searchQuery.toLowerCase(); + + return items.filter((item) => + searchFields.some((field) => { + const value = item[field]; + + if (typeof value === 'string') { + return value.toLowerCase().includes(query); + } + + return false; + }), + ); + }, [items, searchQuery, searchFields]); + + return { + searchQuery, + filteredItems, + handleSearchChange, + }; +} diff --git a/app/routes/api.enhancer.ts b/app/routes/api.enhancer.ts index 77e6f2fd3..3a15af5af 100644 --- a/app/routes/api.enhancer.ts +++ b/app/routes/api.enhancer.ts @@ -44,9 +44,26 @@ async function enhancerAction({ context, request }: ActionFunctionArgs) { content: `[Model: ${model}]\n\n[Provider: ${providerName}]\n\n` + stripIndents` + You are a professional prompt engineer specializing in crafting precise, effective prompts. + Your task is to enhance prompts by making them more specific, actionable, and effective. + I want you to improve the user prompt that is wrapped in \`\` tags. - IMPORTANT: Only respond with the improved prompt and nothing else! + For valid prompts: + - Make instructions explicit and unambiguous + - Add relevant context and constraints + - Remove redundant information + - Maintain the core intent + - Ensure the prompt is self-contained + - Use professional language + For invalid or unclear prompts: + - Respond with a clear, professional guidance message + - Keep responses concise and actionable + - Maintain a helpful, constructive tone + - Focus on what the user should provide + - Use a standard template for consistency + IMPORTANT: Your response must ONLY contain the enhanced prompt text. + Do not include any explanations, metadata, or wrapper tags. ${message} @@ -79,7 +96,7 @@ async function enhancerAction({ context, request }: ActionFunctionArgs) { }, }); - const transformedStream = result.toAIStream().pipeThrough(transformStream); + const transformedStream = result.toDataStream().pipeThrough(transformStream); return new StreamingTextResponse(transformedStream); } catch (error: unknown) { diff --git a/app/utils/constants.ts b/app/utils/constants.ts index 17fe9d8af..e27062857 100644 --- a/app/utils/constants.ts +++ b/app/utils/constants.ts @@ -7,6 +7,7 @@ export const MODIFICATIONS_TAG_NAME = 'bolt_file_modifications'; export const MODEL_REGEX = /^\[Model: (.*?)\]\n\n/; export const PROVIDER_REGEX = /\[Provider: (.*?)\]\n\n/; export const DEFAULT_MODEL = 'claude-3-5-sonnet-latest'; +export const PROMPT_COOKIE_KEY = 'cachedPrompt'; const PROVIDER_LIST: ProviderInfo[] = [ { @@ -283,9 +284,9 @@ const getOllamaBaseUrl = () => { }; async function getOllamaModels(): Promise { - if (typeof window === 'undefined') { - return []; - } + //if (typeof window === 'undefined') { + //return []; + //} try { const baseUrl = getOllamaBaseUrl(); diff --git a/package.json b/package.json index c21118270..4c81d9a70 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "typescript": "^5.5.2", "unified": "^11.0.5", "unocss": "^0.61.3", - "vite": "^5.3.1", + "vite": "^5.3.6", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-optimize-css-modules": "^1.1.0", "vite-tsconfig-paths": "^4.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd2355c67..b865b1f4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -215,7 +215,7 @@ importers: version: 4.20240620.0 '@remix-run/dev': specifier: ^2.10.0 - version: 2.10.0(@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/serve@2.10.0(typescript@5.5.2))(@types/node@20.14.9)(sass@1.77.6)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6))(wrangler@3.63.2(@cloudflare/workers-types@4.20240620.0)) + version: 2.10.0(@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/serve@2.10.0(typescript@5.5.2))(@types/node@20.14.9)(sass@1.77.6)(typescript@5.5.2)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6))(wrangler@3.63.2(@cloudflare/workers-types@4.20240620.0)) '@types/diff': specifier: ^5.2.1 version: 5.2.1 @@ -257,19 +257,19 @@ importers: version: 11.0.5 unocss: specifier: ^0.61.3 - version: 0.61.3(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) + version: 0.61.3(postcss@8.4.38)(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) vite: - specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + specifier: ^5.3.6 + version: 5.3.6(@types/node@20.14.9)(sass@1.77.6) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) + version: 0.22.0(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) vite-plugin-optimize-css-modules: specifier: ^1.1.0 - version: 1.1.0(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) + version: 1.1.0(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) + version: 4.3.2(typescript@5.5.2)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) vitest: specifier: ^2.0.1 version: 2.0.1(@types/node@20.14.9)(sass@1.77.6) @@ -508,16 +508,16 @@ packages: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.7': - resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.7': - resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.24.7': @@ -537,8 +537,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.25.8': - resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -594,8 +594,8 @@ packages: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.8': - resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} '@blitz/eslint-plugin@0.1.0': @@ -1849,83 +1849,93 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.27.4': + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.27.4': + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.27.4': + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.27.4': + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-freebsd-arm64@4.27.4': + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.4': + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.27.4': + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.27.4': + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.27.4': + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.27.4': + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.27.4': + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-win32-arm64-msvc@4.27.4': + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.27.4': + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-msvc@4.27.4': + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} cpu: [x64] os: [win32] @@ -1968,9 +1978,6 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2278,8 +2285,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -2421,10 +2428,6 @@ packages: bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2487,10 +2490,6 @@ packages: builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - bytes@3.0.0: - resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} - engines: {node: '>= 0.8'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2626,8 +2625,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} engines: {node: '>= 0.8.0'} concat-map@0.0.1: @@ -2660,8 +2659,8 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} cookie@0.5.0: @@ -2694,8 +2693,8 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crypto-browserify@3.12.0: @@ -2748,6 +2747,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -2856,8 +2864,8 @@ packages: electron-to-chromium@1.4.812: resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==} - elliptic@6.5.6: - resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3080,10 +3088,6 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - express@4.21.1: resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} engines: {node: '>= 0.10.0'} @@ -3128,10 +3132,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} @@ -3534,6 +3534,9 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -3718,8 +3721,8 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} markdown-extensions@1.1.1: resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} @@ -3819,9 +3822,6 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -4007,8 +4007,8 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} miller-rabin@4.0.1: @@ -4163,6 +4163,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -4217,8 +4221,8 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} object-is@1.1.6: @@ -4353,9 +4357,6 @@ packages: path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} @@ -4386,6 +4387,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4464,6 +4468,10 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4542,18 +4550,14 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - - qs@6.12.3: - resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==} - engines: {node: '>=0.6'} - qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} + engines: {node: '>=0.6'} + querystring-es3@0.2.1: resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} engines: {node: '>=0.4.x'} @@ -4790,8 +4794,8 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.27.4: + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4963,18 +4967,10 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -5332,8 +5328,8 @@ packages: resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==} engines: {node: '>=18.17'} - undici@6.20.0: - resolution: {integrity: sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==} + undici@6.21.0: + resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} engines: {node: '>=18.17'} unenv-nightly@1.10.0-1717606461.a117952: @@ -5531,8 +5527,8 @@ packages: vite: optional: true - vite@5.3.1: - resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + vite@5.3.6: + resolution: {integrity: sha512-es78AlrylO8mTVBygC0gTC0FENv0C6T496vvd33ydbjF/mIi9q3XQ9A3NWo5qLGFKywvz10J26813OkLvcQleA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5883,7 +5879,7 @@ snapshots: '@babel/traverse': 7.24.7 '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5997,11 +5993,11 @@ snapshots: '@babel/helper-string-parser@7.24.7': {} - '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} '@babel/helper-validator-option@7.24.7': {} @@ -6021,9 +6017,9 @@ snapshots: dependencies: '@babel/types': 7.24.7 - '@babel/parser@7.25.8': + '@babel/parser@7.26.2': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.0 '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.24.7)': dependencies: @@ -6090,7 +6086,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.5 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6101,11 +6097,10 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@babel/types@7.25.8': + '@babel/types@7.26.0': dependencies: - '@babel/helper-string-parser': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 '@blitz/eslint-plugin@0.1.0(@types/eslint@8.56.10)(prettier@3.3.2)(typescript@5.5.2)': dependencies: @@ -6502,7 +6497,7 @@ snapshots: '@eslint/config-array@0.16.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.5 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6510,7 +6505,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.5 + debug: 4.3.7 espree: 10.1.0 globals: 14.0.0 ignore: 5.3.1 @@ -6563,7 +6558,7 @@ snapshots: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.3.5 + debug: 4.3.7 kolorist: 1.8.0 local-pkg: 0.5.0 mlly: 1.7.1 @@ -7151,7 +7146,7 @@ snapshots: optionalDependencies: typescript: 5.5.2 - '@remix-run/dev@2.10.0(@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/serve@2.10.0(typescript@5.5.2))(@types/node@20.14.9)(sass@1.77.6)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6))(wrangler@3.63.2(@cloudflare/workers-types@4.20240620.0))': + '@remix-run/dev@2.10.0(@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/serve@2.10.0(typescript@5.5.2))(@types/node@20.14.9)(sass@1.77.6)(typescript@5.5.2)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6))(wrangler@3.63.2(@cloudflare/workers-types@4.20240620.0))': dependencies: '@babel/core': 7.24.7 '@babel/generator': 7.24.7 @@ -7173,14 +7168,14 @@ snapshots: cacache: 17.1.4 chalk: 4.1.2 chokidar: 3.6.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 dotenv: 16.4.5 es-module-lexer: 1.5.4 esbuild: 0.17.6 esbuild-plugins-node-modules-polyfill: 1.6.4(esbuild@0.17.6) execa: 5.1.1 exit-hook: 2.2.1 - express: 4.19.2 + express: 4.21.1 fs-extra: 10.1.0 get-port: 5.1.1 gunzip-maybe: 1.4.2 @@ -7210,7 +7205,7 @@ snapshots: optionalDependencies: '@remix-run/serve': 2.10.0(typescript@5.5.2) typescript: 5.5.2 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) wrangler: 3.63.2(@cloudflare/workers-types@4.20240620.0) transitivePeerDependencies: - '@types/node' @@ -7240,7 +7235,7 @@ snapshots: '@remix-run/server-runtime': 2.10.0(typescript@5.5.2) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 - cookie-signature: 1.2.1 + cookie-signature: 1.2.2 source-map-support: 0.5.21 stream-slice: 0.1.2 undici: 6.19.4 @@ -7252,10 +7247,10 @@ snapshots: '@remix-run/server-runtime': 2.10.2(typescript@5.5.2) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 - cookie-signature: 1.2.1 + cookie-signature: 1.2.2 source-map-support: 0.5.21 stream-slice: 0.1.2 - undici: 6.20.0 + undici: 6.21.0 optionalDependencies: typescript: 5.5.2 optional: true @@ -7281,7 +7276,7 @@ snapshots: '@remix-run/express': 2.10.0(express@4.21.1)(typescript@5.5.2) '@remix-run/node': 2.10.0(typescript@5.5.2) chokidar: 3.6.0 - compression: 1.7.4 + compression: 1.7.5 express: 4.21.1 get-port: 5.1.1 morgan: 1.10.0 @@ -7343,68 +7338,74 @@ snapshots: dependencies: web-streams-polyfill: 3.3.3 - '@rollup/plugin-inject@5.0.5(rollup@4.18.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) estree-walker: 2.0.2 magic-string: 0.30.10 optionalDependencies: - rollup: 4.18.0 + rollup: 4.27.4 - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/pluginutils@5.1.0(rollup@4.27.4)': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.0 + rollup: 4.27.4 + + '@rollup/rollup-android-arm-eabi@4.27.4': + optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': + '@rollup/rollup-android-arm64@4.27.4': optional: true - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-darwin-arm64@4.27.4': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-darwin-x64@4.27.4': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-freebsd-arm64@4.27.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-freebsd-x64@4.27.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.27.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.27.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.27.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.27.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.27.4': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.27.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-linux-x64-musl@4.27.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.27.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.27.4': optional: true '@shikijs/core@1.9.1': {} @@ -7431,7 +7432,7 @@ snapshots: '@types/acorn@4.0.6': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/cookie@0.6.0': {} @@ -7445,14 +7446,12 @@ snapshots: '@types/eslint@8.56.10': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.5 - - '@types/estree@1.0.5': {} + '@types/estree': 1.0.6 '@types/estree@1.0.6': {} @@ -7529,7 +7528,7 @@ snapshots: '@typescript-eslint/types': 8.0.0-alpha.33 '@typescript-eslint/typescript-estree': 8.0.0-alpha.33(typescript@5.5.2) '@typescript-eslint/visitor-keys': 8.0.0-alpha.33 - debug: 4.3.5 + debug: 4.3.7 eslint: 9.5.0 optionalDependencies: typescript: 5.5.2 @@ -7545,7 +7544,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.0.0-alpha.33(typescript@5.5.2) '@typescript-eslint/utils': 8.0.0-alpha.33(eslint@9.5.0)(typescript@5.5.2) - debug: 4.3.5 + debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: typescript: 5.5.2 @@ -7559,7 +7558,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.0.0-alpha.33 '@typescript-eslint/visitor-keys': 8.0.0-alpha.33 - debug: 4.3.5 + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -7602,20 +7601,20 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.61.3(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6))': + '@unocss/astro@0.61.3(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6))': dependencies: '@unocss/core': 0.61.3 '@unocss/reset': 0.61.3 - '@unocss/vite': 0.61.3(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) + '@unocss/vite': 0.61.3(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) optionalDependencies: - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - rollup - '@unocss/cli@0.61.3(rollup@4.18.0)': + '@unocss/cli@0.61.3(rollup@4.27.4)': dependencies: '@ampproject/remapping': 2.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) '@unocss/config': 0.61.3 '@unocss/core': 0.61.3 '@unocss/preset-uno': 0.61.3 @@ -7739,10 +7738,10 @@ snapshots: dependencies: '@unocss/core': 0.61.3 - '@unocss/vite@0.61.3(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6))': + '@unocss/vite@0.61.3(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6))': dependencies: '@ampproject/remapping': 2.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) '@unocss/config': 0.61.3 '@unocss/core': 0.61.3 '@unocss/inspector': 0.61.3 @@ -7751,7 +7750,7 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.10 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - rollup @@ -7790,7 +7789,7 @@ snapshots: lodash: 4.17.21 mlly: 1.7.1 outdent: 0.8.0 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) vite-node: 1.6.0(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - '@types/node' @@ -7835,7 +7834,7 @@ snapshots: '@vue/compiler-core@3.4.30': dependencies: - '@babel/parser': 7.25.8 + '@babel/parser': 7.26.2 '@vue/shared': 3.4.30 entities: 4.5.0 estree-walker: 2.0.2 @@ -7848,14 +7847,14 @@ snapshots: '@vue/compiler-sfc@3.4.30': dependencies: - '@babel/parser': 7.25.8 + '@babel/parser': 7.26.2 '@vue/compiler-core': 3.4.30 '@vue/compiler-dom': 3.4.30 '@vue/compiler-ssr': 3.4.30 '@vue/shared': 3.4.30 estree-walker: 2.0.2 - magic-string: 0.30.12 - postcss: 8.4.38 + magic-string: 0.30.14 + postcss: 8.4.49 source-map-js: 1.2.1 '@vue/compiler-ssr@3.4.30': @@ -7923,7 +7922,7 @@ snapshots: acorn@8.12.0: {} - acorn@8.12.1: {} + acorn@8.14.0: {} aggregate-error@3.1.0: dependencies: @@ -8056,23 +8055,6 @@ snapshots: bn.js@5.2.1: {} - body-parser@1.20.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -8089,7 +8071,6 @@ snapshots: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - optional: true brace-expansion@1.1.11: dependencies: @@ -8143,7 +8124,7 @@ snapshots: browserify-rsa: 4.1.0 create-hash: 1.2.0 create-hmac: 1.1.7 - elliptic: 6.5.6 + elliptic: 6.6.1 hash-base: 3.0.4 inherits: 2.0.4 parse-asn1: 5.1.7 @@ -8178,9 +8159,6 @@ snapshots: builtin-status-codes@3.0.0: {} - bytes@3.0.0: - optional: true - bytes@3.1.2: {} cac@6.7.14: {} @@ -8214,7 +8192,7 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.5 + debug: 4.3.7 tslib: 2.6.3 transitivePeerDependencies: - supports-color @@ -8293,7 +8271,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 - acorn: 8.12.1 + acorn: 8.14.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -8322,14 +8300,14 @@ snapshots: mime-db: 1.53.0 optional: true - compression@1.7.4: + compression@1.7.5: dependencies: - accepts: 1.3.8 - bytes: 3.0.0 + bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 + negotiator: 0.6.4 on-headers: 1.0.2 - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -8355,21 +8333,20 @@ snapshots: cookie-signature@1.0.6: {} - cookie-signature@1.2.1: {} + cookie-signature@1.2.2: {} cookie@0.5.0: {} cookie@0.6.0: {} - cookie@0.7.1: - optional: true + cookie@0.7.1: {} core-util-is@1.0.3: {} create-ecdh@4.0.4: dependencies: bn.js: 4.12.0 - elliptic: 6.5.6 + elliptic: 6.6.1 create-hash@1.2.0: dependencies: @@ -8392,7 +8369,7 @@ snapshots: crelt@1.0.6: {} - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -8415,7 +8392,7 @@ snapshots: css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 css-what@6.1.0: {} @@ -8439,6 +8416,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 @@ -8529,7 +8510,7 @@ snapshots: electron-to-chromium@1.4.812: {} - elliptic@6.5.6: + elliptic@6.6.1: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -8545,8 +8526,7 @@ snapshots: encodeurl@1.0.2: {} - encodeurl@2.0.0: - optional: true + encodeurl@2.0.0: {} end-of-stream@1.4.4: dependencies: @@ -8708,8 +8688,8 @@ snapshots: '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 + cross-spawn: 7.0.6 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.0.1 eslint-visitor-keys: 4.0.0 @@ -8759,7 +8739,7 @@ snapshots: estree-util-attach-comments@2.1.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-util-build-jsx@2.2.2: dependencies: @@ -8794,7 +8774,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 esutils@2.0.3: {} @@ -8820,7 +8800,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -8832,7 +8812,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -8844,42 +8824,6 @@ snapshots: exit-hook@2.2.1: {} - express@4.19.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@4.21.1: dependencies: accepts: 1.3.8 @@ -8915,7 +8859,6 @@ snapshots: vary: 1.1.2 transitivePeerDependencies: - supports-color - optional: true extend@3.0.2: {} @@ -8929,7 +8872,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -8958,18 +8901,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -8981,7 +8912,6 @@ snapshots: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - optional: true find-up@5.0.0: dependencies: @@ -9001,7 +8931,7 @@ snapshots: foreground-child@3.2.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 format@0.2.2: {} @@ -9203,7 +9133,7 @@ snapshots: hast-util-to-estree@2.3.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 '@types/unist': 2.0.10 @@ -9223,7 +9153,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/hast': 3.0.4 '@types/unist': 3.0.2 comma-separated-tokens: 2.0.3 @@ -9399,7 +9329,11 @@ snapshots: is-reference@3.0.2: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 is-stream@2.0.1: {} @@ -9558,7 +9492,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magic-string@0.30.12: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -9840,10 +9774,7 @@ snapshots: media-typer@0.3.0: {} - merge-descriptors@1.0.1: {} - - merge-descriptors@1.0.3: - optional: true + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -9956,7 +9887,7 @@ snapshots: micromark-extension-mdx-expression@1.0.8: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -9968,7 +9899,7 @@ snapshots: micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-util-is-identifier-name: 2.1.0 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 @@ -9984,7 +9915,7 @@ snapshots: micromark-extension-mdxjs-esm@1.0.5: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 micromark-core-commonmark: 1.1.0 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 @@ -10033,7 +9964,7 @@ snapshots: micromark-factory-mdx-expression@1.0.9: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 micromark-util-symbol: 1.1.0 @@ -10149,7 +10080,7 @@ snapshots: micromark-util-events-to-acorn@1.2.3: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/unist': 2.0.10 estree-util-visit: 1.2.1 micromark-util-symbol: 1.1.0 @@ -10214,7 +10145,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.5 + debug: 4.3.7 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -10236,7 +10167,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.5 + debug: 4.3.7 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -10255,7 +10186,7 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -10390,6 +10321,9 @@ snapshots: negotiator@0.6.3: {} + negotiator@0.6.4: + optional: true + node-domexception@1.0.0: {} node-fetch-native@1.6.4: {} @@ -10471,7 +10405,7 @@ snapshots: dependencies: path-key: 4.0.0 - object-inspect@1.13.2: {} + object-inspect@1.13.3: {} object-is@1.1.6: dependencies: @@ -10617,10 +10551,7 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.2 - path-to-regexp@0.1.10: - optional: true - - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} path-to-regexp@6.2.2: {} @@ -10648,12 +10579,14 @@ snapshots: periscopic@3.1.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 is-reference: 3.0.2 picocolors@1.0.1: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} pidtree@0.6.0: {} @@ -10727,6 +10660,12 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -10798,18 +10737,13 @@ snapshots: punycode@2.3.1: {} - qs@6.11.0: - dependencies: - side-channel: 1.0.6 - - qs@6.12.3: + qs@6.13.0: dependencies: side-channel: 1.0.6 - qs@6.13.0: + qs@6.13.1: dependencies: side-channel: 1.0.6 - optional: true querystring-es3@0.2.1: {} @@ -11081,26 +11015,28 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.18.0: + rollup@4.27.4: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.27.4 + '@rollup/rollup-android-arm64': 4.27.4 + '@rollup/rollup-darwin-arm64': 4.27.4 + '@rollup/rollup-darwin-x64': 4.27.4 + '@rollup/rollup-freebsd-arm64': 4.27.4 + '@rollup/rollup-freebsd-x64': 4.27.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 + '@rollup/rollup-linux-arm-musleabihf': 4.27.4 + '@rollup/rollup-linux-arm64-gnu': 4.27.4 + '@rollup/rollup-linux-arm64-musl': 4.27.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 + '@rollup/rollup-linux-riscv64-gnu': 4.27.4 + '@rollup/rollup-linux-s390x-gnu': 4.27.4 + '@rollup/rollup-linux-x64-gnu': 4.27.4 + '@rollup/rollup-linux-x64-musl': 4.27.4 + '@rollup/rollup-win32-arm64-msvc': 4.27.4 + '@rollup/rollup-win32-ia32-msvc': 4.27.4 + '@rollup/rollup-win32-x64-msvc': 4.27.4 fsevents: 2.3.3 run-parallel@1.2.0: @@ -11234,24 +11170,6 @@ snapshots: semver@7.6.2: {} - send@0.18.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - send@0.19.0: dependencies: debug: 2.6.9 @@ -11269,16 +11187,6 @@ snapshots: statuses: 2.0.1 transitivePeerDependencies: - supports-color - optional: true - - serve-static@1.15.0: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color serve-static@1.16.2: dependencies: @@ -11288,7 +11196,6 @@ snapshots: send: 0.19.0 transitivePeerDependencies: - supports-color - optional: true set-cookie-parser@2.6.0: {} @@ -11325,7 +11232,7 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + object-inspect: 1.13.3 siginfo@2.0.0: {} @@ -11483,15 +11390,15 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.6 - acorn: 8.12.1 + acorn: 8.14.0 aria-query: 5.3.2 axobject-query: 4.1.0 code-red: 1.0.4 css-tree: 2.3.1 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.12 + magic-string: 0.30.14 periscopic: 3.1.0 swr@2.2.5(react@18.3.1): @@ -11636,7 +11543,7 @@ snapshots: undici@6.19.4: {} - undici@6.20.0: + undici@6.21.0: optional: true unenv-nightly@1.10.0-1717606461.a117952: @@ -11742,10 +11649,10 @@ snapshots: universalify@2.0.1: {} - unocss@0.61.3(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)): + unocss@0.61.3(postcss@8.4.38)(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)): dependencies: - '@unocss/astro': 0.61.3(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) - '@unocss/cli': 0.61.3(rollup@4.18.0) + '@unocss/astro': 0.61.3(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) + '@unocss/cli': 0.61.3(rollup@4.27.4) '@unocss/core': 0.61.3 '@unocss/extractor-arbitrary-variants': 0.61.3 '@unocss/postcss': 0.61.3(postcss@8.4.38) @@ -11763,9 +11670,9 @@ snapshots: '@unocss/transformer-compile-class': 0.61.3 '@unocss/transformer-directives': 0.61.3 '@unocss/transformer-variant-group': 0.61.3 - '@unocss/vite': 0.61.3(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)) + '@unocss/vite': 0.61.3(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)) optionalDependencies: - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - postcss - rollup @@ -11786,7 +11693,7 @@ snapshots: url@0.11.3: dependencies: punycode: 1.4.1 - qs: 6.12.3 + qs: 6.13.1 use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): dependencies: @@ -11870,10 +11777,10 @@ snapshots: vite-node@1.6.0(@types/node@20.14.9)(sass@1.77.6): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.7 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - '@types/node' - less @@ -11887,10 +11794,10 @@ snapshots: vite-node@2.0.1(@types/node@20.14.9)(sass@1.77.6): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.7 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - '@types/node' - less @@ -11901,34 +11808,34 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)): + vite-plugin-node-polyfills@0.22.0(rollup@4.27.4)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.18.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.27.4) node-stdlib-browser: 1.2.0 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - rollup - vite-plugin-optimize-css-modules@1.1.0(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)): + vite-plugin-optimize-css-modules@1.1.0(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)): dependencies: - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) - vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.9)(sass@1.77.6)): + vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@5.3.6(@types/node@20.14.9)(sass@1.77.6)): dependencies: debug: 4.3.5 globrex: 0.1.2 tsconfck: 3.1.0(typescript@5.5.2) optionalDependencies: - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) transitivePeerDependencies: - supports-color - typescript - vite@5.3.1(@types/node@20.14.9)(sass@1.77.6): + vite@5.3.6(@types/node@20.14.9)(sass@1.77.6): dependencies: esbuild: 0.21.5 - postcss: 8.4.38 - rollup: 4.18.0 + postcss: 8.4.49 + rollup: 4.27.4 optionalDependencies: '@types/node': 20.14.9 fsevents: 2.3.3 @@ -11951,7 +11858,7 @@ snapshots: std-env: 3.7.0 tinybench: 2.8.0 tinypool: 1.0.0 - vite: 5.3.1(@types/node@20.14.9)(sass@1.77.6) + vite: 5.3.6(@types/node@20.14.9)(sass@1.77.6) vite-node: 2.0.1(@types/node@20.14.9)(sass@1.77.6) why-is-node-running: 2.2.2 optionalDependencies: diff --git a/public/social_preview_index.jpg b/public/social_preview_index.jpg index 0b4b6aedc..55952e327 100644 Binary files a/public/social_preview_index.jpg and b/public/social_preview_index.jpg differ