diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 17a920b9f60..a62d6f557cb 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -43,7 +43,7 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ favicon: "./assets/favicon.png", bundler: "metro", }, - plugins: ["expo-router"], + plugins: ["expo-router", "expo-localization"], extra: { router: {}, eas: { diff --git a/apps/mobile/app/_layout.tsx b/apps/mobile/app/_layout.tsx index cb06e07d52d..283df545853 100644 --- a/apps/mobile/app/_layout.tsx +++ b/apps/mobile/app/_layout.tsx @@ -1,16 +1,6 @@ import "react-native-get-random-values"; // MUST BE FIRST IMPORT import "../global.css"; -import { PortalHost } from "@rn-primitives/portal"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { Stack } from "expo-router"; -const queryClient = new QueryClient(); +import { RootLayout } from "@/screens/RootLayout"; -export default function RootLayout() { - return ( - - - - - ); -} +export default RootLayout; diff --git a/apps/mobile/lib/env.ts b/apps/mobile/lib/env.ts index f30047c4e3a..5173ffcf431 100644 --- a/apps/mobile/lib/env.ts +++ b/apps/mobile/lib/env.ts @@ -8,6 +8,8 @@ const envSchema = z.object({ EXPO_PUBLIC_WEB_URL: z.url().optional(), EXPO_PUBLIC_DEEP_LINK_SCHEME: z.string().default("superset"), EXPO_PUBLIC_DEEP_LINK_DOMAIN: z.string().optional(), + EXPO_PUBLIC_POSTHOG_KEY: z.string(), + EXPO_PUBLIC_POSTHOG_HOST: z.url().default("https://us.i.posthog.com"), }); export const env = envSchema.parse({ @@ -18,4 +20,6 @@ export const env = envSchema.parse({ .EXPO_PUBLIC_DEEP_LINK_SCHEME as unknown, EXPO_PUBLIC_DEEP_LINK_DOMAIN: process.env .EXPO_PUBLIC_DEEP_LINK_DOMAIN as unknown, + EXPO_PUBLIC_POSTHOG_KEY: process.env.EXPO_PUBLIC_POSTHOG_KEY as unknown, + EXPO_PUBLIC_POSTHOG_HOST: process.env.EXPO_PUBLIC_POSTHOG_HOST as unknown, }); diff --git a/apps/mobile/lib/posthog/client.ts b/apps/mobile/lib/posthog/client.ts new file mode 100644 index 00000000000..e38b20541a8 --- /dev/null +++ b/apps/mobile/lib/posthog/client.ts @@ -0,0 +1,10 @@ +import { env } from "../env"; + +export const posthogConfig = { + apiKey: env.EXPO_PUBLIC_POSTHOG_KEY, + host: env.EXPO_PUBLIC_POSTHOG_HOST, + options: { + enableSessionReplay: false, + debug: env.NODE_ENV === "development", + }, +}; diff --git a/apps/mobile/lib/posthog/index.ts b/apps/mobile/lib/posthog/index.ts new file mode 100644 index 00000000000..63205d047c1 --- /dev/null +++ b/apps/mobile/lib/posthog/index.ts @@ -0,0 +1 @@ +export { posthogConfig } from "./client"; diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 3ea2308de16..ec71955508e 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -14,6 +14,7 @@ "dependencies": { "@better-auth/expo": "1.4.16", "@electric-sql/client": "https://pkg.pr.new/@electric-sql/client@3724", + "@react-native-async-storage/async-storage": "2.2.0", "@react-navigation/native": "^7.1.28", "@rn-primitives/portal": "^1.3.0", "@rn-primitives/slot": "^1.2.0", @@ -31,10 +32,14 @@ "clsx": "^2.1.1", "dotenv": "^17.2.3", "expo": "~54.0.31", + "expo-application": "~7.0.8", "expo-constants": "^18.0.13", "expo-crypto": "^15.0.8", "expo-dev-client": "~6.0.20", + "expo-device": "~8.0.10", + "expo-file-system": "~19.0.21", "expo-linking": "~8.0.11", + "expo-localization": "~17.0.8", "expo-network": "~8.0.8", "expo-router": "^6.0.21", "expo-secure-store": "~15.0.8", @@ -42,6 +47,7 @@ "expo-system-ui": "~6.0.9", "expo-web-browser": "~15.0.10", "lucide-react-native": "^0.562.0", + "posthog-react-native": "^4.23.0", "react": "19.1.0", "react-native": "0.81.5", "react-native-get-random-values": "^1.11.0", diff --git a/apps/mobile/screens/RootLayout/RootLayout.tsx b/apps/mobile/screens/RootLayout/RootLayout.tsx new file mode 100644 index 00000000000..bf7ddb1e38b --- /dev/null +++ b/apps/mobile/screens/RootLayout/RootLayout.tsx @@ -0,0 +1,20 @@ +import { PortalHost } from "@rn-primitives/portal"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { Stack } from "expo-router"; + +import { PostHogUserIdentifier } from "./components/PostHogUserIdentifier"; +import { PostHogProvider } from "./providers/PostHogProvider"; + +const queryClient = new QueryClient(); + +export function RootLayout() { + return ( + + + + + + + + ); +} diff --git a/apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx b/apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx new file mode 100644 index 00000000000..634c89a6a85 --- /dev/null +++ b/apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx @@ -0,0 +1,21 @@ +import { usePostHog } from "posthog-react-native"; +import { useEffect } from "react"; +import { useSession } from "@/lib/auth/client"; + +export function PostHogUserIdentifier() { + const { data: session } = useSession(); + const posthog = usePostHog(); + + useEffect(() => { + if (session?.user) { + posthog.identify(session.user.id, { + email: session.user.email, + name: session.user.name, + }); + } else if (session === null) { + posthog.reset(); + } + }, [session, posthog]); + + return null; +} diff --git a/apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/index.ts b/apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/index.ts new file mode 100644 index 00000000000..9c592fde4de --- /dev/null +++ b/apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/index.ts @@ -0,0 +1 @@ +export { PostHogUserIdentifier } from "./PostHogUserIdentifier"; diff --git a/apps/mobile/screens/RootLayout/index.ts b/apps/mobile/screens/RootLayout/index.ts new file mode 100644 index 00000000000..3c5e2f947c5 --- /dev/null +++ b/apps/mobile/screens/RootLayout/index.ts @@ -0,0 +1 @@ +export { RootLayout } from "./RootLayout"; diff --git a/apps/mobile/screens/RootLayout/providers/PostHogProvider/PostHogProvider.tsx b/apps/mobile/screens/RootLayout/providers/PostHogProvider/PostHogProvider.tsx new file mode 100644 index 00000000000..05b103874d2 --- /dev/null +++ b/apps/mobile/screens/RootLayout/providers/PostHogProvider/PostHogProvider.tsx @@ -0,0 +1,53 @@ +import { usePathname } from "expo-router"; +import { + PostHogProvider as PHProvider, + usePostHog, +} from "posthog-react-native"; +import { type ReactNode, useEffect, useRef } from "react"; +import { posthogConfig } from "@/lib/posthog"; + +interface PostHogProviderProps { + children: ReactNode; +} + +function PostHogInitializer({ children }: { children: ReactNode }) { + const posthog = usePostHog(); + const pathname = usePathname(); + const previousPathname = useRef(null); + + useEffect(() => { + if (posthogConfig.options.debug) { + posthog.debug(true); + } + posthog.register({ + app_name: "mobile", + }); + }, [posthog]); + + // Track screen views on pathname change + useEffect(() => { + if (pathname && pathname !== previousPathname.current) { + posthog.screen(pathname, { path: pathname }); + previousPathname.current = pathname; + } + }, [pathname, posthog]); + + return <>{children}; +} + +export function PostHogProvider({ children }: PostHogProviderProps) { + return ( + + {children} + + ); +} diff --git a/apps/mobile/screens/RootLayout/providers/PostHogProvider/index.ts b/apps/mobile/screens/RootLayout/providers/PostHogProvider/index.ts new file mode 100644 index 00000000000..56caddde426 --- /dev/null +++ b/apps/mobile/screens/RootLayout/providers/PostHogProvider/index.ts @@ -0,0 +1 @@ +export { PostHogProvider } from "./PostHogProvider"; diff --git a/bun.lock b/bun.lock index b2d50e81267..c3f3bf7c6ae 100644 --- a/bun.lock +++ b/bun.lock @@ -344,6 +344,7 @@ "dependencies": { "@better-auth/expo": "1.4.16", "@electric-sql/client": "https://pkg.pr.new/@electric-sql/client@3724", + "@react-native-async-storage/async-storage": "2.2.0", "@react-navigation/native": "^7.1.28", "@rn-primitives/portal": "^1.3.0", "@rn-primitives/slot": "^1.2.0", @@ -361,10 +362,14 @@ "clsx": "^2.1.1", "dotenv": "^17.2.3", "expo": "~54.0.31", + "expo-application": "~7.0.8", "expo-constants": "^18.0.13", "expo-crypto": "^15.0.8", "expo-dev-client": "~6.0.20", + "expo-device": "~8.0.10", + "expo-file-system": "~19.0.21", "expo-linking": "~8.0.11", + "expo-localization": "~17.0.8", "expo-network": "~8.0.8", "expo-router": "^6.0.21", "expo-secure-store": "~15.0.8", @@ -372,6 +377,7 @@ "expo-system-ui": "~6.0.9", "expo-web-browser": "~15.0.10", "lucide-react-native": "^0.562.0", + "posthog-react-native": "^4.23.0", "react": "19.1.0", "react-native": "0.81.5", "react-native-get-random-values": "^1.11.0", @@ -1513,6 +1519,8 @@ "@react-email/text": ["@react-email/text@0.1.5", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg=="], + "@react-native-async-storage/async-storage": ["@react-native-async-storage/async-storage@2.2.0", "", { "dependencies": { "merge-options": "^3.0.4" }, "peerDependencies": { "react-native": "^0.0.0-0 || >=0.65 <1.0" } }, "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw=="], + "@react-native/assets-registry": ["@react-native/assets-registry@0.81.5", "", {}, "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w=="], "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.81.5", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" } }, "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ=="], @@ -2833,6 +2841,8 @@ "expo": ["expo@54.0.31", "", { "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.21", "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", "@expo/devtools": "0.1.8", "@expo/fingerprint": "0.15.4", "@expo/metro": "~54.2.0", "@expo/metro-config": "54.0.13", "@expo/vector-icons": "^15.0.3", "@ungap/structured-clone": "^1.3.0", "babel-preset-expo": "~54.0.9", "expo-asset": "~12.0.12", "expo-constants": "~18.0.13", "expo-file-system": "~19.0.21", "expo-font": "~14.0.10", "expo-keep-awake": "~15.0.8", "expo-modules-autolinking": "3.0.24", "expo-modules-core": "3.0.29", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", "react-native": "*", "react-native-webview": "*" }, "optionalPeers": ["@expo/dom-webview", "@expo/metro-runtime", "react-native-webview"], "bin": { "expo": "bin/cli", "fingerprint": "bin/fingerprint", "expo-modules-autolinking": "bin/autolinking" } }, "sha512-kQ3RDqA/a59I7y+oqQGyrPbbYlgPMUdKBOgvFLpoHbD2bCM+F75i4N0mUijy7dG5F/CUCu2qHmGGUCXBbMDkCg=="], + "expo-application": ["expo-application@7.0.8", "", { "peerDependencies": { "expo": "*" } }, "sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q=="], + "expo-asset": ["expo-asset@12.0.12", "", { "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ=="], "expo-constants": ["expo-constants@18.0.13", "", { "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ=="], @@ -2847,6 +2857,8 @@ "expo-dev-menu-interface": ["expo-dev-menu-interface@2.0.0", "", { "peerDependencies": { "expo": "*" } }, "sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw=="], + "expo-device": ["expo-device@8.0.10", "", { "dependencies": { "ua-parser-js": "^0.7.33" }, "peerDependencies": { "expo": "*" } }, "sha512-jd5BxjaF7382JkDMaC+P04aXXknB2UhWaVx5WiQKA05ugm/8GH5uaz9P9ckWdMKZGQVVEOC8MHaUADoT26KmFA=="], + "expo-file-system": ["expo-file-system@19.0.21", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg=="], "expo-font": ["expo-font@14.0.11", "", { "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg=="], @@ -2857,6 +2869,8 @@ "expo-linking": ["expo-linking@8.0.11", "", { "dependencies": { "expo-constants": "~18.0.12", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA=="], + "expo-localization": ["expo-localization@17.0.8", "", { "dependencies": { "rtl-detect": "^1.0.2" }, "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-UrdwklZBDJ+t+ZszMMiE0SXZ2eJxcquCuQcl6EvGHM9K+e6YqKVRQ+w8qE+iIB3H75v2RJy6MHAaLK+Mqeo04g=="], + "expo-manifests": ["expo-manifests@1.0.10", "", { "dependencies": { "@expo/config": "~12.0.11", "expo-json-utils": "~0.15.0" }, "peerDependencies": { "expo": "*" } }, "sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ=="], "expo-modules-autolinking": ["expo-modules-autolinking@3.0.24", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ=="], @@ -3485,6 +3499,8 @@ "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + "merge-options": ["merge-options@3.0.4", "", { "dependencies": { "is-plain-obj": "^2.1.0" } }, "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], @@ -3857,6 +3873,8 @@ "posthog-node": ["posthog-node@5.21.1", "", { "dependencies": { "@posthog/core": "1.10.0" } }, "sha512-xFRlaZTrVfIVrRfEZsI/DM6pdJqeX6iaRlo46nexhB1wfRcuIy1mtp76nkZSw3DDRXBczTo41K7raO2yS3dxzA=="], + "posthog-react-native": ["posthog-react-native@4.23.0", "", { "dependencies": { "@posthog/core": "1.13.0" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">=1.0.0", "@react-navigation/native": ">= 5.0.0", "expo-application": ">= 4.0.0", "expo-device": ">= 4.0.0", "expo-file-system": ">= 13.0.0", "expo-localization": ">= 11.0.0", "posthog-react-native-session-replay": ">= 1.2.0", "react-native-device-info": ">= 10.0.0", "react-native-localize": ">= 3.0.0", "react-native-navigation": ">= 6.0.0", "react-native-safe-area-context": ">= 4.0.0", "react-native-svg": ">= 15.0.0" }, "optionalPeers": ["@react-native-async-storage/async-storage", "@react-navigation/native", "expo-application", "expo-device", "expo-file-system", "expo-localization", "posthog-react-native-session-replay", "react-native-device-info", "react-native-localize", "react-native-navigation", "react-native-safe-area-context"] }, "sha512-dhaB9d41tuaeGU4Jium8WJPDGqaybxMa2VVVd4qvFllIHB5cj/+6SPKaGKTTBfBB9ThS88/DO0l6kRqQXz+Dpg=="], + "postject": ["postject@1.0.0-alpha.6", "", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="], @@ -4157,6 +4175,8 @@ "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + "rtl-detect": ["rtl-detect@1.1.2", "", {}, "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], @@ -4523,6 +4543,8 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "ua-parser-js": ["ua-parser-js@0.7.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg=="], + "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], @@ -5215,6 +5237,8 @@ "meow/type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + "merge-options/is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + "mermaid/marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], "mermaid/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], @@ -5295,6 +5319,8 @@ "posthog-node/@posthog/core": ["@posthog/core@1.10.0", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-Xk3JQ+cdychsvftrV3G9ZrN9W329lbyFW0pGJXFGKFQf8qr4upw2SgNg9BVorjSrfhoXZRnJGt/uNF4nGFBL5A=="], + "posthog-react-native/@posthog/core": ["@posthog/core@1.13.0", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-knjncrk7qRmssFRbGzBl1Tunt21GRpe0Wv+uVelyL0Rh7PdQUsgguulzXFTps8hA6wPwTU4kq85qnbAJ3eH6Wg=="], + "postject/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],