diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bb1f20029d269b3f4cbea5268f14fb1f7ae570d0..1dea4cef687f4af0cab4c6865f4798cdcbb26915 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -788,7 +788,7 @@ develop:deploy-blog-mainnet: extends: .deploy_template_mainnet needs: - docker-build-blog - - e2e-tests-blog + #- e2e-tests-blog variables: CONTAINER_NAME: denser-dev-blog PORT: 8111 @@ -849,7 +849,7 @@ develop:deploy-blog-mirrornet: extends: .deploy_template_mirrornet needs: - docker-build-blog - - e2e-tests-blog + #- e2e-tests-blog variables: CONTAINER_NAME: denser-dev-blog-mirror PORT: 8211 diff --git a/apps/auth/next.config.js b/apps/auth/next.config.js index b33edf97a0a3eafca7c19121569988894614195e..987b1d874a0937b11594fca955958716cfb324ae 100644 --- a/apps/auth/next.config.js +++ b/apps/auth/next.config.js @@ -50,6 +50,10 @@ const nextConfig = { from: path.join(__dirname, '../../node_modules/@hiveio/hb-auth/dist/worker.js'), to: path.join(__dirname, 'public/auth/') }, + { + from: path.join(__dirname, '../../node_modules/@hiveio/hb-auth/dist/assets'), + to: path.join(__dirname, 'public/auth/assets') + }, { from: path.join(__dirname, './locales'), to: path.join(__dirname, 'public/locales/') diff --git a/apps/auth/package.json b/apps/auth/package.json index 7f6b76eb688ec6424f838ebfb9fa99483a87a34c..b908655cae587d2b9de1a25756a6ea379b711869 100644 --- a/apps/auth/package.json +++ b/apps/auth/package.json @@ -7,12 +7,13 @@ "scripts": { "clean": "rm -rf ./public/auth/* && rm -rf ./public/locales/* && rm -rf ./public/smart-signer/*", "copy:worker": "cp ../../node_modules/@hiveio/hb-auth/dist/worker.js ./public/auth/", + "copy:assets": "cp -r ../../node_modules/@hiveio/hb-auth/dist/assets ./public/auth/assets", "predev": "pnpm run clean", "dev": "react-env -- next dev -p 5000 | pnpm dlx pino-pretty --colorize", "devssl": "react-env -- next dev --port 5000 --experimental-https --experimental-https-key ../../ssl/server-key.pem --experimental-https-cert ../../ssl/server-cert.pem | pnpm dlx pino-pretty --colorize", "prebuild": "pnpm run clean", "build": "react-env -- next build", - "postbuild": "pnpm run copy:worker", + "postbuild": "pnpm run copy:worker && pnpm run copy:assets", "start": "react-env -- next start -p 5000", "lint": "eslint .", "test:jest": "jest --watch" diff --git a/apps/blog/components/ai-search-input.tsx b/apps/blog/components/ai-search-input.tsx new file mode 100644 index 0000000000000000000000000000000000000000..58d384aa0cd94a36110a2565b2fb3ad93fa1f8ad --- /dev/null +++ b/apps/blog/components/ai-search-input.tsx @@ -0,0 +1,33 @@ +import { Input } from '@hive/ui'; +import { Icons } from '@ui/components/icons'; +import { useRouter } from 'next/router'; +import { useState, KeyboardEvent } from 'react'; + +const AISearchInput = () => { + const router = useRouter(); + const query = router.query.q as string; + const [value, setValues] = useState(''); + const handleEnter = (event: KeyboardEvent) => { + if (event.key === 'Enter') { + router.push(`/search?q=${encodeURIComponent(value)}`); + } + }; + + return ( +
+
+ +
+ setValues(e.target.value)} + onKeyDown={(e) => handleEnter(e)} + /> +
+ ); +}; +export default AISearchInput; diff --git a/apps/blog/components/post-img.tsx b/apps/blog/components/post-img.tsx index ccc586f05d61cf38da920f5a769beca2b2e19e9f..1ba100e12f67334b8b17785e9113373d1a128b3a 100644 --- a/apps/blog/components/post-img.tsx +++ b/apps/blog/components/post-img.tsx @@ -5,67 +5,72 @@ import { extractPictureFromPostBody, extractUrlsFromJsonString, extractYouTubeVi import type { Entry } from '@transaction/lib/bridge'; import clsx from 'clsx'; -function find_first_img(post: Entry) { - if ( - post.json_metadata.links && - post.json_metadata.links[0] && - customEndsWith(post.json_metadata.links[0].slice(0, post.json_metadata.links[0].length - 1), [ - 'png', - 'webp', - 'jpeg', - 'jpg' - ]) - ) { - return proxifyImageUrl( - post.json_metadata.links[0].slice(0, post.json_metadata.links[0].length - 1), - true - ); +export function find_first_img(post: Entry) { + try { + if ( + post.json_metadata.links && + post.json_metadata.links[0] && + customEndsWith(post.json_metadata.links[0].slice(0, post.json_metadata.links[0].length - 1), [ + 'png', + 'webp', + 'jpeg', + 'jpg' + ]) + ) { + return proxifyImageUrl( + post.json_metadata.links[0].slice(0, post.json_metadata.links[0].length - 1), + true + ); + } + if (post.original_entry && post.original_entry.json_metadata.images) { + return proxifyImageUrl(post.original_entry.json_metadata.images[0], true); + } + if (post.original_entry && post.original_entry.json_metadata.image) { + return proxifyImageUrl(post.original_entry.json_metadata.image[0], true); + } + if (post.json_metadata.image && post.json_metadata.image[0]) { + return proxifyImageUrl(post.json_metadata.image[0], true); + } + const regex_any_img = /!\[.*?\]\((.*?)\)/; + const match = post.body.match(regex_any_img); + if (match && match[1]) { + return proxifyImageUrl(match[1], true); + } + if (post.json_metadata.images && post.json_metadata.images[0]) { + return proxifyImageUrl(post.json_metadata.images[0], true); + } + if (post.json_metadata.flow?.pictures && post.json_metadata.flow?.pictures[0]) { + return proxifyImageUrl(post.json_metadata.flow?.pictures[0].url, true); + } + const youtube_id = extractYouTubeVideoIds(extractUrlsFromJsonString(post.body)); + if (youtube_id[0]) { + return proxifyImageUrl(`https://img.youtube.com/vi/${youtube_id[0]}/0.jpg`, true); + } + if (post.json_metadata?.tags && post.json_metadata?.tags.includes('nsfw')) { + return proxifyImageUrl(`https://images.hive.blog/u/${post.author}/avatar/`, true); + } + const pictures_extracted = extractPictureFromPostBody(extractUrlsFromJsonString(post.body)); + if (pictures_extracted[0]) { + return proxifyImageUrl(pictures_extracted[0], true); + } + const regex_for_peakd = /https:\/\/files\.peakd\.com\/[^\s]+\.jpg/; + const peakd_img = post.body.match(regex_for_peakd); + if (peakd_img !== null) { + return proxifyImageUrl(peakd_img[0], true); + } + const regexgif = / { }, []); const { user } = useUser(); const { manabarsData } = useManabars(user.username); - const { data, isLoading, isError } = useQuery( + const { data } = useQuery( ['unreadNotifications', user.username], () => getUnreadNotifications(user.username), { @@ -52,7 +52,7 @@ const SiteHeader: FC = () => { const [input, setInput] = useState(''); const handleEnter = (event: KeyboardEvent) => { if (event.key === 'Enter') { - router.push(`/search?q=${encodeURIComponent(input)}&s=newest`); + router.push(`/search?q=${encodeURIComponent(input)}`); } }; const [isNavHidden, setIsNavHidden] = useState(false); @@ -112,10 +112,26 @@ const SiteHeader: FC = () => { )} - +
+
+
+ +
+ setInput(e.target.value)} + onKeyDown={(e) => handleEnter(e)} + /> +
+
+ - diff --git a/apps/blog/components/suggestions-card.tsx b/apps/blog/components/suggestions-card.tsx new file mode 100644 index 0000000000000000000000000000000000000000..20f4154271c477c631138682ef45648ed0b08ace --- /dev/null +++ b/apps/blog/components/suggestions-card.tsx @@ -0,0 +1,39 @@ +import { Entry } from '@transaction/lib/bridge'; +import { find_first_img } from './post-img'; +import Link from 'next/link'; +import clsx from 'clsx'; +import { proxifyImageUrl } from '@ui/lib/old-profixy'; + +const SuggestionsCard = ({ entry }: { entry: Entry }) => { + const cardImage = find_first_img(entry); + + return ( +
+ + <> + {cardImage ? ( +
+ + + Post image + +
+ ) : null} + +

{entry.title}

+ +
+ {entry.author} + +
+
+ ); +}; +export default SuggestionsCard; diff --git a/apps/blog/next.config.js b/apps/blog/next.config.js index 32bd258414bd8cf8ab584128705514c8ae707426..6092cb20c6d906eeaed7a03e8a97409e7d350db3 100644 --- a/apps/blog/next.config.js +++ b/apps/blog/next.config.js @@ -39,6 +39,10 @@ const nextConfig = { from: path.join(__dirname, '../../node_modules/@hiveio/hb-auth/dist/worker.js'), to: path.join(__dirname, 'public/auth/') }, + { + from: path.join(__dirname, '../../node_modules/@hiveio/hb-auth/dist/assets'), + to: path.join(__dirname, 'public/auth/assets') + }, { from: path.join(__dirname, './locales'), to: path.join(__dirname, 'public/locales/') diff --git a/apps/blog/package.json b/apps/blog/package.json index cb30dbb6093f592e820aa2909a3ab54fbbc629bb..00cf44e42b3f56f4c48d800d0a8bd235a28f1267 100644 --- a/apps/blog/package.json +++ b/apps/blog/package.json @@ -5,13 +5,14 @@ "scripts": { "clean": "rm -rf ./public/auth/* && rm -rf ./public/locales/* && rm -rf ./public/smart-signer/*", "copy:worker": "cp ../../node_modules/@hiveio/hb-auth/dist/worker.js ./public/auth/", + "copy:assets": "cp -r ../../node_modules/@hiveio/hb-auth/dist/assets ./public/auth/assets", "predev": "pnpm run clean", "dev": "react-env -- next dev -p 3000 | pnpm dlx pino-pretty --colorize", "dev:3010": "react-env -- next dev -p 3010 | pnpm dlx pino-pretty --colorize", "devssl": "react-env -- next dev --port 3000 --experimental-https --experimental-https-key ../../ssl/server-key.pem --experimental-https-cert ../../ssl/server-cert.pem | pnpm dlx pino-pretty --colorize", "prebuild": "pnpm run clean", "build": "react-env -- next build", - "postbuild": "pnpm run copy:worker", + "postbuild": "pnpm run copy:worker && pnpm run copy:assets", "start": "react-env -- next start -p 3000", "lint": "eslint .", "pw:test:local": "playwright test --config=playwright.local3000.config.ts --update-snapshots", diff --git a/apps/blog/pages/[param]/[p2]/[permlink]/index.tsx b/apps/blog/pages/[param]/[p2]/[permlink]/index.tsx index 60c7871a1055247b95041cb135a795083cc5afd6..87218973be4c4d3729540e62e601daa0379659ed 100644 --- a/apps/blog/pages/[param]/[p2]/[permlink]/index.tsx +++ b/apps/blog/pages/[param]/[p2]/[permlink]/index.tsx @@ -3,7 +3,14 @@ import { Clock, Link2 } from 'lucide-react'; import UserInfo from '@/blog/components/user-info'; import { getActiveVotes } from '@transaction/lib/hive'; import { useQuery } from '@tanstack/react-query'; -import { Entry, getCommunity, getDiscussion, getListCommunityRoles, getPost } from '@transaction/lib/bridge'; +import { + Entry, + getCommunity, + getDiscussion, + getListCommunityRoles, + getPost, + getSuggestions +} from '@transaction/lib/bridge'; import Loading from '@hive/ui/components/loading'; import dynamic from 'next/dynamic'; import ImageGallery from '@/blog/components/image-gallery'; @@ -56,6 +63,7 @@ import moment from 'moment'; import { PostDeleteDialog } from '@/blog/components/post-delete-dialog'; import { useDeletePostMutation } from '@/blog/components/hooks/use-post-mutation'; import FlagIcon from '@/blog/components/flag-icon'; +import SuggestionsCard from '@/blog/components/suggestions-card'; const logger = getLogger('app'); export const postClassName = @@ -90,6 +98,14 @@ function PostPage({ } = useQuery(['postData', username, permlink], () => getPost(username, String(permlink)), { enabled: !!username && !!permlink }); + + const { data: suggestions, isLoading: isLoadingSuggestions } = useQuery( + ['suggestions', username, permlink], + () => getSuggestions(username, String(permlink)), + { + enabled: !!username && !!permlink + } + ); const { isLoading: isLoadingDiscussion, data: discussion } = useQuery( ['discussionData', username, permlink, user.username], () => getDiscussion(username, String(permlink), user.username), @@ -216,175 +232,199 @@ function PostPage({ return ( <> {canonical_url ? : null} -
-
-
- {communityData && !user.isLoggedIn ? ( - - {}} /> - - ) : communityData && user.isLoggedIn ? ( - - {}} /> - - ) : null} -
- {!isLoadingPost && post ? ( -
- {!commentSite ? ( -

+
+ {suggestions ? ( +
+ {suggestions ? ( +

You Might Also Like

+ ) : null} +
+ {suggestions.map((suggestion, i) => ( + + ))} +
+
+ ) : null} +
+
+
+
+ {communityData && !user.isLoggedIn ? ( + + {}} /> + + ) : communityData && user.isLoggedIn ? ( + - {post.title} -

- ) : ( -
-

- {t('post_content.if_comment.you_are_viewing_a_single_comments_thread_from')}: -

-

+ {}} /> + + ) : null} +

+ {!isLoadingPost && post ? ( +
+ {!commentSite ? ( +

{post.title}

- - • {t('post_content.if_comment.view_the_full_context')} - - {discussionState && !discussionState.some((e) => e.depth === 1) ? ( + ) : ( +
+

+ {t('post_content.if_comment.you_are_viewing_a_single_comments_thread_from')}: +

+

+ {post.title} +

- • {t('post_content.if_comment.view_the_direct_parent')} + • {t('post_content.if_comment.view_the_full_context')} - ) : null} -
- )} - - {isLoadingPost ? ( - - ) : edit && commentSite && post.parent_author && post.parent_permlink ? ( - - ) : edit ? ( - - ) : legalBlockedUser ? ( -
{t('global.unavailable_for_legal_reasons')}
- ) : copyRightCheck || userFromDMCA ? ( -
{t('post_content.body.copyright')}
- ) : mutedPost ? ( - <> - -
- {t('post_content.body.content_were_hidden')} - + {discussionState && !discussionState.some((e) => e.depth === 1) ? ( + + • {t('post_content.if_comment.view_the_direct_parent')} + + ) : null}
- - ) : ( - - + {isLoadingPost ? ( + + ) : edit && commentSite && post.parent_author && post.parent_permlink ? ( + - - )} -
- {!commentSite ? ( -
    - {post.json_metadata.tags - ?.filter((e) => e !== (post.community_title ?? post.category) && e !== '') - .map((tag: string) => ( -
  • + ) : edit ? ( + + ) : legalBlockedUser ? ( +
    {t('global.unavailable_for_legal_reasons')}
    + ) : copyRightCheck || userFromDMCA ? ( +
    {t('post_content.body.copyright')}
    + ) : mutedPost ? ( + <> + +
    + {t('post_content.body.content_were_hidden')} + +
    + + ) : ( + + + + )} +
    + {!commentSite ? ( +
      + {post.json_metadata.tags + ?.filter((e) => e !== (post.community_title ?? post.category) && e !== '') + .map((tag: string) => ( +
    • + + #{tag} + +
    • + ))} +
    + ) : null} +
    +
    +
    +
    + + + {dateToFullRelative(post.created, t)} + + {t('post_content.footer.in')} + + {post.community_title ? ( - #{tag} + {post.community_title} -
  • - ))} -
- ) : null} -
-
-
-
- - - {dateToFullRelative(post.created, t)} - - {t('post_content.footer.in')} - - {post.community_title ? ( - - {post.community_title} - - ) : ( - - #{post.category} - - )} - - {t('post_content.footer.by')} -
- - {post.author_title ? ( - - {post.author_title} + ) : ( + + #{post.category} + + )} + + {t('post_content.footer.by')} +
+ + {post.author_title ? ( + + {post.author_title} + + + ) : ( - - ) : ( - - )} + )} +
-
-
- - - + + - ${post.payout?.toFixed(2)} - - - {!isActiveVotesLoading && activeVotesData ? ( - - {post.stats?.total_votes && post.stats?.total_votes !== 0 ? ( - - {post.stats?.total_votes > 1 - ? t('post_content.footer.votes', { votes: post.stats?.total_votes }) - : t('post_content.footer.vote')} - - ) : null} - - ) : null} -
-
-
-
- - | - {user && user.isLoggedIn ? ( - <> - - {pinMutations.isLoading || unpinMutation.isLoading ? ( -
- -
- ) : userCanModerate && post.depth === 0 ? ( -
- {/*
+
+
+
+ + | + {user && user.isLoggedIn ? ( + <> + + {pinMutations.isLoading || unpinMutation.isLoading ? ( +
+ +
+ ) : userCanModerate && post.depth === 0 ? ( +
+ {/* */} - {/* TODO swap two button to one when api return stats.is_pinned, + {/* TODO swap two button to one when api return stats.is_pinned, temprary use two button to unpin and pin */} - - + +
+ ) : null} + {userCanModerate ? ( + + ) : null} + + ) : ( + + + + )} + {post.children === 0 && + user.isLoggedIn && + post.author === user.username && + moment().format('YYYY-MM-DDTHH:mm:ss') < post.payout_at ? ( + <> + | + + -
- ) : null} - {userCanModerate ? ( - - ) : null} - - ) : ( - - - - )} - {post.children === 0 && - user.isLoggedIn && - post.author === user.username && - moment().format('YYYY-MM-DDTHH:mm:ss') < post.payout_at ? ( - <> - | - + + + ) : null} + {user && user.isLoggedIn && post.author === user.username && !edit ? ( + <> + | - - - ) : null} - {user && user.isLoggedIn && post.author === user.username && !edit ? ( - <> - | - - - ) : null} - | - - - - - {post.children > 1 ? ( - - ) : ( - - )} - - - {post.children} - - - -

- {post.children === 0 - ? t('post_content.footer.no_responses') - : post.children === 1 - ? t('post_content.footer.response') - : t('post_content.footer.responses', { responses: post.children })} -

-
-
-
-
-
- - - - - - - + + ) : null} + | + + + + + {post.children > 1 ? ( + + ) : ( + + )} + + + {post.children} + + + +

+ {post.children === 0 + ? t('post_content.footer.no_responses') + : post.children === 1 + ? t('post_content.footer.response') + : t('post_content.footer.responses', { responses: post.children })} +

+
+
+
+
+
+ + + + + + + +
+ ) : ( + + )} +
+
+
+ {reply && post && user.isLoggedIn ? ( + + ) : null} +
+ {!isLoadingDiscussion && discussion && discussionState && !isLoadingPost && post ? ( +
+
+ {t('select_sort.sort_comments.sort')} + +
+
) : ( - + )}
-
-
- {reply && post && user.isLoggedIn ? ( - - ) : null} -
- {!isLoadingDiscussion && discussion && discussionState && !isLoadingPost && post ? ( -
-
- {t('select_sort.sort_comments.sort')} - -
- -
- ) : ( - - )} +
); diff --git a/apps/blog/pages/search.tsx b/apps/blog/pages/search.tsx index 51cd07943a17b7f1c5b8a1f6cb40602fb4e80121..dd301c076ab5b25d554574c9d5f8b07fd24c9160 100644 --- a/apps/blog/pages/search.tsx +++ b/apps/blog/pages/search.tsx @@ -1,135 +1,31 @@ -import { - Input, - Label, - Select, - SelectContent, - SelectGroup, - SelectItem, - SelectTrigger, - SelectValue -} from '@hive/ui'; -import { Icons } from '@ui/components/icons'; import { useRouter } from 'next/router'; -import { useState, KeyboardEvent, useEffect } from 'react'; -import { useTranslation } from 'next-i18next'; import { GetServerSideProps } from 'next'; import { getDefaultProps } from '../lib/get-translations'; -import { getSearch } from '@transaction/lib/bridge'; -import SearchCard from '../components/search-card'; -import { useLocalStorage } from 'usehooks-ts'; -import { DEFAULT_PREFERENCES, Preferences } from '../pages/[param]/settings'; -import { useUser } from '@smart-signer/lib/auth/use-user'; -import { useFollowListQuery } from '../components/hooks/use-follow-list'; -import { useInfiniteQuery } from '@tanstack/react-query'; +import { useQuery } from '@tanstack/react-query'; import Loading from '@ui/components/loading'; -import { PostSkeleton } from './[...param]'; -import { useInView } from 'react-intersection-observer'; +import PostList from '../components/post-list'; +import { getSimilarPosts } from '@transaction/lib/bridge'; +import AISearchInput from '../components/ai-search-input'; export const getServerSideProps: GetServerSideProps = getDefaultProps; export default function SearchPage() { const router = useRouter(); - const { t } = useTranslation('common_blog'); - const { ref, inView } = useInView(); - const [values, setValues] = useState({ - sort: 'newest', - input: '' - }); - const handleEnter = (event: KeyboardEvent) => { - if (event.key === 'Enter') { - router.push(`/search?q=${encodeURIComponent(values.input)}&sort=${encodeURIComponent(values.sort)}`); - } - }; - const { user } = useUser(); + const query = router.query.q as string; - const { - data: entriesData, - isLoading: entriesDataIsLoading, - isFetching: entriesDataIsFetching, - isError: entriesDataIsError, - isFetchingNextPage, - fetchNextPage, - hasNextPage - } = useInfiniteQuery( - ['infiniteSearch', router.query.q, router.query.sort], - (lastPage) => getSearch(router.query.q as string, lastPage.pageParam, router.query.sort as string), - { - getNextPageParam: (lastPage) => lastPage.scroll_id, - enabled: Boolean(router.query.sort) && Boolean(router.query.q) - } - ); - useEffect(() => { - if (inView && hasNextPage) { - fetchNextPage(); - } - }, [fetchNextPage, hasNextPage, inView]); - const handleSelect = (e: string) => { - setValues({ ...values, sort: e }); - router.push(`/search?q=${encodeURIComponent(values.input)}&s=${encodeURIComponent(e)}`); - }; - const [preferences] = useLocalStorage( - `user-preferences-${user.username}`, - DEFAULT_PREFERENCES - ); - const { data: blacklist } = useFollowListQuery(user.username, 'blacklisted'); + const { data, isLoading } = useQuery(['posts', query], () => getSimilarPosts(query), { + refetchOnWindowFocus: false, + refetchOnReconnect: false, + refetchOnMount: false, + enabled: !!router.query.q + }); return ( -
-
-
-
- -
- setValues({ ...values, input: e.target.value })} - onKeyDown={(e) => handleEnter(e)} - /> -
-
- -
-
- - {entriesDataIsError ? null : entriesDataIsLoading ? ( - - ) : !entriesData ? ( - 'Nothing was found.' - ) : ( - entriesData.pages.map((data, i) => ( -
    - {data.results.map((post) => ( - - ))} -
- )) - )} -
- +
+
+
+ {!query ? null : isLoading ? : data ? : null}
); } diff --git a/apps/blog/playwright/tests/e2e/communitiesPage.spec.ts b/apps/blog/playwright/tests/e2e/communitiesPage.spec.ts index 1d072cc019ae408fb98fd2a010b40158ab7bc4da..86f9b5dbd0a198fd1436c156c7afa2b258d8c72d 100644 --- a/apps/blog/playwright/tests/e2e/communitiesPage.spec.ts +++ b/apps/blog/playwright/tests/e2e/communitiesPage.spec.ts @@ -615,7 +615,11 @@ test.describe('Communities page tests', () => { } }); - const languageApi = (await response.json()).result[0].lang; + // const languageApi = (await response.json()).result[0].lang; + const languageApi = (await response.json()) + .result + .map( (item) => (item.title === 'LeoFinance' ? item : null )) + .find( (item) => item !== null ).lang; expect(communityChoosenLanguageText).toBe(languageApi); }); diff --git a/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts b/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts index 92acabbcbe7c733477dd8f1b9c4e12acb6520213..58dffc469b6737e9ac472877b0aefa571928b4d8 100644 --- a/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts +++ b/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts @@ -633,22 +633,21 @@ test.describe('Home page tests', () => { test('navigation search link is visible', async ({ page }) => { await homePage.goto(); - await expect(homePage.getNavSearchLink).toBeVisible(); + await expect(homePage.getNavSearchAIInput).toBeVisible(); }); test('move to the search page', async ({ page }) => { await homePage.goto(); - await expect(homePage.getNavSearchLink).toBeVisible(); - // click search link in navbar - await homePage.getNavSearchLink.click(); + await expect(homePage.getNavSearchAIInput).toBeVisible(); + // Type test and press Enter + await homePage.getNavSearchAIInput.fill('test'); + await homePage.page.keyboard.press('Enter'); + await homePage.page.waitForTimeout(5000); // validate url was changed to /search - await expect(homePage.page).toHaveURL('/search'); - // validate that input search is visible on the page - await expect(homePage.getNavSearchInput).toBeVisible(); - await expect(homePage.getNavSearchInput).toHaveAttribute('placeholder', 'Search...'); - // validate the 'sort by' dropdown list is visible - await expect(page.locator('[data-testid="search-sort-by-dropdown-list"]')).toBeVisible(); + await expect(homePage.page).toHaveURL('/search?q=test'); + // validate the first post card + await expect(homePage.getFirstPostListItem).toBeVisible(); }); test('navigation Login link is visible', async ({ page }) => { diff --git a/apps/blog/playwright/tests/support/pages/homePage.ts b/apps/blog/playwright/tests/support/pages/homePage.ts index 23bfa25b31be7338a8bfa1deedfdcfbb695c1aa3..3d362a1fe269b46079c89b19894b9eb787c7663c 100644 --- a/apps/blog/playwright/tests/support/pages/homePage.ts +++ b/apps/blog/playwright/tests/support/pages/homePage.ts @@ -23,6 +23,7 @@ export class HomePage { readonly getNavHbauthButton: Locator; readonly getNavSearchInput: Locator; readonly getNavSearchLink: Locator; + readonly getNavSearchAIInput: Locator; readonly getNavUserAvatar: Locator; readonly getNavCreatePost: Locator; readonly getNavSidebarMenu: any; @@ -192,6 +193,7 @@ export class HomePage { // this.getNavSearchInput = page.locator('header div nav input[type="search"]'); // old one this.getNavSearchInput = page.locator('input[type="search"]'); this.getNavSearchLink = page.locator('[data-testid="navbar-search-link"]'); + this.getNavSearchAIInput = page.getByPlaceholder('AI Search'); this.getNavUserAvatar = page.locator('[data-testid="profile-menu"]'); this.getNavProfileMenuContent = page.locator('[data-testid="profile-menu-content"]'); this.getNavCreatePost = page.locator('[data-testid="nav-pencil"]'); diff --git a/apps/blog/playwright/tests/testnet_e2e/followUser.spec.ts b/apps/blog/playwright/tests/testnet_e2e/followUser.spec.ts index 642b15c5d0064be07174853127973a7c9f32c98a..40146f1f5fb50381d9337d3291ff2f50c5b26fbd 100644 --- a/apps/blog/playwright/tests/testnet_e2e/followUser.spec.ts +++ b/apps/blog/playwright/tests/testnet_e2e/followUser.spec.ts @@ -10,11 +10,11 @@ test.describe('Follow user - tests', () => { let profilePage: ProfilePage; let postPage: PostPage; - test.beforeEach(async ({ denserAutoTest0Page, page }) => { - profileUserMenu = new ProfileUserMenu(page); - homePage = new HomePage(page); - profilePage = new ProfilePage(page); - postPage = new PostPage(page); + test.beforeEach(async ({ denserAutoTest0Page }) => { + profileUserMenu = new ProfileUserMenu(denserAutoTest0Page.page); + homePage = new HomePage(denserAutoTest0Page.page); + profilePage = new ProfilePage(denserAutoTest0Page.page); + postPage = new PostPage(denserAutoTest0Page.page); }); test('Add user to follow list - user account', async ({ denserAutoTest0Page }) => { @@ -34,13 +34,13 @@ test.describe('Follow user - tests', () => { await expect(denserAutoTest0Page.page.getByRole('link', { name: `${secondPostAuthor}` })).toBeVisible() await expect(denserAutoTest0Page.page.locator(profilePage.followBtn)).toContainText('Unfollow') await denserAutoTest0Page.page.locator(profilePage.followBtn).click() - expect(denserAutoTest0Page.page.getByRole('link', { name: `${secondPostAuthor}` })).not.toBeVisible() + await expect(await denserAutoTest0Page.page.getByRole('link', { name: `${secondPostAuthor}` })).not.toBeVisible() await expect(denserAutoTest0Page.page.locator(profilePage.profileStatsString)).toContainText('Not following anybody') }); test('Add user to follow list from post', async ({ denserAutoTest0Page }) => { const postAuthor = await denserAutoTest0Page.page.locator(homePage.postAuthor).first().innerText() - + await expect(denserAutoTest0Page.page.locator(homePage.postsImages).first()).toBeVisible() await denserAutoTest0Page.page.locator(homePage.postsImages).first().click({force: true}) await expect(denserAutoTest0Page.page.locator(postPage.articleBodyString).first()).toBeVisible() @@ -53,10 +53,10 @@ test.describe('Follow user - tests', () => { await denserAutoTest0Page.page.locator(profileUserMenu.profileLinkString).click() await expect(denserAutoTest0Page.page.locator(profilePage.profileStatsString)).toContainText('1 following') await denserAutoTest0Page.page.getByText('1 following').click() - expect(denserAutoTest0Page.page.getByRole('link', { name: `${postAuthor}` })).toBeVisible() + await expect(denserAutoTest0Page.page.getByRole('link', { name: `${postAuthor}` })).toBeVisible() await denserAutoTest0Page.page.locator(profilePage.followBtn).click() - expect(denserAutoTest0Page.page.getByRole('link', { name: `${postAuthor}` })).not.toBeVisible() + await expect(await denserAutoTest0Page.page.getByRole('link', { name: `${postAuthor}` })).not.toBeVisible() await expect(denserAutoTest0Page.page.locator(profilePage.profileStatsString)).toContainText('Not following anybody') }); diff --git a/apps/blog/public/auth/assets/beekeeper.common-CS5Y60Mg.wasm b/apps/blog/public/auth/assets/beekeeper.common-CS5Y60Mg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..6d2c8320aff40b4f0db47fee0442f861521ed56d Binary files /dev/null and b/apps/blog/public/auth/assets/beekeeper.common-CS5Y60Mg.wasm differ diff --git a/apps/wallet/next.config.js b/apps/wallet/next.config.js index 0a2d848c0d8c1af9814f567900ba5df8ef137adc..d7b240720e33fcddaafb9c856be35d7fdb019ca4 100644 --- a/apps/wallet/next.config.js +++ b/apps/wallet/next.config.js @@ -26,6 +26,10 @@ const nextConfig = { from: path.join(__dirname, '../../node_modules/@hiveio/hb-auth/dist/worker.js'), to: path.join(__dirname, 'public/auth/') }, + { + from: path.join(__dirname, '../../node_modules/@hiveio/hb-auth/dist/assets'), + to: path.join(__dirname, 'public/auth/assets') + }, { from: path.join(__dirname, './locales'), to: path.join(__dirname, 'public/locales/') diff --git a/apps/wallet/package.json b/apps/wallet/package.json index df692d873797f3d5a92bca932154d57195180bc9..22fd30d2167a273914388dfb4f217120435e9451 100644 --- a/apps/wallet/package.json +++ b/apps/wallet/package.json @@ -5,12 +5,13 @@ "scripts": { "clean": "rm -rf ./public/auth/* && rm -rf ./public/locales/* && rm -rf ./public/smart-signer/*", "copy:worker": "cp ../../node_modules/@hiveio/hb-auth/dist/worker.js ./public/auth/", + "copy:assets": "cp -r ../../node_modules/@hiveio/hb-auth/dist/assets ./public/auth/assets", "predev": "pnpm run clean", "dev": "react-env -- next dev -p 4000 | pnpm dlx pino-pretty --colorize", "devssl": "react-env -- next dev --port 4000 --experimental-https --experimental-https-key ../../ssl/server-key.pem --experimental-https-cert ../../ssl/server-cert.pem | pnpm dlx pino-pretty --colorize", "prebuild": "pnpm run clean", "build": "react-env -- next build", - "postbuild": "pnpm run copy:worker", + "postbuild": "pnpm run copy:worker && pnpm run copy:assets", "start": "react-env -- next start -p 4000", "lint": "eslint .", "pw:test:local": "playwright test --config=playwright.local4000.config.ts", diff --git a/packages/smart-signer/package.json b/packages/smart-signer/package.json index caa9f930379280194350d3d9c44fb4f47c637e11..1af3918b3ef810a42ce4b2d586d56bd3406ecd64 100644 --- a/packages/smart-signer/package.json +++ b/packages/smart-signer/package.json @@ -11,7 +11,7 @@ "@hiveio/dhive": "^1.3.0", "@hiveio/wax": "1.27.6-rc7-stable.250314151849", "@hiveio/wax-signers-keychain": "1.27.6-rc7-stable.250314151849", - "@hiveio/hb-auth": "0.0.1-stable.241220110655", + "@hiveio/hb-auth": "0.0.1-stable.250131124251", "@tanstack/react-query": "^4.36.1", "change-case": "^5.4.3", "cors": "^2.8.5", diff --git a/packages/transaction/index.ts b/packages/transaction/index.ts index 96578699fdb1c366cdd2dc759f96af174a08db3a..c1c4a27de7c576c9c6bb59d28dcf92935969cf58 100644 --- a/packages/transaction/index.ts +++ b/packages/transaction/index.ts @@ -19,7 +19,7 @@ import { getSigner } from '@smart-signer/lib/signer/get-signer'; import { SignerOptions, SignTransaction } from '@smart-signer/lib/signer/signer'; import { hiveChainService } from './lib/hive-chain-service'; import { Beneficiarie, Preferences } from './lib/app-types'; -import WorkerBee, { IBroadcastData, ITransactionData, IWorkerBee } from '@hiveio/workerbee'; +import WorkerBee, { ITransactionData, IWorkerBee } from '@hiveio/workerbee'; import { getLogger } from '@hive/ui/lib/logging'; const logger = getLogger('app'); @@ -163,7 +163,7 @@ export class TransactionService { logger.info('Broadcasting transaction id: %o, body: %o', transactionId, txBuilder.toApi()); await ( await hiveChainService.getHiveChain() - ).api.network_broadcast_api.broadcast_transaction({max_block_age: 50, trx: txBuilder.toApiJson()}); + ).api.network_broadcast_api.broadcast_transaction({max_block_age: -1, trx: txBuilder.toApiJson()}); return { transactionId }; } @@ -209,7 +209,7 @@ export class TransactionService { logger.info('Starting observing transaction id: %o', transactionId); const result: TransactionBroadcastResult = await new Promise((resolve, reject) => { const subscription = observer.subscribe({ - next: (data: IBroadcastData) => { + next: (data: ITransactionData) => { const { block: { number: blockNumber } } = data; diff --git a/packages/transaction/lib/bridge.ts b/packages/transaction/lib/bridge.ts index 85639f27be4b4bbbb28b5c9ea47530d81b9c7b6f..7ea13d82165740fa793993185dd8235309425b86 100644 --- a/packages/transaction/lib/bridge.ts +++ b/packages/transaction/lib/bridge.ts @@ -233,6 +233,47 @@ export const getPostsRanked = async ( return resp; }); }; +const apiDevOrigin = 'https://api.dev.openhive.network'; +export const getSimilarPosts = async ( + pattern: string, + tr_body: number = 100, + limit: number = 20 +): Promise => { + try { + const response = await fetch( + `${apiDevOrigin}/hivesense-api/similarposts?pattern=${encodeURIComponent(pattern)}&tr_body=${tr_body}&posts_limit=${limit}` + ); + if (!response.ok) { + throw new Error(`Similar posts API Error: ${response.status}`); + } + const data = await response.json(); + return data; + } catch (error) { + logger.error('Error in getSimilarPosts', error); + throw new Error('Error in getSimilarPosts'); + } +}; + +export const getSuggestions = async ( + author: string, + permlink: string, + tr_body: number = 0, + posts_limit: number = 5 +): Promise => { + try { + const response = await fetch( + `${apiDevOrigin}/hivesense-api/similarpostsbypost?author=${author}&permlink=${permlink}&tr_body=${tr_body}&posts_limit=${posts_limit}` + ); + if (!response.ok) { + throw new Error(`Similar posts API Error: ${response.status}`); + } + const data = await response.json(); + return data; + } catch (error) { + logger.error('Error in getSuggestions', error); + throw new Error('Error in getSuggestions'); + } +}; interface IGetAccountPosts { sort: string; diff --git a/packages/transaction/lib/transform-error.ts b/packages/transaction/lib/transform-error.ts index 9456325a0601f08e86134e2f652b621e24d57e59..f5e9185edc52bf34643dcc95dbc8837354ec95b4 100644 --- a/packages/transaction/lib/transform-error.ts +++ b/packages/transaction/lib/transform-error.ts @@ -28,6 +28,7 @@ const wellKnownErrorDescriptions = [ * @returns error description */ export function transformError(e: any, ctx?: { method: string; params: T }, defaultDescription?: string) { + console.trace('DEBUG: in transformError: got error (will be swallowed): %o on %o', e, ctx, defaultDescription); logger.error('in transformError: got error (will be swallowed): %o on %o', e, ctx); let description = 'Error'; diff --git a/packages/transaction/package.json b/packages/transaction/package.json index ca7e6291d3ee49a3fc4fb10d3e074c5135501f28..962969c120af4c0d7e6ba958b898571bd888fd5f 100644 --- a/packages/transaction/package.json +++ b/packages/transaction/package.json @@ -9,7 +9,7 @@ "dependencies": { "@hive/smart-signer": "workspace:*", "@hiveio/wax": "1.27.6-rc7-stable.250314151849", - "@hiveio/workerbee": "1.27.6-rc9-stable.250314184948", + "@hiveio/workerbee": "1.27.6-rc9", "secure-random": "^1.1.2", "set-interval-async": "^3.0.3", "speakingurl": "^14.0.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c767541ea4e1f83358026f940561d4de963003b1..13f8a55937aeb221aa840b7fbd261c45662f2502 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -605,8 +605,8 @@ importers: specifier: ^1.3.0 version: 1.3.2 '@hiveio/hb-auth': - specifier: 0.0.1-stable.241220110655 - version: 0.0.1-stable.241220110655 + specifier: 0.0.1-stable.250131124251 + version: 0.0.1-stable.250131124251 '@hiveio/wax': specifier: 1.27.6-rc7-stable.250314151849 version: 1.27.6-rc7-stable.250314151849 @@ -714,8 +714,8 @@ importers: specifier: 1.27.6-rc7-stable.250314151849 version: 1.27.6-rc7-stable.250314151849 '@hiveio/workerbee': - specifier: 1.27.6-rc9-stable.250314184948 - version: 1.27.6-rc9-stable.250314184948 + specifier: 1.27.6-rc9 + version: 1.27.6-rc9 secure-random: specifier: ^1.1.2 version: 1.1.2 @@ -1791,19 +1791,19 @@ packages: resolution: {integrity: sha1-mPx0QrDh3NSPSOYGyR1SUyi3lyA=, tarball: https://gitlab.syncad.com/api/v4/projects/198/packages/npm/@hiveio/beekeeper/-/@hiveio/beekeeper-1.27.10-stable.250305202831.tgz} engines: {node: ^20.11 || >= 21.2} - '@hiveio/beekeeper@1.27.10-stable.250310202833': - resolution: {integrity: sha1-RIuA9M6LrJkf/2HuNmiavT9bUyI=, tarball: https://gitlab.syncad.com/api/v4/projects/198/packages/npm/@hiveio/beekeeper/-/@hiveio/beekeeper-1.27.10-stable.250310202833.tgz} - engines: {node: ^20.11 || >= 21.2} - - '@hiveio/beekeeper@1.27.6-rc4': - resolution: {integrity: sha1-mj3k3qAgTdIrc6IxzC5VOprhWZs=, tarball: https://gitlab.syncad.com/api/v4/projects/198/packages/npm/@hiveio/beekeeper/-/@hiveio/beekeeper-1.27.6-rc4.tgz} + '@hiveio/beekeeper@1.27.6-rc3': + resolution: {integrity: sha1-+tV/0zANMNTgBA7WJAT5DKO9Bk0=, tarball: https://gitlab.syncad.com/api/v4/projects/198/packages/npm/@hiveio/beekeeper/-/@hiveio/beekeeper-1.27.6-rc3.tgz} engines: {node: '>= 18'} + '@hiveio/beekeeper@1.27.8-stable.250131103618': + resolution: {integrity: sha1-0IYuFBbxIIKfRTrI6ZZc7Jf+qLA=, tarball: https://gitlab.syncad.com/api/v4/projects/198/packages/npm/@hiveio/beekeeper/-/@hiveio/beekeeper-1.27.8-stable.250131103618.tgz} + engines: {node: ^20.11 || >= 21.2} + '@hiveio/dhive@1.3.2': resolution: {integrity: sha512-kJjp3TbpIlODxjJX4BWwvOf+cMxT8CFH/mNQ40RRjR2LP0a4baSWae1G+U/q/NtgjsIQz6Ja40tvnw6KF12I+g==, tarball: https://registry.npmjs.org/@hiveio/dhive/-/dhive-1.3.2.tgz} - '@hiveio/hb-auth@0.0.1-stable.241220110655': - resolution: {integrity: sha1-IxccJaFFnpA4jDlwePXU3nayaCM=, tarball: https://gitlab.syncad.com/api/v4/projects/429/packages/npm/@hiveio/hb-auth/-/@hiveio/hb-auth-0.0.1-stable.241220110655.tgz} + '@hiveio/hb-auth@0.0.1-stable.250131124251': + resolution: {integrity: sha1-HX9GbxRjpo+ezDR5SAvuEIVr6II=, tarball: https://gitlab.syncad.com/api/v4/projects/429/packages/npm/@hiveio/hb-auth/-/@hiveio/hb-auth-0.0.1-stable.250131124251.tgz} '@hiveio/hivescript@1.3.3': resolution: {integrity: sha512-nOeGespwSujSaEl4R09u9FXGgMyOywtWWQiJdiWsmJDknCUqXXxTfs3KICssPTjkDlbGp2gkg3WjUyrlxm28Qg==, tarball: https://registry.npmjs.org/@hiveio/hivescript/-/hivescript-1.3.3.tgz} @@ -1811,21 +1811,21 @@ packages: '@hiveio/wax-signers-keychain@1.27.6-rc7-stable.250314151849': resolution: {integrity: sha1-8HTCTsNn2vvVB6tyLi+1miB/YXw=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax-signers-keychain/-/@hiveio/wax-signers-keychain-1.27.6-rc7-stable.250314151849.tgz} - '@hiveio/wax@1.27.6-rc6-241220084915': - resolution: {integrity: sha1-+k17yp3C+Zo+StyEYDFYtCg5jy4=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax/-/@hiveio/wax-1.27.6-rc6-241220084915.tgz} + '@hiveio/wax@1.27.6-rc4': + resolution: {integrity: sha1-NZnSU6P8zkdBvnkHsWG1uswa6Es=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax/-/@hiveio/wax-1.27.6-rc4.tgz} engines: {node: '>= 18'} - '@hiveio/wax@1.27.6-rc7-stable.250314151849': - resolution: {integrity: sha1-qkI3WlmARRzTCZOMLDaDw2zNKx8=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax/-/@hiveio/wax-1.27.6-rc7-stable.250314151849.tgz} + '@hiveio/wax@1.27.6-rc7-stable.250131113706': + resolution: {integrity: sha1-Xi2VV8y9T6MdBHOBSzxZNpmGnF8=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax/-/@hiveio/wax-1.27.6-rc7-stable.250131113706.tgz} engines: {node: ^20.11 || >= 21.2} - '@hiveio/wax@1.27.6-rc7-stable.250314180436': - resolution: {integrity: sha1-/NkHF9IjJixN2LUTiUo/6KeQxUY=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax/-/@hiveio/wax-1.27.6-rc7-stable.250314180436.tgz} + '@hiveio/wax@1.27.6-rc7-stable.250314151849': + resolution: {integrity: sha1-qkI3WlmARRzTCZOMLDaDw2zNKx8=, tarball: https://gitlab.syncad.com/api/v4/projects/419/packages/npm/@hiveio/wax/-/@hiveio/wax-1.27.6-rc7-stable.250314151849.tgz} engines: {node: ^20.11 || >= 21.2} - '@hiveio/workerbee@1.27.6-rc9-stable.250314184948': - resolution: {integrity: sha1-3wFwvN+VugsZqtH+DsJI97I9w8o=, tarball: https://gitlab.syncad.com/api/v4/projects/452/packages/npm/@hiveio/workerbee/-/@hiveio/workerbee-1.27.6-rc9-stable.250314184948.tgz} - engines: {node: ^20.11 || >= 21.2} + '@hiveio/workerbee@1.27.6-rc9': + resolution: {integrity: sha1-w4GYKWKihjlOau951Ufu5VSBXmo=, tarball: https://gitlab.syncad.com/api/v4/projects/452/packages/npm/@hiveio/workerbee/-/@hiveio/workerbee-1.27.6-rc9.tgz} + engines: {node: '>= 18'} '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} @@ -6852,8 +6852,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.11.17: - resolution: {integrity: sha512-Jr6v8thd5qRlOlc6CslSTzGzzQW03uiscab7KHQZX1Dfo4R6n6FDhZ0Hri6/X7edLIDv9gl4VMZXhxTjLnl0VQ==} + libphonenumber-js@1.12.6: + resolution: {integrity: sha512-PJiS4ETaUfCOFLpmtKzAbqZQjCCKVu2OhTV4SVNNE7c2nu/dACvtCqj4L0i/KWNnIgRv7yrILvBj5Lonv5Ncxw==} lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -9871,8 +9871,8 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + validator@13.15.0: + resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} engines: {node: '>= 0.10'} varint@5.0.2: @@ -11454,9 +11454,9 @@ snapshots: '@hiveio/beekeeper@1.27.10-stable.250305202831': {} - '@hiveio/beekeeper@1.27.10-stable.250310202833': {} + '@hiveio/beekeeper@1.27.6-rc3': {} - '@hiveio/beekeeper@1.27.6-rc4': {} + '@hiveio/beekeeper@1.27.8-stable.250131103618': {} '@hiveio/dhive@1.3.2': dependencies: @@ -11476,12 +11476,10 @@ snapshots: transitivePeerDependencies: - encoding - '@hiveio/hb-auth@0.0.1-stable.241220110655': + '@hiveio/hb-auth@0.0.1-stable.250131124251': dependencies: - '@hiveio/beekeeper': 1.27.6-rc4 - '@hiveio/wax': 1.27.6-rc6-241220084915 + '@hiveio/wax': 1.27.6-rc7-stable.250131113706 comlink: 4.4.2 - idb: 7.1.1 '@hiveio/hivescript@1.3.3': {} @@ -11493,31 +11491,33 @@ snapshots: - debug - encoding - '@hiveio/wax@1.27.6-rc6-241220084915': + '@hiveio/wax@1.27.6-rc4': dependencies: - '@hiveio/beekeeper': 1.27.6-rc4 + '@hiveio/beekeeper': 1.27.6-rc3 class-transformer: 0.5.1 class-validator: 0.14.1 events: 3.3.0 long: 5.2.4 reflect-metadata: 0.1.14 - '@hiveio/wax@1.27.6-rc7-stable.250314151849': + '@hiveio/wax@1.27.6-rc7-stable.250131113706': dependencies: - '@hiveio/beekeeper': 1.27.10-stable.250305202831 + '@hiveio/beekeeper': 1.27.8-stable.250131103618 events: 3.3.0 long: 5.2.4 - '@hiveio/wax@1.27.6-rc7-stable.250314180436': + '@hiveio/wax@1.27.6-rc7-stable.250314151849': dependencies: '@hiveio/beekeeper': 1.27.10-stable.250305202831 events: 3.3.0 long: 5.2.4 - '@hiveio/workerbee@1.27.6-rc9-stable.250314184948': + '@hiveio/workerbee@1.27.6-rc9': dependencies: - '@hiveio/beekeeper': 1.27.10-stable.250310202833 - '@hiveio/wax': 1.27.6-rc7-stable.250314180436 + '@hiveio/beekeeper': 1.27.6-rc3 + '@hiveio/wax': 1.27.6-rc4 + events: 3.3.0 + rxjs: 7.8.1 '@hookform/resolvers@3.10.0(react-hook-form@7.54.2(react@18.3.0))': dependencies: @@ -14483,8 +14483,8 @@ snapshots: class-validator@0.14.1: dependencies: '@types/validator': 13.12.2 - libphonenumber-js: 1.11.17 - validator: 13.12.0 + libphonenumber-js: 1.12.6 + validator: 13.15.0 class-variance-authority@0.6.1: dependencies: @@ -17670,7 +17670,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.11.17: {} + libphonenumber-js@1.12.6: {} lie@3.3.0: dependencies: @@ -21055,7 +21055,7 @@ snapshots: validate-npm-package-name@5.0.1: {} - validator@13.12.0: {} + validator@13.15.0: {} varint@5.0.2: {}