diff --git a/apps/main/package.json b/apps/main/package.json index 7fa4cd7218..22f308a94a 100644 --- a/apps/main/package.json +++ b/apps/main/package.json @@ -44,8 +44,6 @@ "msedge-tts": "1.3.4", "nanoid": "5.0.7", "ofetch": "1.4.1", - "posthog-js": "1.169.0", - "posthog-node": "4.2.1", "semver": "7.6.3", "vscode-languagedetection": "npm:@vscode/vscode-languagedetection@^1.0.22" }, diff --git a/apps/main/src/tipc/app.ts b/apps/main/src/tipc/app.ts index 58761890f5..d932e86ff9 100644 --- a/apps/main/src/tipc/app.ts +++ b/apps/main/src/tipc/app.ts @@ -1,3 +1,5 @@ +import fs from "node:fs" +import fsp from "node:fs/promises" import path from "node:path" import { getRendererHandlers } from "@egoist/tipc/main" @@ -225,6 +227,46 @@ export const appRoute = { }), clearAllData: t.procedure.action(clearAllData), + + saveToObsidian: t.procedure + .input<{ + url: string + title: string + content: string + author: string + publishedAt: string + vaultPath: string + }>() + .action(async ({ input }) => { + try { + const { url, title, content, author, publishedAt, vaultPath } = input + + const fileName = `${(title || publishedAt).trim().slice(0, 20)}.md` + const filePath = path.join(vaultPath, fileName) + const exists = fs.existsSync(filePath) + if (exists) { + return { success: false, error: "File already exists" } + } + + const markdown = `--- +url: ${url} +author: ${author} +publishedAt: ${publishedAt} +--- + +# ${title} + +${content} +` + + await fsp.writeFile(filePath, markdown, "utf-8") + return { success: true } + } catch (error) { + console.error("Failed to save to Obsidian:", error) + const errorMessage = error instanceof Error ? error.message : String(error) + return { success: false, error: errorMessage } + } + }), } interface Sender extends Electron.WebContents { diff --git a/apps/renderer/package.json b/apps/renderer/package.json index c5e69bf68b..001f138ee1 100644 --- a/apps/renderer/package.json +++ b/apps/renderer/package.json @@ -75,7 +75,6 @@ "nanoid": "5.0.7", "ofetch": "1.4.1", "path-to-regexp": "8.2.0", - "posthog-js": "1.169.1", "re-resizable": "6.10.0", "react-blurhash": "^0.3.0", "react-error-boundary": "4.0.13", diff --git a/apps/renderer/src/atoms/server-configs.ts b/apps/renderer/src/atoms/server-configs.ts new file mode 100644 index 0000000000..d48daba172 --- /dev/null +++ b/apps/renderer/src/atoms/server-configs.ts @@ -0,0 +1,8 @@ +import { atom } from "jotai" + +import { createAtomHooks } from "~/lib/jotai" +import type { ServerConfigs } from "~/models" + +export const [, , useServerConfigs, , getServerConfigs, setServerConfigs] = createAtomHooks( + atom>(null), +) diff --git a/apps/renderer/src/atoms/settings/integration.ts b/apps/renderer/src/atoms/settings/integration.ts index dff5ec8dac..f54a02ace6 100644 --- a/apps/renderer/src/atoms/settings/integration.ts +++ b/apps/renderer/src/atoms/settings/integration.ts @@ -19,6 +19,10 @@ export const createDefaultSettings = (): IntegrationSettings => ({ enableOmnivore: false, omnivoreEndpoint: "", omnivoreToken: "", + + // obsidian + enableObsidian: false, + obsidianVaultPath: "", }) export const { diff --git a/apps/renderer/src/components/icons/users.tsx b/apps/renderer/src/components/icons/users.tsx index e36c6d9aa5..1ec2ed9c2f 100644 --- a/apps/renderer/src/components/icons/users.tsx +++ b/apps/renderer/src/components/icons/users.tsx @@ -1,5 +1,4 @@ import type { SVGProps } from "react" -import React from "react" export function PhUsersBold(props: SVGProps) { return ( diff --git a/apps/renderer/src/components/ui/fab/FABContainer.tsx b/apps/renderer/src/components/ui/fab/FABContainer.tsx index 643207b482..1bee8fcd98 100644 --- a/apps/renderer/src/components/ui/fab/FABContainer.tsx +++ b/apps/renderer/src/components/ui/fab/FABContainer.tsx @@ -3,7 +3,7 @@ import { typescriptHappyForwardRef } from "foxact/typescript-happy-forward-ref" import type { HTMLMotionProps } from "framer-motion" import { AnimatePresence } from "framer-motion" import { atom, useAtomValue } from "jotai" -import type React from "react" +import type * as React from "react" import type { JSX, PropsWithChildren, ReactNode } from "react" import { useId } from "react" diff --git a/apps/renderer/src/components/ui/loading.tsx b/apps/renderer/src/components/ui/loading.tsx index 905ab50bd3..0eb0c9e5f6 100644 --- a/apps/renderer/src/components/ui/loading.tsx +++ b/apps/renderer/src/components/ui/loading.tsx @@ -1,5 +1,6 @@ import { m, useAnimation } from "framer-motion" -import React, { cloneElement, useEffect } from "react" +import * as React from "react" +import { cloneElement, useEffect } from "react" import { cn } from "~/lib/utils" diff --git a/apps/renderer/src/components/ui/markdown/HTML.tsx b/apps/renderer/src/components/ui/markdown/HTML.tsx new file mode 100644 index 0000000000..1945f35c2b --- /dev/null +++ b/apps/renderer/src/components/ui/markdown/HTML.tsx @@ -0,0 +1,90 @@ +import katexStyle from "katex/dist/katex.min.css?raw" +import { createElement, Fragment, memo, useEffect, useMemo, useRef, useState } from "react" + +import { MemoedDangerousHTMLStyle } from "~/components/common/MemoedDangerousHTMLStyle" +import { parseHtml } from "~/lib/parse-html" +import { useWrappedElementSize } from "~/providers/wrapped-element-provider" + +import type { MediaInfoRecord } from "../media" +import { MediaContainerWidthProvider, MediaInfoRecordProvider } from "../media" +import { MarkdownRenderContainerRefContext } from "./context" + +export type HTMLProps = { + children: string | null | undefined + as: A + + accessory?: React.ReactNode + noMedia?: boolean + mediaInfo?: MediaInfoRecord + + handleTranslate?: (html: HTMLElement | null) => void +} & JSX.IntrinsicElements[A] & + Partial<{ + renderInlineStyle: boolean + }> +const HTMLImpl = (props: HTMLProps) => { + const { + children, + renderInlineStyle, + as = "div", + accessory, + noMedia, + mediaInfo, + handleTranslate: translate, + ...rest + } = props + const [remarkOptions, setRemarkOptions] = useState({ + renderInlineStyle, + noMedia, + }) + const [shouldForceReMountKey, setShouldForceReMountKey] = useState(0) + + useEffect(() => { + setRemarkOptions((options) => { + if (JSON.stringify(options) === JSON.stringify({ renderInlineStyle, noMedia })) { + return options + } + + setShouldForceReMountKey((key) => key + 1) + return { ...options, renderInlineStyle, noMedia } + }) + }, [renderInlineStyle, noMedia]) + + const [refElement, setRefElement] = useState(null) + + const onceRef = useRef(false) + useEffect(() => { + if (onceRef.current || !refElement) { + return + } + + translate?.(refElement) + onceRef.current = true + }, [translate, refElement]) + + const markdownElement = useMemo( + () => + children && + parseHtml(children, { + ...remarkOptions, + }).toContent(), + [children, remarkOptions], + ) + + const { w: containerWidth } = useWrappedElementSize() + + if (!markdownElement) return null + return ( + + + + {katexStyle} + {createElement(as, { ...rest, ref: setRefElement }, markdownElement)} + + + {!!accessory && {accessory}} + + ) +} + +export const HTML = memo(HTMLImpl) diff --git a/apps/renderer/src/components/ui/markdown/Markdown.tsx b/apps/renderer/src/components/ui/markdown/Markdown.tsx index 0198c10a83..c688542896 100644 --- a/apps/renderer/src/components/ui/markdown/Markdown.tsx +++ b/apps/renderer/src/components/ui/markdown/Markdown.tsx @@ -1,15 +1,9 @@ -import katexStyle from "katex/dist/katex.min.css?raw" -import { createElement, Fragment, memo, useEffect, useMemo, useRef, useState } from "react" +import { useMemo, useState } from "react" -import { MemoedDangerousHTMLStyle } from "~/components/common/MemoedDangerousHTMLStyle" -import { parseHtml } from "~/lib/parse-html" import type { RemarkOptions } from "~/lib/parse-markdown" import { parseMarkdown } from "~/lib/parse-markdown" import { cn } from "~/lib/utils" -import { useWrappedElementSize } from "~/providers/wrapped-element-provider" -import type { MediaInfoRecord } from "../media" -import { MediaContainerWidthProvider, MediaInfoRecordProvider } from "../media" import { MarkdownRenderContainerRefContext } from "./context" export const Markdown: Component< @@ -39,84 +33,3 @@ export const Markdown: Component< ) } - -const HTMLImpl = ( - props: { - children: string | null | undefined - as: A - - accessory?: React.ReactNode - noMedia?: boolean - mediaInfo?: MediaInfoRecord - - translate?: (html: HTMLElement | null) => void - } & JSX.IntrinsicElements[A] & - Partial<{ - renderInlineStyle: boolean - }>, -) => { - const { - children, - renderInlineStyle, - as = "div", - accessory, - noMedia, - mediaInfo, - translate, - ...rest - } = props - const [remarkOptions, setRemarkOptions] = useState({ - renderInlineStyle, - noMedia, - }) - const [shouldForceReMountKey, setShouldForceReMountKey] = useState(0) - - useEffect(() => { - setRemarkOptions((options) => { - if (JSON.stringify(options) === JSON.stringify({ renderInlineStyle, noMedia })) { - return options - } - - setShouldForceReMountKey((key) => key + 1) - return { ...options, renderInlineStyle, noMedia } - }) - }, [renderInlineStyle, noMedia]) - - const [refElement, setRefElement] = useState(null) - - const onceRef = useRef(false) - useEffect(() => { - if (onceRef.current || !refElement) { - return - } - - translate?.(refElement) - onceRef.current = true - }, [translate, refElement]) - - const markdownElement = useMemo( - () => - children && - parseHtml(children, { - ...remarkOptions, - }).toContent(), - [children, remarkOptions], - ) - - const { w: containerWidth } = useWrappedElementSize() - - if (!markdownElement) return null - return ( - - - - {katexStyle} - {createElement(as, { ...rest, ref: setRefElement }, markdownElement)} - - - {!!accessory && {accessory}} - - ) -} - -export const HTML = memo(HTMLImpl) diff --git a/apps/renderer/src/components/ui/markdown/context.tsx b/apps/renderer/src/components/ui/markdown/context.tsx index 0c7924bf1d..6ccc810d57 100644 --- a/apps/renderer/src/components/ui/markdown/context.tsx +++ b/apps/renderer/src/components/ui/markdown/context.tsx @@ -1,3 +1,14 @@ -import { createContext } from "react" +import { createContext as reactCreateContext } from "react" +import { createContext } from "use-context-selector" -export const MarkdownRenderContainerRefContext = createContext(null) +import type { MarkdownImage, MarkdownRenderActions } from "./types" + +export const MarkdownRenderContainerRefContext = reactCreateContext(null) + +export const MarkdownImageRecordContext = createContext>({}) + +export const MarkdownRenderActionContext = reactCreateContext({ + transformUrl: (url) => url ?? "", + isAudio: () => false, + ensureAndRenderTimeStamp: () => false, +}) diff --git a/apps/renderer/src/components/ui/markdown/index.ts b/apps/renderer/src/components/ui/markdown/index.ts deleted file mode 100644 index b94d1d4f41..0000000000 --- a/apps/renderer/src/components/ui/markdown/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./Markdown" diff --git a/apps/renderer/src/components/ui/markdown/renderers/BlockImage.tsx b/apps/renderer/src/components/ui/markdown/renderers/BlockImage.tsx index c5c2c5130e..fdf93c80aa 100644 --- a/apps/renderer/src/components/ui/markdown/renderers/BlockImage.tsx +++ b/apps/renderer/src/components/ui/markdown/renderers/BlockImage.tsx @@ -1,10 +1,11 @@ +import { useContext } from "react" +import { useContextSelector } from "use-context-selector" + import { cn } from "~/lib/utils" -import { useEntryContentContext } from "~/modules/entry-content/hooks" import { useWrappedElementSize } from "~/providers/wrapped-element-provider" -import { useEntry } from "~/store/entry" import { Media } from "../../media" -import { usePopulatedFullUrl } from "../utils" +import { MarkdownImageRecordContext, MarkdownRenderActionContext } from "../context" export const MarkdownBlockImage = ( props: React.ImgHTMLAttributes & { @@ -15,17 +16,19 @@ export const MarkdownBlockImage = ( }, ) => { const size = useWrappedElementSize() - const { feedId } = useEntryContentContext() - const src = usePopulatedFullUrl(feedId, props.src) + const { transformUrl } = useContext(MarkdownRenderActionContext) + const src = transformUrl(props.src) - const { entryId } = useEntryContentContext() - const media = useEntry(entryId, (entry) => entry?.entries.media?.find((m) => m.url === props.src)) + const media = useContextSelector(MarkdownImageRecordContext, (record) => + props.src ? record[props.src] : null, + ) return ( & { @@ -12,12 +13,13 @@ export const MarkdownInlineImage = ( } }, ) => { - const { feedId } = useEntryContentContext() - const populatedUrl = usePopulatedFullUrl(feedId, props.src) + const { transformUrl } = useContext(MarkdownRenderActionContext) + const populatedUrl = transformUrl(props.src) return ( { - const { view, feedId } = useEntryContentContext() + const { transformUrl, isAudio, ensureAndRenderTimeStamp } = useContext( + MarkdownRenderActionContext, + ) - const populatedFullHref = usePopulatedFullUrl(feedId, props.href) + const populatedFullHref = transformUrl(props.href) - const parseTimeStamp = view === FeedViewType.Audios + const parseTimeStamp = isAudio(populatedFullHref) if (parseTimeStamp) { const childrenText = props.children diff --git a/apps/renderer/src/components/ui/markdown/renderers/MarkdownP.tsx b/apps/renderer/src/components/ui/markdown/renderers/MarkdownP.tsx index 8c0e7a6f7d..bad49c7c81 100644 --- a/apps/renderer/src/components/ui/markdown/renderers/MarkdownP.tsx +++ b/apps/renderer/src/components/ui/markdown/renderers/MarkdownP.tsx @@ -1,16 +1,13 @@ import * as React from "react" -import { FeedViewType } from "~/lib/enum" -import { useEntryContentContextSelector } from "~/modules/entry-content/hooks" - -import { ensureAndRenderTimeStamp } from "../utils" +import { MarkdownRenderActionContext } from "../context" import { IsInParagraphContext } from "./ctx" export const MarkdownP: Component< React.DetailedHTMLProps, HTMLParagraphElement> > = ({ children, ...props }) => { - const view = useEntryContentContextSelector((s) => s.view) - const parseTimeline = view === FeedViewType.Audios + const { isAudio, ensureAndRenderTimeStamp } = React.useContext(MarkdownRenderActionContext) + const parseTimeline = isAudio() if (parseTimeline && typeof children === "string") { const renderer = ensureAndRenderTimeStamp(children) if (renderer) return

{renderer}

diff --git a/apps/renderer/src/components/ui/markdown/types.ts b/apps/renderer/src/components/ui/markdown/types.ts new file mode 100644 index 0000000000..0fc2b6b849 --- /dev/null +++ b/apps/renderer/src/components/ui/markdown/types.ts @@ -0,0 +1,12 @@ +export type MarkdownImage = { + url: string + blurhash?: string + width: number + height: number +} + +export interface MarkdownRenderActions { + transformUrl: (url?: string) => string + isAudio: (url?: string) => boolean + ensureAndRenderTimeStamp: (children: string) => React.ReactNode +} diff --git a/apps/renderer/src/components/ui/markdown/utils/index.tsx b/apps/renderer/src/components/ui/markdown/utils/index.tsx deleted file mode 100644 index 48b5f32df4..0000000000 --- a/apps/renderer/src/components/ui/markdown/utils/index.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { useMemo } from "react" - -import { useFeedByIdSelector } from "~/store/feed" - -import { TimeStamp } from "../components/TimeStamp" - -export const ensureAndRenderTimeStamp = (children: string) => { - const firstPart = children.replace(" ", " ").split(" ")[0] - // 00:00 , 00:00:00 - if (!firstPart) { - return - } - const isTime = isValidTimeString(firstPart.trim()) - if (isTime) { - return ( - <> - - {children.slice(firstPart.length)} - - ) - } - return false -} -function isValidTimeString(time: string): boolean { - const timeRegex = /^\d{1,2}:[0-5]\d(?::[0-5]\d)?$/ - return timeRegex.test(time) -} - -export function timeStringToSeconds(time: string): number | null { - const timeParts = time.split(":").map(Number) - - if (timeParts.length === 2) { - const [minutes, seconds] = timeParts - return minutes * 60 + seconds - } else if (timeParts.length === 3) { - const [hours, minutes, seconds] = timeParts - return hours * 3600 + minutes * 60 + seconds - } else { - return null - } -} - -const safeUrl = (url: string, baseUrl: string) => { - try { - return new URL(url, baseUrl).href - } catch { - return url - } -} -export const usePopulatedFullUrl = (feedId: string, relativeUrl?: string) => { - const feedSiteUrl = useFeedByIdSelector(feedId, (feed) => - "siteUrl" in feed ? feed.siteUrl : undefined, - ) - - const populatedFullHref = useMemo(() => { - if (!relativeUrl) return void 0 - - if (relativeUrl.startsWith("http")) return relativeUrl - if (relativeUrl.startsWith("/") && feedSiteUrl) return safeUrl(relativeUrl, feedSiteUrl) - return relativeUrl - }, [feedSiteUrl, relativeUrl]) - - return populatedFullHref -} diff --git a/apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx b/apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx new file mode 100644 index 0000000000..0b90a91bb0 --- /dev/null +++ b/apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx @@ -0,0 +1,18 @@ +import type { SVGProps } from "react" + +export function SimpleIconsObsidian(props: SVGProps) { + return ( + + + + ) +} diff --git a/apps/renderer/src/components/ui/platform-icon/icons.ts b/apps/renderer/src/components/ui/platform-icon/icons.ts index a6aa151f77..084815395f 100644 --- a/apps/renderer/src/components/ui/platform-icon/icons.ts +++ b/apps/renderer/src/components/ui/platform-icon/icons.ts @@ -1,5 +1,6 @@ export * from "./collections/eagle" export * from "./collections/instapaper" +export * from "./collections/obsidian" export * from "./collections/omnivore" export * from "./collections/readwise" export * from "./collections/rss3" diff --git a/apps/renderer/src/components/ui/tabs.tsx b/apps/renderer/src/components/ui/tabs.tsx index 529b222850..ee6e212a9f 100644 --- a/apps/renderer/src/components/ui/tabs.tsx +++ b/apps/renderer/src/components/ui/tabs.tsx @@ -56,8 +56,7 @@ const tabsTriggerVariants = cva("", { variant: { default: "py-1.5 border-b-2 border-transparent data-[state=active]:text-accent dark:data-[state=active]:text-theme-accent-500", - rounded: - "py-1 rounded-sm data-[state=active]:bg-theme-accent-300 dark:data-[state=active]:bg-theme-accent-800 data-[state=active]:shadow-sm", + rounded: "!py-1 !px-3 bg-transparent", }, }, defaultVariants: { @@ -68,58 +67,64 @@ const tabsTriggerVariants = cva("", { export interface TabsTriggerProps extends React.ComponentPropsWithoutRef, VariantProps {} -const TabsTrigger = React.forwardRef< - React.ElementRef, - TabsTriggerProps ->(({ className, variant, children, ...props }, ref) => { - const triggerRef = React.useRef(null) - React.useImperativeHandle(ref, () => triggerRef.current!, [ref]) +const TabsTrigger = React.forwardRef( + ({ className, variant, children, ...props }, ref) => { + const triggerRef = React.useRef(null) + React.useImperativeHandle(ref, () => triggerRef.current!, []) - const [isSelect, setIsSelect] = React.useState(false) - const id = React.useContext(TabsIdContext) - const layoutId = `tab-selected-underline-${id}` - React.useLayoutEffect(() => { - if (!triggerRef.current) return + const [isSelect, setIsSelect] = React.useState(false) + const id = React.useContext(TabsIdContext) + const layoutId = `tab-selected-underline-${id}` + React.useLayoutEffect(() => { + if (!triggerRef.current) return - const trigger = triggerRef.current as HTMLElement + const trigger = triggerRef.current as HTMLElement - const isSelect = trigger.dataset.state === "active" - setIsSelect(isSelect) - const ob = new MutationObserver(() => { const isSelect = trigger.dataset.state === "active" setIsSelect(isSelect) - }) - ob.observe(trigger, { - attributes: true, - attributeFilter: ["data-state"], - }) + const ob = new MutationObserver(() => { + const isSelect = trigger.dataset.state === "active" + setIsSelect(isSelect) + }) + ob.observe(trigger, { + attributes: true, + attributeFilter: ["data-state"], + }) - return () => { - ob.disconnect() - } - }, []) + return () => { + ob.disconnect() + } + }, []) - return ( - - {children} - {isSelect && ( - - )} - - ) -}) + return ( + + {children} + {isSelect && ( + + )} + + ) + }, +) TabsTrigger.displayName = TabsPrimitive.Trigger.displayName const TabsContent = React.forwardRef< diff --git a/apps/renderer/src/constants/app.tsx b/apps/renderer/src/constants/app.tsx index 1e1404991d..cea153d90f 100644 --- a/apps/renderer/src/constants/app.tsx +++ b/apps/renderer/src/constants/app.tsx @@ -13,7 +13,4 @@ export const ROUTE_FEED_IN_FOLDER = "folder-" export const ROUTE_FEED_IN_LIST = "list-" export const ROUTE_FEED_IN_INBOX = "inbox-" -export const DAILY_CLAIM_AMOUNT = "20" -export const INVITATION_PRICE = "100" - export const INBOX_PREFIX_ID = "inbox-" diff --git a/apps/renderer/src/constants/tabs.tsx b/apps/renderer/src/constants/tabs.tsx index 43b4ee00cb..96dedf408c 100644 --- a/apps/renderer/src/constants/tabs.tsx +++ b/apps/renderer/src/constants/tabs.tsx @@ -1,4 +1,4 @@ -import type React from "react" +import type * as React from "react" import { FeedViewType } from "~/lib/enum" diff --git a/apps/renderer/src/hooks/biz/useAb.ts b/apps/renderer/src/hooks/biz/useAb.ts deleted file mode 100644 index deccb5695d..0000000000 --- a/apps/renderer/src/hooks/biz/useAb.ts +++ /dev/null @@ -1,39 +0,0 @@ -// import { useAtomValue } from "jotai" -// import PostHog from "posthog-js" -// import { useFeatureFlagEnabled } from "posthog-js/react" - -// import { jotaiStore } from "~/lib/jotai" -// import type { FeatureKeys } from "~/modules/ab/atoms" -// import { debugFeaturesAtom, enableDebugOverrideAtom, IS_DEBUG_ENV } from "~/modules/ab/atoms" -// import { abPayloadFallback } from "~/modules/ab/fallback" - -// export const useAb = (feature: FeatureKeys) => { -// const isEnableDebugOverrides = useAtomValue(enableDebugOverrideAtom) -// const debugFeatureOverrides = useAtomValue(debugFeaturesAtom) - -// const isEnabled = useFeatureFlagEnabled(feature) - -// if (IS_DEBUG_ENV && isEnableDebugOverrides) return debugFeatureOverrides[feature] - -// return isEnabled -// } - -// export const isAbEnabled = (feature: FeatureKeys) => { -// const featureFlag = PostHog.getFeatureFlag(feature) -// const enabled = typeof featureFlag === "boolean" ? featureFlag : featureFlag === "enabled" -// const debugOverride = jotaiStore.get(debugFeaturesAtom) - -// const isEnableOverride = jotaiStore.get(enableDebugOverrideAtom) - -// if (isEnableOverride) { -// return debugOverride[feature] -// } - -// return enabled -// } - -// export const getAbValue = (feature: FeatureKeys) => { -// return PostHog.getFeatureFlagPayload(feature) || abPayloadFallback[feature] -// } - -export {} diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index d4d9dc0c27..1d8d19794a 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -25,6 +25,7 @@ import { mountLottie } from "~/components/ui/lottie-container" import { SimpleIconsEagle, SimpleIconsInstapaper, + SimpleIconsObsidian, SimpleIconsOmnivore, SimpleIconsReadwise, } from "~/components/ui/platform-icon/icons" @@ -171,6 +172,34 @@ export const useEntryActions = ({ const enableOmnivore = useIntegrationSettingKey("enableOmnivore") const omnivoreToken = useIntegrationSettingKey("omnivoreToken") const omnivoreEndpoint = useIntegrationSettingKey("omnivoreEndpoint") + const enableObsidian = useIntegrationSettingKey("enableObsidian") + const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") + const isObsidianEnabled = enableObsidian && !!obsidianVaultPath + + const saveToObsidian = useMutation({ + mutationKey: ["save-to-obsidian"], + mutationFn: async (data: { + url: string + title: string + content: string + author: string + publishedAt: string + vaultPath: string + }) => { + return await tipcClient?.saveToObsidian(data) + }, + onSuccess: (data) => { + if (data?.success) { + toast.success(t("entry_actions.saved_to_obsidian"), { + duration: 3000, + }) + } else { + toast.error(`${t("entry_actions.failed_to_save_to_obsidian")}: ${data?.error}`, { + duration: 3000, + }) + } + }, + }) const checkEagle = useQuery({ queryKey: ["check-eagle"], @@ -370,6 +399,24 @@ export const useEntryActions = ({ } }, }, + { + name: t("entry_actions.save_to_obsidian"), + icon: , + key: "saveToObsidian", + hide: !isObsidianEnabled || !populatedEntry?.entries?.url, + onClick: () => { + if (!isObsidianEnabled || !populatedEntry?.entries?.url) return + + saveToObsidian.mutate({ + url: populatedEntry.entries.url, + title: populatedEntry.entries.title || "", + content: populatedEntry.entries.content || "", + author: populatedEntry.entries.author || "", + publishedAt: populatedEntry.entries.publishedAt || "", + vaultPath: obsidianVaultPath, + }) + }, + }, { key: "tip", shortcut: shortcuts.entry.tip.key, @@ -534,9 +581,16 @@ export const useEntryActions = ({ enableInstapaper, instapaperPassword, instapaperUsername, + enableOmnivore, + omnivoreToken, + omnivoreEndpoint, + isObsidianEnabled, + isInbox, feed?.ownerUserId, type, showSourceContent, + obsidianVaultPath, + saveToObsidian, openTipModal, collect, uncollect, diff --git a/apps/renderer/src/initialize/analytics.ts b/apps/renderer/src/initialize/analytics.ts index 03631b559a..f178d37817 100644 --- a/apps/renderer/src/initialize/analytics.ts +++ b/apps/renderer/src/initialize/analytics.ts @@ -4,7 +4,6 @@ import type { TrackProperties } from "@openpanel/web" import { getGeneralSettings } from "~/atoms/settings/general" import { op } from "./op" -import { initPostHog } from "./posthog" declare global { interface Window { @@ -15,8 +14,6 @@ declare global { } } export const initAnalytics = () => { - // TODO remove this - initPostHog() if (env.VITE_OPENPANEL_CLIENT_ID === undefined) return op.setGlobalProperties({ @@ -28,17 +25,13 @@ export const initAnalytics = () => { window.analytics = { reset: () => { // op.clear() - - // TODO remove this if op ready - window.posthog?.reset() }, capture(event_name: string, properties?: TrackProperties | null) { if (import.meta.env.DEV) return if (!getGeneralSettings().sendAnonymousData) { return } - // TODO remove this if op ready - window.posthog?.capture(event_name, properties as TrackProperties) + op.track(event_name, properties as TrackProperties) }, } diff --git a/apps/renderer/src/initialize/op.ts b/apps/renderer/src/initialize/op.ts index 210b589e09..5cbf50cc27 100644 --- a/apps/renderer/src/initialize/op.ts +++ b/apps/renderer/src/initialize/op.ts @@ -2,7 +2,7 @@ import { env } from "@follow/shared/env" import { OpenPanel } from "@openpanel/web" export const op = new OpenPanel({ - clientId: env.VITE_OPENPANEL_CLIENT_ID, + clientId: env.VITE_OPENPANEL_CLIENT_ID ?? "", trackScreenViews: true, trackOutgoingLinks: true, trackAttributes: true, diff --git a/apps/renderer/src/initialize/posthog.ts b/apps/renderer/src/initialize/posthog.ts deleted file mode 100644 index 9c2f58ae46..0000000000 --- a/apps/renderer/src/initialize/posthog.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { env } from "@follow/shared/env" -import type { CaptureOptions, Properties } from "posthog-js" -import { posthog } from "posthog-js" - -import { getGeneralSettings } from "~/atoms/settings/general" -import { whoami } from "~/atoms/user" - -declare global { - interface Window { - posthog?: { - capture: InstanceType["capture"] - reset: InstanceType["reset"] - } - } -} -export const initPostHog = () => { - if (env.VITE_POSTHOG_KEY === undefined) return - posthog.init(env.VITE_POSTHOG_KEY, { - person_profiles: "identified_only", - enable_heatmaps: false, - autocapture: false, - loaded: () => { - const user = whoami() - if (user) { - posthog.identify(user.id, { name: user.name, handle: user.handle }) - } - }, - }) - - const { capture, reset } = posthog - - window.posthog = { - reset, - capture(event_name: string, properties?: Properties | null, options?: CaptureOptions) { - if (import.meta.env.DEV) return - if (!getGeneralSettings().sendAnonymousData) { - return - } - return capture.apply(posthog, [ - event_name, - { - ...properties, - build: ELECTRON ? "electron" : "web", - version: APP_VERSION, - hash: GIT_COMMIT_SHA, - }, - options, - ] as const) - }, - } -} diff --git a/apps/renderer/src/lib/error-parser.ts b/apps/renderer/src/lib/error-parser.ts index a502ed4297..9deb239d9e 100644 --- a/apps/renderer/src/lib/error-parser.ts +++ b/apps/renderer/src/lib/error-parser.ts @@ -5,7 +5,7 @@ import type { ExternalToast } from "sonner" import { toast } from "sonner" import { CopyButton } from "~/components/ui/code-highlighter" -import { Markdown } from "~/components/ui/markdown" +import { Markdown } from "~/components/ui/markdown/Markdown" import { cn } from "~/lib/utils" export const getFetchErrorMessage = (error: Error) => { diff --git a/apps/renderer/src/lib/utils.ts b/apps/renderer/src/lib/utils.ts index 25809b5080..d24ad59fbf 100644 --- a/apps/renderer/src/lib/utils.ts +++ b/apps/renderer/src/lib/utils.ts @@ -4,6 +4,7 @@ import { memoize } from "lodash-es" import { twMerge } from "tailwind-merge" import { parse } from "tldts" +import { getServerConfigs } from "~/atoms/server-configs" import type { MediaModel } from "~/models" import type { RSSHubRoute } from "~/modules/discover/types" @@ -286,3 +287,39 @@ export const filterSmallMedia = (media: MediaModel) => { (m) => !(m.type === "photo" && m.width && m.width < 65 && m.height && m.height < 65), ) } + +export const getLevelMultiplier = (level: number) => { + if (level === 0) { + return 0.1 + } + const serverConfigs = getServerConfigs() + if (!serverConfigs) { + return 1 + } + const level1Range = serverConfigs?.LEVEL_PERCENTAGES[3] - serverConfigs?.LEVEL_PERCENTAGES[2] + const percentageIndex = serverConfigs.LEVEL_PERCENTAGES.length - level + let levelCurrentRange + if (percentageIndex - 1 < 0) { + levelCurrentRange = serverConfigs?.LEVEL_PERCENTAGES[percentageIndex] + } else { + levelCurrentRange = + serverConfigs?.LEVEL_PERCENTAGES[percentageIndex] - + serverConfigs?.LEVEL_PERCENTAGES[percentageIndex - 1] + } + const rangeMultiplier = levelCurrentRange / level1Range + + const poolMultiplier = + serverConfigs?.DAILY_POWER_PERCENTAGES[level] / serverConfigs?.DAILY_POWER_PERCENTAGES[1] + + return (poolMultiplier / rangeMultiplier).toFixed(0) +} + +export const getBlockchainExplorerUrl = () => { + const serverConfigs = getServerConfigs() + + if (serverConfigs?.IS_RSS3_TESTNET) { + return `https://scan.testnet.rss3.io` + } else { + return `https://scan.rss3.io` + } +} diff --git a/apps/renderer/src/models/types.ts b/apps/renderer/src/models/types.ts index 6fe67938d0..822eb8acf8 100644 --- a/apps/renderer/src/models/types.ts +++ b/apps/renderer/src/models/types.ts @@ -123,3 +123,5 @@ export type ActionsInput = { export const TransactionTypes = ["mint", "purchase", "tip", "withdraw"] as const export type WalletModel = ExtractBizResponse["data"][number] + +export type ServerConfigs = ExtractBizResponse["data"] diff --git a/apps/renderer/src/modules/ai/ai-daily/FeedDailyModalContent.tsx b/apps/renderer/src/modules/ai/ai-daily/FeedDailyModalContent.tsx index 499a8aaa35..5fd883e3e6 100644 --- a/apps/renderer/src/modules/ai/ai-daily/FeedDailyModalContent.tsx +++ b/apps/renderer/src/modules/ai/ai-daily/FeedDailyModalContent.tsx @@ -3,7 +3,7 @@ import { FeedViewType } from "~/lib/enum" import { DayOf } from "./constants" import { DailyReportModalContent, DailyReportTitle } from "./daily" -import { useParseDailyDate } from "./hooks" +import { useParseDailyDate } from "./useParseDailyDate" const tabs = [DayOf.Today, DayOf.Yesterday] @@ -23,7 +23,11 @@ export const FeedDailyModalContent = () => {
{tabs.map((tab: any) => ( - + { const { title, startDate, endDate } = useParseDailyDate(day) @@ -184,34 +184,39 @@ export const DailyReportModalContent: Component = ({ view, }) => { const content = useQueryData({ endDate, startDate, view }) + const RelatedEntryLink = useState(() => createRelatedEntryLink("toast"))[0] const { t } = useTranslation() + if (!content.data && !content.isLoading) + return ( +
+ +

{t("ai_daily.no_found")}

+
+ ) return ( -
- {content.isLoading ? ( - - ) : content.data ? ( - - {content.data} - - ) : ( -
- -

{t("ai_daily.no_found")}

-
- )} +
+
+ {content.isLoading ? ( + + ) : content.data ? ( + + {content.data} + + ) : null} +
{!!content.data && ( { + const { present } = useModalStack() + const { t } = useTranslation() + + return useCallback(() => { + present({ + content: () => , + title: t("ai_daily.header"), + resizeable: true, + clickOutsideToDismiss: true, + + resizeDefaultSize: { width: 660, height: 450 }, + }) + }, [present, t]) +} diff --git a/apps/renderer/src/modules/ai/ai-daily/hooks.tsx b/apps/renderer/src/modules/ai/ai-daily/useParseDailyDate.tsx similarity index 76% rename from apps/renderer/src/modules/ai/ai-daily/hooks.tsx rename to apps/renderer/src/modules/ai/ai-daily/useParseDailyDate.tsx index 086500cfba..bcd743e311 100644 --- a/apps/renderer/src/modules/ai/ai-daily/hooks.tsx +++ b/apps/renderer/src/modules/ai/ai-daily/useParseDailyDate.tsx @@ -1,10 +1,7 @@ -import { useCallback, useMemo } from "react" +import { useMemo } from "react" import { useTranslation } from "react-i18next" -import { useModalStack } from "~/components/ui/modal" - import { DayOf } from "./constants" -import { FeedDailyModalContent } from "./FeedDailyModalContent" export const useParseDailyDate = (day: DayOf) => { const { t } = useTranslation("common") @@ -62,19 +59,3 @@ export const useParseDailyDate = (day: DayOf) => { return { title, startDate, endDate } }, [day, t]) } - -export const useAIDailyReportModal = () => { - const { present } = useModalStack() - const { t } = useTranslation() - - return useCallback(() => { - present({ - content: () => , - title: t("ai_daily.header"), - resizeable: true, - clickOutsideToDismiss: true, - - resizeDefaultSize: { width: 660, height: 450 }, - }) - }, [present]) -} diff --git a/apps/renderer/src/modules/claim/hooks.ts b/apps/renderer/src/modules/claim/hooks.ts index 27b78139c6..57e0071623 100644 --- a/apps/renderer/src/modules/claim/hooks.ts +++ b/apps/renderer/src/modules/claim/hooks.ts @@ -20,7 +20,6 @@ export const useFeedClaimModal = ({ feedId }: { feedId?: string }) => { present({ title: t("feed_claim_modal.title"), content: () => createElement(FeedClaimModalContent, { feedId }), - modalClassName: "!h-auto !max-h-screen", }) }, [feedId, present]) } diff --git a/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx b/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx index 8338885054..91a243da87 100644 --- a/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx +++ b/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx @@ -13,7 +13,7 @@ import { Button } from "~/components/ui/button" import { CopyButton } from "~/components/ui/code-highlighter" import { Form, FormItem, FormLabel } from "~/components/ui/form" import { Input } from "~/components/ui/input" -import { Markdown } from "~/components/ui/markdown" +import { Markdown } from "~/components/ui/markdown/Markdown" import { useCurrentModal, useIsTopModal, useModalStack } from "~/components/ui/modal" import { Select, diff --git a/apps/renderer/src/modules/discover/form.tsx b/apps/renderer/src/modules/discover/form.tsx index 053cb53084..38bd383497 100644 --- a/apps/renderer/src/modules/discover/form.tsx +++ b/apps/renderer/src/modules/discover/form.tsx @@ -80,7 +80,7 @@ export function DiscoverForm({ type = "search" }: { type?: string }) { mutationFn: async ({ keyword, target }: { keyword: string; target: "feeds" | "lists" }) => { const { data } = await apiClient.discover.$post({ json: { - keyword, + keyword: keyword.trim(), target, }, }) @@ -119,7 +119,7 @@ export function DiscoverForm({ type = "search" }: { type?: string }) { const keyword = form.watch("keyword") useEffect(() => { - const trimmedKeyword = keyword.trim() + const trimmedKeyword = keyword.trimStart() if (!prefix) { form.setValue("keyword", trimmedKeyword) return @@ -342,7 +342,7 @@ const SearchCard: FC<{
- {item.subscriptionCount} + {item.subscriptionCount ?? 0} {" "} Followers
diff --git a/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx b/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx index e6fc95cc49..580d2f8ccd 100644 --- a/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx +++ b/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx @@ -18,12 +18,13 @@ import { useIsOnline } from "~/hooks/common" import { stopPropagation } from "~/lib/dom" import { FeedViewType } from "~/lib/enum" import { cn, getOS, isBizId } from "~/lib/utils" -import { useAIDailyReportModal } from "~/modules/ai/ai-daily/hooks" +import { useAIDailyReportModal } from "~/modules/ai/ai-daily/useAIDailyReportModal" import { EntryHeader } from "~/modules/entry-content/header" import { useRefreshFeedMutation } from "~/queries/feed" import { useFeedById, useFeedHeaderTitle } from "~/store/feed" import { MarkAllReadWithOverlay } from "../components/mark-all-button" +import { TimelineTabs } from "./TimelineTabs" export const EntryListHeader: FC<{ totalCount: number @@ -46,7 +47,7 @@ export const EntryListHeader: FC<{ const titleInfo = !!headerTitle && (
-
+
{headerTitle} @@ -67,17 +68,12 @@ export const EntryListHeader: FC<{ const feed = useFeedById(feedId) const isList = !!listId - const titleStyleBasedView = ["pl-12", "pl-7", "pl-7", "pl-7", "px-5", "pl-12"] - const containerRef = React.useRef(null) return (
{!titleAtBottom && titleInfo} @@ -105,8 +101,8 @@ export const EntryListHeader: FC<{ {view === FeedViewType.Pictures && } - {isOnline ? ( - feed?.ownerUserId === user?.id && + {isOnline && + (feed?.ownerUserId === user?.id && isBizId(routerParams.feedId!) && feed?.type === "feed" ? ( - ) - ) : null} + ))} {!isList && ( <>
{titleAtBottom && titleInfo} +
) } diff --git a/apps/renderer/src/modules/entry-column/layouts/TimelineTabs.tsx b/apps/renderer/src/modules/entry-column/layouts/TimelineTabs.tsx new file mode 100644 index 0000000000..33bcc3d771 --- /dev/null +++ b/apps/renderer/src/modules/entry-column/layouts/TimelineTabs.tsx @@ -0,0 +1,64 @@ +import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs" +import { useNavigateEntry } from "~/hooks/biz/useNavigateEntry" +import { useRouteParams } from "~/hooks/biz/useRouteParams" +import { InboxItem, ListItem } from "~/modules/feed-column/item" +import { useSubscriptionStore } from "~/store/subscription" + +export const TimelineTabs = () => { + const routerParams = useRouteParams() + const { view, listId, inboxId } = routerParams + + const listsData = useSubscriptionStore((state) => + state.feedIdByView[view].map((id) => state.data[id]).filter((s) => "listId" in s), + ) + const inboxData = useSubscriptionStore((state) => + state.feedIdByView[view].map((id) => state.data[id]).filter((s) => "inboxId" in s), + ) + const hasData = listsData.length > 0 || inboxData.length > 0 + + const timeline = listId || inboxId || "" + + const navigate = useNavigateEntry() + if (!hasData) return null + return ( + { + if (!val) { + navigate({ + feedId: null, + entryId: null, + view, + }) + } + }} + > + + + Yours + + {listsData.map((s) => ( + + + + ))} + {inboxData.map((s) => ( + + + + ))} + + + ) +} diff --git a/apps/renderer/src/modules/entry-column/translation.tsx b/apps/renderer/src/modules/entry-column/translation.tsx index 16be390a7f..ba0eb275f3 100644 --- a/apps/renderer/src/modules/entry-column/translation.tsx +++ b/apps/renderer/src/modules/entry-column/translation.tsx @@ -1,6 +1,6 @@ import * as HoverCard from "@radix-ui/react-hover-card" -import { HTML } from "~/components/ui/markdown" +import { HTML } from "~/components/ui/markdown/HTML" import { ScrollArea } from "~/components/ui/scroll-area" import { tooltipStyle } from "~/components/ui/tooltip/styles" import { useMeasure } from "~/hooks/common" diff --git a/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx b/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx index eec0f29bb5..e4ced0f72f 100644 --- a/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx +++ b/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx @@ -28,10 +28,15 @@ import { usePresentUserProfileModal } from "../../profile/hooks" const getLimit = (width: number): number => { const routeParams = getRouteParams() // social media view has four extra buttons - if (routeParams.view === FeedViewType.SocialMedia) { - if (width > 1050) return 15 - if (width > 750) return 10 - return 5 + if ( + [FeedViewType.SocialMedia, FeedViewType.Pictures, FeedViewType.Videos].includes( + routeParams.view, + ) + ) { + if (width > 1100) return 15 + if (width > 950) return 10 + if (width > 800) return 5 + return 3 } if (width > 900) return 15 if (width > 600) return 10 diff --git a/apps/renderer/src/modules/entry-content/hooks.ts b/apps/renderer/src/modules/entry-content/hooks.ts deleted file mode 100644 index 49ae522344..0000000000 --- a/apps/renderer/src/modules/entry-content/hooks.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useContext, useContextSelector } from "use-context-selector" - -import { isDev } from "~/constants" - -import { EntryContentContext } from "./provider" - -export const useEntryContentContext = () => { - const ctx = useContext(EntryContentContext) - if (!ctx && isDev) { - console.error("Notice: EntryContentContext is not provided.", new Error("x").stack) - } - return ctx -} - -export const useEntryContentContextSelector = (selector: (ctx: EntryContentContext) => T) => - useContextSelector(EntryContentContext, selector) diff --git a/apps/renderer/src/modules/entry-content/index.tsx b/apps/renderer/src/modules/entry-content/index.tsx index af94a654f4..4176287bea 100644 --- a/apps/renderer/src/modules/entry-content/index.tsx +++ b/apps/renderer/src/modules/entry-content/index.tsx @@ -18,7 +18,6 @@ import { enableShowSourceContent } from "~/atoms/source-content" import { m } from "~/components/common/Motion" import { ShadowDOM } from "~/components/common/ShadowDOM" import { AutoResizeHeight } from "~/components/ui/auto-resize-height" -import { HTML } from "~/components/ui/markdown" import { Toc } from "~/components/ui/markdown/components/Toc" import { useInPeekModal } from "~/components/ui/modal/inspire/PeekModal" import { RootPortal } from "~/components/ui/portal" @@ -45,6 +44,7 @@ import { useFeedById } from "~/store/feed" import { LoadingWithIcon } from "../../components/ui/loading" import { EntryPlaceholderDaily } from "../ai/ai-daily/EntryPlaceholderDaily" +import { EntryContentHTMLRenderer } from "../renderer/html" import { getTranslationCache, setEntryContentScrollToTop, @@ -57,7 +57,6 @@ import { SourceContentPanel } from "./components/SourceContentView" import { SupportCreator } from "./components/SupportCreator" import { EntryHeader } from "./header" import { EntryContentLoading } from "./loading" -import { EntryContentProvider } from "./provider" export interface EntryContentClassNames { header?: string @@ -217,12 +216,7 @@ export const EntryContentRender: Component<{ } return ( - + <> {!isInReadabilityMode ? ( - {content} - + ) : ( - + )}
@@ -323,7 +320,7 @@ export const EntryContentRender: Component<{
- + ) } @@ -364,9 +361,10 @@ const TitleMetaHandler: Component<{ return null } -const ReadabilityContent = ({ entryId }: { entryId: string }) => { +const ReadabilityContent = ({ entryId, feedId }: { entryId: string; feedId: string }) => { const { t } = useTranslation() const result = useEntryReadabilityContent(entryId) + const view = useRouteParamsSelector((route) => route.view) return (
@@ -382,12 +380,15 @@ const ReadabilityContent = ({ entryId }: { entryId: string }) => {
)} - {result?.content ?? ""} - +
) } diff --git a/apps/renderer/src/modules/feed-column/index.tsx b/apps/renderer/src/modules/feed-column/index.tsx index 98f8ca9ec4..af72926670 100644 --- a/apps/renderer/src/modules/feed-column/index.tsx +++ b/apps/renderer/src/modules/feed-column/index.tsx @@ -7,7 +7,6 @@ import { useCallback, useLayoutEffect, useRef, useState } from "react" import { isHotkeyPressed, useHotkeys } from "react-hotkeys-hook" import { useTranslation } from "react-i18next" -import { getReadonlyRoute } from "~/atoms/route" import { useUISettingKey } from "~/atoms/settings/ui" import { useSidebarActiveView } from "~/atoms/sidebar" import { ActionButton } from "~/components/ui/button" @@ -74,9 +73,7 @@ export function FeedColumn({ children, className }: PropsWithChildren<{ classNam const nextActive = typeof args === "function" ? args(active) : args setActive_(args) - if (getReadonlyRoute().location.pathname.startsWith(Routes.Feeds)) { - navigateBackHome(nextActive) - } + navigateBackHome(nextActive) }, [active, navigateBackHome], ) diff --git a/apps/renderer/src/modules/feed-column/item.tsx b/apps/renderer/src/modules/feed-column/item.tsx index 104dc3a47b..c3fb1916a6 100644 --- a/apps/renderer/src/modules/feed-column/item.tsx +++ b/apps/renderer/src/modules/feed-column/item.tsx @@ -168,7 +168,8 @@ export const FeedItem = memo(FeedItemImpl) const ListItemImpl: Component<{ listId: string view: FeedViewType -}> = ({ view, listId, className }) => { + iconSize?: number +}> = ({ view, listId, className, iconSize = 28 }) => { const list = useListById(listId) const isActive = useRouteParamsSelector((routerParams) => routerParams.listId === listId) @@ -224,7 +225,7 @@ const ListItemImpl: Component<{ }} >
- + {getPreferredTitle(list)} @@ -250,7 +251,8 @@ export const ListItem = memo(ListItemImpl) const InboxItemImpl: Component<{ inboxId: string view: FeedViewType -}> = ({ view, inboxId, className }) => { + iconSize?: number +}> = ({ view, inboxId, className, iconSize = 16 }) => { const inbox = useInboxById(inboxId) const isActive = useRouteParamsSelector((routerParams) => routerParams.inboxId === inboxId) @@ -293,7 +295,7 @@ const InboxItemImpl: Component<{ }} >
- + {getPreferredTitle(inbox)} diff --git a/apps/renderer/src/modules/feed-column/styles.ts b/apps/renderer/src/modules/feed-column/styles.ts index 0f631b6d58..8d72217646 100644 --- a/apps/renderer/src/modules/feed-column/styles.ts +++ b/apps/renderer/src/modules/feed-column/styles.ts @@ -4,6 +4,6 @@ import clsx from "clsx" export const feedColumnStyles = { item: clsx( !IN_ELECTRON && tw`duration-200 hover:bg-theme-item-hover`, - tw`data-[active=true]:!bg-theme-item-active`, + tw`data-[active=true]:bg-theme-item-active`, ), } diff --git a/apps/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx b/apps/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx index 5572acf416..1dd109ca17 100644 --- a/apps/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx +++ b/apps/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx @@ -1,9 +1,9 @@ import { TooltipTrigger } from "@radix-ui/react-tooltip" import { Trans, useTranslation } from "react-i18next" +import { useServerConfigs } from "~/atoms/server-configs" import { Button } from "~/components/ui/button" import { Tooltip, TooltipContent } from "~/components/ui/tooltip" -import { DAILY_CLAIM_AMOUNT } from "~/constants" import { useClaimCheck, useClaimWalletDailyRewardMutation } from "~/queries/wallet" export const ClaimDailyReward = () => { @@ -13,6 +13,8 @@ export const ClaimDailyReward = () => { const check = useClaimCheck() const canClaim = check.data?.data + const serverConfigs = useServerConfigs() + return ( @@ -30,7 +32,7 @@ export const ClaimDailyReward = () => { ) : ( t("wallet.claim.tooltip.alreadyClaimed") diff --git a/apps/renderer/src/modules/power/my-wallet-section/index.tsx b/apps/renderer/src/modules/power/my-wallet-section/index.tsx index ebc2b2e2c0..c7f8db012d 100644 --- a/apps/renderer/src/modules/power/my-wallet-section/index.tsx +++ b/apps/renderer/src/modules/power/my-wallet-section/index.tsx @@ -1,13 +1,14 @@ import { useMutation } from "@tanstack/react-query" import { Trans, useTranslation } from "react-i18next" +import { useServerConfigs } from "~/atoms/server-configs" import { Button } from "~/components/ui/button" import { CopyButton } from "~/components/ui/code-highlighter" import { Divider } from "~/components/ui/divider" import { LoadingWithIcon } from "~/components/ui/loading" import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "~/components/ui/tooltip" import { apiClient } from "~/lib/api-fetch" -import { cn } from "~/lib/utils" +import { cn, getBlockchainExplorerUrl } from "~/lib/utils" import { SettingSectionTitle } from "~/modules/settings/section" import { ActivityPoints } from "~/modules/wallet/activity-points" import { Balance } from "~/modules/wallet/balance" @@ -16,12 +17,16 @@ import { useWallet, wallet as walletActions } from "~/queries/wallet" import { ClaimDailyReward } from "./claim-daily-reward" import { CreateWallet } from "./create-wallet" +import { useRewardDescriptionModal } from "./reward-description-modal" import { WithdrawButton } from "./withdraw" export const MyWalletSection = () => { const { t } = useTranslation("settings") const wallet = useWallet() const myWallet = wallet.data?.[0] + const serverConfigs = useServerConfigs() + + const rewardDescriptionModal = useRewardDescriptionModal() const refreshMutation = useMutation({ mutationFn: async () => { @@ -61,7 +66,7 @@ export const MyWalletSection = () => { ), @@ -71,7 +76,7 @@ export const MyWalletSection = () => { -
- {t("wallet.power.rewardDescription3")} -
+ {serverConfigs?.DISABLE_PERSONAL_DAILY_POWER && ( +
+ {t("wallet.power.rewardDescription3")} +
+ )}
{t("wallet.power.rewardDescription")}
diff --git a/apps/renderer/src/modules/power/my-wallet-section/reward-description-modal.tsx b/apps/renderer/src/modules/power/my-wallet-section/reward-description-modal.tsx new file mode 100644 index 0000000000..02006c8742 --- /dev/null +++ b/apps/renderer/src/modules/power/my-wallet-section/reward-description-modal.tsx @@ -0,0 +1,79 @@ +import { from } from "dnum" +import { useCallback } from "react" +import { useTranslation } from "react-i18next" + +import { useServerConfigs } from "~/atoms/server-configs" +import { useModalStack } from "~/components/ui/modal" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "~/components/ui/table" +import { getLevelMultiplier } from "~/lib/utils" +import { Balance } from "~/modules/wallet/balance" +import { Level } from "~/modules/wallet/level" + +export const useRewardDescriptionModal = () => { + const { present } = useModalStack() + const { t } = useTranslation("settings") + const serverConfigs = useServerConfigs() + + return useCallback(() => { + present({ + content: () => ( +
+
+

{t("wallet.rewardDescription.description1")}

+

1. {t("wallet.rewardDescription.description2")}

+ + + + {t("wallet.rewardDescription.level")} + {t("wallet.rewardDescription.percentage")} + {t("wallet.rewardDescription.reward")} + {t("wallet.rewardDescription.total")} + + + + {serverConfigs?.DAILY_POWER_PERCENTAGES.map((percentage, index) => { + const level = serverConfigs?.DAILY_POWER_PERCENTAGES.length - index - 1 + return ( + + + + + {serverConfigs?.LEVEL_PERCENTAGES[index] * 100}% + {getLevelMultiplier(level)} + + + { + from( + serverConfigs.DAILY_POWER_SUPPLY * + serverConfigs?.DAILY_POWER_PERCENTAGES[level], + 18, + )[0] + } + + + + ) + })} + +
+

2. {t("wallet.rewardDescription.description3")}

+
+
+ ), + title: t("wallet.rewardDescription.title"), + overlay: true, + overlayOptions: { + blur: true, + className: "bg-black/80", + }, + clickOutsideToDismiss: true, + }) + }, [serverConfigs, present, t]) +} diff --git a/apps/renderer/src/modules/power/transaction-section/index.tsx b/apps/renderer/src/modules/power/transaction-section/index.tsx index ea3cd63d27..dda1695d2d 100644 --- a/apps/renderer/src/modules/power/transaction-section/index.tsx +++ b/apps/renderer/src/modules/power/transaction-section/index.tsx @@ -1,6 +1,7 @@ import { useState } from "react" import { useTranslation } from "react-i18next" +import { useServerConfigs } from "~/atoms/server-configs" import { useWhoami } from "~/atoms/user" import { Logo } from "~/components/icons/logo" import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar" @@ -18,7 +19,7 @@ import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs" import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "~/components/ui/tooltip" import { EllipsisHorizontalTextWithTooltip } from "~/components/ui/typography" import { replaceImgUrlIfNeed } from "~/lib/img-proxy" -import { cn } from "~/lib/utils" +import { cn, getBlockchainExplorerUrl } from "~/lib/utils" import { TransactionTypes } from "~/models/types" import { usePresentUserProfileModal } from "~/modules/profile/hooks" import { SettingSectionTitle } from "~/modules/settings/section" @@ -40,11 +41,18 @@ export const TransactionsSection: Component = ({ className }) => { type: type === "all" ? undefined : type, }) + const serverConfigs = useServerConfigs() + if (!myWallet) return null return (
+ {!!transactions.data?.length && ( + + {t("wallet.transactions.more")} + + )} {!transactions.data?.length && ( -
+
{t("wallet.transactions.noTransactions")}
)} diff --git a/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx b/apps/renderer/src/modules/renderer/components/TimeStamp.tsx similarity index 79% rename from apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx rename to apps/renderer/src/modules/renderer/components/TimeStamp.tsx index 7021102859..727db8f245 100644 --- a/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx +++ b/apps/renderer/src/modules/renderer/components/TimeStamp.tsx @@ -1,16 +1,16 @@ +import { useContext } from "react" + import { AudioPlayer } from "~/atoms/player" import { nextFrame } from "~/lib/dom" -import { useEntryContentContext } from "~/modules/entry-content/hooks" import { useEntry } from "~/store/entry" -import { timeStringToSeconds } from "../utils" +import { EntryInfoContext } from "../context" export const TimeStamp = (props: { time: string }) => { - const { entryId, audioSrc: src } = useEntryContentContext() - + const { entryId } = useContext(EntryInfoContext) const entry = useEntry(entryId) const mediaDuration = entry?.entries.attachments?.[0]?.duration_in_seconds - + const src = entry?.entries?.attachments?.[0].url if (!src) return {props.time} const seekTo = timeStringToSeconds(props.time) @@ -89,3 +89,17 @@ const CircleProgress: React.FC = ({ ) } + +function timeStringToSeconds(time: string): number | null { + const timeParts = time.split(":").map(Number) + + if (timeParts.length === 2) { + const [minutes, seconds] = timeParts + return minutes * 60 + seconds + } else if (timeParts.length === 3) { + const [hours, minutes, seconds] = timeParts + return hours * 3600 + minutes * 60 + seconds + } else { + return null + } +} diff --git a/apps/renderer/src/modules/entry-content/provider.tsx b/apps/renderer/src/modules/renderer/context.tsx similarity index 66% rename from apps/renderer/src/modules/entry-content/provider.tsx rename to apps/renderer/src/modules/renderer/context.tsx index 545000aadd..21a9320907 100644 --- a/apps/renderer/src/modules/entry-content/provider.tsx +++ b/apps/renderer/src/modules/renderer/context.tsx @@ -1,3 +1,4 @@ +import { createContext as createReactContext } from "react" import { createContext } from "use-context-selector" import { FeedViewType } from "~/lib/enum" @@ -20,3 +21,13 @@ export const EntryContentContext = createContext(defaultCon export const EntryContentProvider: Component = ({ children, ...value }) => ( {children} ) + +export interface EntryInfoContext { + feedId: string + entryId: string +} +const defaultInfoContextValue: EntryInfoContext = { + feedId: "", + entryId: "", +} +export const EntryInfoContext = createReactContext(defaultInfoContextValue) diff --git a/apps/renderer/src/modules/renderer/html.tsx b/apps/renderer/src/modules/renderer/html.tsx new file mode 100644 index 0000000000..e36755739e --- /dev/null +++ b/apps/renderer/src/modules/renderer/html.tsx @@ -0,0 +1,115 @@ +import { useMemo } from "react" + +import { + MarkdownImageRecordContext, + MarkdownRenderActionContext, +} from "~/components/ui/markdown/context" +import type { HTMLProps } from "~/components/ui/markdown/HTML" +import { HTML } from "~/components/ui/markdown/HTML" +import type { MarkdownImage, MarkdownRenderActions } from "~/components/ui/markdown/types" +import { FeedViewType } from "~/lib/enum" +import { useEntry } from "~/store/entry/hooks" +import { useFeedByIdSelector } from "~/store/feed/hooks" + +import { TimeStamp } from "./components/TimeStamp" +import { EntryInfoContext } from "./context" + +export function EntryContentHTMLRenderer({ + view, + feedId, + entryId, + children, + ...props +}: { + view: FeedViewType + feedId: string + entryId: string + children: Nullable +} & HTMLProps) { + const entry = useEntry(entryId) + + const populatedFullUrl = usePopulatedFullUrl(feedId, entry?.entries.url || void 0) + const images: Record = useMemo(() => { + return ( + entry?.entries.media?.reduce( + (acc, media) => { + if (media.height && media.width) { + acc[media.url] = { + url: media.url, + width: media.width, + height: media.height, + } + } + return acc + }, + {} as Record, + ) ?? {} + ) + }, [entry]) + const actions: MarkdownRenderActions = useMemo(() => { + return { + isAudio() { + return view === FeedViewType.Audios + }, + transformUrl(url) { + return populatedFullUrl ?? url ?? "" + }, + ensureAndRenderTimeStamp, + } + }, [populatedFullUrl, view]) + return ( + + + ({ feedId, entryId }), [feedId, entryId])}> + {/* @ts-expect-error */} + {children} + + + + ) +} + +const safeUrl = (url: string, baseUrl: string) => { + try { + return new URL(url, baseUrl).href + } catch { + return url + } +} +const usePopulatedFullUrl = (feedId: string, relativeUrl?: string) => { + const feedSiteUrl = useFeedByIdSelector(feedId, (feed) => + "siteUrl" in feed ? feed.siteUrl : undefined, + ) + + const populatedFullHref = useMemo(() => { + if (!relativeUrl) return void 0 + + if (relativeUrl.startsWith("http")) return relativeUrl + if (relativeUrl.startsWith("/") && feedSiteUrl) return safeUrl(relativeUrl, feedSiteUrl) + return relativeUrl + }, [feedSiteUrl, relativeUrl]) + + return populatedFullHref +} + +const ensureAndRenderTimeStamp = (children: string) => { + const firstPart = children.replace(" ", " ").split(" ")[0] + // 00:00 , 00:00:00 + if (!firstPart) { + return + } + const isTime = isValidTimeString(firstPart.trim()) + if (isTime) { + return ( + <> + + {children.slice(firstPart.length)} + + ) + } + return false +} +function isValidTimeString(time: string): boolean { + const timeRegex = /^\d{1,2}:[0-5]\d(?::[0-5]\d)?$/ + return timeRegex.test(time) +} diff --git a/apps/renderer/src/modules/settings/modal/layout.tsx b/apps/renderer/src/modules/settings/modal/layout.tsx index f5c09dd7bf..a83b4e6494 100644 --- a/apps/renderer/src/modules/settings/modal/layout.tsx +++ b/apps/renderer/src/modules/settings/modal/layout.tsx @@ -181,9 +181,8 @@ const SettingItemButton = (props: { )} type="button" onClick={() => { - if (!disabled) { - setTab(path) - } else { + setTab(path) + if (disabled) { switch (why) { case DisableWhy.NotActivation: { presentActivationModal() diff --git a/apps/renderer/src/modules/settings/tabs/integration.tsx b/apps/renderer/src/modules/settings/tabs/integration.tsx index 0d54800235..90f61b9da3 100644 --- a/apps/renderer/src/modules/settings/tabs/integration.tsx +++ b/apps/renderer/src/modules/settings/tabs/integration.tsx @@ -7,6 +7,7 @@ import { Divider } from "~/components/ui/divider" import { SimpleIconsEagle, SimpleIconsInstapaper, + SimpleIconsObsidian, SimpleIconsOmnivore, SimpleIconsReadwise, } from "~/components/ui/platform-icon/icons" @@ -151,6 +152,24 @@ export const SettingIntegration = () => { ), }), + { + type: "title", + value: ( + + + {t("integration.obsidian.title")} + + ), + }, + defineSettingItem("enableObsidian", { + label: t("integration.obsidian.enable.label"), + description: t("integration.obsidian.enable.description"), + }), + defineSettingItem("obsidianVaultPath", { + label: t("integration.obsidian.vaultPath.label"), + vertical: true, + description: t("integration.obsidian.vaultPath.description"), + }), BottomTip, ]} diff --git a/apps/renderer/src/modules/settings/tabs/invitations.tsx b/apps/renderer/src/modules/settings/tabs/invitations.tsx index ef44dc0976..d255595bf5 100644 --- a/apps/renderer/src/modules/settings/tabs/invitations.tsx +++ b/apps/renderer/src/modules/settings/tabs/invitations.tsx @@ -3,6 +3,7 @@ import dayjs from "dayjs" import { Trans, useTranslation } from "react-i18next" import { toast } from "sonner" +import { useServerConfigs } from "~/atoms/server-configs" import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar" import { Button } from "~/components/ui/button" import { CopyButton } from "~/components/ui/code-highlighter" @@ -19,7 +20,6 @@ import { TableRow, } from "~/components/ui/table" import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "~/components/ui/tooltip" -import { INVITATION_PRICE } from "~/constants" import { useAuthQuery } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" import { toastFetchError } from "~/lib/error-parser" @@ -35,6 +35,8 @@ export const SettingInvitations = () => { const { present } = useModalStack() const presentUserProfile = usePresentUserProfileModal("drawer") + const serverConfigs = useServerConfigs() + return (
@@ -46,7 +48,7 @@ export const SettingInvitations = () => { void }) => { const newInvitation = useMutation({ mutationKey: ["newInvitation"], mutationFn: () => apiClient.invitations.new.$post(), - async onError(err) { + onError(err) { toastFetchError(err) }, onSuccess(data) { @@ -175,13 +177,15 @@ const ConfirmModalContent = ({ dismiss }: { dismiss: () => void }) => { }, }) + const serverConfigs = useServerConfigs() + return ( <>
, diff --git a/apps/renderer/src/modules/wallet/activity-points.tsx b/apps/renderer/src/modules/wallet/activity-points.tsx index 804defb905..945e0babdf 100644 --- a/apps/renderer/src/modules/wallet/activity-points.tsx +++ b/apps/renderer/src/modules/wallet/activity-points.tsx @@ -14,7 +14,7 @@ export const ActivityPoints = ({
{isLoading ? : points} - x{Math.floor(points / 10)} + {Math.floor(points / 10)}x
) } diff --git a/apps/renderer/src/modules/wallet/level.tsx b/apps/renderer/src/modules/wallet/level.tsx index 9b2e8a3879..3b9505560d 100644 --- a/apps/renderer/src/modules/wallet/level.tsx +++ b/apps/renderer/src/modules/wallet/level.tsx @@ -1,6 +1,4 @@ -import { cn } from "~/lib/utils" - -export const multiples = [0.1, 1, 2, 5, 18] +import { cn, getLevelMultiplier } from "~/lib/utils" export const Level = ({ level, @@ -21,7 +19,9 @@ export const Level = ({ ) : ( <> Lv.{level} - x{multiples[level]} + + {getLevelMultiplier(level)}x + )}
diff --git a/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx b/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx index e07c996c6b..b841ead2b9 100644 --- a/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx +++ b/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx @@ -2,7 +2,11 @@ import { createElement } from "react" import { useTranslation } from "react-i18next" import { useSearchParams } from "react-router-dom" +import { useUserRole } from "~/atoms/user" import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs" +import { UserRole } from "~/lib/enum" +import { cn } from "~/lib/utils" +import { useActivationModal } from "~/modules/activation" import { DiscoverForm } from "~/modules/discover/form" import { DiscoverImport } from "~/modules/discover/import" import { DiscoverInboxList } from "~/modules/discover/inbox-list-form" @@ -17,7 +21,7 @@ import { useSubViewTitle } from "../hooks" const tabs: { name: I18nKeys value: string - disabled?: boolean + disableForTrial?: boolean }[] = [ { name: "words.search", @@ -34,6 +38,7 @@ const tabs: { { name: "words.inbox", value: "inbox", + disableForTrial: true, }, { name: "words.rss3", @@ -58,6 +63,17 @@ export function Component() { const { t } = useTranslation() useSubViewTitle("words.discover") + const presentActivationModal = useActivationModal() + const role = useUserRole() + + const currentTabs = tabs.map((tab) => { + const disabled = tab.disableForTrial && role === UserRole.Trial + return { + ...tab, + disabled, + } + }) + return (
{t("words.discover")}
@@ -71,19 +87,30 @@ export function Component() { }} > - {tabs.map((tab) => ( - + {currentTabs.map((tab) => ( + { + if (tab.disabled) { + presentActivationModal() + } + }} + > {t(tab.name)} ))} - + - {tabs.map((tab) => ( + {currentTabs.map((tab) => ( - {createElement(TabComponent[tab.value] || TabComponent.default, { - type: tab.value, - })} +
+ {createElement(TabComponent[tab.value] || TabComponent.default, { + type: tab.value, + })} +
))} diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index 52c494b0a5..26113fbe2a 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -3,7 +3,8 @@ import { repository } from "@pkg" import { Slot } from "@radix-ui/react-slot" import { throttle } from "lodash-es" import type { PropsWithChildren } from "react" -import React, { forwardRef, useEffect, useRef, useState } from "react" +import * as React from "react" +import { forwardRef, useEffect, useRef, useState } from "react" import { useHotkeys } from "react-hotkeys-hook" import { Trans, useTranslation } from "react-i18next" import { useResizable } from "react-resizable-layout" diff --git a/apps/renderer/src/providers/root-providers.tsx b/apps/renderer/src/providers/root-providers.tsx index 9b357e3a76..c98d2cf16e 100644 --- a/apps/renderer/src/providers/root-providers.tsx +++ b/apps/renderer/src/providers/root-providers.tsx @@ -23,6 +23,7 @@ import { LazyModalStackProvider, // specific import should add `index` postfix } from "./lazy/index" +import { ServerConfigsProvider } from "./server-configs-provider" import { SettingSync } from "./setting-sync" import { StableRouterProvider } from "./stable-router-provider" import { UserProvider } from "./user-provider" @@ -44,6 +45,7 @@ export const RootProviders: FC = ({ children }) => ( + diff --git a/apps/renderer/src/providers/server-configs-provider.tsx b/apps/renderer/src/providers/server-configs-provider.tsx new file mode 100644 index 0000000000..112acc5549 --- /dev/null +++ b/apps/renderer/src/providers/server-configs-provider.tsx @@ -0,0 +1,15 @@ +import { useEffect } from "react" + +import { setServerConfigs } from "~/atoms/server-configs" +import { useServerConfigsQuery } from "~/queries/server-configs" + +export const ServerConfigsProvider = () => { + const serverConfigs = useServerConfigsQuery() + + useEffect(() => { + if (!serverConfigs) return + setServerConfigs(serverConfigs) + }, [serverConfigs]) + + return null +} diff --git a/apps/renderer/src/queries/server-configs.ts b/apps/renderer/src/queries/server-configs.ts new file mode 100644 index 0000000000..108341586c --- /dev/null +++ b/apps/renderer/src/queries/server-configs.ts @@ -0,0 +1,12 @@ +import { useAuthQuery } from "~/hooks/common" +import { apiClient } from "~/lib/api-fetch" +import { defineQuery } from "~/lib/defineQuery" + +export const serverConfigs = { + get: () => defineQuery(["server-configs"], async () => await apiClient.status.configs.$get()), +} + +export const useServerConfigsQuery = () => { + const { data } = useAuthQuery(serverConfigs.get()) + return data?.data +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 1760cea04b..f1921f91ba 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -28,13 +28,8 @@ export default defineConfig( "require-await": "off", "@typescript-eslint/require-await": "warn", "@typescript-eslint/await-thenable": "warn", - "@typescript-eslint/no-floating-promises": "warn", - "@typescript-eslint/no-misused-promises": [ - "warn", - { - checksVoidReturn: { arguments: false, attributes: false }, - }, - ], + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-misused-promises": "off", }, }, { @@ -47,12 +42,9 @@ export default defineConfig( "no-debug": noDebug, }, rules: { - "@typescript-eslint/no-floating-promises": "off", "no-debug/no-debug-stack": "error", - "unicorn/prefer-math-trunc": "off", "@eslint-react/no-clone-element": 0, "@eslint-react/hooks-extra/no-direct-set-state-in-use-effect": 0, - "@typescript-eslint/no-misused-promises": 0, // NOTE: Disable this temporarily "react-compiler/react-compiler": 0, "no-restricted-syntax": 0, diff --git a/locales/app/ar-DZ.json b/locales/app/ar-DZ.json index 4a57067e38..04eb81068d 100644 --- a/locales/app/ar-DZ.json +++ b/locales/app/ar-DZ.json @@ -17,15 +17,18 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل في الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل في الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل في الحفظ إلى Obsidian.", "entry_actions.failed_to_save_to_readwise": "فشل في الحفظ إلى Readwise.", "entry_actions.mark_as_read": "تحديد كمقروء", "entry_actions.mark_as_unread": "تحديد كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ إلى Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", + "entry_actions.saved_to_obsidian": "تم الحفظ إلى Obsidian.", "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "تمييز بنجمة", diff --git a/locales/app/ar-IQ.json b/locales/app/ar-IQ.json index 98d12b9f99..49b2357d28 100644 --- a/locales/app/ar-IQ.json +++ b/locales/app/ar-IQ.json @@ -17,15 +17,18 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل في الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل في الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل في الحفظ إلى Obsidian.", "entry_actions.failed_to_save_to_readwise": "فشل في الحفظ إلى Readwise.", "entry_actions.mark_as_read": "تحديد كمقروء", "entry_actions.mark_as_unread": "تحديد كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ إلى Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", + "entry_actions.saved_to_obsidian": "تم الحفظ إلى Obsidian.", "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "إضافة إلى المفضلة", diff --git a/locales/app/ar-KW.json b/locales/app/ar-KW.json index 6b6271848e..4913cd44db 100644 --- a/locales/app/ar-KW.json +++ b/locales/app/ar-KW.json @@ -17,15 +17,18 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل في الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل في الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل في الحفظ إلى Obsidian", "entry_actions.failed_to_save_to_readwise": "فشل في الحفظ إلى Readwise.", "entry_actions.mark_as_read": "وضع علامة كمقروء", "entry_actions.mark_as_unread": "وضع علامة كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ إلى Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", + "entry_actions.saved_to_obsidian": "تم الحفظ إلى Obsidian.", "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "تفضيل", diff --git a/locales/app/ar-MA.json b/locales/app/ar-MA.json index d2c58f31eb..83a9676d73 100644 --- a/locales/app/ar-MA.json +++ b/locales/app/ar-MA.json @@ -17,16 +17,19 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل الحفظ في Obsidian", "entry_actions.failed_to_save_to_readwise": "فشل الحفظ إلى Readwise.", "entry_actions.mark_as_read": "وضع علامة كمقروء", "entry_actions.mark_as_unread": "وضع علامة كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ في Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", - "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", + "entry_actions.saved_to_obsidian": "تم الحفظ في Obsidian", + "entry_actions.saved_to_readwise": "تم الحفظ في Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "إضافة إلى المفضلة", "entry_actions.starred": "مضاف إلى المفضلة.", diff --git a/locales/app/de.json b/locales/app/de.json index 1c85f4d7c5..5fbdc871ef 100644 --- a/locales/app/de.json +++ b/locales/app/de.json @@ -17,15 +17,18 @@ "entry_actions.copy_link": "Link kopieren", "entry_actions.failed_to_save_to_eagle": "Speichern in Eagle fehlgeschlagen.", "entry_actions.failed_to_save_to_instapaper": "Speichern in Instapaper fehlgeschlagen.", + "entry_actions.failed_to_save_to_obsidian": "Speichern in Obsidian fehlgeschlagen", "entry_actions.failed_to_save_to_readwise": "Speichern in Readwise fehlgeschlagen.", "entry_actions.mark_as_read": "Als gelesen markieren", "entry_actions.mark_as_unread": "Als ungelesen markieren", "entry_actions.open_in_browser": "Im Browser öffnen", "entry_actions.save_media_to_eagle": "Medien in Eagle speichern", "entry_actions.save_to_instapaper": "In Instapaper speichern", + "entry_actions.save_to_obsidian": "In Obsidian speichern", "entry_actions.save_to_readwise": "In Readwise speichern", "entry_actions.saved_to_eagle": "In Eagle gespeichert.", "entry_actions.saved_to_instapaper": "In Instapaper gespeichert.", + "entry_actions.saved_to_obsidian": "In Obsidian gespeichert", "entry_actions.saved_to_readwise": "In Readwise gespeichert.", "entry_actions.share": "Teilen", "entry_actions.star": "Favorisieren", diff --git a/locales/app/en.json b/locales/app/en.json index ef0224cf2d..4b6a606871 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -4,7 +4,7 @@ "achievement.first_claim_feed_description": "You own your feed on Follow", "achievement.mint_more_power": "Be a hardcore player and earn more ", "activation.activate": "Activate", - "activation.description": "During the public beta, users who have not used their activation code can only use some of the features.", + "activation.description": "During the public beta phase, current feature is limited for inactive users.", "activation.title": "Invitation Code", "ai_daily.header": "AI Daily Report", "ai_daily.no_found": "No AI news found for this period.", @@ -59,6 +59,7 @@ "entry_actions.copy_title": "Copy Title", "entry_actions.failed_to_save_to_eagle": "Failed to save to Eagle.", "entry_actions.failed_to_save_to_instapaper": "Failed to save to Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "Failed to save to Obsidian", "entry_actions.failed_to_save_to_omnivore": "Failed to save to Omnivore.", "entry_actions.failed_to_save_to_readwise": "Failed to save to Readwise.", "entry_actions.mark_as_read": "Mark as Read", @@ -67,10 +68,12 @@ "entry_actions.recent_reader": "Recent reader:", "entry_actions.save_media_to_eagle": "Save Media To Eagle", "entry_actions.save_to_instapaper": "Save To Instapaper", + "entry_actions.save_to_obsidian": "Save to Obsidian", "entry_actions.save_to_omnivore": "Save To Omnivore", "entry_actions.save_to_readwise": "Save To Readwise", "entry_actions.saved_to_eagle": "Saved To Eagle.", "entry_actions.saved_to_instapaper": "Saved To Instapaper.", + "entry_actions.saved_to_obsidian": "Saved to Obsidian", "entry_actions.saved_to_omnivore": "Saved To Omnivore.", "entry_actions.saved_to_readwise": "Saved To Readwise.", "entry_actions.share": "Share", diff --git a/locales/app/es.json b/locales/app/es.json index 4d51fd0779..4fe26cad13 100644 --- a/locales/app/es.json +++ b/locales/app/es.json @@ -15,12 +15,15 @@ "discover.rss_url": "RSS URL", "discover.select_placeholder": "Seleccionar", "entry_actions.copy_link": "Copiar enlace", + "entry_actions.failed_to_save_to_obsidian": "Error al guardar en Obsidian", "entry_actions.mark_as_read": "Marcar como leído", "entry_actions.mark_as_unread": "Marcar como no leído", "entry_actions.open_in_browser": "Abrir en el navegador", "entry_actions.save_media_to_eagle": "Guardar medios en Eagle", "entry_actions.save_to_instapaper": "Guardar en Instapaper", + "entry_actions.save_to_obsidian": "Guardar en Obsidian", "entry_actions.save_to_readwise": "Guardar en Readwise", + "entry_actions.saved_to_obsidian": "Guardado en Obsidian", "entry_actions.share": "Compartir", "entry_actions.star": "Agregar a favoritos", "entry_actions.tip": "Dar propina", diff --git a/locales/app/zh-CN.json b/locales/app/zh-CN.json index 24a3afbc9d..6b57aac6b4 100644 --- a/locales/app/zh-CN.json +++ b/locales/app/zh-CN.json @@ -55,6 +55,7 @@ "entry_actions.copy_title": "复制标题", "entry_actions.failed_to_save_to_eagle": "保存到 Eagle 失败", "entry_actions.failed_to_save_to_instapaper": "保存到 Instapaper 失败", + "entry_actions.failed_to_save_to_obsidian": "保存到 Obsidian 失败", "entry_actions.failed_to_save_to_omnivore": "保存到 Omnivore 失败", "entry_actions.failed_to_save_to_readwise": "保存到 Readwise 失败", "entry_actions.mark_as_read": "标记为已读", @@ -63,10 +64,12 @@ "entry_actions.recent_reader": "最近阅读者:", "entry_actions.save_media_to_eagle": "保存到 Eagle", "entry_actions.save_to_instapaper": "保存到 Instapaper", + "entry_actions.save_to_obsidian": "保存到 Obsidian", "entry_actions.save_to_omnivore": "保存到 Omnivore", "entry_actions.save_to_readwise": "保存到 Readwise", "entry_actions.saved_to_eagle": "保存到 Eagle", "entry_actions.saved_to_instapaper": "保存到 Instapaper.", + "entry_actions.saved_to_obsidian": "已保存到 Obsidian", "entry_actions.saved_to_omnivore": "保存到 Omnivore.", "entry_actions.saved_to_readwise": "保存到 Readwise.", "entry_actions.share": "分享", diff --git a/locales/app/zh-HK.json b/locales/app/zh-HK.json index bedbae4ce8..1ea7260767 100644 --- a/locales/app/zh-HK.json +++ b/locales/app/zh-HK.json @@ -55,6 +55,7 @@ "entry_actions.copy_title": "複製標題", "entry_actions.failed_to_save_to_eagle": "無法保存至 Eagle", "entry_actions.failed_to_save_to_instapaper": "無法保存至 Instapaper", + "entry_actions.failed_to_save_to_obsidian": "儲存至 Obsidian 失敗", "entry_actions.failed_to_save_to_omnivore": "無法保存至 Omnivore", "entry_actions.failed_to_save_to_readwise": "無法保存至 Readwise", "entry_actions.mark_as_read": "標記為已讀", @@ -63,12 +64,14 @@ "entry_actions.recent_reader": "最近閱讀者:", "entry_actions.save_media_to_eagle": "保存媒體至 Eagle", "entry_actions.save_to_instapaper": "保存至 Instapaper", + "entry_actions.save_to_obsidian": "儲存至 Obsidian", "entry_actions.save_to_omnivore": "保存至 Omnivore", - "entry_actions.save_to_readwise": "保存至 Readwise", + "entry_actions.save_to_readwise": "儲存至 Readwise", "entry_actions.saved_to_eagle": "已保存至 Eagle", "entry_actions.saved_to_instapaper": "已保存至 Instapaper", + "entry_actions.saved_to_obsidian": "已儲存至 Obsidian", "entry_actions.saved_to_omnivore": "已保存至 Omnivore", - "entry_actions.saved_to_readwise": "已保存至 Readwise", + "entry_actions.saved_to_readwise": "已儲存至 Readwise", "entry_actions.share": "分享", "entry_actions.star": "收藏", "entry_actions.starred": "已收藏", @@ -197,7 +200,7 @@ "sidebar.add_more_feeds": "添加訂閱源", "sidebar.category_remove_dialog.cancel": "取消", "sidebar.category_remove_dialog.continue": "繼續", - "sidebar.category_remove_dialog.description": "此操作將刪除你的分類,但其中的訂閱源將保留並按網站分組。", + "sidebar.category_remove_dialog.description": "此操作將刪除你的分類,但其中的訂閱源將留並按網站分組。", "sidebar.category_remove_dialog.title": "刪除分類", "sidebar.feed_actions.claim": "認領", "sidebar.feed_actions.claim_feed": "認領訂閱源", diff --git a/locales/app/zh-TW.json b/locales/app/zh-TW.json index ba3cba4be2..f05cac3719 100644 --- a/locales/app/zh-TW.json +++ b/locales/app/zh-TW.json @@ -55,6 +55,7 @@ "entry_actions.copy_title": "複製標題", "entry_actions.failed_to_save_to_eagle": "無法儲存到 Eagle。", "entry_actions.failed_to_save_to_instapaper": "無法儲存到 Instapaper。", + "entry_actions.failed_to_save_to_obsidian": "儲存到 Obsidian 失敗", "entry_actions.failed_to_save_to_omnivore": "無法儲存到 Omnivore。", "entry_actions.failed_to_save_to_readwise": "無法儲存到 Readwise。", "entry_actions.mark_as_read": "標記為已讀", @@ -63,10 +64,12 @@ "entry_actions.recent_reader": "最近閲讀者:", "entry_actions.save_media_to_eagle": "儲存媒體至 Eagle", "entry_actions.save_to_instapaper": "儲存到 Instapaper", + "entry_actions.save_to_obsidian": "儲存到 Obsidian", "entry_actions.save_to_omnivore": "儲存到 Omnivore", "entry_actions.save_to_readwise": "儲存到 Readwise", "entry_actions.saved_to_eagle": "已儲存至 Eagle。", "entry_actions.saved_to_instapaper": "已儲存至 Instapaper。", + "entry_actions.saved_to_obsidian": "已儲存到 Obsidian", "entry_actions.saved_to_omnivore": "已儲存至 Omnivore。", "entry_actions.saved_to_readwise": "已儲存至 Readwise。", "entry_actions.share": "分享", diff --git a/locales/settings/ar-DZ.json b/locales/settings/ar-DZ.json index 1cde8829eb..f5d2e7176c 100644 --- a/locales/settings/ar-DZ.json +++ b/locales/settings/ar-DZ.json @@ -109,6 +109,11 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ إلى Obsidian' عند توفره.", + "integration.obsidian.enable.label": "تمكين", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار إلى خزنة Obsidian الخاصة بك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' عند توفره.", "integration.readwise.enable.label": "تمكين", "integration.readwise.title": "Readwise", diff --git a/locales/settings/ar-IQ.json b/locales/settings/ar-IQ.json index f28350e614..14226a1e24 100644 --- a/locales/settings/ar-IQ.json +++ b/locales/settings/ar-IQ.json @@ -115,6 +115,11 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ إلى Obsidian' عند توفره.", + "integration.obsidian.enable.label": "تمكين", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار إلى خزنة Obsidian الخاصة بك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' عند توفره.", "integration.readwise.enable.label": "تمكين", "integration.readwise.title": "Readwise", diff --git a/locales/settings/ar-KW.json b/locales/settings/ar-KW.json index 336338690c..f378441671 100644 --- a/locales/settings/ar-KW.json +++ b/locales/settings/ar-KW.json @@ -115,6 +115,11 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ إلى Obsidian' عند توفره.", + "integration.obsidian.enable.label": "تمكين", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار إلى خزنة Obsidian الخاصة بك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' عند توفره.", "integration.readwise.enable.label": "تمكين", "integration.readwise.title": "Readwise", diff --git a/locales/settings/ar-MA.json b/locales/settings/ar-MA.json index 95146c6570..c15e4203aa 100644 --- a/locales/settings/ar-MA.json +++ b/locales/settings/ar-MA.json @@ -109,11 +109,16 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ في Obsidian' إلا كان متوفر.", + "integration.obsidian.enable.label": "تشغيل", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار لخزنة Obsidian ديالك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' إلا كان متوفر.", "integration.readwise.enable.label": "تشغيل", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "يمكنك الحصول عليه هنا: ", - "integration.readwise.token.label": "رمز الوصول إلى Readwise", + "integration.readwise.token.label": "رمز الوصول لـ Readwise", "integration.sidebar_title": "التكامل", "integration.tip": "نصيحة: البيانات الحساسة ديالك كتحفظ محليا وما كتترفعش للسيرفر.", "integration.title": "التكامل", diff --git a/locales/settings/de.json b/locales/settings/de.json index e1595ddfce..d96476bb96 100644 --- a/locales/settings/de.json +++ b/locales/settings/de.json @@ -121,6 +121,11 @@ "integration.instapaper.password.label": "Instapaper Passwort", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper Benutzername", + "integration.obsidian.enable.description": "Zeige den Button „In Obsidian speichern, wenn erfügbar.", + "integration.obsidian.enable.label": "Aktivieren", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "Der Pfad zu Ihrem Obsidian Vault.", + "integration.obsidian.vaultPath.label": "Obsidian Vault-Pfad", "integration.readwise.enable.description": "Zeige den Button „Zu Readwise speichern“, wenn verfügbar.", "integration.readwise.enable.label": "Aktivieren", "integration.readwise.title": "Readwise", diff --git a/locales/settings/en.json b/locales/settings/en.json index 43e2a952e9..c625184e0a 100644 --- a/locales/settings/en.json +++ b/locales/settings/en.json @@ -129,6 +129,11 @@ "integration.instapaper.password.label": "Instapaper Password", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper Username", + "integration.obsidian.enable.description": "Display 'Save to Obsidian' button when available.", + "integration.obsidian.enable.label": "Enable", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "The path to your Obsidian vault.", + "integration.obsidian.vaultPath.label": "Obsidian Vault Path", "integration.omnivore.enable.description": "Display 'Save to Omnivore' button when available.", "integration.omnivore.enable.label": "Enable", "integration.omnivore.endpoint.description": "Omnivore Official Endpoint is: ", @@ -240,10 +245,20 @@ "wallet.ranking.power": "Power", "wallet.ranking.rank": "Rank", "wallet.ranking.title": "Power Ranking", + "wallet.rewardDescription.description1": "The daily rewards for each user are based on two factors: user level and user activity points.", + "wallet.rewardDescription.description2": "User level: Determined by the user's Power ranking compared to all other users.", + "wallet.rewardDescription.description3": "User Activity: Engaging with various Follow features can boost activity. Rewards range from a minimum of 1x to a maximum of 10x.", + "wallet.rewardDescription.level": "User Level", + "wallet.rewardDescription.percentage": "Ranking Percentage", + "wallet.rewardDescription.reward": "Reward Multiplier", + "wallet.rewardDescription.title": "Reward Description", + "wallet.rewardDescription.total": "Total Reward Per Day", "wallet.sidebar_title": "Power", "wallet.transactions.amount": "Amount", "wallet.transactions.date": "Date", + "wallet.transactions.description": "Certain transactions incur a {{percentage}}% platform fee to support Follow go further. For details, please refer to the blockchain transaction.", "wallet.transactions.from": "From", + "wallet.transactions.more": "View more through the blockchain explorer.", "wallet.transactions.noTransactions": "No transactions", "wallet.transactions.title": "Transactions", "wallet.transactions.to": "To", diff --git a/locales/settings/es.json b/locales/settings/es.json index 73d99acca1..707edd8923 100644 --- a/locales/settings/es.json +++ b/locales/settings/es.json @@ -109,6 +109,11 @@ "integration.instapaper.password.label": "Contraseña de Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Usuario de Instapaper", + "integration.obsidian.enable.description": "Mostrar el botón 'Guardar en Obsidian' cuando esté disponible.", + "integration.obsidian.enable.label": "Habilitar", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "La ruta a tu bóveda de Obsidian.", + "integration.obsidian.vaultPath.label": "Ruta de la bóveda de Obsidian", "integration.readwise.enable.description": "Mostrar el botón 'Guardar en Readwise' cuando esté disponible.", "integration.readwise.enable.label": "Habilitar", "integration.readwise.title": "Readwise", diff --git a/locales/settings/zh-CN.json b/locales/settings/zh-CN.json index 48f880d8aa..d95682706a 100644 --- a/locales/settings/zh-CN.json +++ b/locales/settings/zh-CN.json @@ -128,6 +128,11 @@ "integration.instapaper.password.label": "密码", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 用户名", + "integration.obsidian.enable.description": "显示保存到Obsidian按钮(如果可用)", + "integration.obsidian.enable.label": "启用", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "你的 Obsidian 仓库的路径", + "integration.obsidian.vaultPath.label": "Obsidian 仓库路径", "integration.omnivore.enable.description": "显示\"保存到 Omnivore\"按钮(如果可用)", "integration.omnivore.enable.label": "启用", "integration.omnivore.endpoint.description": "Omnivore 官方接口", diff --git a/locales/settings/zh-HK.json b/locales/settings/zh-HK.json index 8a3ed6e724..f8f6445c5e 100644 --- a/locales/settings/zh-HK.json +++ b/locales/settings/zh-HK.json @@ -128,6 +128,11 @@ "integration.instapaper.password.label": "Instapaper 密碼", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 用戶名", + "integration.obsidian.enable.description": "顯示「儲存至 Obsidian」按鈕(如果可用)", + "integration.obsidian.enable.label": "啟用", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "你的 Obsidian 儲存庫的路徑", + "integration.obsidian.vaultPath.label": "Obsidian 儲存庫路徑", "integration.omnivore.enable.description": "顯示\"保存到 Omnivore\"按钮(如果可用)。", "integration.omnivore.enable.label": "啟用", "integration.omnivore.endpoint.description": "Omnivore 官方端口", diff --git a/locales/settings/zh-TW.json b/locales/settings/zh-TW.json index 2a37219d1b..a2e965b163 100644 --- a/locales/settings/zh-TW.json +++ b/locales/settings/zh-TW.json @@ -125,11 +125,16 @@ "integration.instapaper.password.label": "密碼", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 使用者", + "integration.obsidian.enable.description": "顯示「儲存到 Obsidian」按鈕(如果可用)", + "integration.obsidian.enable.label": "啟用", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "您的 Obsidian 儲存庫的路徑", + "integration.obsidian.vaultPath.label": "Obsidian 儲存庫路徑", "integration.readwise.enable.description": "顯示「儲存到 Readwise」按钮(如果可用)。", "integration.readwise.enable.label": "啟用", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "您可以在這裡取得", - "integration.readwise.token.label": "Readwise 存取令牌", + "integration.readwise.token.label": "Readwise 令牌", "integration.sidebar_title": "整合功能", "integration.tip": "提示:您的敏感資料儲存於本機,不會上傳到伺服器。", "integration.title": "整合功能", diff --git a/package.json b/package.json index b48507064e..40df62b258 100644 --- a/package.json +++ b/package.json @@ -77,8 +77,8 @@ "electron-devtools-installer": "3.2.0", "electron-packager-languages": "0.5.0", "electron-vite": "^2.3.0", - "eslint": "^9.12.0", - "eslint-config-hyoban": "^3.1.10", + "eslint": "^9.13.0", + "eslint-config-hyoban": "^3.1.11", "fake-indexeddb": "6.0.0", "happy-dom": "15.7.4", "hono": "4.6.5", diff --git a/packages/shared/src/env.ts b/packages/shared/src/env.ts index e66d2bbf00..effc347b56 100644 --- a/packages/shared/src/env.ts +++ b/packages/shared/src/env.ts @@ -13,10 +13,8 @@ export const env = createEnv({ VITE_FIREBASE_CONFIG: z.string().optional(), // For external, use api_url if you don't want to fill it in. VITE_EXTERNAL_API_URL: z.string().optional(), - VITE_OPENPANEL_CLIENT_ID: z.string(), - VITE_OPENPANEL_API_URL: z.string().url(), - - VITE_POSTHOG_KEY: z.string().optional(), + VITE_OPENPANEL_CLIENT_ID: z.string().optional(), + VITE_OPENPANEL_API_URL: z.string().url().optional(), }, emptyStringAsUndefined: true, diff --git a/packages/shared/src/hono.ts b/packages/shared/src/hono.ts index 793ff12e9c..8448dca6f1 100644 --- a/packages/shared/src/hono.ts +++ b/packages/shared/src/hono.ts @@ -4431,6 +4431,37 @@ declare const levelsRelations: drizzle_orm.Relations<"levels", { }>; declare const _routes: hono_hono_base.HonoBase=16.0.0} - '@eslint-react/ast@1.15.0': - resolution: {integrity: sha512-7rOLLfGER82FQJy7pCFNs4j/47RYTEiPDfMFGAu4W7yerJrvU2rRNqjSwwm1Iq0DrrasBV8a3IVtPYQoDOqycg==} + '@eslint-react/ast@1.15.1-beta.3': + resolution: {integrity: sha512-ECcFPPhmlbFQpe23HgmxtSUEfr/h3Xjvx/eFyMgvWfKFv4Hb9njJNIb6oAd8Y4SgkA8EFGEUkIXAnFjQ2yypdQ==} - '@eslint-react/core@1.15.0': - resolution: {integrity: sha512-T7KirkdempegOxQznW1xclZtv5hQRChgbeYqisPRENkNg90w3uY7ia5iPf6FEZntkja/NF00VUnUetIw4rO0og==} + '@eslint-react/core@1.15.1-beta.3': + resolution: {integrity: sha512-WzeiBdEiscp6dOe5CALG68+b+2gFOi1FsZQfD1L3xxbo5fzvzRheUox02T2tgmamj+IIURjKfxI/UOJ359rDBg==} - '@eslint-react/eslint-plugin@1.15.0': - resolution: {integrity: sha512-5cuu7gNBgwQwgDX1YJugL7ujay0NT27g3UN0qtJAON9WLBv/ESq+qLMxddGwPSljV/XGxhwbbys09Jgww/fy8A==} + '@eslint-react/eslint-plugin@1.15.1-beta.3': + resolution: {integrity: sha512-NcbXAEm49d7+xSWdIgJLt6xn8r5uXJLOB0gND4vzFux3at0JBUs3BZ2OQ7Z9lZ0wYJ7fUGG1GAtan4KvkB+dbA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2259,20 +2250,20 @@ packages: typescript: optional: true - '@eslint-react/jsx@1.15.0': - resolution: {integrity: sha512-VZy8RWPx+2PUuBKaXPtu2qWnWN9SpkdgY3ohkZoGdoqkEYkYaXjvABNByQLwvk2+Ewqt0K+1f8r7QoQi47pQmw==} + '@eslint-react/jsx@1.15.1-beta.3': + resolution: {integrity: sha512-+8Cgpi2PWtNaikHuBx0T+0Fvd8R8AzxndxPvsGzwGDjuIALF695C7c7E05h/x3208u8Bqx3HiAEenk9PxcmN6A==} - '@eslint-react/shared@1.15.0': - resolution: {integrity: sha512-LRgcKKhNePEJzuwICe3rgUC5KVd4ZhlKys91gMxmUob3RCiUj4BjfAURJMqzwsPGF32WQeHkipw1hWNGpQNdlw==} + '@eslint-react/shared@1.15.1-beta.3': + resolution: {integrity: sha512-c8ChS+Bq2sET9+5m6z22mZ31y97CDh6GE/WcvYFgCuR7jort3K2MMKPXeLkpDQBA1f8ZnxnlsE1EILtTW+cnJA==} - '@eslint-react/tools@1.15.0': - resolution: {integrity: sha512-zdd2K3EV2tWaCzNH60wD159HuX904kWzv+X87yqzZ0Nf2OBUDJ4a561NoDX3Pn8A3E6hFdu666zpIGdeaej9eg==} + '@eslint-react/tools@1.15.1-beta.3': + resolution: {integrity: sha512-vS3iEcRQtIbo89q19zhAXwyr8Liu1g2H+AhuherFhPAV/bEA51sgRWSbp6SUbfWl1z4lofGNjOXsjkKHwCNZZg==} - '@eslint-react/types@1.15.0': - resolution: {integrity: sha512-bajL6xIUxZp36fezn5HEhQpL0eJM923hwfRj6cym2Xl0Jn2YgahSztHorsOpId71MYBgn9ERy9yXItcnrz0rsQ==} + '@eslint-react/types@1.15.1-beta.3': + resolution: {integrity: sha512-dErm/tOIJOof8pUsvOTZyJBXMcZGFcoLZIARLeHgiWcTUInH4FHR9UwEP4J+/Zbg0Q5//lxrXUyhTtxYnMf/9A==} - '@eslint-react/var@1.15.0': - resolution: {integrity: sha512-/QycKnbgZRygM/lhHtUFQrvvrswdOyaXfVxwtIFVEYoPHP9q7NaUn0mrBu4VWkXQC9zPk1nWQeC3rZMUxzretg==} + '@eslint-react/var@1.15.1-beta.3': + resolution: {integrity: sha512-01eZTk83DD1ZURIARhf/8WnxeyfXghEV+xAevzMV9YqdwUh6fyXcmIiEa1AGrY5kLDuQteIiPlvkmzMU7G6gWg==} '@eslint/compat@1.1.1': resolution: {integrity: sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==} @@ -2282,8 +2273,8 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.6.0': - resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': @@ -2294,6 +2285,10 @@ packages: resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.13.0': + resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2624,6 +2619,12 @@ packages: resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} engines: {node: '>=10.13.0'} + '@hyoban/eslint-plugin-import-x@4.3.1': + resolution: {integrity: sha512-FrpPz29GL9ayOtKttcWjUpDNxSDe3b3pk9AAYuWNrM1lMhpDNaZ6ImCmI8Cjza9hWoyUfuyBM9oCAdz4opXD0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@iconify-json/logos@1.2.3': resolution: {integrity: sha512-JLHS5hgZP1b55EONAWNeqBUuriRfRNKWXK4cqYx0PpVaJfIIMiiMxFfvoQiX/bkE9XgkLhcKmDUqL3LXPdXPwQ==} @@ -4355,8 +4356,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.8.1': - resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + '@typescript-eslint/eslint-plugin@8.10.0': + resolution: {integrity: sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -4366,37 +4367,22 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.9.0': - resolution: {integrity: sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==} + '@typescript-eslint/parser@8.10.0': + resolution: {integrity: sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@8.8.1': - resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@8.8.1': - resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.9.0': - resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==} + '@typescript-eslint/scope-manager@8.10.0': + resolution: {integrity: sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.8.1': - resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + '@typescript-eslint/type-utils@8.10.0': + resolution: {integrity: sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -4404,34 +4390,12 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.9.0': - resolution: {integrity: sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==} + '@typescript-eslint/types@8.10.0': + resolution: {integrity: sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@8.8.1': - resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.9.0': - resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.8.1': - resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.9.0': - resolution: {integrity: sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==} + '@typescript-eslint/typescript-estree@8.10.0': + resolution: {integrity: sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -4439,24 +4403,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.8.1': - resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - - '@typescript-eslint/utils@8.9.0': - resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==} + '@typescript-eslint/utils@8.10.0': + resolution: {integrity: sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.8.1': - resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.9.0': - resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==} + '@typescript-eslint/visitor-keys@8.10.0': + resolution: {integrity: sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -5877,8 +5831,8 @@ packages: peerDependencies: eslint: ^9.5.0 - eslint-config-hyoban@3.1.10: - resolution: {integrity: sha512-TgzHQ6mR9oDphfm2wRLExSlQQyxXwk8rg1ZkjSmTzIJMr8LpvMSy/8g8imksCnK1Kvmmvy6Yh3ALm5J35p+xOw==} + eslint-config-hyoban@3.1.11: + resolution: {integrity: sha512-eTNGeAFTSdotGPNO+aDacyiy9syFApJYKfSie+6igOTG8QtoOLMzi2Bsv7O1jCKdeIAxbtNuD/BsuNxOG500HA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^9.0.0 @@ -5905,33 +5859,27 @@ packages: peerDependencies: eslint: '*' - eslint-plugin-import-x@4.3.1: - resolution: {integrity: sha512-5TriWkXulDl486XnYYRgsL+VQoS/7mhN/2ci02iLCuL7gdhbiWxnsuL/NTcaKY9fpMgsMFjWZBtIGW7pb+RX0g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - eslint-plugin-jsonc@2.16.0: resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-plugin-package-json@0.15.3: - resolution: {integrity: sha512-NRUh+f5orM2/SynPjZqqNqSahdG3qzG5nf8s2S5nEwkhRbEE78S6sSMVGoSmrrtbhcbvZmLVHguVds4lY3Cwkw==} + eslint-plugin-package-json@0.15.4: + resolution: {integrity: sha512-qH7q8xETpMqqdhmC/rj6hz7bNFGnzzkTuCQfBLNsupqB4ky596PalZLCMhn39NQocPqb5JIgGs0gnDX/VG22nQ==} engines: {node: '>=18'} peerDependencies: eslint: '>=8.0.0' jsonc-eslint-parser: ^2.0.0 - eslint-plugin-react-compiler@0.0.0-experimental-f8a5409-20240829: - resolution: {integrity: sha512-Z76Rz5ga9uE+d8C4L6oMAqCh02d3I6sg/Va6J8UX6tsqarcGV2d+AH3V9mxkMIIRy/HSEKuPsYPgGfFqFfoqTQ==} + eslint-plugin-react-compiler@19.0.0-beta-9ee70a1-20241017: + resolution: {integrity: sha512-GdJHMa9Wqfc/JPiv4WW5JjQsuSISdBo7oM/6IjRO8uxaZncDrKK/RyFqbPvgEiNFzDcX8ZZvR8dgfSGvxh2Qpw==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' - eslint-plugin-react-debug@1.15.0: - resolution: {integrity: sha512-zD5WOVPwKNnO4897gz2yjZZcvdGIObKEi4QURDammVEc3sCU0evHcAPEknTC1WEd7T8A4Zu7Vt7sDaUz/DALnA==} + eslint-plugin-react-debug@1.15.1-beta.3: + resolution: {integrity: sha512-3f/+zlSpri7Ef/rUyzjYc2QaaYkrIRMLUg5LrSmxTa3GAuIzicdalXDTGA0EtzM+aIj/rK7VYHprmgh2CJGvlg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5940,8 +5888,8 @@ packages: typescript: optional: true - eslint-plugin-react-dom@1.15.0: - resolution: {integrity: sha512-P8IdPfiEpDR8SHZdnYJzfdSkV++0hHzOJQhLW9eACyuGCBuzLj2gglmPR5gH2RG44R+Iq5+hsUVNv7sklThvRg==} + eslint-plugin-react-dom@1.15.1-beta.3: + resolution: {integrity: sha512-5UhnomPvEPAMSTMpH9IfHN7hBhyDdFEDmJVX45aWJIMSaWomp+lYaR6xl1HxbZMU6k0P97GE40oNtmN3gDvrgg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5950,8 +5898,8 @@ packages: typescript: optional: true - eslint-plugin-react-hooks-extra@1.15.0: - resolution: {integrity: sha512-guIcax3c4Z/iWyDwZdo5b0qzqpJrhH4svYIfj+wEpfjRdIwpAvL0xM1uqJKdz8Hbgw1D+6dePSau4zmVkuaMqA==} + eslint-plugin-react-hooks-extra@1.15.1-beta.3: + resolution: {integrity: sha512-qQBNuJ+d3OqocNv8icDT5UBF86y2dDjHIAU9boVveJzSJCBW9+xdRVjnZrtWsdJY5KwkoulAf6Wh9LTaZGixQw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5960,14 +5908,14 @@ packages: typescript: optional: true - eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614: - resolution: {integrity: sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==} + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@1.15.0: - resolution: {integrity: sha512-XjbkBFEsaGvhDUKCxDCdJ34dsr/XnQu5a7hq6h2aNpnu05VGCAW6CXf3VuyI/sKfj3Em+aX/9eHdcRi12+dmLg==} + eslint-plugin-react-naming-convention@1.15.1-beta.3: + resolution: {integrity: sha512-IW5EnjVY2oQ9DJXDpwGwwXWigilMvlRhwSntCG1mKmK10LaPctYfp8/7TC4H8QqMvbmtzRJENIeAAHEzRDpaYg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5981,8 +5929,8 @@ packages: peerDependencies: eslint: '>=7' - eslint-plugin-react-web-api@1.15.0: - resolution: {integrity: sha512-LUwzKumBApdKzUgl+9F5/TyJbYGQIOy450s6kr3rLPrc9tk8GQrBmSQKmWh2g7C1x7DIoMNFXeUuAD1q/1AKnw==} + eslint-plugin-react-web-api@1.15.1-beta.3: + resolution: {integrity: sha512-ZJN1tzNO7Zq71ZeVAc1knhAe7q5MRUD5wU5XyCmqcumDFI6kvD7V4ULdhQX3PjewDWqS5ULLBEhwRJMqEFQIGA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5991,8 +5939,8 @@ packages: typescript: optional: true - eslint-plugin-react-x@1.15.0: - resolution: {integrity: sha512-TIZVElFYVXvybmMBVzHPF2hmsaG7greytHd80efUPopxlr+JGjKba6zA3cJAURn+yzN1x2zPJzss2BkB8/48aQ==} + eslint-plugin-react-x@1.15.1-beta.3: + resolution: {integrity: sha512-YJ18nGeJZDwy7jkOmykb5s6ocw7nMUqeFfPv2W1Ig3S6K2Vz59B9kN4f4GqEEYTsFxLqdb9qxKATBLGcaR5S9w==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6045,8 +5993,8 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.12.0: - resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + eslint@9.13.0: + resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6193,12 +6141,6 @@ packages: picomatch: optional: true - fflate@0.4.8: - resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} - - fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -7611,9 +7553,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@0.0.10: - resolution: {integrity: sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -7855,9 +7794,6 @@ packages: oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} - optimist@0.6.1: - resolution: {integrity: sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -7927,9 +7863,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-json-validator@0.6.5: - resolution: {integrity: sha512-fEG8kM+EfX0j7TbTWAv6/0NRkid0fUHm2afJx35en3+IlrJ6dRQfKUCpuUl/bGM6MvQ0MxAlpaXkJtYVMp0F4A==} - hasBin: true + package-json-validator@0.7.0: + resolution: {integrity: sha512-ufEJ03cPLVxZCHuypSJjmUC2t0xDy0Eru4AfPFe2MfPw14BqedavayQqd49H2/VCrcWONmXsJ47Tp7kzaElX2w==} + engines: {node: '>=18'} package-manager-detector@0.2.0: resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} @@ -8396,16 +8332,6 @@ packages: postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - posthog-js@1.169.0: - resolution: {integrity: sha512-C0TiNv6ehbiy78F9gKZIqy3RbCRsWDSQDbQMi1YW2iuO4kDQUQwacmx2DKyaCwsH0/oN69FdBl99WoEJdjmxXg==} - - posthog-js@1.169.1: - resolution: {integrity: sha512-zyse2166QgptTXVMgRB5zsJuM2BWR4N+Vzl08ti7KU5gtQA5PSmsMYR6R2YR/LGQsJve4PBRpR8jRHOj1RZZrA==} - - posthog-node@4.2.1: - resolution: {integrity: sha512-l+fsjYEkTik3m/G0pE7gMr4qBJP84LhK779oQm6MBzhBGpd4By4qieTW+4FUAlNCyzQTynn3Nhsa50c0IELSxQ==} - engines: {node: '>=15.0.0'} - postject@1.0.0-alpha.6: resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} engines: {node: '>=14.0.0'} @@ -8419,9 +8345,6 @@ packages: preact@10.11.3: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} - preact@10.24.3: - resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -8924,9 +8847,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rusha@0.8.14: - resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -9523,8 +9443,8 @@ packages: resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} engines: {node: '>=16'} - typescript-eslint@8.8.1: - resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} + typescript-eslint@8.10.0: + resolution: {integrity: sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -9723,9 +9643,9 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@6.0.0: + resolution: {integrity: sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==} + engines: {node: ^18.17.0 || >=20.5.0} vaul@1.1.0: resolution: {integrity: sha512-YhO/bikcauk48hzhMhvIvT+U87cuCbNbKk9fF4Ou5UkI9t2KkBMernmdP37pCzF15hrv55fcny1YhexK8h6GVQ==} @@ -9831,9 +9751,6 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-vitals@4.2.3: - resolution: {integrity: sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -9898,10 +9815,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wordwrap@0.0.3: - resolution: {integrity: sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==} - engines: {node: '>=0.4.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -11636,20 +11549,20 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0(jiti@2.3.3))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@2.3.3))': dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} - '@eslint-react/ast@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/ast@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) birecord: 0.1.1 string-ts: 2.2.0 ts-pattern: 5.5.0 @@ -11658,18 +11571,18 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) birecord: 0.1.1 short-unique-id: 5.2.0 ts-pattern: 5.5.0 @@ -11678,72 +11591,72 @@ snapshots: - supports-color - typescript - '@eslint-react/eslint-plugin@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) - eslint-plugin-react-debug: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-dom: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-hooks-extra: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-naming-convention: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-web-api: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-x: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/eslint-plugin@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) + eslint-plugin-react-debug: 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-dom: 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-hooks-extra: 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-naming-convention: 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-web-api: 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-x: 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/jsx@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) ts-pattern: 5.5.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/shared@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.15.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) picomatch: 4.0.2 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/tools@1.15.0': {} + '@eslint-react/tools@1.15.1-beta.3': {} - '@eslint-react/types@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/types@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.15.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/var@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) ts-pattern: 5.5.0 transitivePeerDependencies: - eslint @@ -11760,7 +11673,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.6.0': {} + '@eslint/core@0.7.0': {} '@eslint/eslintrc@3.1.0': dependencies: @@ -11778,6 +11691,8 @@ snapshots: '@eslint/js@9.12.0': {} + '@eslint/js@9.13.0': {} + '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.0': @@ -12246,6 +12161,23 @@ snapshots: '@hutson/parse-repository-url@5.0.0': {} + '@hyoban/eslint-plugin-import-x@4.3.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + debug: 4.3.7 + doctrine: 3.0.0 + eslint: 9.13.0(jiti@2.3.3) + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.8.1 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + stable-hash: 0.0.4 + tslib: 2.7.0 + transitivePeerDependencies: + - supports-color + - typescript + '@iconify-json/logos@1.2.3': dependencies: '@iconify/types': 2.0.0 @@ -14011,10 +13943,10 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@2.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@stylistic/eslint-plugin@2.9.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) eslint-visitor-keys: 4.1.0 espree: 10.2.0 estraverse: 5.3.0 @@ -14250,33 +14182,15 @@ snapshots: '@types/node': 22.7.5 optional: true - '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.8.1 - eslint: 9.12.0(jiti@2.3.3) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.9.0 - eslint: 9.12.0(jiti@2.3.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 + eslint: 9.13.0(jiti@2.3.3) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -14285,35 +14199,29 @@ snapshots: typescript: 5.6.3 transitivePeerDependencies: - supports-color - optional: true - '@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.8.1': + '@typescript-eslint/scope-manager@8.10.0': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 - '@typescript-eslint/scope-manager@8.9.0': + '@typescript-eslint/type-utils@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 - - '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: @@ -14322,26 +14230,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - eslint - - supports-color - - '@typescript-eslint/types@8.8.1': {} + '@typescript-eslint/types@8.10.0': {} - '@typescript-eslint/types@8.9.0': {} - - '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.10.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -14353,51 +14247,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.9.0(typescript@5.6.3)': + '@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 - debug: 4.3.7 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.8.1': + '@typescript-eslint/visitor-keys@8.10.0': dependencies: - '@typescript-eslint/types': 8.8.1 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@8.9.0': - dependencies: - '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/types': 8.10.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -14411,17 +14274,17 @@ snapshots: '@unocss/core@0.63.4': {} - '@unocss/eslint-config@0.63.4(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@unocss/eslint-config@0.63.4(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@unocss/eslint-plugin': 0.63.4(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@unocss/eslint-plugin': 0.63.4(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@unocss/eslint-plugin@0.63.4(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@unocss/eslint-plugin@0.63.4(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) '@unocss/config': 0.63.4 '@unocss/core': 0.63.4 magic-string: 0.30.12 @@ -14519,10 +14382,6 @@ snapshots: dependencies: acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.13.0): dependencies: acorn: 8.13.0 @@ -16080,46 +15939,46 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.12.0(jiti@2.3.3)): + eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) semver: 7.6.3 - eslint-config-flat-gitignore@0.3.0(eslint@9.12.0(jiti@2.3.3)): + eslint-config-flat-gitignore@0.3.0(eslint@9.13.0(jiti@2.3.3)): dependencies: '@eslint/compat': 1.1.1 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) find-up-simple: 1.0.0 - eslint-config-hyoban@3.1.10(@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(tailwindcss@3.4.14)(typescript@5.6.3): + eslint-config-hyoban@3.1.11(@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(tailwindcss@3.4.14)(typescript@5.6.3): dependencies: - '@eslint-react/eslint-plugin': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/eslint-plugin': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) '@eslint/js': 9.12.0 - '@stylistic/eslint-plugin': 2.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@unocss/eslint-config': 0.63.4(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@stylistic/eslint-plugin': 2.9.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@unocss/eslint-config': 0.63.4(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) defu: 6.1.4 - eslint: 9.12.0(jiti@2.3.3) - eslint-config-flat-gitignore: 0.3.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-antfu: 2.7.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-command: 0.2.6(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-hyoban: 0.6.1(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-import-x: 4.3.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-jsonc: 2.16.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-package-json: 0.15.3(eslint@9.12.0(jiti@2.3.3))(jsonc-eslint-parser@2.4.0) - eslint-plugin-react-compiler: 0.0.0-experimental-f8a5409-20240829(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-react-hooks: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-react-refresh: 0.4.12(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-regexp: 2.6.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.12.0(jiti@2.3.3)) + eslint: 9.13.0(jiti@2.3.3) + eslint-config-flat-gitignore: 0.3.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-antfu: 2.7.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-command: 0.2.6(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-hyoban: 0.6.1(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-import-x: '@hyoban/eslint-plugin-import-x@4.3.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)' + eslint-plugin-jsonc: 2.16.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-package-json: 0.15.4(eslint@9.13.0(jiti@2.3.3))(jsonc-eslint-parser@2.4.0) + eslint-plugin-react-compiler: 19.0.0-beta-9ee70a1-20241017(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react-refresh: 0.4.12(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-regexp: 2.6.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.13.0(jiti@2.3.3)) eslint-plugin-tailwindcss: 3.17.5(tailwindcss@3.4.14) - eslint-plugin-unicorn: 56.0.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3)) + eslint-plugin-unicorn: 56.0.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3)) globals: 15.11.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 read-package-up: 11.0.0 - typescript-eslint: 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + typescript-eslint: 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -16135,87 +15994,70 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-antfu@2.7.0(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-antfu@2.7.0(eslint@9.13.0(jiti@2.3.3)): dependencies: '@antfu/utils': 0.7.10 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) - eslint-plugin-command@0.2.6(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-command@0.2.6(eslint@9.13.0(jiti@2.3.3)): dependencies: '@es-joy/jsdoccomment': 0.48.0 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) - eslint-plugin-hyoban@0.6.1(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-hyoban@0.6.1(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) - eslint-plugin-import-x@4.3.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-jsonc@2.16.0(eslint@9.13.0(jiti@2.3.3)): dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - debug: 4.3.7 - doctrine: 3.0.0 - eslint: 9.12.0(jiti@2.3.3) - eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.8.1 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - stable-hash: 0.0.4 - tslib: 2.7.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsonc@2.16.0(eslint@9.12.0(jiti@2.3.3)): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) - eslint: 9.12.0(jiti@2.3.3) - eslint-compat-utils: 0.5.1(eslint@9.12.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) + eslint: 9.13.0(jiti@2.3.3) + eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@2.3.3)) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-package-json@0.15.3(eslint@9.12.0(jiti@2.3.3))(jsonc-eslint-parser@2.4.0): + eslint-plugin-package-json@0.15.4(eslint@9.13.0(jiti@2.3.3))(jsonc-eslint-parser@2.4.0): dependencies: '@altano/repository-tools': 0.1.1 detect-indent: 6.1.0 detect-newline: 3.1.0 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) jsonc-eslint-parser: 2.4.0 - package-json-validator: 0.6.5 + package-json-validator: 0.7.0 semver: 7.6.3 sort-object-keys: 1.1.3 sort-package-json: 1.57.0 - validate-npm-package-name: 5.0.1 + validate-npm-package-name: 6.0.0 - eslint-plugin-react-compiler@0.0.0-experimental-f8a5409-20240829(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-react-compiler@19.0.0-beta-9ee70a1-20241017(eslint@9.13.0(jiti@2.3.3)): dependencies: '@babel/core': 7.25.8 '@babel/parser': 7.25.8 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.8) - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) hermes-parser: 0.20.1 zod: 3.23.8 zod-validation-error: 3.4.0(zod@3.23.8) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): - dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + eslint-plugin-react-debug@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) string-ts: 2.2.0 ts-pattern: 5.5.0 optionalDependencies: @@ -16223,127 +16065,127 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): - dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + eslint-plugin-react-dom@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): - dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + eslint-plugin-react-hooks-extra@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-react-hooks@5.0.0(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) - eslint-plugin-react-naming-convention@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-naming-convention@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.12(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-react-refresh@0.4.12(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) - eslint-plugin-react-web-api@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-web-api@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) birecord: 0.1.1 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): - dependencies: - '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.15.0 - '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) - is-immutable-type: 5.0.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-x@1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.1-beta.3 + '@eslint-react/types': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.1-beta.3(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) + is-immutable-type: 5.0.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-regexp@2.6.0(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-regexp@2.6.0(eslint@9.13.0(jiti@2.3.3)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) '@eslint-community/regexpp': 4.11.1 comment-parser: 1.4.1 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) jsdoc-type-pratt-parser: 4.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) eslint-plugin-tailwindcss@3.17.5(tailwindcss@3.4.14): dependencies: @@ -16351,14 +16193,14 @@ snapshots: postcss: 8.4.47 tailwindcss: 3.4.14 - eslint-plugin-unicorn@56.0.0(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-unicorn@56.0.0(eslint@9.13.0(jiti@2.3.3)): dependencies: '@babel/helper-validator-identifier': 7.25.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.38.1 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) esquery: 1.6.0 globals: 15.11.0 indent-string: 4.0.0 @@ -16371,11 +16213,11 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) eslint-scope@8.1.0: dependencies: @@ -16386,14 +16228,14 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint@9.12.0(jiti@2.3.3): + eslint@9.13.0(jiti@2.3.3): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 - '@eslint/core': 0.6.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.12.0 + '@eslint/js': 9.13.0 '@eslint/plugin-kit': 0.2.0 '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 @@ -16430,8 +16272,8 @@ snapshots: espree@10.2.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.13.0 + acorn-jsx: 5.3.2(acorn@8.13.0) eslint-visitor-keys: 4.1.0 espree@9.6.1: @@ -16605,10 +16447,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fflate@0.4.8: {} - - fflate@0.7.4: {} - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -17458,10 +17296,10 @@ snapshots: is-hexadecimal@2.0.1: {} - is-immutable-type@5.0.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + is-immutable-type@5.0.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) ts-api-utils: 1.3.0(typescript@5.6.3) ts-declaration-location: 1.0.4(typescript@5.6.3) typescript: 5.6.3 @@ -17794,8 +17632,8 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.7.1 - pkg-types: 1.2.0 + mlly: 1.7.2 + pkg-types: 1.2.1 locate-path@2.0.0: dependencies: @@ -18416,8 +18254,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist@0.0.10: {} - minimist@1.2.8: {} minipass-collect@1.0.2: @@ -18680,11 +18516,6 @@ snapshots: dependencies: regex: 4.3.3 - optimist@0.6.1: - dependencies: - minimist: 0.0.10 - wordwrap: 0.0.3 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -18754,9 +18585,9 @@ snapshots: package-json-from-dist@1.0.1: {} - package-json-validator@0.6.5: + package-json-validator@0.7.0: dependencies: - optimist: 0.6.1 + yargs: 17.7.2 package-manager-detector@0.2.0: {} @@ -18953,7 +18784,7 @@ snapshots: pkg-types@1.2.0: dependencies: confbox: 0.1.7 - mlly: 1.7.1 + mlly: 1.7.2 pathe: 1.1.2 pkg-types@1.2.1: @@ -19199,25 +19030,6 @@ snapshots: postgres-range@1.1.4: optional: true - posthog-js@1.169.0: - dependencies: - fflate: 0.4.8 - preact: 10.24.3 - web-vitals: 4.2.3 - - posthog-js@1.169.1: - dependencies: - fflate: 0.4.8 - preact: 10.24.3 - web-vitals: 4.2.3 - - posthog-node@4.2.1: - dependencies: - axios: 1.7.7(debug@4.3.7) - rusha: 0.8.14 - transitivePeerDependencies: - - debug - postject@1.0.0-alpha.6: dependencies: commander: 9.5.0 @@ -19229,8 +19041,6 @@ snapshots: preact@10.11.3: {} - preact@10.24.3: {} - prelude-ls@1.2.1: {} prettier@3.3.3: {} @@ -19809,8 +19619,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rusha@0.8.14: {} - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -20420,11 +20228,11 @@ snapshots: type-fest@4.26.1: {} - typescript-eslint@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + typescript-eslint@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -20622,7 +20430,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} + validate-npm-package-name@6.0.0: {} vaul@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -20747,8 +20555,6 @@ snapshots: web-namespaces@2.0.1: {} - web-vitals@4.2.3: {} - webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} @@ -20805,8 +20611,6 @@ snapshots: word-wrap@1.2.5: {} - wordwrap@0.0.3: {} - wordwrap@1.0.0: {} wrap-ansi@7.0.0: diff --git a/scripts/pull-ab-flags.ts b/scripts/pull-ab-flags.ts deleted file mode 100644 index 3755973fac..0000000000 --- a/scripts/pull-ab-flags.ts +++ /dev/null @@ -1,107 +0,0 @@ -import "dotenv/config" - -import { readFileSync, writeFileSync } from "node:fs" -import path, { dirname, resolve } from "node:path" -import { fileURLToPath } from "node:url" -import { inspect } from "node:util" - -import { ofetch } from "ofetch" - -const { POSTHOG_TOKEN } = process.env - -if (!POSTHOG_TOKEN) { - throw new Error("POSTHOG_TOKEN is not set") -} -// https://posthog.com/docs/api/feature-flags#post-api-organizations-parent_lookup_organization_id-feature_flags-copy_flags -const listRes: ListRes = await ofetch( - `https://app.posthog.com/api/projects/${process.env.POSTHOG_PROJECT_ID}/feature_flags/?limit=9999`, - { - method: "GET", - headers: { - Authorization: `Bearer ${POSTHOG_TOKEN}`, - }, - }, -) - -interface ListRes { - count: number - next: null - previous: null - results: ResultsItem[] -} -interface ResultsItem { - id: number - name: string - key: string - filters: any[] - deleted: boolean - active: boolean - created_by: any[] - created_at: string - is_simple_flag: boolean - rollout_percentage: number - ensure_experience_continuity: boolean - experiment_set: any[] - surveys: any[] - features: any[] - rollback_conditions: any[] - performed_rollback: boolean - can_edit: boolean - usage_dashboard: number - analytics_dashboards: any[] - has_enriched_analytics: boolean - tags: any[] -} - -const existFlags = {} as Record - -listRes.results.forEach((flag) => (existFlags[flag.key] = true)) - -const __dirname = resolve(dirname(fileURLToPath(import.meta.url))) -const localFlagsString = readFileSync(path.join(__dirname, "../constants/flags.json"), "utf8") -const localFlags = JSON.parse(localFlagsString as string) as Record - -const updateToRmoteFlags = {} as Record - -// If remote key has but local not has, add to Local -for (const key in existFlags) { - if (!(key in localFlags)) { - localFlags[key] = existFlags[key] - } -} - -// Write to local flags -writeFileSync(path.join(__dirname, "../constants/flags.json"), JSON.stringify(localFlags, null, 2)) - -console.info("update local flags", inspect(localFlags)) - -// Local first -for (const key in localFlags) { - // existFlags[key] = localFlags[key] - if (existFlags[key] !== localFlags[key]) { - updateToRmoteFlags[key] = localFlags[key] - } -} - -if (Object.keys(updateToRmoteFlags).length > 0) { - await Promise.allSettled( - Object.entries(updateToRmoteFlags).map(([key, flag]) => { - return fetch( - `https://app.posthog.com/api/projects/${process.env.POSTHOG_PROJECT_ID}/feature_flags/`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${process.env.POSTHOG_PRIVATE_KEY}`, - }, - body: JSON.stringify({ - key, - active: flag, - }), - }, - ) - }), - ) - - console.info("update flags", inspect(updateToRmoteFlags)) -}