From a75401b802898be41f5f8f70c3b577195022a820 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 02:32:49 +0300 Subject: [PATCH 01/16] swiper-1-2-fix --- public/locales/en/translation.json | 2 +- public/locales/ru/translation.json | 2 +- .../_shared/SolidSwiper/ArticleCardSwiper.tsx | 123 +++++++++--------- 3 files changed, 60 insertions(+), 67 deletions(-) diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 267804e7..064c8c5d 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -397,7 +397,7 @@ "Top authors": "Authors rating", "Top commented": "Most commented", "Top discussed": "Top discussed", - "Top month articles": "Top of the month", + "Top month": "Top of the month", "Top rated": "Popular", "Top recent": "Most recent", "Top topics": "Interesting topics", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 30e38a8d..09497c5a 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -418,7 +418,7 @@ "Top authors": "Рейтинг авторов", "Top commented": "Самое комментируемое", "Top discussed": "Обсуждаемое", - "Top month articles": "Лучшие материалы месяца", + "Top month": "Лучшее за месяц", "Top rated": "Популярное", "Top recent": "Самое новое", "Top topics": "Интересные темы", diff --git a/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx b/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx index 46a590b7..067748d5 100644 --- a/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx +++ b/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx @@ -10,6 +10,8 @@ import { ShowOnlyOnClient } from '../ShowOnlyOnClient' import { SwiperRef } from './swiper' +import { Row1 } from '../../Feed/Row1' +import { Row2 } from '../../Feed/Row2' import styles from './Swiper.module.scss' type Props = { @@ -42,71 +44,62 @@ export const ArticleCardSwiper = (props: Props) => {

{props.title}

- 1} - fallback={ - - } - > -
- (mainSwipeRef.current = el)} - centered-slides={true} - observer={true} - space-between={10} - breakpoints={{ - 576: { spaceBetween: 20, slidesPerView: 1.5 }, - 992: { spaceBetween: 52, slidesPerView: 1.5 }, - }} - round-lengths={true} - loop={true} - speed={800} - autoplay={{ - disableOnInteraction: false, - delay: 6000, - pauseOnMouseEnter: true, - }} - > - - {(slide, index) => ( - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - - - - )} - - -
mainSwipeRef.current.swiper.slidePrev()} - > - -
-
mainSwipeRef.current.swiper.slideNext()} - > - -
-
+ 0}> + }> + }> +
+ (mainSwipeRef.current = el)} + centered-slides={true} + observer={true} + space-between={10} + breakpoints={{ + 576: { spaceBetween: 20, slidesPerView: 1.5 }, + 992: { spaceBetween: 52, slidesPerView: 1.5 }, + }} + round-lengths={true} + loop={true} + speed={800} + autoplay={{ + disableOnInteraction: false, + delay: 6000, + pauseOnMouseEnter: true, + }} + > + + {(slide, index) => ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + + + + )} + + +
mainSwipeRef.current.swiper.slidePrev()} + > + +
+
mainSwipeRef.current.swiper.slideNext()} + > + +
+
+
+
From 06ce5266e23be3c85994a9738c88ac784adf124e Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 02:43:23 +0300 Subject: [PATCH 02/16] refactoring: seen context provider --- src/components/App.tsx | 33 ++++++------ src/components/Feed/Sidebar/Sidebar.tsx | 5 +- src/context/seen.tsx | 67 +++++++++++++++++++++++++ src/stores/zine/seen.ts | 15 ------ 4 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 src/context/seen.tsx delete mode 100644 src/stores/zine/seen.ts diff --git a/src/components/App.tsx b/src/components/App.tsx index 5a362864..f8f9a6c5 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -12,6 +12,7 @@ import { InboxProvider } from '../context/inbox' import { LocalizeProvider } from '../context/localize' import { MediaQueryProvider } from '../context/mediaQuery' import { NotificationsProvider } from '../context/notifications' +import { SeenProvider } from '../context/seen' import { SessionProvider } from '../context/session' import { SnackbarProvider } from '../context/snackbar' import { TopicsProvider } from '../context/topics' @@ -115,21 +116,23 @@ export const App = (props: Props) => { - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/src/components/Feed/Sidebar/Sidebar.tsx b/src/components/Feed/Sidebar/Sidebar.tsx index 213589ef..6fdbee40 100644 --- a/src/components/Feed/Sidebar/Sidebar.tsx +++ b/src/components/Feed/Sidebar/Sidebar.tsx @@ -4,18 +4,17 @@ import { For, Show, createSignal } from 'solid-js' import { useFollowing } from '../../../context/following' import { useLocalize } from '../../../context/localize' +import { useSeen } from '../../../context/seen' import { Author } from '../../../graphql/schema/core.gen' import { router, useRouter } from '../../../stores/router' import { useArticlesStore } from '../../../stores/zine/articles' -import { useSeenStore } from '../../../stores/zine/seen' import { Userpic } from '../../Author/Userpic' import { Icon } from '../../_shared/Icon' - import styles from './Sidebar.module.scss' export const Sidebar = () => { const { t } = useLocalize() - const { seen } = useSeenStore() + const { seen } = useSeen() const { subscriptions } = useFollowing() const { page } = useRouter() const { articlesByTopic } = useArticlesStore() diff --git a/src/context/seen.tsx b/src/context/seen.tsx new file mode 100644 index 00000000..f26ef3e2 --- /dev/null +++ b/src/context/seen.tsx @@ -0,0 +1,67 @@ +import { openDB } from 'idb' +import { Accessor, JSX, createContext, createSignal, onMount, useContext } from 'solid-js' + +type SeenContextType = { + seen: Accessor<{ [slug: string]: number }> + addSeen: (slug: string) => void +} + +const SeenContext = createContext() +export function useSeen() { + return useContext(SeenContext) +} + +const DB_NAME = 'discourseAppDB' +const DB_VERSION = 1 +const STORE_NAME = 'seen' +const setupIndexedDB = async () => { + return await openDB(DB_NAME, DB_VERSION, { + upgrade(db) { + if (!db.objectStoreNames.contains(STORE_NAME)) { + db.createObjectStore(STORE_NAME, { keyPath: 'slug' }) + } + }, + }) +} + +const getSeenFromIndexedDB = async (db) => { + const tx = db.transaction(STORE_NAME, 'readonly') + const store = tx.objectStore(STORE_NAME) + const seen = await store.getAll() + return seen.reduce((acc, { slug, date }) => { + acc[slug] = date + return acc + }, {}) +} + +const saveSeenToIndexedDB = async (db, seen) => { + const tx = db.transaction(STORE_NAME, 'readwrite') + const store = tx.objectStore(STORE_NAME) + for (const [slug, date] of Object.entries(seen)) { + await store.put({ slug, date }) + } + await tx.done +} + +export const SeenProvider = (props: { children: JSX.Element }) => { + const [seen, setSeen] = createSignal<{ [slug: string]: number }>({}) + const [db, setDb] = createSignal() + const addSeen = async (slug: string) => { + setSeen((prev) => { + const newSeen = { ...prev, [slug]: Date.now() } + saveSeenToIndexedDB(db(), newSeen) + return newSeen + }) + } + + onMount(async () => { + const ndb = await setupIndexedDB() + setDb(ndb) + const seenFromDB = await getSeenFromIndexedDB(ndb) + setSeen(seenFromDB) + }) + + const value: SeenContextType = { seen, addSeen } + + return {props.children} +} diff --git a/src/stores/zine/seen.ts b/src/stores/zine/seen.ts deleted file mode 100644 index bf01d92d..00000000 --- a/src/stores/zine/seen.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createStorageSignal } from '@solid-primitives/storage' - -// TODO: use indexedDB here -export const [seen, setSeen] = createStorageSignal<{ [slug: string]: Date }>('seen', {}) -export const addSeen = (slug) => setSeen({ ...seen(), [slug]: Date.now() }) - -export const useSeenStore = (initialData: { [slug: string]: Date } = {}) => { - setSeen({ ...seen(), ...initialData }) - - return { - seen, - setSeen, - addSeen, - } -} From a885686ae4eac44f9cb9104dd161e89476d98d52 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 02:44:06 +0300 Subject: [PATCH 03/16] stab --- src/components/Feed/ArticleCard/ArticleCard.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Feed/ArticleCard/ArticleCard.tsx b/src/components/Feed/ArticleCard/ArticleCard.tsx index a22db42d..19529050 100644 --- a/src/components/Feed/ArticleCard/ArticleCard.tsx +++ b/src/components/Feed/ArticleCard/ArticleCard.tsx @@ -89,8 +89,8 @@ const getTitleAndSubtitle = ( } const getMainTopicTitle = (article: Shout, lng: string) => { - const mainTopicSlug = article.main_topic || '' - const mainTopic = article.topics?.find((tpc: Topic) => tpc.slug === mainTopicSlug) + const mainTopicSlug = article?.main_topic || '' + const mainTopic = article?.topics?.find((tpc: Topic) => tpc.slug === mainTopicSlug) const mainTopicTitle = mainTopicSlug && lng === 'en' ? mainTopicSlug.replace(/-/, ' ') : mainTopic?.title || '' @@ -111,8 +111,8 @@ export const ArticleCard = (props: ArticleCardProps) => { const [isActionPopupActive, setIsActionPopupActive] = createSignal(false) const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false) const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true) - const description = getDescription(props.article.body) - const aspectRatio = () => LAYOUT_ASPECT[props.article.layout] + const description = getDescription(props.article?.body) + const aspectRatio = () => LAYOUT_ASPECT[props.article?.layout] const [mainTopicTitle, mainTopicSlug] = getMainTopicTitle(props.article, lang()) const { title, subtitle } = getTitleAndSubtitle(props.article) From 56b292c817e3fdf8efa606ec8d8bc4cbf63716cf Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 02:44:25 +0300 Subject: [PATCH 04/16] refactoring: topics context provider --- src/components/Nav/Header/Header.tsx | 2 +- src/components/Views/AllTopics/AllTopics.tsx | 14 ++- src/components/Views/Expo/Expo.tsx | 2 +- src/components/Views/Feed/Feed.tsx | 4 +- src/components/Views/Home.tsx | 6 +- .../Views/PublishSettings/PublishSettings.tsx | 5 +- src/components/Views/Topic.tsx | 6 +- src/context/topics.tsx | 82 ++++++++++++- src/pages/allTopics.page.tsx | 22 +--- src/pages/index.page.tsx | 8 +- src/pages/topic.page.tsx | 2 - src/stores/zine/topics.ts | 110 ------------------ 12 files changed, 103 insertions(+), 160 deletions(-) delete mode 100644 src/stores/zine/topics.ts diff --git a/src/components/Nav/Header/Header.tsx b/src/components/Nav/Header/Header.tsx index f1342f1d..680dd886 100644 --- a/src/components/Nav/Header/Header.tsx +++ b/src/components/Nav/Header/Header.tsx @@ -48,7 +48,7 @@ export const Header = (props: Props) => { const { page } = useRouter() const { requireAuthentication } = useSession() const { searchParams } = useRouter() - const { topics } = useTopics() + const { sortedTopics: topics } = useTopics() const [randomTopics, setRandomTopics] = createSignal([]) const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false) const [getIsScrolled, setIsScrolled] = createSignal(false) diff --git a/src/components/Views/AllTopics/AllTopics.tsx b/src/components/Views/AllTopics/AllTopics.tsx index 92e57527..6183c26e 100644 --- a/src/components/Views/AllTopics/AllTopics.tsx +++ b/src/components/Views/AllTopics/AllTopics.tsx @@ -2,10 +2,10 @@ import type { Topic } from '../../../graphql/schema/core.gen' import { Meta } from '@solidjs/meta' import { clsx } from 'clsx' -import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' +import { For, Show, createEffect, createMemo, createSignal, onMount } from 'solid-js' import { useLocalize } from '../../../context/localize' +import { useTopics } from '../../../context/topics' import { useRouter } from '../../../stores/router' -import { setTopicsSort, useTopicsStore } from '../../../stores/zine/topics' import { capitalize } from '../../../utils/capitalize' import { dummyFilter } from '../../../utils/dummyFilter' import { getImageUrl } from '../../../utils/getImageUrl' @@ -33,10 +33,12 @@ export const AllTopics = (props: Props) => { const [limit, setLimit] = createSignal(PAGE_SIZE) const ALPHABET = lang() === 'ru' ? [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ#'] : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ#'] - - const { sortedTopics } = useTopicsStore({ - topics: props.topics, - sortBy: searchParams().by || 'shouts', + const { sortedTopics, setTopicsSort, addTopics } = useTopics() + onMount(() => { + setTopicsSort(searchParams()?.by || 'shouts') + if (props.topics) { + addTopics(props.topics) + } }) createEffect(() => { diff --git a/src/components/Views/Expo/Expo.tsx b/src/components/Views/Expo/Expo.tsx index 8506bf24..cb9fa754 100644 --- a/src/components/Views/Expo/Expo.tsx +++ b/src/components/Views/Expo/Expo.tsx @@ -192,7 +192,7 @@ export const Expo = (props: Props) => { )} 0} keyed={true}> - + {(shout) => ( diff --git a/src/components/Views/Feed/Feed.tsx b/src/components/Views/Feed/Feed.tsx index e5c196e9..283ebb72 100644 --- a/src/components/Views/Feed/Feed.tsx +++ b/src/components/Views/Feed/Feed.tsx @@ -6,13 +6,13 @@ import { For, Show, createEffect, createMemo, createSignal, on, onMount } from ' import { useLocalize } from '../../../context/localize' import { useReactions } from '../../../context/reactions' import { useSession } from '../../../context/session' +import { useTopics } from '../../../context/topics' import { apiClient } from '../../../graphql/client/core' import type { Author, LoadShoutsOptions, Reaction, Shout } from '../../../graphql/schema/core.gen' import { router, useRouter } from '../../../stores/router' import { showModal } from '../../../stores/ui' import { resetSortedArticles, useArticlesStore } from '../../../stores/zine/articles' import { useTopAuthorsStore } from '../../../stores/zine/topAuthors' -import { useTopicsStore } from '../../../stores/zine/topics' import { getImageUrl } from '../../../utils/getImageUrl' import { byCreated } from '../../../utils/sortby' import { CommentDate } from '../../Article/CommentDate' @@ -103,7 +103,7 @@ export const FeedView = (props: Props) => { const { session } = useSession() const { loadReactionsBy } = useReactions() const { sortedArticles } = useArticlesStore() - const { topTopics } = useTopicsStore() + const { topTopics } = useTopics() const { topAuthors } = useTopAuthorsStore() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const [topComments, setTopComments] = createSignal([]) diff --git a/src/components/Views/Home.tsx b/src/components/Views/Home.tsx index b4c321ba..ac22c97b 100644 --- a/src/components/Views/Home.tsx +++ b/src/components/Views/Home.tsx @@ -2,6 +2,7 @@ import { getPagePath } from '@nanostores/router' import { For, Show, createMemo, createSignal, onMount } from 'solid-js' import { useLocalize } from '../../context/localize' +import { useTopics } from '../../context/topics' import { Shout, Topic } from '../../graphql/schema/core.gen' import { router } from '../../stores/router' import { @@ -11,7 +12,6 @@ import { useArticlesStore, } from '../../stores/zine/articles' import { useTopAuthorsStore } from '../../stores/zine/topAuthors' -import { useTopicsStore } from '../../stores/zine/topics' import { capitalize } from '../../utils/capitalize' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import { splitToPages } from '../../utils/splitToPages' @@ -46,7 +46,7 @@ export const HomeView = (props: Props) => { shouts: props.shouts, }) - const { topTopics } = useTopicsStore() + const { topTopics } = useTopics() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const { topAuthors } = useTopAuthorsStore() const { t } = useLocalize() @@ -110,7 +110,7 @@ export const HomeView = (props: Props) => { nodate={true} /> - + diff --git a/src/components/Views/PublishSettings/PublishSettings.tsx b/src/components/Views/PublishSettings/PublishSettings.tsx index 1e9f4a81..de86a02b 100644 --- a/src/components/Views/PublishSettings/PublishSettings.tsx +++ b/src/components/Views/PublishSettings/PublishSettings.tsx @@ -6,11 +6,11 @@ import { createStore } from 'solid-js/store' import { ShoutForm, useEditorContext } from '../../../context/editor' import { useLocalize } from '../../../context/localize' import { useSession } from '../../../context/session' +import { useTopics } from '../../../context/topics' import { Topic } from '../../../graphql/schema/core.gen' import { UploadedFile } from '../../../pages/types' import { router } from '../../../stores/router' import { hideModal, showModal } from '../../../stores/ui' -import { loadAllTopics, useTopicsStore } from '../../../stores/zine/topics' import { TopicSelect, UploadModalContent } from '../../Editor' import { Modal } from '../../Nav/Modal' import { Button } from '../../_shared/Button' @@ -53,7 +53,7 @@ const emptyConfig = { export const PublishSettings = (props: Props) => { const { t } = useLocalize() const { author } = useSession() - const { sortedTopics } = useTopicsStore() + const { sortedTopics } = useTopics() const { showSnackbar } = useSnackbar() const [topics, setTopics] = createSignal(sortedTopics()) @@ -82,7 +82,6 @@ export const PublishSettings = (props: Props) => { onMount(() => { setSettingsForm(initialData()) - loadAllTopics() }) createEffect(() => setTopics(sortedTopics())) diff --git a/src/components/Views/Topic.tsx b/src/components/Views/Topic.tsx index 97a107dd..1a295bcb 100644 --- a/src/components/Views/Topic.tsx +++ b/src/components/Views/Topic.tsx @@ -5,10 +5,10 @@ import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' import { useLocalize } from '../../context/localize' +import { useTopics } from '../../context/topics' import { useRouter } from '../../stores/router' import { loadShouts, useArticlesStore } from '../../stores/zine/articles' import { useAuthorsStore } from '../../stores/zine/authors' -import { useTopicsStore } from '../../stores/zine/topics' import { capitalize } from '../../utils/capitalize' import { getImageUrl } from '../../utils/getImageUrl' import { getDescription } from '../../utils/meta' @@ -43,7 +43,7 @@ export const TopicView = (props: Props) => { const { searchParams, changeSearchParams } = useRouter() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const { sortedArticles } = useArticlesStore({ shouts: props.shouts }) - const { topicEntities } = useTopicsStore({ topics: [props.topic] }) + const { topicEntities } = useTopics() const { authorsByTopic } = useAuthorsStore() const [favoriteTopArticles, setFavoriteTopArticles] = createSignal([]) const [reactedTopMonthArticles, setReactedTopMonthArticles] = createSignal([]) @@ -216,7 +216,7 @@ export const TopicView = (props: Props) => { wrapper={'author'} /> 0} keyed={true}> - + + topicEntities: Accessor<{ [topicSlug: string]: Topic }> + sortedTopics: Accessor + randomTopics: Accessor + topTopics: Accessor + setTopicsSort: (sortBy: string) => void + addTopics: (topics: Topic[]) => void } const TopicsContext = createContext() @@ -40,20 +48,84 @@ const saveTopicsToIndexedDB = async (db, topics) => { } export const TopicsProvider = (props: { children: JSX.Element }) => { + const [topicEntities, setTopicEntities] = createSignal<{ [topicSlug: string]: Topic }>({}) + const [sortAllBy, setSortAllBy] = createSignal<'shouts' | 'followers' | 'authors' | 'title'>('shouts') const [randomTopics, setRandomTopics] = createSignal([]) + const sortedTopics = createLazyMemo(() => { + const topics = Object.values(topicEntities()) + const { changeSearchParams } = useRouter() + switch (sortAllBy()) { + case 'followers': { + topics.sort(byTopicStatDesc('followers')) + break + } + case 'shouts': { + topics.sort(byTopicStatDesc('shouts')) + break + } + case 'authors': { + topics.sort(byTopicStatDesc('authors')) + break + } + case 'title': { + topics.sort((a, b) => a.title.localeCompare(b.title)) + break + } + default: { + topics.sort(byTopicStatDesc('shouts')) + changeSearchParams({ by: 'shouts' }) + } + } + + return topics + }) + + const topTopics = createMemo(() => { + const topics = Object.values(topicEntities()) + topics.sort(byTopicStatDesc('shouts')) + return topics + }) + + const addTopics = (...args: Topic[][]) => { + const allTopics = args.flatMap((topics) => (topics || []).filter(Boolean)) + + const newTopicEntities = allTopics.reduce( + (acc, topic) => { + acc[topic.slug] = topic + return acc + }, + {} as Record, + ) + + setTopicEntities((prevTopicEntities) => { + return { + ...prevTopicEntities, + ...newTopicEntities, + } + }) + } + onMount(async () => { const db = await setupIndexedDB() - let topics = getTopicsFromIndexedDB(db) + let topics = await getTopicsFromIndexedDB(db) - if (topics.length === 0) { + if (topics.length < 100) { topics = await apiClient.getAllTopics() await saveTopicsToIndexedDB(db, topics) } + addTopics(topics) setRandomTopics(topics) }) - const value: TopicsContextType = { topics: randomTopics } + const value: TopicsContextType = { + setTopicsSort: setSortAllBy, + topicEntities, + sortedTopics, + randomTopics, + topTopics, + addTopics, + } return {props.children} } diff --git a/src/pages/allTopics.page.tsx b/src/pages/allTopics.page.tsx index 49d54626..5b440afe 100644 --- a/src/pages/allTopics.page.tsx +++ b/src/pages/allTopics.page.tsx @@ -1,29 +1,15 @@ -import type { PageProps } from './types' - -import { createSignal, onMount } from 'solid-js' - import { AllTopics } from '../components/Views/AllTopics' import { PageLayout } from '../components/_shared/PageLayout' import { useLocalize } from '../context/localize' -import { loadAllTopics } from '../stores/zine/topics' +import { useTopics } from '../context/topics' -export const AllTopicsPage = (props: PageProps) => { +export const AllTopicsPage = () => { const { t } = useLocalize() - - const [isLoaded, setIsLoaded] = createSignal(Boolean(props.allTopics)) - - onMount(async () => { - if (isLoaded()) { - return - } - - await loadAllTopics() - setIsLoaded(true) - }) + const { sortedTopics } = useTopics() return ( - + ) } diff --git a/src/pages/index.page.tsx b/src/pages/index.page.tsx index 93d3c412..a04c09b0 100644 --- a/src/pages/index.page.tsx +++ b/src/pages/index.page.tsx @@ -2,13 +2,12 @@ import type { PageProps } from './types' import { Show, createSignal, onCleanup, onMount } from 'solid-js' -import { HomeView, PRERENDERED_ARTICLES_COUNT, RANDOM_TOPICS_COUNT } from '../components/Views/Home' +import { HomeView, PRERENDERED_ARTICLES_COUNT } from '../components/Views/Home' import { Loading } from '../components/_shared/Loading' import { PageLayout } from '../components/_shared/PageLayout' import { useLocalize } from '../context/localize' import { ReactionsProvider } from '../context/reactions' import { loadShouts, resetSortedArticles } from '../stores/zine/articles' -import { loadRandomTopics } from '../stores/zine/topics' export const HomePage = (props: PageProps) => { const [isLoaded, setIsLoaded] = createSignal(Boolean(props.homeShouts)) @@ -19,10 +18,7 @@ export const HomePage = (props: PageProps) => { return } - await Promise.all([ - loadShouts({ filters: { featured: true }, limit: PRERENDERED_ARTICLES_COUNT }), - loadRandomTopics({ amount: RANDOM_TOPICS_COUNT }), - ]) + await loadShouts({ filters: { featured: true }, limit: PRERENDERED_ARTICLES_COUNT }) setIsLoaded(true) }) diff --git a/src/pages/topic.page.tsx b/src/pages/topic.page.tsx index b5e6212a..4fa3fb49 100644 --- a/src/pages/topic.page.tsx +++ b/src/pages/topic.page.tsx @@ -8,7 +8,6 @@ import { PageLayout } from '../components/_shared/PageLayout' import { ReactionsProvider } from '../context/reactions' import { useRouter } from '../stores/router' import { loadShouts, resetSortedArticles } from '../stores/zine/articles' -import { loadTopic } from '../stores/zine/topics' export const TopicPage = (props: PageProps) => { const { page } = useRouter() @@ -25,7 +24,6 @@ export const TopicPage = (props: PageProps) => { limit: PRERENDERED_ARTICLES_COUNT, offset: 0, }), - loadTopic({ slug: slug() }), ]) onMount(async () => { diff --git a/src/stores/zine/topics.ts b/src/stores/zine/topics.ts deleted file mode 100644 index 6de17d64..00000000 --- a/src/stores/zine/topics.ts +++ /dev/null @@ -1,110 +0,0 @@ -import type { Topic } from '../../graphql/schema/core.gen' - -import { createLazyMemo } from '@solid-primitives/memo' -import { createMemo, createSignal } from 'solid-js' - -import { apiClient } from '../../graphql/client/core' -import { byTopicStatDesc } from '../../utils/sortby' -import { useRouter } from '../router' - -export type TopicsSortBy = 'followers' | 'title' | 'authors' | 'shouts' - -const [sortAllBy, setSortAllBy] = createSignal('shouts') - -export const setTopicsSort = (sortBy: TopicsSortBy) => setSortAllBy(sortBy) - -const [topicEntities, setTopicEntities] = createSignal<{ [topicSlug: string]: Topic }>({}) -const [randomTopics, setRandomTopics] = createSignal([]) - -const sortedTopics = createLazyMemo(() => { - const topics = Object.values(topicEntities()) - const { changeSearchParams } = useRouter() - switch (sortAllBy()) { - case 'followers': { - // console.debug('[store.topics] sorted by followers') - topics.sort(byTopicStatDesc('followers')) - break - } - case 'shouts': { - // log.debug(`sorted by shouts`) - topics.sort(byTopicStatDesc('shouts')) - break - } - case 'authors': { - // log.debug(`sorted by authors`) - topics.sort(byTopicStatDesc('authors')) - break - } - case 'title': { - // console.debug('[store.topics] sorted by title') - topics.sort((a, b) => a.title.localeCompare(b.title)) - break - } - default: { - topics.sort(byTopicStatDesc('shouts')) - changeSearchParams({ by: 'shouts' }) - } - } - - return topics -}) - -const topTopics = createMemo(() => { - const topics = Object.values(topicEntities()) - topics.sort(byTopicStatDesc('shouts')) - return topics -}) - -const addTopics = (...args: Topic[][]) => { - const allTopics = args.flatMap((topics) => (topics || []).filter(Boolean)) - - const newTopicEntities = allTopics.reduce( - (acc, topic) => { - acc[topic.slug] = topic - return acc - }, - {} as Record, - ) - - setTopicEntities((prevTopicEntities) => { - return { - ...prevTopicEntities, - ...newTopicEntities, - } - }) -} - -export const loadAllTopics = async (): Promise => { - const topics = await apiClient.getAllTopics() - addTopics(topics) -} - -export const loadRandomTopics = async ({ amount }: { amount: number }): Promise => { - const topics = await apiClient.getRandomTopics({ amount }) - setRandomTopics(topics) -} - -export const loadTopic = async ({ slug }: { slug: string }): Promise => { - const topic = await apiClient.getTopic({ slug }) - addTopics([topic]) -} - -type InitialState = { - topics?: Topic[] - randomTopics?: Topic[] - sortBy?: TopicsSortBy -} - -export const useTopicsStore = (initialState: InitialState = {}) => { - if (initialState.sortBy) { - setSortAllBy(initialState.sortBy) - } - - addTopics(initialState.topics, initialState.randomTopics) - - if (initialState.randomTopics) { - setRandomTopics(initialState.randomTopics) - } - - return { topicEntities, sortedTopics, randomTopics, topTopics } -} From 1f3b52258dce5ffb21298b9bdbb150da683cb9e5 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 03:05:04 +0300 Subject: [PATCH 05/16] topics renew every hour --- src/components/Views/AllTopics/AllTopics.tsx | 10 ++------ src/context/topics.tsx | 24 +++++++++++++++----- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/components/Views/AllTopics/AllTopics.tsx b/src/components/Views/AllTopics/AllTopics.tsx index 6183c26e..ae76c775 100644 --- a/src/components/Views/AllTopics/AllTopics.tsx +++ b/src/components/Views/AllTopics/AllTopics.tsx @@ -2,7 +2,7 @@ import type { Topic } from '../../../graphql/schema/core.gen' import { Meta } from '@solidjs/meta' import { clsx } from 'clsx' -import { For, Show, createEffect, createMemo, createSignal, onMount } from 'solid-js' +import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' import { useLocalize } from '../../../context/localize' import { useTopics } from '../../../context/topics' import { useRouter } from '../../../stores/router' @@ -33,13 +33,7 @@ export const AllTopics = (props: Props) => { const [limit, setLimit] = createSignal(PAGE_SIZE) const ALPHABET = lang() === 'ru' ? [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ#'] : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ#'] - const { sortedTopics, setTopicsSort, addTopics } = useTopics() - onMount(() => { - setTopicsSort(searchParams()?.by || 'shouts') - if (props.topics) { - addTopics(props.topics) - } - }) + const { sortedTopics, setTopicsSort } = useTopics() createEffect(() => { if (!searchParams().by) { diff --git a/src/context/topics.tsx b/src/context/topics.tsx index ff8ce45c..eb8c3e93 100644 --- a/src/context/topics.tsx +++ b/src/context/topics.tsx @@ -13,6 +13,7 @@ type TopicsContextType = { topTopics: Accessor setTopicsSort: (sortBy: string) => void addTopics: (topics: Topic[]) => void + loadTopics: () => Promise } const TopicsContext = createContext() @@ -33,11 +34,13 @@ const setupIndexedDB = async () => { }) } -const getTopicsFromIndexedDB = (db) => { +const getTopicsFromIndexedDB = async (db) => { const tx = db.transaction(STORE_NAME, 'readonly') const store = tx.objectStore(STORE_NAME) - return store.getAll() + const topics = await store.getAll() + return { topics, timestamp: tx.done } } + const saveTopicsToIndexedDB = async (db, topics) => { const tx = db.transaction(STORE_NAME, 'readwrite') const store = tx.objectStore(STORE_NAME) @@ -105,14 +108,22 @@ export const TopicsProvider = (props: { children: JSX.Element }) => { } }) } + const [db, setDb] = createSignal() + const loadTopics = async () => { + const ttt = await apiClient.getAllTopics() + await saveTopicsToIndexedDB(db(), ttt) + return ttt + } onMount(async () => { const db = await setupIndexedDB() - let topics = await getTopicsFromIndexedDB(db) + setDb(db) + let { topics, timestamp } = await getTopicsFromIndexedDB(db) - if (topics.length < 100) { - topics = await apiClient.getAllTopics() - await saveTopicsToIndexedDB(db, topics) + if (topics.length < 100 || Date.now() - timestamp > 3600000) { + const newTopics = await loadTopics() + await saveTopicsToIndexedDB(db, newTopics) + topics = newTopics } addTopics(topics) setRandomTopics(topics) @@ -125,6 +136,7 @@ export const TopicsProvider = (props: { children: JSX.Element }) => { randomTopics, topTopics, addTopics, + loadTopics, } return {props.children} From a03c26dd5ab53a7883f686f3d27d3bae1f7014b2 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 11:15:20 +0300 Subject: [PATCH 06/16] seen-fix --- package.json | 2 +- src/components/Nav/HeaderAuth.tsx | 7 ++- .../_shared/Popup/Popup.module.scss | 2 +- src/context/seen.tsx | 50 +++---------------- 4 files changed, 14 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index 76af1218..cdc77a02 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@solid-primitives/memo": "1.2.4", "@solid-primitives/pagination": "0.2.10", "@solid-primitives/share": "2.0.4", - "@solid-primitives/storage": "1.3.9", + "@solid-primitives/storage": "^3.5.0", "@solid-primitives/upload": "0.0.110", "@solidjs/meta": "0.29.1", "@thisbeyond/solid-select": "0.14.0", diff --git a/src/components/Nav/HeaderAuth.tsx b/src/components/Nav/HeaderAuth.tsx index f779f4bd..d3e38709 100644 --- a/src/components/Nav/HeaderAuth.tsx +++ b/src/components/Nav/HeaderAuth.tsx @@ -234,7 +234,12 @@ export const HeaderAuth = (props: Props) => { } > -
+
diff --git a/src/components/_shared/Popup/Popup.module.scss b/src/components/_shared/Popup/Popup.module.scss index 5d27cd6e..7677a3aa 100644 --- a/src/components/_shared/Popup/Popup.module.scss +++ b/src/components/_shared/Popup/Popup.module.scss @@ -73,7 +73,7 @@ border: none; white-space: nowrap; - &:before { + &::before { content: ''; height: 100%; left: 0; diff --git a/src/context/seen.tsx b/src/context/seen.tsx index f26ef3e2..bd4a26cd 100644 --- a/src/context/seen.tsx +++ b/src/context/seen.tsx @@ -1,5 +1,5 @@ -import { openDB } from 'idb' -import { Accessor, JSX, createContext, createSignal, onMount, useContext } from 'solid-js' +import { makePersisted } from '@solid-primitives/storage' +import { Accessor, JSX, createContext, createSignal, useContext } from 'solid-js' type SeenContextType = { seen: Accessor<{ [slug: string]: number }> @@ -11,56 +11,18 @@ export function useSeen() { return useContext(SeenContext) } -const DB_NAME = 'discourseAppDB' -const DB_VERSION = 1 -const STORE_NAME = 'seen' -const setupIndexedDB = async () => { - return await openDB(DB_NAME, DB_VERSION, { - upgrade(db) { - if (!db.objectStoreNames.contains(STORE_NAME)) { - db.createObjectStore(STORE_NAME, { keyPath: 'slug' }) - } - }, - }) -} - -const getSeenFromIndexedDB = async (db) => { - const tx = db.transaction(STORE_NAME, 'readonly') - const store = tx.objectStore(STORE_NAME) - const seen = await store.getAll() - return seen.reduce((acc, { slug, date }) => { - acc[slug] = date - return acc - }, {}) -} - -const saveSeenToIndexedDB = async (db, seen) => { - const tx = db.transaction(STORE_NAME, 'readwrite') - const store = tx.objectStore(STORE_NAME) - for (const [slug, date] of Object.entries(seen)) { - await store.put({ slug, date }) - } - await tx.done -} - export const SeenProvider = (props: { children: JSX.Element }) => { - const [seen, setSeen] = createSignal<{ [slug: string]: number }>({}) - const [db, setDb] = createSignal() + const [seen, setSeen] = makePersisted(createSignal<{ [slug: string]: number }>({}), { + name: 'discoursio-seen', + }) + const addSeen = async (slug: string) => { setSeen((prev) => { const newSeen = { ...prev, [slug]: Date.now() } - saveSeenToIndexedDB(db(), newSeen) return newSeen }) } - onMount(async () => { - const ndb = await setupIndexedDB() - setDb(ndb) - const seenFromDB = await getSeenFromIndexedDB(ndb) - setSeen(seenFromDB) - }) - const value: SeenContextType = { seen, addSeen } return {props.children} From 78210d558faae01322742527d414955d771a59e0 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 11:51:17 +0300 Subject: [PATCH 07/16] seen-usecontext --- src/components/Article/Comment/Comment.tsx | 2 +- src/components/Article/CommentsTree.tsx | 14 +++++++------- src/components/Article/FullArticle.tsx | 3 +++ src/components/Feed/Sidebar/Sidebar.tsx | 5 +++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/Article/Comment/Comment.tsx b/src/components/Article/Comment/Comment.tsx index d66e1767..5e94c4a8 100644 --- a/src/components/Article/Comment/Comment.tsx +++ b/src/components/Article/Comment/Comment.tsx @@ -127,7 +127,7 @@ export const Comment = (props: Props) => {
  • props.lastSeen, + [styles.isNew]: props.lastSeen > (props.comment.updated_at || props.comment.created_at), })} > diff --git a/src/components/Article/CommentsTree.tsx b/src/components/Article/CommentsTree.tsx index e8acc1fa..d899be8b 100644 --- a/src/components/Article/CommentsTree.tsx +++ b/src/components/Article/CommentsTree.tsx @@ -11,6 +11,7 @@ import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated' import { Comment } from './Comment' +import { useSeen } from '../../context/seen' import styles from './Article.module.scss' const SimplifiedEditor = lazy(() => import('../Editor/SimplifiedEditor')) @@ -48,21 +49,20 @@ export const CommentsTree = (props: Props) => { } return newSortedComments }) - - const dateFromLocalStorage = Number.parseInt(localStorage.getItem(`${props.shoutSlug}`)) + const { seen } = useSeen() + const shoutLastSeen = createMemo(() => seen()[props.shoutSlug] ?? 0) const currentDate = new Date() const setCookie = () => localStorage.setItem(`${props.shoutSlug}`, `${currentDate}`) onMount(() => { - if (!dateFromLocalStorage) { + if (!shoutLastSeen()) { setCookie() - } else if (currentDate.getTime() > dateFromLocalStorage) { + } else if (currentDate.getTime() > shoutLastSeen()) { const newComments = comments().filter((c) => { if (c.reply_to || c.created_by.slug === author()?.slug) { return } - const created = c.created_at - return created > dateFromLocalStorage + return (c.updated_at || c.created_at) > shoutLastSeen() }) setNewReactions(newComments) setCookie() @@ -134,7 +134,7 @@ export const CommentsTree = (props: Props) => { comment={reaction} clickedReply={(id) => setClickedReplyId(id)} clickedReplyId={clickedReplyId()} - lastSeen={dateFromLocalStorage} + lastSeen={shoutLastSeen()} /> )} diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index 5d878580..94f4eff9 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -38,6 +38,7 @@ import { CommentsTree } from './CommentsTree' import { SharePopup, getShareUrl } from './SharePopup' import { ShoutRatingControl } from './ShoutRatingControl' +import { useSeen } from '../../context/seen' import stylesHeader from '../Nav/Header/Header.module.scss' import styles from './Article.module.scss' @@ -76,6 +77,7 @@ export const FullArticle = (props: Props) => { const [isActionPopupActive, setIsActionPopupActive] = createSignal(false) const { t, formatDate, lang } = useLocalize() const { author, session, requireAuthentication } = useSession() + const { addSeen } = useSeen() const formattedDate = createMemo(() => formatDate(new Date(props.article.published_at * 1000))) @@ -302,6 +304,7 @@ export const FullArticle = (props: Props) => { onMount(async () => { install('G-LQ4B87H8C2') await loadReactionsBy({ by: { shout: props.article.slug } }) + addSeen(props.article.slug) setIsReactionsLoaded(true) document.title = props.article.title window?.addEventListener('resize', updateIframeSizes) diff --git a/src/components/Feed/Sidebar/Sidebar.tsx b/src/components/Feed/Sidebar/Sidebar.tsx index 6fdbee40..a116bc4b 100644 --- a/src/components/Feed/Sidebar/Sidebar.tsx +++ b/src/components/Feed/Sidebar/Sidebar.tsx @@ -17,7 +17,7 @@ export const Sidebar = () => { const { seen } = useSeen() const { subscriptions } = useFollowing() const { page } = useRouter() - const { articlesByTopic } = useArticlesStore() + const { articlesByTopic, articlesByAuthor } = useArticlesStore() const [isSubscriptionsVisible, setSubscriptionsVisible] = createSignal(true) const checkTopicIsSeen = (topicSlug: string) => { @@ -25,8 +25,9 @@ export const Sidebar = () => { } const checkAuthorIsSeen = (authorSlug: string) => { - return Boolean(seen()[authorSlug]) + return articlesByAuthor()[authorSlug]?.every((article) => Boolean(seen()[article.slug])) } + return (
      From 8df9e3c356f809256f67f997ff16fdb588ec4e71 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 15:59:07 +0300 Subject: [PATCH 08/16] bump-ver --- package-lock.json | 750 +++++++++++++++++----------------------------- package.json | 12 +- 2 files changed, 289 insertions(+), 473 deletions(-) diff --git a/package-lock.json b/package-lock.json index d3ea3271..276ea8bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,9 +34,9 @@ "@solid-primitives/memo": "1.2.4", "@solid-primitives/pagination": "0.2.10", "@solid-primitives/share": "2.0.4", - "@solid-primitives/storage": "1.3.9", - "@solid-primitives/upload": "0.0.110", - "@solidjs/meta": "0.29.1", + "@solid-primitives/storage": "^3.5.0", + "@solid-primitives/upload": "0.0.115", + "@solidjs/meta": "0.29.3", "@thisbeyond/solid-select": "0.14.0", "@tiptap/core": "2.2.3", "@tiptap/extension-blockquote": "2.2.3", @@ -95,9 +95,9 @@ "prosemirror-history": "1.3.2", "prosemirror-trailing-node": "2.0.7", "prosemirror-view": "1.32.7", - "rollup": "4.11.0", + "rollup": "4.17.2", "sass": "1.69.5", - "solid-js": "1.8.15", + "solid-js": "1.8.17", "solid-popper": "0.3.0", "solid-tiptap": "0.7.0", "solid-transition-group": "0.2.3", @@ -110,8 +110,8 @@ "typescript": "5.2.2", "typograf": "7.3.0", "uniqolor": "1.1.0", - "vike": "0.4.148", - "vite": "5.2.10", + "vike": "0.4.171", + "vite": "5.2.11", "vite-plugin-mkcert": "^1.17.3", "vite-plugin-node-polyfills": "0.21.0", "vite-plugin-sass-dts": "^1.3.17", @@ -1204,9 +1204,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.2.tgz", - "integrity": "sha512-6Skx9N47inLQzYi9RKgJ7PBnUnaHnMe/imqX43cOcJjZtfMnQLxEvfM2Eyo7gChkwrZlwc+VbA4huFRjw2fsYA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.3.tgz", + "integrity": "sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==", "dev": true, "hasInstallScript": true, "bin": { @@ -1220,20 +1220,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "1.7.2", - "@biomejs/cli-darwin-x64": "1.7.2", - "@biomejs/cli-linux-arm64": "1.7.2", - "@biomejs/cli-linux-arm64-musl": "1.7.2", - "@biomejs/cli-linux-x64": "1.7.2", - "@biomejs/cli-linux-x64-musl": "1.7.2", - "@biomejs/cli-win32-arm64": "1.7.2", - "@biomejs/cli-win32-x64": "1.7.2" + "@biomejs/cli-darwin-arm64": "1.7.3", + "@biomejs/cli-darwin-x64": "1.7.3", + "@biomejs/cli-linux-arm64": "1.7.3", + "@biomejs/cli-linux-arm64-musl": "1.7.3", + "@biomejs/cli-linux-x64": "1.7.3", + "@biomejs/cli-linux-x64-musl": "1.7.3", + "@biomejs/cli-win32-arm64": "1.7.3", + "@biomejs/cli-win32-x64": "1.7.3" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.2.tgz", - "integrity": "sha512-CrldIueHivWEWmeTkK8bTXajeX53F8i2Rrkkt8cPZyMtzkrwxf8Riq4a/jz3SQBHkxHFT4TqGbSTNMXe3X1ogA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.3.tgz", + "integrity": "sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==", "cpu": [ "arm64" ], @@ -1247,9 +1247,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.2.tgz", - "integrity": "sha512-UELnLJuJOsTL9meArvn8BtiXDURyPil2Ej9me2uVpEvee8UQdqd/bssP5we400OWShlL1AAML4fn6d2WX5332g==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.3.tgz", + "integrity": "sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==", "cpu": [ "x64" ], @@ -1263,9 +1263,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.2.tgz", - "integrity": "sha512-Z1CSGQE6fHz55gkiFHv9E8wEAaSUd7dHSRaxSCBa7utonHqpIeMbvj3Evm1w0WfGLFDtRXLV1fTfEdM0FMTOhA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.3.tgz", + "integrity": "sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==", "cpu": [ "arm64" ], @@ -1279,9 +1279,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.2.tgz", - "integrity": "sha512-kKYZiem7Sj7wI0dpVxJlK7C+TFQwzO/ctufIGXGJAyEmUe9vEKSzV8CXpv+JIRiTWyqaZJ4K+eHz4SPdPCv05w==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.3.tgz", + "integrity": "sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==", "cpu": [ "arm64" ], @@ -1295,9 +1295,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.2.tgz", - "integrity": "sha512-vXXyox8/CQijBxAu0+r8FfSO7JlC4tob3PbaFda8gPJFRz2uFJw39HtxVUwbTV1EcU6wSPh4SiRu5sZfP1VHrQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.3.tgz", + "integrity": "sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==", "cpu": [ "x64" ], @@ -1311,9 +1311,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.2.tgz", - "integrity": "sha512-x10LpGMepDrLS+h2TZ6/T7egpHjGKtiI4GuShNylmBQJWfTotbFf9eseHggrqJ4WZf9yrGoVYrtbxXftuB95sQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.3.tgz", + "integrity": "sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==", "cpu": [ "x64" ], @@ -1327,9 +1327,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.2.tgz", - "integrity": "sha512-kRXdlKzcU7INf6/ldu0nVmkOgt7bKqmyXRRCUqqaJfA32+9InTbkD8tGrHZEVYIWr+eTuKcg16qZVDsPSDFZ8g==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.3.tgz", + "integrity": "sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==", "cpu": [ "arm64" ], @@ -1343,9 +1343,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.2.tgz", - "integrity": "sha512-qHTtpAs+CNglAAuaTy09htoqUhrQyd3nd0aGTuLNqD10h1llMVi8WFZfoa+e5MuDSfYtMK6nW2Tbf6WgzzR1Qw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.3.tgz", + "integrity": "sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==", "cpu": [ "x64" ], @@ -1382,19 +1382,19 @@ "integrity": "sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==", "dev": true }, - "node_modules/@brillout/vite-plugin-import-build": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.22.tgz", - "integrity": "sha512-n5sv0HdCB5WC2QJSnTN6iS/F+sJsF0AmtsCCaQ+5+dRjgsoGGsa3auinJV8tuEog5WsX+3MF8RIwn3A/u0e04w==", + "node_modules/@brillout/vite-plugin-server-entry": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-server-entry/-/vite-plugin-server-entry-0.4.6.tgz", + "integrity": "sha512-VmnbkEVNY9pGnr2ICu+5lFnT3Zz4oblWxKZ1D4kutkzljxDOOBld8oWQI1RVup7c5OiG7XOHFJYYZS38BAXiLw==", "dev": true, "dependencies": { "@brillout/import": "^0.2.3" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", - "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", + "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", "dev": true, "funding": [ { @@ -1410,13 +1410,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", - "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", + "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", "dev": true, "funding": [ { @@ -1433,9 +1433,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", - "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", + "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", "dev": true, "funding": [ { @@ -1451,8 +1451,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/selector-specificity": { @@ -1488,9 +1488,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", "cpu": [ "ppc64" ], @@ -1504,9 +1504,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -1520,9 +1520,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -1536,9 +1536,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -1552,9 +1552,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -1568,9 +1568,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -1584,9 +1584,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -1600,9 +1600,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -1616,9 +1616,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -1632,9 +1632,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -1648,9 +1648,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -1664,9 +1664,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -1680,9 +1680,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -1696,9 +1696,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -1712,9 +1712,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -1728,9 +1728,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -1744,9 +1744,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -1760,9 +1760,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -1776,9 +1776,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -1792,9 +1792,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -1808,9 +1808,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -1824,9 +1824,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -1840,9 +1840,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -3632,9 +3632,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.11.0.tgz", - "integrity": "sha512-BV+u2QSfK3i1o6FucqJh5IK9cjAU6icjFFhvknzFgu472jzl0bBojfDAkJLBEsHFMo+YZg6rthBvBBt8z12IBQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", "cpu": [ "arm" ], @@ -3645,9 +3645,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.11.0.tgz", - "integrity": "sha512-0ij3iw7sT5jbcdXofWO2NqDNjSVVsf6itcAkV2I6Xsq4+6wjW1A8rViVB67TfBEan7PV2kbLzT8rhOVWLI2YXw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", "cpu": [ "arm64" ], @@ -3658,9 +3658,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.11.0.tgz", - "integrity": "sha512-yPLs6RbbBMupArf6qv1UDk6dzZvlH66z6NLYEwqTU0VHtss1wkI4UYeeMS7TVj5QRVvaNAWYKP0TD/MOeZ76Zg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", "cpu": [ "arm64" ], @@ -3671,9 +3671,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.11.0.tgz", - "integrity": "sha512-OvqIgwaGAwnASzXaZEeoJY3RltOFg+WUbdkdfoluh2iqatd090UeOG3A/h0wNZmE93dDew9tAtXgm3/+U/B6bw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", "cpu": [ "x64" ], @@ -3684,9 +3684,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.11.0.tgz", - "integrity": "sha512-X17s4hZK3QbRmdAuLd2EE+qwwxL8JxyVupEqAkxKPa/IgX49ZO+vf0ka69gIKsaYeo6c1CuwY3k8trfDtZ9dFg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", "cpu": [ "arm" ], @@ -3710,9 +3710,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.11.0.tgz", - "integrity": "sha512-673Lu9EJwxVB9NfYeA4AdNu0FOHz7g9t6N1DmT7bZPn1u6bTF+oZjj+fuxUcrfxWXE0r2jxl5QYMa9cUOj9NFg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", "cpu": [ "arm64" ], @@ -3723,9 +3723,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.11.0.tgz", - "integrity": "sha512-yFW2msTAQNpPJaMmh2NpRalr1KXI7ZUjlN6dY/FhWlOclMrZezm5GIhy3cP4Ts2rIAC+IPLAjNibjp1BsxCVGg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", "cpu": [ "arm64" ], @@ -3749,9 +3749,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.11.0.tgz", - "integrity": "sha512-kKT9XIuhbvYgiA3cPAGntvrBgzhWkGpBMzuk1V12Xuoqg7CI41chye4HU0vLJnGf9MiZzfNh4I7StPeOzOWJfA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", "cpu": [ "riscv64" ], @@ -3775,9 +3775,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.11.0.tgz", - "integrity": "sha512-6q4ESWlyTO+erp1PSCmASac+ixaDv11dBk1fqyIuvIUc/CmRAX2Zk+2qK1FGo5q7kyDcjHCFVwgGFCGIZGVwCA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", "cpu": [ "x64" ], @@ -3788,9 +3788,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.11.0.tgz", - "integrity": "sha512-vIAQUmXeMLmaDN78HSE4Kh6xqof2e3TJUKr+LPqXWU4NYNON0MDN9h2+t4KHrPAQNmU3w1GxBQ/n01PaWFwa5w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", "cpu": [ "x64" ], @@ -3801,9 +3801,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.11.0.tgz", - "integrity": "sha512-LVXo9dDTGPr0nezMdqa1hK4JeoMZ02nstUxGYY/sMIDtTYlli1ZxTXBYAz3vzuuvKO4X6NBETciIh7N9+abT1g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", "cpu": [ "arm64" ], @@ -3814,9 +3814,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.11.0.tgz", - "integrity": "sha512-xZVt6K70Gr3I7nUhug2dN6VRR1ibot3rXqXS3wo+8JP64t7djc3lBFyqO4GiVrhNaAIhUCJtwQ/20dr0h0thmQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", "cpu": [ "ia32" ], @@ -3827,9 +3827,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.11.0.tgz", - "integrity": "sha512-f3I7h9oTg79UitEco9/2bzwdciYkWr8pITs3meSDSlr1TdvQ7IxkQaaYN2YqZXX5uZhiYL+VuYDmHwNzhx+HOg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", "cpu": [ "x64" ], @@ -4072,15 +4072,24 @@ } }, "node_modules/@solid-primitives/storage": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@solid-primitives/storage/-/storage-1.3.9.tgz", - "integrity": "sha512-ysJSIycmToQD8Hpt4jpIlh7U8EuYdpQwkamppng3g93E5f6RZVPCzYmRZ+ckRN2cNLFpAuTEqZx7OBRh3PBWFQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@solid-primitives/storage/-/storage-3.5.0.tgz", + "integrity": "sha512-AqU3vrXz8XlxOgJIiP+oQxE/vFchGf4Qe7E5Xfa02DJdF9rD8CtiTmVZDBU08ViS7g0Nwc4IpStHvVO0jBMalQ==", "dev": true, "dependencies": { - "@solid-primitives/utils": "^6.0.0" + "@solid-primitives/utils": "^6.2.3" }, "peerDependencies": { + "@tauri-apps/plugin-store": "*", "solid-js": "^1.6.12" + }, + "peerDependenciesMeta": { + "@tauri-apps/plugin-store": { + "optional": true + }, + "solid-start": { + "optional": true + } } }, "node_modules/@solid-primitives/transition-group": { @@ -4093,26 +4102,17 @@ } }, "node_modules/@solid-primitives/upload": { - "version": "0.0.110", - "resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.110.tgz", - "integrity": "sha512-YQZGogXzc77c/3hxDoxGi78FkvQQfUbElbdSPn+E0GRl21XMuJbD/QKQKNXm7KyxX+cMTwLnQYCoqfRXcgHMIA==", + "version": "0.0.115", + "resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.115.tgz", + "integrity": "sha512-CWTXz28mmRGvZV90IzViNtBAKC6cnO2WSNb3UjvbkPRrtxlHrj/ewZwLRhuLSu6JzdY/c+rHi1j24v7H0SrdXg==", "dev": true, "dependencies": { - "@solid-primitives/utils": "^5.5.1" + "@solid-primitives/utils": "^6.2.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, - "node_modules/@solid-primitives/upload/node_modules/@solid-primitives/utils": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-5.5.2.tgz", - "integrity": "sha512-L52ig3eHKU6CqbPCKJIb4lweBuINHBOERcE1duApyKozEN8+zCqEKwD1Qo9ljKeEzJTBGWClxNpwEiNTUWTGvg==", - "dev": true, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, "node_modules/@solid-primitives/utils": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.2.3.tgz", @@ -4123,9 +4123,9 @@ } }, "node_modules/@solidjs/meta": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@solidjs/meta/-/meta-0.29.1.tgz", - "integrity": "sha512-qtrBYCnRRuzyvBg/u/SRO/2fM5r6DT1YKf+2W1RZhveMoeXHbZpWIrXjgpLFRHJLn6cqAGqrIzu42qS2o+1hKQ==", + "version": "0.29.3", + "resolved": "https://registry.npmjs.org/@solidjs/meta/-/meta-0.29.3.tgz", + "integrity": "sha512-R2uirgjgyh3FPFh+rb840plF701N6GvM5w81/QeI61QwjXb4QzLkyI/uzXfC5UW8favpUn9KK9ILQeoTl6pX0A==", "dev": true, "peerDependencies": { "solid-js": ">=1.8.4" @@ -4630,9 +4630,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5454,9 +5454,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001615", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz", - "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==", + "version": "1.0.30001616", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", + "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", "dev": true, "funding": [ { @@ -6290,9 +6290,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.756", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.756.tgz", - "integrity": "sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==", + "version": "1.4.757", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz", + "integrity": "sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==", "dev": true }, "node_modules/elliptic": { @@ -6394,9 +6394,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -6406,28 +6406,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/escalade": { @@ -10796,9 +10797,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.20.0.tgz", - "integrity": "sha512-q7AY7vMjKYqDCeoedgUiAgrLabliXxndJuuFmcmc2+YU1SblvnOiG2WEACF2lwAZsMlfLpiAilA3L+TWlDqIsQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz", + "integrity": "sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==", "dev": true, "dependencies": { "orderedmap": "^2.0.0" @@ -10880,12 +10881,12 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz", - "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz", + "integrity": "sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==", "dev": true, "dependencies": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { @@ -11193,9 +11194,9 @@ } }, "node_modules/rollup": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.11.0.tgz", - "integrity": "sha512-2xIbaXDXjf3u2tajvA5xROpib7eegJ9Y/uPlSFhXLNpK9ampCczXAhLEb5yLzJyG3LAdI1NWtNjDXiLyniNdjQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -11208,19 +11209,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.11.0", - "@rollup/rollup-android-arm64": "4.11.0", - "@rollup/rollup-darwin-arm64": "4.11.0", - "@rollup/rollup-darwin-x64": "4.11.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.11.0", - "@rollup/rollup-linux-arm64-gnu": "4.11.0", - "@rollup/rollup-linux-arm64-musl": "4.11.0", - "@rollup/rollup-linux-riscv64-gnu": "4.11.0", - "@rollup/rollup-linux-x64-gnu": "4.11.0", - "@rollup/rollup-linux-x64-musl": "4.11.0", - "@rollup/rollup-win32-arm64-msvc": "4.11.0", - "@rollup/rollup-win32-ia32-msvc": "4.11.0", - "@rollup/rollup-win32-x64-msvc": "4.11.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.2" } }, @@ -11550,13 +11554,13 @@ } }, "node_modules/solid-js": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.15.tgz", - "integrity": "sha512-d0QP/efr3UVcwGgWVPveQQ0IHOH6iU7yUhc2piy8arNG8wxKmvUy1kFxyF8owpmfCWGB87usDKMaVnsNYZm+Vw==", + "version": "1.8.17", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.17.tgz", + "integrity": "sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==", "dev": true, "dependencies": { "csstype": "^3.1.0", - "seroval": "^1.0.3", + "seroval": "^1.0.4", "seroval-plugins": "^1.0.3" } }, @@ -12495,23 +12499,23 @@ } }, "node_modules/vike": { - "version": "0.4.148", - "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.148.tgz", - "integrity": "sha512-2KkrY6zB+fTVwQzzcr5zAxpIT2buezDcUP5u4oFzDdxhqcV7r5CGq2PWQ3/ALA8jP/Agz0ZdiMbXUNGJFI+uVw==", + "version": "0.4.171", + "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.171.tgz", + "integrity": "sha512-B14tkH5AFFSxL/hdkPOREER8gJYvyInubKPNqwFkOCU7vZZxA02N82pSig7ultP9WIFKUmIhU8rV6UKGXFA1LA==", "dev": true, "dependencies": { - "@brillout/import": "0.2.3", + "@brillout/import": "^0.2.3", "@brillout/json-serializer": "^0.5.8", "@brillout/picocolors": "^1.0.10", "@brillout/require-shim": "^0.1.2", - "@brillout/vite-plugin-import-build": "^0.2.20", - "acorn": "^8.8.2", - "cac": "^6.7.14", - "es-module-lexer": "^1.3.0", - "esbuild": "^0.17.18", - "fast-glob": "^3.2.12", - "sirv": "^2.0.2", - "source-map-support": "^0.5.21" + "@brillout/vite-plugin-server-entry": "^0.4.5", + "acorn": "^8.0.0", + "cac": "^6.0.0", + "es-module-lexer": "^1.0.0", + "esbuild": "^0.19.0", + "fast-glob": "^3.0.0", + "sirv": "^2.0.0", + "source-map-support": "^0.5.0" }, "bin": { "vike": "node/cli/bin-entry.js" @@ -12521,7 +12525,7 @@ }, "peerDependencies": { "react-streaming": ">=0.3.5", - "vite": ">=3.1.0" + "vite": ">=4.4.0" }, "peerDependenciesMeta": { "react-streaming": { @@ -12530,9 +12534,9 @@ } }, "node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "dependencies": { "esbuild": "^0.20.1", @@ -12660,6 +12664,22 @@ } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/@esbuild/android-arm": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", @@ -13012,175 +13032,6 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", - "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", - "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", - "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", - "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", - "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", - "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", - "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", - "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", - "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", - "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", - "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/vite/node_modules/esbuild": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", @@ -13233,41 +13084,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/vite/node_modules/rollup": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", - "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@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.2" - } - }, "node_modules/vitefu": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", diff --git a/package.json b/package.json index cdc77a02..a37a5f78 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "@solid-primitives/pagination": "0.2.10", "@solid-primitives/share": "2.0.4", "@solid-primitives/storage": "^3.5.0", - "@solid-primitives/upload": "0.0.110", - "@solidjs/meta": "0.29.1", + "@solid-primitives/upload": "0.0.115", + "@solidjs/meta": "0.29.3", "@thisbeyond/solid-select": "0.14.0", "@tiptap/core": "2.2.3", "@tiptap/extension-blockquote": "2.2.3", @@ -113,9 +113,9 @@ "prosemirror-history": "1.3.2", "prosemirror-trailing-node": "2.0.7", "prosemirror-view": "1.32.7", - "rollup": "4.11.0", + "rollup": "4.17.2", "sass": "1.69.5", - "solid-js": "1.8.15", + "solid-js": "1.8.17", "solid-popper": "0.3.0", "solid-tiptap": "0.7.0", "solid-transition-group": "0.2.3", @@ -128,8 +128,8 @@ "typescript": "5.2.2", "typograf": "7.3.0", "uniqolor": "1.1.0", - "vike": "0.4.148", - "vite": "5.2.10", + "vike": "0.4.171", + "vite": "5.2.11", "vite-plugin-mkcert": "^1.17.3", "vite-plugin-node-polyfills": "0.21.0", "vite-plugin-sass-dts": "^1.3.17", From e1a69d97c2c9f2f7eb6a6a5c25f70684c71b1e16 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 16:16:43 +0300 Subject: [PATCH 09/16] vike-downgrade --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a37a5f78..f58b980a 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "typescript": "5.2.2", "typograf": "7.3.0", "uniqolor": "1.1.0", - "vike": "0.4.171", + "vike": "0.4.148", "vite": "5.2.11", "vite-plugin-mkcert": "^1.17.3", "vite-plugin-node-polyfills": "0.21.0", From f6043ad223ee985bc9aff495f5f14af0aae647d8 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 16:47:03 +0300 Subject: [PATCH 10/16] lock-fix --- package-lock.json | 235 +++++++++++++++++++++------------------------- 1 file changed, 109 insertions(+), 126 deletions(-) diff --git a/package-lock.json b/package-lock.json index 276ea8bd..143cad9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,7 +110,7 @@ "typescript": "5.2.2", "typograf": "7.3.0", "uniqolor": "1.1.0", - "vike": "0.4.171", + "vike": "0.4.148", "vite": "5.2.11", "vite-plugin-mkcert": "^1.17.3", "vite-plugin-node-polyfills": "0.21.0", @@ -1382,10 +1382,10 @@ "integrity": "sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==", "dev": true }, - "node_modules/@brillout/vite-plugin-server-entry": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-server-entry/-/vite-plugin-server-entry-0.4.6.tgz", - "integrity": "sha512-VmnbkEVNY9pGnr2ICu+5lFnT3Zz4oblWxKZ1D4kutkzljxDOOBld8oWQI1RVup7c5OiG7XOHFJYYZS38BAXiLw==", + "node_modules/@brillout/vite-plugin-import-build": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.22.tgz", + "integrity": "sha512-n5sv0HdCB5WC2QJSnTN6iS/F+sJsF0AmtsCCaQ+5+dRjgsoGGsa3auinJV8tuEog5WsX+3MF8RIwn3A/u0e04w==", "dev": true, "dependencies": { "@brillout/import": "^0.2.3" @@ -1487,26 +1487,10 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "cpu": [ "arm" ], @@ -1520,9 +1504,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ "arm64" ], @@ -1536,9 +1520,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], @@ -1552,9 +1536,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "cpu": [ "arm64" ], @@ -1568,9 +1552,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -1584,9 +1568,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "cpu": [ "arm64" ], @@ -1600,9 +1584,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "cpu": [ "x64" ], @@ -1616,9 +1600,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "cpu": [ "arm" ], @@ -1632,9 +1616,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "cpu": [ "arm64" ], @@ -1648,9 +1632,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "cpu": [ "ia32" ], @@ -1664,9 +1648,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -1680,9 +1664,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "cpu": [ "mips64el" ], @@ -1696,9 +1680,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "cpu": [ "ppc64" ], @@ -1712,9 +1696,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "cpu": [ "riscv64" ], @@ -1728,9 +1712,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "cpu": [ "s390x" ], @@ -1744,9 +1728,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ "x64" ], @@ -1760,9 +1744,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "cpu": [ "x64" ], @@ -1776,9 +1760,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "cpu": [ "x64" ], @@ -1792,9 +1776,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "cpu": [ "x64" ], @@ -1808,9 +1792,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "cpu": [ "arm64" ], @@ -1824,9 +1808,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "cpu": [ "ia32" ], @@ -1840,9 +1824,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "cpu": [ "x64" ], @@ -6394,9 +6378,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -6406,29 +6390,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/escalade": { @@ -12499,23 +12482,23 @@ } }, "node_modules/vike": { - "version": "0.4.171", - "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.171.tgz", - "integrity": "sha512-B14tkH5AFFSxL/hdkPOREER8gJYvyInubKPNqwFkOCU7vZZxA02N82pSig7ultP9WIFKUmIhU8rV6UKGXFA1LA==", + "version": "0.4.148", + "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.148.tgz", + "integrity": "sha512-2KkrY6zB+fTVwQzzcr5zAxpIT2buezDcUP5u4oFzDdxhqcV7r5CGq2PWQ3/ALA8jP/Agz0ZdiMbXUNGJFI+uVw==", "dev": true, "dependencies": { - "@brillout/import": "^0.2.3", + "@brillout/import": "0.2.3", "@brillout/json-serializer": "^0.5.8", "@brillout/picocolors": "^1.0.10", "@brillout/require-shim": "^0.1.2", - "@brillout/vite-plugin-server-entry": "^0.4.5", - "acorn": "^8.0.0", - "cac": "^6.0.0", - "es-module-lexer": "^1.0.0", - "esbuild": "^0.19.0", - "fast-glob": "^3.0.0", - "sirv": "^2.0.0", - "source-map-support": "^0.5.0" + "@brillout/vite-plugin-import-build": "^0.2.20", + "acorn": "^8.8.2", + "cac": "^6.7.14", + "es-module-lexer": "^1.3.0", + "esbuild": "^0.17.18", + "fast-glob": "^3.2.12", + "sirv": "^2.0.2", + "source-map-support": "^0.5.21" }, "bin": { "vike": "node/cli/bin-entry.js" @@ -12525,7 +12508,7 @@ }, "peerDependencies": { "react-streaming": ">=0.3.5", - "vite": ">=4.4.0" + "vite": ">=3.1.0" }, "peerDependenciesMeta": { "react-streaming": { From f992cf93778663fdb036898eefa0cb72bcb876c8 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 18:05:22 +0300 Subject: [PATCH 11/16] my-meta --- package-lock.json | 10 -- package.json | 1 - src/components/App.tsx | 2 +- src/components/Article/FullArticle.tsx | 2 +- .../Views/AllAuthors/AllAuthors.tsx | 2 +- src/components/Views/AllTopics/AllTopics.tsx | 2 +- src/components/Views/Author/Author.tsx | 2 +- src/components/Views/Feed/Feed.tsx | 2 +- src/components/Views/Topic.tsx | 2 +- src/components/_shared/Image/Image.tsx | 2 +- src/components/_shared/PageLayout.tsx | 2 +- src/context/meta.tsx | 139 ++++++++++++++++++ src/pages/about/discussionRules.page.tsx | 2 +- src/pages/about/dogma.page.tsx | 2 +- src/pages/about/guide.page.tsx | 2 +- src/pages/about/help.page.tsx | 2 +- src/pages/about/manifest.page.tsx | 2 +- src/pages/about/partners.page.tsx | 2 +- src/pages/about/principles.page.tsx | 2 +- src/pages/about/termsOfUse.page.tsx | 2 +- src/pages/about/thanks.page.tsx | 2 +- src/pages/create.page.tsx | 2 +- 22 files changed, 158 insertions(+), 30 deletions(-) create mode 100644 src/context/meta.tsx diff --git a/package-lock.json b/package-lock.json index 143cad9b..bf39951b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,6 @@ "@solid-primitives/share": "2.0.4", "@solid-primitives/storage": "^3.5.0", "@solid-primitives/upload": "0.0.115", - "@solidjs/meta": "0.29.3", "@thisbeyond/solid-select": "0.14.0", "@tiptap/core": "2.2.3", "@tiptap/extension-blockquote": "2.2.3", @@ -4106,15 +4105,6 @@ "solid-js": "^1.6.12" } }, - "node_modules/@solidjs/meta": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/@solidjs/meta/-/meta-0.29.3.tgz", - "integrity": "sha512-R2uirgjgyh3FPFh+rb840plF701N6GvM5w81/QeI61QwjXb4QzLkyI/uzXfC5UW8favpUn9KK9ILQeoTl6pX0A==", - "dev": true, - "peerDependencies": { - "solid-js": ">=1.8.4" - } - }, "node_modules/@thisbeyond/solid-select": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.14.0.tgz", diff --git a/package.json b/package.json index f58b980a..707221bc 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "@solid-primitives/share": "2.0.4", "@solid-primitives/storage": "^3.5.0", "@solid-primitives/upload": "0.0.115", - "@solidjs/meta": "0.29.3", "@thisbeyond/solid-select": "0.14.0", "@tiptap/core": "2.2.3", "@tiptap/extension-blockquote": "2.2.3", diff --git a/src/components/App.tsx b/src/components/App.tsx index f8f9a6c5..55a56f81 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1,6 +1,6 @@ import type { PageProps, RootSearchParams } from '../pages/types' -import { Meta, MetaProvider } from '@solidjs/meta' +import { Meta, MetaProvider } from '../context/meta' import { Component, createEffect, createMemo } from 'solid-js' import { Dynamic } from 'solid-js/web' diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index 94f4eff9..78bcca55 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -2,7 +2,7 @@ import type { Author, Shout, Topic } from '../../graphql/schema/core.gen' import { getPagePath } from '@nanostores/router' import { createPopper } from '@popperjs/core' -import { Link, Meta } from '@solidjs/meta' +import { Link, Meta } from '../../context/meta' import { clsx } from 'clsx' import { install } from 'ga-gtag' import { For, Show, createEffect, createMemo, createSignal, on, onCleanup, onMount } from 'solid-js' diff --git a/src/components/Views/AllAuthors/AllAuthors.tsx b/src/components/Views/AllAuthors/AllAuthors.tsx index 5464891d..c3027d2c 100644 --- a/src/components/Views/AllAuthors/AllAuthors.tsx +++ b/src/components/Views/AllAuthors/AllAuthors.tsx @@ -1,6 +1,6 @@ import type { Author } from '../../../graphql/schema/core.gen' -import { Meta } from '@solidjs/meta' +import { Meta } from '../../../context/meta' import { clsx } from 'clsx' import { For, Show, createMemo, createSignal } from 'solid-js' diff --git a/src/components/Views/AllTopics/AllTopics.tsx b/src/components/Views/AllTopics/AllTopics.tsx index ae76c775..ecf35fd3 100644 --- a/src/components/Views/AllTopics/AllTopics.tsx +++ b/src/components/Views/AllTopics/AllTopics.tsx @@ -1,6 +1,6 @@ import type { Topic } from '../../../graphql/schema/core.gen' -import { Meta } from '@solidjs/meta' +import { Meta } from '../../../context/meta' import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' import { useLocalize } from '../../../context/localize' diff --git a/src/components/Views/Author/Author.tsx b/src/components/Views/Author/Author.tsx index ff307500..8bc68e37 100644 --- a/src/components/Views/Author/Author.tsx +++ b/src/components/Views/Author/Author.tsx @@ -1,7 +1,7 @@ import type { Author, Reaction, Shout, Topic } from '../../../graphql/schema/core.gen' import { getPagePath } from '@nanostores/router' -import { Meta, Title } from '@solidjs/meta' +import { Meta, Title } from '../../../context/meta' import { clsx } from 'clsx' import { For, Match, Show, Switch, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' diff --git a/src/components/Views/Feed/Feed.tsx b/src/components/Views/Feed/Feed.tsx index 283ebb72..f73fdf46 100644 --- a/src/components/Views/Feed/Feed.tsx +++ b/src/components/Views/Feed/Feed.tsx @@ -1,5 +1,5 @@ import { getPagePath } from '@nanostores/router' -import { Meta } from '@solidjs/meta' +import { Meta } from '../../../context/meta' import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' diff --git a/src/components/Views/Topic.tsx b/src/components/Views/Topic.tsx index 1a295bcb..76fcb30f 100644 --- a/src/components/Views/Topic.tsx +++ b/src/components/Views/Topic.tsx @@ -1,6 +1,6 @@ import { LoadShoutsOptions, Shout, Topic } from '../../graphql/schema/core.gen' -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' diff --git a/src/components/_shared/Image/Image.tsx b/src/components/_shared/Image/Image.tsx index 413f66c8..6b4d8346 100644 --- a/src/components/_shared/Image/Image.tsx +++ b/src/components/_shared/Image/Image.tsx @@ -1,6 +1,6 @@ import type { JSX } from 'solid-js' -import { Link } from '@solidjs/meta' +import { Link } from '../../../context/meta' import { splitProps } from 'solid-js' import { getImageUrl } from '../../../utils/getImageUrl' diff --git a/src/components/_shared/PageLayout.tsx b/src/components/_shared/PageLayout.tsx index 1cd7abc9..71692348 100644 --- a/src/components/_shared/PageLayout.tsx +++ b/src/components/_shared/PageLayout.tsx @@ -1,6 +1,6 @@ import type { JSX } from 'solid-js' -import { Title } from '@solidjs/meta' +import { Title } from '../../context/meta' import { clsx } from 'clsx' import { Show, createEffect, createSignal } from 'solid-js' diff --git a/src/context/meta.tsx b/src/context/meta.tsx new file mode 100644 index 00000000..fdea7dca --- /dev/null +++ b/src/context/meta.tsx @@ -0,0 +1,139 @@ +import { + Component, + createContext, + createRenderEffect, + createSignal, + JSX, + onCleanup, + ParentComponent, + useContext, +} from 'solid-js' +import { isServer, spread } from 'solid-js/web' + +export const MetaContext = createContext() + +interface TagDescription { + tag: string + props: Record + cleanup?: () => void +} + +export interface MetaContextType { + addTag: (tag: TagDescription) => void + removeTag: (tag: TagDescription) => void +} + +function initClientProvider() { + const tags = new Map() + + function addTag(tag: TagDescription) { + const key = getTagKey(tag) + tags.set(key, tag) + + const el = document.createElement(tag.tag) + spread(el, tag.props) + document.head.appendChild(el) + + tag.cleanup = () => { + document.head.removeChild(el) + tags.delete(key) + } + } + + function removeTag(tag: TagDescription) { + const key = getTagKey(tag) + const existingTag = tags.get(key) + if (existingTag) { + if (existingTag.cleanup) existingTag.cleanup() + tags.delete(key) + } + } + + return { addTag, removeTag } +} + +function initServerProvider() { + const tags: TagDescription[] = [] + + function addTag(tagDesc: TagDescription) { + tags.push(tagDesc) + } + + function removeTag(tag: TagDescription) { + const index = tags.findIndex((t) => getTagKey(t) === getTagKey(tag)) + if (index !== -1) { + tags.splice(index, 1) + } + } + + return { addTag, removeTag } +} + +export const MetaProvider: ParentComponent = (props) => { + const actions = isServer ? initServerProvider() : initClientProvider() + const [tags, setTags] = createSignal([]) + + const addTag = (tag: TagDescription) => { + actions.addTag(tag) + setTags([...tags(), tag]) + } + + const removeTag = (tag: TagDescription) => { + actions.removeTag(tag) + setTags(tags().filter((t) => getTagKey(t) !== getTagKey(tag))) + } + + onCleanup(() => { + for (const tag of tags()) { + tag.cleanup?.() + } + }) + + return {props.children} +} + +const getTagKey = (tag: TagDescription) => { + const props = Object.entries(tag.props) + .filter(([k]) => k !== 'children') + .sort() + + return `${tag.tag}${JSON.stringify(props)}` +} + +export function useHead(tagDesc: TagDescription) { + const c = useContext(MetaContext) + if (!c) throw new Error(' should be in the tree') + + createRenderEffect(() => { + c.addTag(tagDesc) + + return () => { + c.removeTag(tagDesc) + } + }) +} + +const MetaTag = (tag: string, props: Record) => { + useHead({ tag, props }) + + return null +} + +export const Title: Component> = (props) => + MetaTag('title', props as Record) + +export const Style: Component> = (props) => + MetaTag('style', props as Record) + +export const Meta: Component> = (props) => + MetaTag('meta', props as Record) + +export const Link: Component> = (props) => + MetaTag('link', props as Record) + +export const Base: Component> = (props) => + MetaTag('base', props as Record) + +export const Stylesheet: Component, 'rel'>> = (props) => ( + +) diff --git a/src/pages/about/discussionRules.page.tsx b/src/pages/about/discussionRules.page.tsx index f6b2019b..917beb61 100644 --- a/src/pages/about/discussionRules.page.tsx +++ b/src/pages/about/discussionRules.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/about/dogma.page.tsx b/src/pages/about/dogma.page.tsx index 8fa5130b..ada689a5 100644 --- a/src/pages/about/dogma.page.tsx +++ b/src/pages/about/dogma.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/about/guide.page.tsx b/src/pages/about/guide.page.tsx index 95e34f5f..c2cba232 100644 --- a/src/pages/about/guide.page.tsx +++ b/src/pages/about/guide.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/about/help.page.tsx b/src/pages/about/help.page.tsx index 5a0733f3..18a5a642 100644 --- a/src/pages/about/help.page.tsx +++ b/src/pages/about/help.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { Donate } from '../../components/Discours/Donate' import { StaticPage } from '../../components/Views/StaticPage' diff --git a/src/pages/about/manifest.page.tsx b/src/pages/about/manifest.page.tsx index fdcbd20d..7599bdce 100644 --- a/src/pages/about/manifest.page.tsx +++ b/src/pages/about/manifest.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { Feedback } from '../../components/Discours/Feedback' import { Modal } from '../../components/Nav/Modal' diff --git a/src/pages/about/partners.page.tsx b/src/pages/about/partners.page.tsx index 64038137..7277cbb3 100644 --- a/src/pages/about/partners.page.tsx +++ b/src/pages/about/partners.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/about/principles.page.tsx b/src/pages/about/principles.page.tsx index a5f102ea..d8b10b63 100644 --- a/src/pages/about/principles.page.tsx +++ b/src/pages/about/principles.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/about/termsOfUse.page.tsx b/src/pages/about/termsOfUse.page.tsx index 7811ed96..a5082158 100644 --- a/src/pages/about/termsOfUse.page.tsx +++ b/src/pages/about/termsOfUse.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/about/thanks.page.tsx b/src/pages/about/thanks.page.tsx index 0fccade7..4336174d 100644 --- a/src/pages/about/thanks.page.tsx +++ b/src/pages/about/thanks.page.tsx @@ -1,4 +1,4 @@ -import { Meta } from '@solidjs/meta' +import { Meta } from '../../context/meta' import { StaticPage } from '../../components/Views/StaticPage' import { useLocalize } from '../../context/localize' diff --git a/src/pages/create.page.tsx b/src/pages/create.page.tsx index ea5c27f2..65ebe26d 100644 --- a/src/pages/create.page.tsx +++ b/src/pages/create.page.tsx @@ -1,5 +1,5 @@ import { redirectPage } from '@nanostores/router' -import { Meta } from '@solidjs/meta' +import { Meta } from '../context/meta' import { clsx } from 'clsx' import { AuthGuard } from '../components/AuthGuard' From ec0c2cf1362d7b1353f5c07800ff9fc96427d8c0 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 18:17:31 +0300 Subject: [PATCH 12/16] isorted-fmt --- biome.json | 37 +++---------------- package.json | 6 +-- src/components/App.tsx | 2 +- src/components/Article/FullArticle.tsx | 2 +- .../Views/AllAuthors/AllAuthors.tsx | 2 +- src/components/Views/AllTopics/AllTopics.tsx | 2 +- src/components/Views/Author/Author.tsx | 2 +- src/components/Views/Feed/Feed.tsx | 2 +- src/components/Views/Topic.tsx | 2 +- src/components/_shared/Image/Image.tsx | 2 +- src/components/_shared/PageLayout.tsx | 2 +- src/context/meta.tsx | 4 +- src/pages/create.page.tsx | 2 +- vite.config.ts | 2 +- 14 files changed, 21 insertions(+), 48 deletions(-) diff --git a/biome.json b/biome.json index 30d953a8..7b211ccc 100644 --- a/biome.json +++ b/biome.json @@ -1,21 +1,8 @@ { "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", "files": { - "include": [ - "*.tsx", - "*.ts", - "*.js", - "*.json" - ], - "ignore": [ - "./dist", - "./node_modules", - ".husky", - "docs", - "gen", - "*.gen.ts", - "*.d.ts" - ] + "include": ["*.tsx", "*.ts", "*.js", "*.json"], + "ignore": ["./dist", "./node_modules", ".husky", "docs", "gen", "*.gen.ts", "*.d.ts"] }, "vcs": { "defaultBranch": "dev", @@ -23,19 +10,13 @@ }, "organizeImports": { "enabled": true, - "ignore": [ - "./api", - "./gen" - ] + "ignore": ["./api", "./gen"] }, "formatter": { "indentStyle": "space", "indentWidth": 2, "lineWidth": 108, - "ignore": [ - "./src/graphql/schema", - "./gen" - ] + "ignore": ["./src/graphql/schema", "./gen"] }, "javascript": { "formatter": { @@ -48,13 +29,7 @@ } }, "linter": { - "ignore": [ - "*.scss", - "*.md", - ".DS_Store", - "*.svg", - "*.d.ts" - ], + "ignore": ["*.scss", "*.md", ".DS_Store", "*.svg", "*.d.ts"], "enabled": true, "rules": { "all": true, @@ -99,4 +74,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 707221bc..289d1149 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "hygen": "HYGEN_TMPLS=gen hygen", "postinstall": "npm run codegen && npx patch-package", "check:code": "npx @biomejs/biome check src --log-kind=compact --verbose", - "check:code:fix": "npx @biomejs/biome lint src --log-kind=compact", + "check:code:fix": "npx @biomejs/biome check . --apply", "lint": "npm run lint:code && stylelint **/*.{scss,css}", "lint:code": "npx @biomejs/biome lint src --log-kind=compact --verbose", "lint:code:fix": "npx @biomejs/biome lint src --apply-unsafe --log-kind=compact --verbose", @@ -140,7 +140,5 @@ "y-prosemirror": "1.2.2", "yjs": "13.6.12" }, - "trustedDependencies": [ - "@biomejs/biome" - ] + "trustedDependencies": ["@biomejs/biome"] } diff --git a/src/components/App.tsx b/src/components/App.tsx index 55a56f81..00b5dfa9 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1,8 +1,8 @@ import type { PageProps, RootSearchParams } from '../pages/types' -import { Meta, MetaProvider } from '../context/meta' import { Component, createEffect, createMemo } from 'solid-js' import { Dynamic } from 'solid-js/web' +import { Meta, MetaProvider } from '../context/meta' import { ConfirmProvider } from '../context/confirm' import { ConnectProvider } from '../context/connect' diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index 78bcca55..eb10ea09 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -2,11 +2,11 @@ import type { Author, Shout, Topic } from '../../graphql/schema/core.gen' import { getPagePath } from '@nanostores/router' import { createPopper } from '@popperjs/core' -import { Link, Meta } from '../../context/meta' import { clsx } from 'clsx' import { install } from 'ga-gtag' import { For, Show, createEffect, createMemo, createSignal, on, onCleanup, onMount } from 'solid-js' import { isServer } from 'solid-js/web' +import { Link, Meta } from '../../context/meta' import { useLocalize } from '../../context/localize' import { useReactions } from '../../context/reactions' diff --git a/src/components/Views/AllAuthors/AllAuthors.tsx b/src/components/Views/AllAuthors/AllAuthors.tsx index c3027d2c..38d1742a 100644 --- a/src/components/Views/AllAuthors/AllAuthors.tsx +++ b/src/components/Views/AllAuthors/AllAuthors.tsx @@ -1,8 +1,8 @@ import type { Author } from '../../../graphql/schema/core.gen' -import { Meta } from '../../../context/meta' import { clsx } from 'clsx' import { For, Show, createMemo, createSignal } from 'solid-js' +import { Meta } from '../../../context/meta' import { useLocalize } from '../../../context/localize' import { useRouter } from '../../../stores/router' diff --git a/src/components/Views/AllTopics/AllTopics.tsx b/src/components/Views/AllTopics/AllTopics.tsx index ecf35fd3..26dfe848 100644 --- a/src/components/Views/AllTopics/AllTopics.tsx +++ b/src/components/Views/AllTopics/AllTopics.tsx @@ -1,9 +1,9 @@ import type { Topic } from '../../../graphql/schema/core.gen' -import { Meta } from '../../../context/meta' import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' import { useLocalize } from '../../../context/localize' +import { Meta } from '../../../context/meta' import { useTopics } from '../../../context/topics' import { useRouter } from '../../../stores/router' import { capitalize } from '../../../utils/capitalize' diff --git a/src/components/Views/Author/Author.tsx b/src/components/Views/Author/Author.tsx index 8bc68e37..79140961 100644 --- a/src/components/Views/Author/Author.tsx +++ b/src/components/Views/Author/Author.tsx @@ -1,9 +1,9 @@ import type { Author, Reaction, Shout, Topic } from '../../../graphql/schema/core.gen' import { getPagePath } from '@nanostores/router' -import { Meta, Title } from '../../../context/meta' import { clsx } from 'clsx' import { For, Match, Show, Switch, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' +import { Meta, Title } from '../../../context/meta' import { useFollowing } from '../../../context/following' import { useLocalize } from '../../../context/localize' diff --git a/src/components/Views/Feed/Feed.tsx b/src/components/Views/Feed/Feed.tsx index f73fdf46..b2fc5dfe 100644 --- a/src/components/Views/Feed/Feed.tsx +++ b/src/components/Views/Feed/Feed.tsx @@ -1,9 +1,9 @@ import { getPagePath } from '@nanostores/router' -import { Meta } from '../../../context/meta' import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' import { useLocalize } from '../../../context/localize' +import { Meta } from '../../../context/meta' import { useReactions } from '../../../context/reactions' import { useSession } from '../../../context/session' import { useTopics } from '../../../context/topics' diff --git a/src/components/Views/Topic.tsx b/src/components/Views/Topic.tsx index 76fcb30f..d788d1f6 100644 --- a/src/components/Views/Topic.tsx +++ b/src/components/Views/Topic.tsx @@ -1,8 +1,8 @@ import { LoadShoutsOptions, Shout, Topic } from '../../graphql/schema/core.gen' -import { Meta } from '../../context/meta' import { clsx } from 'clsx' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' +import { Meta } from '../../context/meta' import { useLocalize } from '../../context/localize' import { useTopics } from '../../context/topics' diff --git a/src/components/_shared/Image/Image.tsx b/src/components/_shared/Image/Image.tsx index 6b4d8346..bfb5a6d3 100644 --- a/src/components/_shared/Image/Image.tsx +++ b/src/components/_shared/Image/Image.tsx @@ -1,7 +1,7 @@ import type { JSX } from 'solid-js' -import { Link } from '../../../context/meta' import { splitProps } from 'solid-js' +import { Link } from '../../../context/meta' import { getImageUrl } from '../../../utils/getImageUrl' diff --git a/src/components/_shared/PageLayout.tsx b/src/components/_shared/PageLayout.tsx index 71692348..de35813e 100644 --- a/src/components/_shared/PageLayout.tsx +++ b/src/components/_shared/PageLayout.tsx @@ -1,8 +1,8 @@ import type { JSX } from 'solid-js' -import { Title } from '../../context/meta' import { clsx } from 'clsx' import { Show, createEffect, createSignal } from 'solid-js' +import { Title } from '../../context/meta' import { Footer } from '../Discours/Footer' import { Header } from '../Nav/Header' diff --git a/src/context/meta.tsx b/src/context/meta.tsx index fdea7dca..c09f0dbd 100644 --- a/src/context/meta.tsx +++ b/src/context/meta.tsx @@ -1,11 +1,11 @@ import { Component, + JSX, + ParentComponent, createContext, createRenderEffect, createSignal, - JSX, onCleanup, - ParentComponent, useContext, } from 'solid-js' import { isServer, spread } from 'solid-js/web' diff --git a/src/pages/create.page.tsx b/src/pages/create.page.tsx index 65ebe26d..833d328e 100644 --- a/src/pages/create.page.tsx +++ b/src/pages/create.page.tsx @@ -1,6 +1,6 @@ import { redirectPage } from '@nanostores/router' -import { Meta } from '../context/meta' import { clsx } from 'clsx' +import { Meta } from '../context/meta' import { AuthGuard } from '../components/AuthGuard' import { Button } from '../components/_shared/Button' diff --git a/vite.config.ts b/vite.config.ts index 324e5161..f50a5bab 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,7 @@ import ssrPlugin from 'vike/plugin' import { defineConfig } from 'vite' import mkcert from 'vite-plugin-mkcert' -import { nodePolyfills } from 'vite-plugin-node-polyfills'; +import { nodePolyfills } from 'vite-plugin-node-polyfills' import sassDts from 'vite-plugin-sass-dts' import solidPlugin from 'vite-plugin-solid' From 9c1ed4a04b0824e77ffc3e2b9f9439686e6c4b5f Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 18:38:03 +0300 Subject: [PATCH 13/16] orig-meta --- .../Article/AudioPlayer/PlayerPlaylist.tsx | 2 +- src/context/meta.tsx | 292 +++++++++++++----- 2 files changed, 212 insertions(+), 82 deletions(-) diff --git a/src/components/Article/AudioPlayer/PlayerPlaylist.tsx b/src/components/Article/AudioPlayer/PlayerPlaylist.tsx index 81e69d58..4d1ff700 100644 --- a/src/components/Article/AudioPlayer/PlayerPlaylist.tsx +++ b/src/components/Article/AudioPlayer/PlayerPlaylist.tsx @@ -3,7 +3,7 @@ import { For, Show, createSignal, lazy } from 'solid-js' import { useLocalize } from '../../../context/localize' import { MediaItem } from '../../../pages/types' -import { getDescription } from '../../../utils/meta' +import { getDescription } from '../../../utils' import { Icon } from '../../_shared/Icon' import { Popover } from '../../_shared/Popover' import { SharePopup, getShareUrl } from '../SharePopup' diff --git a/src/context/meta.tsx b/src/context/meta.tsx index c09f0dbd..3d36eb06 100644 --- a/src/context/meta.tsx +++ b/src/context/meta.tsx @@ -1,103 +1,219 @@ import { Component, - JSX, - ParentComponent, createContext, createRenderEffect, - createSignal, + createUniqueId, + JSX, onCleanup, + ParentComponent, + sharedConfig, useContext, } from 'solid-js' -import { isServer, spread } from 'solid-js/web' +import { isServer, spread, escape as escapeMeta, useAssets, ssr } from 'solid-js/web' export const MetaContext = createContext() interface TagDescription { tag: string - props: Record - cleanup?: () => void + props: Record + setting?: { close?: boolean; escape?: boolean } + id: string + name?: string + ref?: Element } export interface MetaContextType { - addTag: (tag: TagDescription) => void - removeTag: (tag: TagDescription) => void + addTag: (tag: TagDescription) => number + removeTag: (tag: TagDescription, index: number) => void +} + +const cascadingTags = ['title', 'meta'] + +// https://html.spec.whatwg.org/multipage/semantics.html#the-title-element +const titleTagProperties: string[] = [] + +const metaTagProperties: string[] = + // https://html.spec.whatwg.org/multipage/semantics.html#the-meta-element + ['name', 'http-equiv', 'content', 'charset', 'media'] + // additional properties + .concat(['property']) + +const getTagKey = (tag: TagDescription, properties: string[]) => { + // pick allowed properties and sort them + const tagProps = Object.fromEntries( + Object.entries(tag.props) + .filter(([k]) => properties.includes(k)) + .sort(), + ) + + // treat `property` as `name` for meta tags + if (Object.hasOwn(tagProps, 'name') || Object.hasOwn(tagProps, 'property')) { + tagProps.name = tagProps.name || tagProps.property + tagProps.property = undefined + } + + // concat tag name and properties as unique key for this tag + return tag.tag + JSON.stringify(tagProps) } function initClientProvider() { - const tags = new Map() - - function addTag(tag: TagDescription) { - const key = getTagKey(tag) - tags.set(key, tag) - - const el = document.createElement(tag.tag) - spread(el, tag.props) - document.head.appendChild(el) - - tag.cleanup = () => { - document.head.removeChild(el) - tags.delete(key) - } + if (!sharedConfig.context) { + const ssrTags = document.head.querySelectorAll('[data-sm]') + // `forEach` on `NodeList` is not supported in Googlebot, so use a workaround + Array.prototype.forEach.call(ssrTags, (ssrTag: Node) => ssrTag.parentNode?.removeChild(ssrTag)) } - function removeTag(tag: TagDescription) { - const key = getTagKey(tag) - const existingTag = tags.get(key) - if (existingTag) { - if (existingTag.cleanup) existingTag.cleanup() - tags.delete(key) + const cascadedTagInstances = new Map() + // TODO: use one element for all tags of the same type, just swap out + // where the props get applied + function getElement(tag: TagDescription) { + if (tag.ref) { + return tag.ref } + let el = document.querySelector(`[data-sm="${tag.id}"]`) + if (el) { + if (el.tagName.toLowerCase() !== tag.tag) { + if (el.parentNode) { + // remove the old tag + el.parentNode.removeChild(el) + } + // add the new tag + el = document.createElement(tag.tag) + } + // use the old tag + el.removeAttribute('data-sm') + } else { + // create a new tag + el = document.createElement(tag.tag) + } + return el } - return { addTag, removeTag } + return { + addTag(tag: TagDescription) { + if (cascadingTags.indexOf(tag.tag) !== -1) { + const properties = tag.tag === 'title' ? titleTagProperties : metaTagProperties + const tagKey = getTagKey(tag, properties) + + // only cascading tags need to be kept as singletons + if (!cascadedTagInstances.has(tagKey)) { + cascadedTagInstances.set(tagKey, []) + } + + let instances = cascadedTagInstances.get(tagKey) + const index = instances.length + + instances = [...instances, tag] + + // track indices synchronously + cascadedTagInstances.set(tagKey, instances) + + const element = getElement(tag) + tag.ref = element + + spread(element, tag.props) + + let lastVisited = null + for (let i = index - 1; i >= 0; i--) { + if (instances[i] != null) { + lastVisited = instances[i] + break + } + } + + if (element.parentNode !== document.head) { + document.head.appendChild(element) + } + if (lastVisited?.ref?.parentNode) { + document.head?.removeChild(lastVisited.ref) + } + + return index + } + + const element = getElement(tag) + tag.ref = element + + spread(element, tag.props) + + if (element.parentNode !== document.head) { + document.head.appendChild(element) + } + + return -1 + }, + removeTag(tag: TagDescription, index: number) { + const properties = tag.tag === 'title' ? titleTagProperties : metaTagProperties + const tagKey = getTagKey(tag, properties) + + if (tag.ref) { + const t = cascadedTagInstances.get(tagKey) + if (t) { + if (tag.ref.parentNode) { + tag.ref.parentNode.removeChild(tag.ref) + for (let i = index - 1; i >= 0; i--) { + if (t[i] != null) { + document.head.appendChild(t[i].ref) + } + } + } + + t[index] = null + cascadedTagInstances.set(tagKey, t) + } else if (tag.ref.parentNode) { + tag.ref.parentNode.removeChild(tag.ref) + } + } + }, + } } function initServerProvider() { const tags: TagDescription[] = [] + useAssets(() => ssr(renderTags(tags)) as string) - function addTag(tagDesc: TagDescription) { - tags.push(tagDesc) + return { + addTag(tagDesc: TagDescription) { + // tweak only cascading tags + if (cascadingTags.indexOf(tagDesc.tag) !== -1) { + const properties = tagDesc.tag === 'title' ? titleTagProperties : metaTagProperties + const tagDescKey = getTagKey(tagDesc, properties) + const index = tags.findIndex( + (prev) => prev.tag === tagDesc.tag && getTagKey(prev, properties) === tagDescKey, + ) + if (index !== -1) { + tags.splice(index, 1) + } + } + tags.push(tagDesc) + return tags.length + }, + // biome-ignore lint/suspicious/noEmptyBlockStatements: initial value + removeTag(_tag: TagDescription, _index: number) {}, } - - function removeTag(tag: TagDescription) { - const index = tags.findIndex((t) => getTagKey(t) === getTagKey(tag)) - if (index !== -1) { - tags.splice(index, 1) - } - } - - return { addTag, removeTag } } export const MetaProvider: ParentComponent = (props) => { const actions = isServer ? initServerProvider() : initClientProvider() - const [tags, setTags] = createSignal([]) - - const addTag = (tag: TagDescription) => { - actions.addTag(tag) - setTags([...tags(), tag]) - } - - const removeTag = (tag: TagDescription) => { - actions.removeTag(tag) - setTags(tags().filter((t) => getTagKey(t) !== getTagKey(tag))) - } - - onCleanup(() => { - for (const tag of tags()) { - tag.cleanup?.() - } - }) - - return {props.children} + return {props.children} } -const getTagKey = (tag: TagDescription) => { - const props = Object.entries(tag.props) - .filter(([k]) => k !== 'children') - .sort() +const MetaTag = ( + tag: string, + props: { [k: string]: string }, + setting?: { escape?: boolean; close?: boolean }, +) => { + useHead({ + tag, + props, + setting, + id: createUniqueId(), + get name() { + return props.name || props.property + }, + }) - return `${tag.tag}${JSON.stringify(props)}` + return null } export function useHead(tagDesc: TagDescription) { @@ -105,34 +221,48 @@ export function useHead(tagDesc: TagDescription) { if (!c) throw new Error(' should be in the tree') createRenderEffect(() => { - c.addTag(tagDesc) - - return () => { - c.removeTag(tagDesc) - } + const index = c?.addTag(tagDesc) + onCleanup(() => c?.removeTag(tagDesc, index)) }) } -const MetaTag = (tag: string, props: Record) => { - useHead({ tag, props }) - - return null +function renderTags(tags: TagDescription[]) { + return tags + .map((tag) => { + const keys = Object.keys(tag.props) + const props = keys + .map((k) => + k === 'children' + ? '' + : ` ${k}="${ + // @ts-expect-error + escapeMeta(tag.props[k], true) + }"`, + ) + .join('') + const children = tag.props.children + if (tag.setting?.close) { + return `<${tag.tag} data-sm="${tag.id}"${props}>${ + // @ts-expect-error + tag.setting?.escape ? escapeMeta(children) : children || '' + }` + } + return `<${tag.tag} data-sm="${tag.id}"${props}/>` + }) + .join('') } export const Title: Component> = (props) => - MetaTag('title', props as Record) + MetaTag('title', props, { escape: true, close: true }) export const Style: Component> = (props) => - MetaTag('style', props as Record) + MetaTag('style', props, { close: true }) -export const Meta: Component> = (props) => - MetaTag('meta', props as Record) +export const Meta: Component> = (props) => MetaTag('meta', props) -export const Link: Component> = (props) => - MetaTag('link', props as Record) +export const Link: Component> = (props) => MetaTag('link', props) -export const Base: Component> = (props) => - MetaTag('base', props as Record) +export const Base: Component> = (props) => MetaTag('base', props) export const Stylesheet: Component, 'rel'>> = (props) => ( From c52e79faf0aa4fe55ddf5342569a05d4caebfdab Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 18:49:39 +0300 Subject: [PATCH 14/16] import-typo-fix --- src/components/Article/AudioPlayer/PlayerPlaylist.tsx | 2 +- src/utils/meta.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Article/AudioPlayer/PlayerPlaylist.tsx b/src/components/Article/AudioPlayer/PlayerPlaylist.tsx index 4d1ff700..81e69d58 100644 --- a/src/components/Article/AudioPlayer/PlayerPlaylist.tsx +++ b/src/components/Article/AudioPlayer/PlayerPlaylist.tsx @@ -3,7 +3,7 @@ import { For, Show, createSignal, lazy } from 'solid-js' import { useLocalize } from '../../../context/localize' import { MediaItem } from '../../../pages/types' -import { getDescription } from '../../../utils' +import { getDescription } from '../../../utils/meta' import { Icon } from '../../_shared/Icon' import { Popover } from '../../_shared/Popover' import { SharePopup, getShareUrl } from '../SharePopup' diff --git a/src/utils/meta.ts b/src/utils/meta.ts index 10eeb0ee..d436946c 100644 --- a/src/utils/meta.ts +++ b/src/utils/meta.ts @@ -1,6 +1,7 @@ import { Shout } from '../graphql/schema/core.gen' const MAX_DESCRIPTION_LENGTH = 150 + export const getDescription = (body: string): string => { if (!body) { return '' From 0b8ee33ed5cbeba327a9ca40157b11099f140ca2 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 18:56:46 +0300 Subject: [PATCH 15/16] typed --- src/context/meta.tsx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/context/meta.tsx b/src/context/meta.tsx index 3d36eb06..44846a3e 100644 --- a/src/context/meta.tsx +++ b/src/context/meta.tsx @@ -1,15 +1,15 @@ import { Component, + JSX, + ParentComponent, createContext, createRenderEffect, createUniqueId, - JSX, onCleanup, - ParentComponent, sharedConfig, useContext, } from 'solid-js' -import { isServer, spread, escape as escapeMeta, useAssets, ssr } from 'solid-js/web' +import { escape as escapeMeta, isServer, spread, ssr, useAssets } from 'solid-js/web' export const MetaContext = createContext() @@ -253,16 +253,19 @@ function renderTags(tags: TagDescription[]) { } export const Title: Component> = (props) => - MetaTag('title', props, { escape: true, close: true }) + MetaTag('title', props as { [k: string]: string }, { escape: true, close: true }) export const Style: Component> = (props) => - MetaTag('style', props, { close: true }) + MetaTag('style', props as { [k: string]: string }, { close: true }) -export const Meta: Component> = (props) => MetaTag('meta', props) +export const Meta: Component> = (props) => + MetaTag('meta', props as { [k: string]: string }) -export const Link: Component> = (props) => MetaTag('link', props) +export const Link: Component> = (props) => + MetaTag('link', props as { [k: string]: string }) -export const Base: Component> = (props) => MetaTag('base', props) +export const Base: Component> = (props) => + MetaTag('base', props as { [k: string]: string }) export const Stylesheet: Component, 'rel'>> = (props) => ( From 67004a889f7c1482264ebc5fa0557367cab693b6 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 7 May 2024 18:59:49 +0300 Subject: [PATCH 16/16] typed-2 --- src/context/meta.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/context/meta.tsx b/src/context/meta.tsx index 44846a3e..bf2e1a1d 100644 --- a/src/context/meta.tsx +++ b/src/context/meta.tsx @@ -170,7 +170,10 @@ function initClientProvider() { function initServerProvider() { const tags: TagDescription[] = [] - useAssets(() => ssr(renderTags(tags)) as string) + useAssets(() => { + const rendered = renderTags(tags) + return ssr(rendered as string) as unknown as Element + }) return { addTag(tagDesc: TagDescription) { @@ -195,7 +198,7 @@ function initServerProvider() { export const MetaProvider: ParentComponent = (props) => { const actions = isServer ? initServerProvider() : initClientProvider() - return {props.children} + return {props.children} } const MetaTag = (