fix(web): remove openpanel and fix ssr manifest

This commit is contained in:
DIYgod 2026-03-17 18:17:39 +08:00
parent ef1c755125
commit 338164b68c
29 changed files with 167 additions and 573 deletions

View File

@ -29,8 +29,6 @@ env:
VITE_WEB_URL: ${{ vars.VITE_WEB_URL }}
VITE_API_URL: ${{ vars.VITE_API_URL }}
VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }}
VITE_OPENPANEL_CLIENT_ID: ${{ vars.VITE_OPENPANEL_CLIENT_ID }}
VITE_OPENPANEL_API_URL: ${{ vars.VITE_OPENPANEL_API_URL }}
VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
NODE_OPTIONS: --max-old-space-size=8192

View File

@ -24,8 +24,6 @@ jobs:
runs-on: ubuntu-latest
env:
VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }}
VITE_OPENPANEL_CLIENT_ID: ${{ vars.VITE_OPENPANEL_CLIENT_ID }}
VITE_OPENPANEL_API_URL: ${{ vars.VITE_OPENPANEL_API_URL }}
VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }}
strategy:
matrix:

View File

@ -4,8 +4,6 @@ VITE_IMGPROXY_URL=http://localhost:2873
VITE_SENTRY_DSN=
VITE_BUILD_TYPE=production
VITE_INBOXES_EMAIL=@follow.re
VITE_OPENPANEL_CLIENT_ID=
VITE_OPENPANEL_API_URL=
VITE_EDITOR=cursor

View File

@ -29,7 +29,6 @@
"@follow-app/readability": "workspace:*",
"@follow/shared": "workspace:*",
"@follow/utils": "workspace:*",
"@openpanel/web": "1.0.7",
"builder-util-runtime": "9.5.1",
"electron-context-menu": "4.1.1",
"electron-ipc-decorator": "0.2.0",

View File

@ -1,20 +0,0 @@
import { env } from "@follow/shared/env.desktop"
import { OpenPanel } from "@openpanel/web"
import { app } from "electron"
import { DEVICE_ID } from "~/constants/system"
export const op = new OpenPanel({
clientId: env.VITE_OPENPANEL_CLIENT_ID ?? "",
trackScreenViews: false,
trackOutgoingLinks: false,
trackAttributes: false,
trackHashChanges: false,
apiUrl: env.VITE_OPENPANEL_API_URL,
})
op.setGlobalProperties({
device_id: DEVICE_ID,
app_version: app.getVersion(),
build: "electron",
})

View File

@ -23,7 +23,6 @@ import { AppManager } from "./app"
const apiURL = process.env["VITE_API_URL"] || import.meta.env.VITE_API_URL
const buildSafeHeaders = createBuildSafeHeaders(env.VITE_WEB_URL, [
env.VITE_OPENPANEL_API_URL || "",
IMAGE_PROXY_URL,
env.VITE_API_URL,
"https://readwise.io",

View File

@ -28,7 +28,6 @@
"@lexical/markdown": "0.40.0",
"@lexical/react": "0.40.0",
"@number-flow/react": "0.5.11",
"@openpanel/web": "1.0.7",
"@radix-ui/react-avatar": "1.1.11",
"@radix-ui/react-context-menu": "2.2.16",
"@radix-ui/react-dialog": "1.1.15",

View File

@ -1,10 +0,0 @@
import { env } from "@follow/shared/env.desktop"
import { OpenPanel } from "@openpanel/web"
export const op = new OpenPanel({
clientId: env.VITE_OPENPANEL_CLIENT_ID ?? "",
trackScreenViews: true,
trackOutgoingLinks: true,
trackAttributes: true,
apiUrl: env.VITE_OPENPANEL_API_URL,
})

View File

@ -290,8 +290,6 @@ export default ({ mode }) => {
"@tanstack/query-sync-storage-persister",
],
["tldts"],
["@openpanel/web"],
["zod", "react-hook-form", "@hookform/resolvers"],
]),

View File

@ -40,7 +40,6 @@
"@follow/utils": "workspace:*",
"@gorhom/portal": "1.0.14",
"@hookform/resolvers": "5.2.2",
"@openpanel/sdk": "1.0.4",
"@react-native-community/image-editor": "4.3.0",
"@react-native-firebase/analytics": "22.2.1",
"@react-native-firebase/app": "22.2.1",

View File

@ -35,14 +35,4 @@ export const initAnalytics = async () => {
if (user) {
tracker.identify(user as AuthUser)
}
// op.setGlobalProperties({
// build: "rn",
// version: nativeApplicationVersion,
// buildId: nativeBuildVersion,
// })
// op.setHeaders({
// "User-Agent": await getUserAgent(),
// })
}

View File

@ -1,13 +0,0 @@
import { OpenPanel } from "@follow/tracker/src/op"
import { proxyEnv } from "./proxy-env"
export const op = new OpenPanel({
clientId: proxyEnv.OPENPANEL_CLIENT_ID ?? "",
apiUrl: proxyEnv.OPENPANEL_API_URL,
headers: {
Origin: "https://app.folo.is",
},
sdk: "react-native",
sdkVersion: "1.0.0",
})

View File

@ -1,14 +0,0 @@
import { env } from "@follow/shared/env.ssr"
import { setOpenPanelTracker } from "@follow/tracker"
import { op } from "./op"
export const initAnalytics = () => {
if (env.VITE_OPENPANEL_CLIENT_ID === undefined) return
setOpenPanelTracker(op)
op.setGlobalProperties({
build: "external-web",
hash: GIT_COMMIT_SHA,
})
}

View File

@ -1,11 +1,9 @@
import { initI18n } from "@client/i18n"
import { initializeDayjs } from "@follow/components/dayjs"
import { initAnalytics } from "./analytics"
import { initSentry } from "./sentry"
export const initialize = async () => {
initAnalytics()
initializeDayjs()
await Promise.all([initI18n(), initSentry()])
}

View File

@ -1,10 +0,0 @@
import { env } from "@follow/shared/env.ssr"
import { OpenPanel } from "@openpanel/web"
export const op = new OpenPanel({
clientId: env.VITE_OPENPANEL_CLIENT_ID ?? "",
trackScreenViews: true,
trackOutgoingLinks: true,
trackAttributes: true,
apiUrl: env.VITE_OPENPANEL_API_URL,
})

View File

@ -18,7 +18,7 @@
<title>Folo</title>
<meta name="apple-itunes-app" content="app-id=6739802604" />
<link rel="manifest" href="/manifest.json" />
<link rel="manifest" href="/manifest.webmanifest" />
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DZMBZBW3EC"></script>
<script>

View File

@ -18,7 +18,6 @@
"@follow-app/client-sdk": "catalog:",
"@follow/tracker": "workspace:*",
"@fontsource/sn-pro": "5.2.6",
"@openpanel/web": "1.0.7",
"@radix-ui/react-avatar": "1.1.11",
"@resvg/resvg-js": "2.6.2",
"@sentry/react": "10.38.0",

View File

@ -14,8 +14,6 @@ export const DEFAULT_VALUES = {
WEB_URL: "https://app.folo.is",
INBOXES_EMAIL: "@follow.re",
FIREBASE_CONFIG: FIREBASE_CONFIG_DEFAULT,
OPENPANEL_CLIENT_ID: "4382168f-b8d2-40c1-9a26-133a312d072b",
OPENPANEL_API_URL: "https://openpanel.follow.is/api",
RECAPTCHA_V3_SITE_KEY: "6LeGa3csAAAAALi_WqhlWoaGaqd_kke4HRGvNE0C",
POSTHOG_KEY: "phc_EZGEvBt830JgBHTiwpHqJAEbWnbv63m5UpreojwEWNL",
@ -30,9 +28,6 @@ export const DEFAULT_VALUES = {
API_URL: "https://api.folo.is",
WEB_URL: "https://staging.follow.is",
INBOXES_EMAIL: "@follow.re",
OPENPANEL_CLIENT_ID: "4382168f-b8d2-40c1-9a26-133a312d072b",
OPENPANEL_API_URL: "https://openpanel.follow.is/api",
POSTHOG_KEY: "phc_EZGEvBt830JgBHTiwpHqJAEbWnbv63m5UpreojwEWNL",
POSTHOG_HOST: "https://us.posthog.com",
},

View File

@ -15,10 +15,6 @@ export const env = createEnv({
VITE_SENTRY_DSN: z.string().optional(),
VITE_INBOXES_EMAIL: z.string().default(DEFAULT_VALUES.PROD.INBOXES_EMAIL),
VITE_FIREBASE_CONFIG: z.string().default(DEFAULT_VALUES.PROD.FIREBASE_CONFIG),
VITE_OPENPANEL_CLIENT_ID: z.string().optional(),
VITE_OPENPANEL_API_URL: z.string().url().optional(),
VITE_POSTHOG_KEY: z.string().optional().default(DEFAULT_VALUES.PROD.POSTHOG_KEY),
VITE_POSTHOG_HOST: z.string().url().optional().default(DEFAULT_VALUES.PROD.POSTHOG_HOST),

View File

@ -10,8 +10,6 @@ const envProfileMap = {
API_URL: DEFAULT_VALUES.PROD.API_URL,
WEB_URL: DEFAULT_VALUES.PROD.WEB_URL,
INBOXES_EMAIL: DEFAULT_VALUES.PROD.INBOXES_EMAIL,
OPENPANEL_CLIENT_ID: DEFAULT_VALUES.PROD.OPENPANEL_CLIENT_ID,
OPENPANEL_API_URL: DEFAULT_VALUES.PROD.OPENPANEL_API_URL,
POSTHOG_KEY: DEFAULT_VALUES.PROD.POSTHOG_KEY,
POSTHOG_HOST: DEFAULT_VALUES.PROD.POSTHOG_HOST,
},
@ -24,8 +22,6 @@ const envProfileMap = {
API_URL: DEFAULT_VALUES.STAGING.API_URL,
WEB_URL: DEFAULT_VALUES.STAGING.WEB_URL,
INBOXES_EMAIL: DEFAULT_VALUES.STAGING.INBOXES_EMAIL,
OPENPANEL_CLIENT_ID: DEFAULT_VALUES.STAGING.OPENPANEL_CLIENT_ID,
OPENPANEL_API_URL: DEFAULT_VALUES.STAGING.OPENPANEL_API_URL,
POSTHOG_KEY: DEFAULT_VALUES.STAGING.POSTHOG_KEY,
POSTHOG_HOST: DEFAULT_VALUES.STAGING.POSTHOG_HOST,
},
@ -45,8 +41,6 @@ export const env = {
WEB_URL: envProfileMap[profile].WEB_URL,
API_URL: envProfileMap[profile].API_URL,
APP_CHECK_DEBUG_TOKEN: process.env.EXPO_PUBLIC_APP_CHECK_DEBUG_TOKEN,
OPENPANEL_CLIENT_ID: envProfileMap[profile].OPENPANEL_CLIENT_ID,
POSTHOG_KEY: envProfileMap[profile].POSTHOG_KEY,
POSTHOG_HOST: envProfileMap[profile].POSTHOG_HOST,
OPENPANEL_API_URL: envProfileMap[profile].OPENPANEL_API_URL,
}

View File

@ -15,10 +15,6 @@ export const env = createEnv({
VITE_SENTRY_DSN: z.string().optional(),
VITE_INBOXES_EMAIL: z.string().default(DEFAULT_VALUES.PROD.INBOXES_EMAIL),
VITE_FIREBASE_CONFIG: z.string().default(DEFAULT_VALUES.PROD.FIREBASE_CONFIG),
VITE_OPENPANEL_CLIENT_ID: z.string().optional(),
VITE_OPENPANEL_API_URL: z.string().url().optional(),
VITE_POSTHOG_KEY: z.string().optional().default(DEFAULT_VALUES.PROD.POSTHOG_KEY),
VITE_POSTHOG_HOST: z.string().url().optional().default(DEFAULT_VALUES.PROD.POSTHOG_HOST),

View File

@ -1,5 +1,4 @@
export type { CaptureExceptionPayload, IdentifyPayload, TrackerAdapter, TrackPayload } from "./base"
export { FirebaseAdapter, type FirebaseAdapterConfig } from "./firebase"
export { OpenPanelAdapter, type OpenPanelAdapterConfig } from "./openpanel"
export { PostHogAdapter, type PostHogAdapterConfig } from "./posthog"
export { ProxyAdapter } from "./proxy"

View File

@ -1,108 +0,0 @@
import { TrackerMapper } from "../enums"
import type { OpenPanel } from "../op"
import type { Optional } from "../types"
import type { IdentifyPayload, TrackerAdapter, TrackPayload } from "./base"
export interface OpenPanelAdapterConfig {
instance: Optional<OpenPanel, "setHeaders">
enabled?: boolean
}
export class OpenPanelAdapter implements TrackerAdapter {
private opInstance: Optional<OpenPanel, "setHeaders">
private enabled: boolean
constructor(config: OpenPanelAdapterConfig) {
this.opInstance = config.instance
this.enabled = config.enabled ?? true
}
initialize(): void {
// OpenPanel is initialized when the instance is created
}
async track({ eventName, properties }: TrackPayload): Promise<void> {
if (!this.isEnabled()) return
try {
// Handle special OpenPanel events based on the original event code
const code = (properties as any)?.__code as TrackerMapper
if (code !== undefined) {
await this.handleSpecialEvents(code, eventName, properties)
} else {
await this.opInstance.track(eventName, properties)
}
} catch (error) {
console.error(`[OpenPanel] Failed to track event "${eventName}":`, error)
}
}
private async handleSpecialEvents(
code: TrackerMapper,
eventName: string,
properties?: Record<string, unknown>,
): Promise<void> {
switch (code) {
case TrackerMapper.Identify: {
// Identify is handled separately, skip here
break
}
default: {
// For all other events, use the standard track method with the code
await this.opInstance.track(eventName, { ...properties, __code: code })
}
}
}
async identify(payload: IdentifyPayload): Promise<void> {
if (!this.isEnabled()) return
try {
await this.opInstance.identify({
profileId: payload.id,
email: payload.email ?? undefined,
avatar: payload.image ?? undefined,
lastName: payload.name ?? undefined,
properties: {
handle: payload.handle,
name: payload.name,
},
})
} catch (error) {
console.error("[OpenPanel] Failed to identify user:", error)
}
}
async setUserProperties(properties: Record<string, unknown>): Promise<void> {
if (!this.isEnabled()) return
try {
this.opInstance.setGlobalProperties?.(properties)
} catch (error) {
console.error("[OpenPanel] Failed to set user properties:", error)
}
}
async clear(): Promise<void> {
if (!this.isEnabled()) return
try {
this.opInstance.clear?.()
} catch (error) {
console.error("[OpenPanel] Failed to clear user data:", error)
}
}
getName(): string {
return "OpenPanel"
}
isEnabled(): boolean {
return this.enabled
}
setEnabled(enabled: boolean): void {
this.enabled = enabled
}
}

View File

@ -1,8 +1,6 @@
import { improvedTrackManager } from "./track-manager"
import { TrackerPoints } from "./tracker-points"
export const setOpenPanelTracker =
improvedTrackManager.setOpenPanelTracker.bind(improvedTrackManager)
export const setFirebaseTracker = improvedTrackManager.setFirebaseTracker.bind(improvedTrackManager)
export const setPostHogTracker = improvedTrackManager.setPostHogTracker.bind(improvedTrackManager)
export const setProxyTracker = improvedTrackManager.setProxyTracker.bind(improvedTrackManager)
@ -14,8 +12,6 @@ export {
FirebaseAdapter,
type FirebaseAdapterConfig,
type IdentifyPayload,
OpenPanelAdapter,
type OpenPanelAdapterConfig,
PostHogAdapter,
type PostHogAdapterConfig,
ProxyAdapter,

View File

@ -1,88 +0,0 @@
interface ApiConfig {
baseUrl: string
defaultHeaders?: Record<string, string | Promise<string | null>>
maxRetries?: number
initialRetryDelay?: number
}
interface FetchOptions extends RequestInit {
retries?: number
}
export class Api {
private baseUrl: string
private headers: Record<string, string | Promise<string | null>>
private maxRetries: number
private initialRetryDelay: number
constructor(config: ApiConfig) {
this.baseUrl = config.baseUrl
this.headers = {
"Content-Type": "application/json",
...config.defaultHeaders,
}
this.maxRetries = config.maxRetries ?? 3
this.initialRetryDelay = config.initialRetryDelay ?? 500
}
setHeaders(headers: Record<string, string>) {
this.headers = {
...this.headers,
...headers,
}
}
private async resolveHeaders(): Promise<Record<string, string>> {
const resolvedHeaders: Record<string, string> = {}
for (const [key, value] of Object.entries(this.headers)) {
const resolvedValue = await value
if (resolvedValue !== null) {
resolvedHeaders[key] = resolvedValue
}
}
return resolvedHeaders
}
private async post<ReqBody, ResBody>(
url: string,
data: ReqBody,
options: FetchOptions,
attempt: number,
): Promise<ResBody | null> {
try {
const response = await fetch(url, {
method: "POST",
headers: await this.resolveHeaders(),
body: JSON.stringify(data ?? {}),
keepalive: true,
...options,
})
if (response.status === 401) return null
if (response.status !== 200 && response.status !== 202) {
throw new Error(`HTTP error! status: ${response.status}`)
}
const responseText = await response.text()
return responseText ? JSON.parse(responseText) : null
} catch (error) {
if (attempt < this.maxRetries) {
const delay = this.initialRetryDelay * 2 ** attempt
await new Promise((resolve) => setTimeout(resolve, delay))
return this.post<ReqBody, ResBody>(url, data, options, attempt + 1)
}
console.error("Max retries reached:", error)
return null
}
}
async fetch<ReqBody, ResBody>(
path: string,
data: ReqBody,
options: FetchOptions = {},
): Promise<ResBody | null> {
const url = `${this.baseUrl}${path}`
return this.post<ReqBody, ResBody>(url, data, options, 0)
}
}

View File

@ -1,206 +0,0 @@
import type { Optional } from "../types"
import { Api } from "./api"
export type TrackHandlerPayload =
| {
type: "track"
payload: TrackPayload
}
| {
type: "increment"
payload: IncrementPayload
}
| {
type: "decrement"
payload: DecrementPayload
}
| {
type: "alias"
payload: AliasPayload
}
| {
type: "identify"
payload: IdentifyPayload
}
export type TrackPayload = {
name: string
properties?: Record<string, unknown>
profileId?: string
}
export type TrackProperties = {
[key: string]: unknown
profileId?: string
}
export type IdentifyPayload = {
profileId: string
firstName?: string
lastName?: string
email?: string
avatar?: string
properties?: Record<string, unknown>
}
export type AliasPayload = {
profileId: string
alias: string
}
export type IncrementPayload = {
profileId: string
property: string
value?: number
}
export type DecrementPayload = {
profileId: string
property: string
value?: number
}
export type OpenPanelOptions = {
clientId: string
clientSecret?: string
apiUrl?: string
sdk?: string
sdkVersion?: string
waitForProfile?: boolean
filter?: (payload: TrackHandlerPayload) => boolean
disabled?: boolean
headers?: Record<string, string>
}
export class OpenPanel {
api: Optional<Api, "setHeaders">
profileId?: string
global?: Record<string, unknown>
queue: TrackHandlerPayload[] = []
constructor(public options: OpenPanelOptions) {
const defaultHeaders: Record<string, string> = {
"openpanel-client-id": options.clientId,
...options.headers,
}
if (options.clientSecret) {
defaultHeaders["openpanel-client-secret"] = options.clientSecret
}
defaultHeaders["openpanel-sdk-name"] = options.sdk || "node"
defaultHeaders["openpanel-sdk-version"] = options.sdkVersion || process.env.SDK_VERSION!
this.api = new Api({
baseUrl: options.apiUrl || "https://api.openpanel.dev",
defaultHeaders,
})
}
ready() {
this.options.waitForProfile = false
this.flush()
}
async send(payload: TrackHandlerPayload) {
if (this.options.disabled) {
return
}
if (this.options.filter && !this.options.filter(payload)) {
return
}
if (this.options.waitForProfile && !this.profileId) {
this.queue.push(payload)
return
}
return this.api.fetch("/track", payload)
}
setHeaders(headers: Record<string, string>) {
this.api.setHeaders?.(headers)
}
setGlobalProperties(properties: Record<string, unknown>) {
this.global = {
...this.global,
...properties,
}
}
async track(name: string, properties?: TrackProperties) {
return this.send({
type: "track",
payload: {
name,
profileId: properties?.profileId ?? this.profileId,
properties: {
...this.global,
...properties,
},
},
})
}
async identify(payload: IdentifyPayload) {
if (payload.profileId) {
this.profileId = payload.profileId
this.flush()
}
if (Object.keys(payload).length > 1) {
return this.send({
type: "identify",
payload: {
...payload,
properties: {
...this.global,
...payload.properties,
},
},
})
}
}
async alias(payload: AliasPayload) {
return this.send({
type: "alias",
payload,
})
}
async increment(payload: IncrementPayload) {
return this.send({
type: "increment",
payload,
})
}
async decrement(payload: DecrementPayload) {
return this.send({
type: "decrement",
payload,
})
}
clear() {
this.profileId = undefined
// should we force a session end here?
}
flush() {
this.queue.forEach((item) => {
this.send({
...item,
// Not sure why ts-expect-error is needed here
// @ts-expect-error
payload: {
...item.payload,
profileId: item.payload.profileId ?? this.profileId,
},
})
})
this.queue = []
}
}

View File

@ -2,12 +2,11 @@ import type { FirebaseAnalyticsTypes } from "@react-native-firebase/analytics"
import type { PostHog } from "posthog-js"
import type PostHogReactNative from "posthog-react-native"
import { FirebaseAdapter, OpenPanelAdapter, PostHogAdapter } from "./adapters"
import { FirebaseAdapter, PostHogAdapter } from "./adapters"
import { ProxyAdapter } from "./adapters/proxy"
import type { TrackerMapper } from "./enums"
import { TrackerManager } from "./manager"
import type { OpenPanel } from "./op"
import type { Optional, Tracker } from "./types"
import type { Tracker } from "./types"
class TrackManager extends TrackerManager {
private trackFns: Tracker[] = []
@ -39,11 +38,6 @@ class TrackManager extends TrackerManager {
}
}
setOpenPanelTracker(op: Optional<OpenPanel, "setHeaders">) {
const adapter = new OpenPanelAdapter({ instance: op })
this.addAdapter(adapter)
}
setFirebaseTracker(
tracker: Pick<FirebaseAnalyticsTypes.Module, "logEvent" | "setUserId" | "setUserProperties">,
) {

View File

@ -4,8 +4,6 @@ interface ImportMetaEnv {
VITE_WEB_URL: string
VITE_API_URL: string
VITE_SENTRY_DSN: string
VITE_OPENPANEL_CLIENT_ID: string
VITE_OPENPANEL_API_URL: string
VITE_FIREBASE_CONFIG: string
}

View File

@ -189,7 +189,7 @@ importers:
dependencies:
'@follow-app/client-sdk':
specifier: 'catalog:'
version: 0.3.92(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.12)(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
version: 0.3.92(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
commander:
specifier: 14.0.1
version: 14.0.1
@ -392,9 +392,6 @@ importers:
'@follow/utils':
specifier: workspace:*
version: link:../../../../packages/internal/utils
'@openpanel/web':
specifier: 1.0.7
version: 1.0.7
builder-util-runtime:
specifier: 9.5.1
version: 9.5.1
@ -528,9 +525,6 @@ importers:
'@number-flow/react':
specifier: 0.5.11
version: 0.5.11(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@openpanel/web':
specifier: 1.0.7
version: 1.0.7
'@radix-ui/react-avatar':
specifier: 1.1.11
version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@ -1069,7 +1063,7 @@ importers:
dependencies:
'@better-auth/expo':
specifier: 1.5.5
version: 1.5.5(0c2eb9cd07d16acbe5ccb94d3f244956)
version: 1.5.5(b83b30101b819d6c970e7e563b1dcee9)
'@expo/metro-runtime':
specifier: 6.1.2
version: 6.1.2(expo@54.0.33)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0)
@ -1115,9 +1109,6 @@ importers:
'@hookform/resolvers':
specifier: 5.2.2
version: 5.2.2(react-hook-form@7.71.1(react@19.1.0))
'@openpanel/sdk':
specifier: 1.0.4
version: 1.0.4
'@react-native-community/image-editor':
specifier: 4.3.0
version: 4.3.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))
@ -1469,9 +1460,6 @@ importers:
'@fontsource/sn-pro':
specifier: 5.2.6
version: 5.2.6
'@openpanel/web':
specifier: 1.0.7
version: 1.0.7
'@radix-ui/react-avatar':
specifier: 1.1.11
version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@ -2075,7 +2063,7 @@ importers:
dependencies:
'@better-auth/stripe':
specifier: 1.5.5
version: 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(better-auth@1.5.5(better-sqlite3@12.6.2)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(mongodb@7.1.0(socks@2.8.7))(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@20.6.1(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(better-call@1.3.2(zod@3.25.76))(stripe@20.3.1(@types/node@25.2.3))
version: 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(better-auth@1.5.5(better-sqlite3@12.6.2)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(mongodb@7.1.0(socks@2.8.7))(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@20.6.1(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(better-call@1.3.2(zod@3.25.76))(stripe@20.3.1(@types/node@25.2.3))
'@electron-toolkit/preload':
specifier: 3.0.2
version: 3.0.2(electron@38.3.0)
@ -5908,12 +5896,6 @@ packages:
'@octokit/types@6.41.0':
resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==}
'@openpanel/sdk@1.0.4':
resolution: {integrity: sha512-F4XocyiaUwUnNRre9LNa9RyTiX/fXcttR4rfFAmMxx6FrbcaemDzMYIg+mH3Hv7lwZqBSo1t2/jObkjpbqjW0g==}
'@openpanel/web@1.0.7':
resolution: {integrity: sha512-lhZCIjUSy5XCcTyzHisehJkdr2/PPEEpMbc8cKtg/5zqxGhHLWIoOiLDjD357KGaxzHg43QVWPe5YBO+Wpto0A==}
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
@ -19038,14 +19020,14 @@ snapshots:
nanostores: 1.2.0
zod: 4.3.6
'@better-auth/drizzle-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))':
'@better-auth/drizzle-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
optionalDependencies:
drizzle-orm: 0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3)
'@better-auth/expo@1.5.5(0c2eb9cd07d16acbe5ccb94d3f244956)':
'@better-auth/expo@1.5.5(b83b30101b819d6c970e7e563b1dcee9)':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-fetch/fetch': 1.1.21
@ -19057,29 +19039,29 @@ snapshots:
expo-linking: 8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0)
expo-web-browser: 15.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))
'@better-auth/kysely-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.12)':
'@better-auth/kysely-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.12)':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
kysely: 0.28.12
'@better-auth/memory-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)':
'@better-auth/memory-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
'@better-auth/mongo-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(socks@2.8.7))':
'@better-auth/mongo-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(socks@2.8.7))':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
mongodb: 7.1.0(socks@2.8.7)
'@better-auth/prisma-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)':
'@better-auth/prisma-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
'@better-auth/stripe@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(better-auth@1.5.5(better-sqlite3@12.6.2)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(mongodb@7.1.0(socks@2.8.7))(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@20.6.1(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(better-call@1.3.2(zod@3.25.76))(stripe@20.3.1(@types/node@25.2.3))':
'@better-auth/stripe@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(better-auth@1.5.5(better-sqlite3@12.6.2)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(mongodb@7.1.0(socks@2.8.7))(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@20.6.1(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(better-call@1.3.2(zod@3.25.76))(stripe@20.3.1(@types/node@25.2.3))':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
better-auth: 1.5.5(better-sqlite3@12.6.2)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(mongodb@7.1.0(socks@2.8.7))(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@20.6.1(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
@ -19100,7 +19082,7 @@ snapshots:
- kysely
- nanostores
'@better-auth/telemetry@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))':
'@better-auth/telemetry@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
@ -21654,6 +21636,55 @@ snapshots:
'@floating-ui/utils@0.2.10': {}
'@follow-app/client-sdk@0.3.92(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@folo-services/constants': 0.1.53
'@folo-services/drizzle': 0.1.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)
'@folo-services/exceptions': 0.1.28
'@folo-services/shared': 0.0.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)(pg@8.16.3)
better-auth: 1.3.28(better-sqlite3@12.6.2)(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
zod: 4.1.12
transitivePeerDependencies:
- '@aws-sdk/client-rds-data'
- '@cloudflare/workers-types'
- '@electric-sql/pglite'
- '@libsql/client'
- '@libsql/client-wasm'
- '@lynx-js/react'
- '@neondatabase/serverless'
- '@op-engineering/op-sqlite'
- '@opentelemetry/api'
- '@planetscale/database'
- '@prisma/client'
- '@sveltejs/kit'
- '@tidbcloud/serverless'
- '@types/better-sqlite3'
- '@types/pg'
- '@types/sql.js'
- '@upstash/redis'
- '@vercel/postgres'
- '@xata.io/client'
- better-sqlite3
- bun-types
- expo-sqlite
- gel
- hono
- knex
- kysely
- mysql2
- next
- pg
- pg-native
- postgres
- prisma
- react
- react-dom
- solid-js
- sql.js
- sqlite3
- svelte
- vue
'@follow-app/client-sdk@0.3.92(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.12)(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@folo-services/constants': 0.1.53
@ -21747,6 +21778,47 @@ snapshots:
dependencies:
zod: 4.1.12
'@folo-services/drizzle@0.1.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)':
dependencies:
'@folo-services/exceptions': 0.1.28
'@hono/zod-openapi': 1.1.4(hono@4.12.1)(zod@4.1.12)
drizzle-orm: 0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3)
drizzle-zod: 0.8.3(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3))(zod@4.1.12)
nanoid: 5.1.6
pg: 8.16.3
zod: 4.1.12
transitivePeerDependencies:
- '@aws-sdk/client-rds-data'
- '@cloudflare/workers-types'
- '@electric-sql/pglite'
- '@libsql/client'
- '@libsql/client-wasm'
- '@neondatabase/serverless'
- '@op-engineering/op-sqlite'
- '@opentelemetry/api'
- '@planetscale/database'
- '@prisma/client'
- '@tidbcloud/serverless'
- '@types/better-sqlite3'
- '@types/pg'
- '@types/sql.js'
- '@upstash/redis'
- '@vercel/postgres'
- '@xata.io/client'
- better-sqlite3
- bun-types
- expo-sqlite
- gel
- hono
- knex
- kysely
- mysql2
- pg-native
- postgres
- prisma
- sql.js
- sqlite3
'@folo-services/drizzle@0.1.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.12)':
dependencies:
'@folo-services/exceptions': 0.1.28
@ -21790,6 +21862,47 @@ snapshots:
'@folo-services/exceptions@0.1.28': {}
'@folo-services/shared@0.0.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)(pg@8.16.3)':
dependencies:
'@folo-services/constants': 0.1.53
'@folo-services/drizzle': 0.1.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.11)
'@hono/zod-openapi': 1.1.4(hono@4.12.1)(zod@4.1.12)
drizzle-orm: 0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3)
drizzle-zod: 0.8.3(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3))(zod@4.1.12)
zod: 4.1.12
transitivePeerDependencies:
- '@aws-sdk/client-rds-data'
- '@cloudflare/workers-types'
- '@electric-sql/pglite'
- '@libsql/client'
- '@libsql/client-wasm'
- '@neondatabase/serverless'
- '@op-engineering/op-sqlite'
- '@opentelemetry/api'
- '@planetscale/database'
- '@prisma/client'
- '@tidbcloud/serverless'
- '@types/better-sqlite3'
- '@types/pg'
- '@types/sql.js'
- '@upstash/redis'
- '@vercel/postgres'
- '@xata.io/client'
- better-sqlite3
- bun-types
- expo-sqlite
- gel
- hono
- knex
- kysely
- mysql2
- pg
- pg-native
- postgres
- prisma
- sql.js
- sqlite3
'@folo-services/shared@0.0.44(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(hono@4.12.1)(kysely@0.28.12)(pg@8.16.3)':
dependencies:
'@folo-services/constants': 0.1.53
@ -22203,7 +22316,7 @@ snapshots:
prettier-package-json: 2.8.0
prettier-plugin-autocorrect: 0.4.3(prettier@3.8.1)
prettier-plugin-sh: 0.18.0(prettier@3.8.1)
prettier-plugin-tailwindcss: 0.6.14(@ianvs/prettier-plugin-sort-imports@4.4.2(prettier@3.6.2))(prettier@3.8.1)
prettier-plugin-tailwindcss: 0.6.14(@ianvs/prettier-plugin-sort-imports@4.4.2(prettier@3.8.1))(prettier@3.8.1)
transitivePeerDependencies:
- '@prettier/plugin-hermes'
- '@prettier/plugin-oxc'
@ -22989,12 +23102,6 @@ snapshots:
dependencies:
'@octokit/openapi-types': 12.11.0
'@openpanel/sdk@1.0.4': {}
'@openpanel/web@1.0.7':
dependencies:
'@openpanel/sdk': 1.0.4
'@opentelemetry/api@1.9.0': {}
'@oxc-project/types@0.112.0': {}
@ -26503,17 +26610,17 @@ snapshots:
better-auth@1.5.5(better-sqlite3@12.6.2)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(mongodb@7.1.0(socks@2.8.7))(next@16.0.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.16.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@20.6.1(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))
'@better-auth/kysely-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.12)
'@better-auth/memory-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)
'@better-auth/mongo-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(socks@2.8.7))
'@better-auth/prisma-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)
'@better-auth/telemetry': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@3.25.76))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))
'@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))
'@better-auth/kysely-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.12)
'@better-auth/memory-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)
'@better-auth/mongo-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(socks@2.8.7))
'@better-auth/prisma-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)
'@better-auth/telemetry': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))
'@better-auth/utils': 0.3.1
'@better-fetch/fetch': 1.1.21
'@noble/ciphers': 2.1.1
'@noble/hashes': 2.0.1
better-call: 1.3.2(zod@4.3.6)
better-call: 1.3.2(zod@3.25.76)
defu: 6.1.4
jose: 6.2.1
kysely: 0.28.12
@ -27821,6 +27928,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3):
optionalDependencies:
'@opentelemetry/api': 1.9.0
better-sqlite3: 12.6.2
expo-sqlite: 16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0)
kysely: 0.28.11
pg: 8.16.3
drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3):
optionalDependencies:
'@opentelemetry/api': 1.9.0
@ -27829,6 +27944,11 @@ snapshots:
kysely: 0.28.12
pg: 8.16.3
drizzle-zod@0.8.3(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3))(zod@4.1.12):
dependencies:
drizzle-orm: 0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.11)(pg@8.16.3)
zod: 4.1.12
drizzle-zod@0.8.3(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3))(zod@4.1.12):
dependencies:
drizzle-orm: 0.45.1(@opentelemetry/api@1.9.0)(better-sqlite3@12.6.2)(expo-sqlite@16.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0))(react@19.1.0))(kysely@0.28.12)(pg@8.16.3)
@ -33527,7 +33647,7 @@ snapshots:
prettier: 3.8.1
sh-syntax: 0.5.8
prettier-plugin-tailwindcss@0.6.14(@ianvs/prettier-plugin-sort-imports@4.4.2(prettier@3.6.2))(prettier@3.8.1):
prettier-plugin-tailwindcss@0.6.14(@ianvs/prettier-plugin-sort-imports@4.4.2(prettier@3.8.1))(prettier@3.8.1):
dependencies:
prettier: 3.8.1
optionalDependencies: