modelence 0.22.2 → 0.23.0-mobile-oauth.dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/bin/modelence.js +8 -3
  2. package/dist/bin/modelence.js.map +1 -1
  3. package/dist/bson.d-M1rp21TC.d.ts +137 -0
  4. package/dist/chunk-DRLEIBGM.js +2 -0
  5. package/dist/chunk-DRLEIBGM.js.map +1 -0
  6. package/dist/chunk-FMEVYO43.js +41 -0
  7. package/dist/chunk-FMEVYO43.js.map +1 -0
  8. package/dist/{chunk-PJRYLKYW.js → chunk-HT5Q3IPP.js} +2 -2
  9. package/dist/{chunk-PJRYLKYW.js.map → chunk-HT5Q3IPP.js.map} +1 -1
  10. package/dist/chunk-MA24NXV7.js +4 -0
  11. package/dist/chunk-MA24NXV7.js.map +1 -0
  12. package/dist/chunk-UW37F3GV.js +2 -0
  13. package/dist/chunk-UW37F3GV.js.map +1 -0
  14. package/dist/chunk-VCIQ5DQM.js +3 -0
  15. package/dist/chunk-VCIQ5DQM.js.map +1 -0
  16. package/dist/chunk-WXSRHKW3.js +2 -0
  17. package/dist/chunk-WXSRHKW3.js.map +1 -0
  18. package/dist/chunk-XMEOB6SD.js +3 -0
  19. package/dist/chunk-XMEOB6SD.js.map +1 -0
  20. package/dist/client.d.ts +181 -7
  21. package/dist/client.js +1 -1
  22. package/dist/package-34JWTHQR.js +2 -0
  23. package/dist/{package-77VM3ZYJ.js.map → package-34JWTHQR.js.map} +1 -1
  24. package/dist/render-VZSAFZWU.js +2 -0
  25. package/dist/{render-CBIFY4DG.js.map → render-VZSAFZWU.js.map} +1 -1
  26. package/dist/renderApp-TK35MPRS.js +2 -0
  27. package/dist/{renderApp-J347DR2B.js.map → renderApp-TK35MPRS.js.map} +1 -1
  28. package/dist/server-HJBOIP54.js +2 -0
  29. package/dist/{server-2Z7VTMEZ.js.map → server-HJBOIP54.js.map} +1 -1
  30. package/dist/server.d.ts +35 -137
  31. package/dist/server.js +1 -1
  32. package/dist/telemetry.js +1 -1
  33. package/dist/transport-KVA6QNGX.js +2 -0
  34. package/dist/{transport-C7DEK6NV.js.map → transport-KVA6QNGX.js.map} +1 -1
  35. package/package.json +4 -3
  36. package/dist/chunk-2VYAJGWJ.js +0 -37
  37. package/dist/chunk-2VYAJGWJ.js.map +0 -1
  38. package/dist/chunk-7I6ULNRU.js +0 -3
  39. package/dist/chunk-7I6ULNRU.js.map +0 -1
  40. package/dist/chunk-AMJHJA2V.js +0 -2
  41. package/dist/chunk-AMJHJA2V.js.map +0 -1
  42. package/dist/chunk-BCUSVRAY.js +0 -2
  43. package/dist/chunk-BCUSVRAY.js.map +0 -1
  44. package/dist/chunk-OJ3LMWVQ.js +0 -2
  45. package/dist/chunk-OJ3LMWVQ.js.map +0 -1
  46. package/dist/chunk-VF4RU7MF.js +0 -3
  47. package/dist/chunk-VF4RU7MF.js.map +0 -1
  48. package/dist/chunk-YOJ4ZP5D.js +0 -4
  49. package/dist/chunk-YOJ4ZP5D.js.map +0 -1
  50. package/dist/package-77VM3ZYJ.js +0 -2
  51. package/dist/render-CBIFY4DG.js +0 -2
  52. package/dist/renderApp-J347DR2B.js +0 -2
  53. package/dist/server-2Z7VTMEZ.js +0 -2
  54. package/dist/transport-C7DEK6NV.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/SetupScreen.tsx","../src/client/AppProvider.tsx","../src/websocket/socketio/client.ts","../src/websocket/client.ts","../src/client/query.ts","../src/client/queryProvider.tsx"],"names":["styles","SetupScreen","jsx","jsxs","Step","number","children","SSR_STATE_SCRIPT_ID","SETUP_POLL_INTERVAL","isInitialized","hasServerRenderedMarkup","AppProvider","loadingElement","setupElement","isServer","isLoading","setIsLoading","useState","isSessionInitialized","needsSetup","setNeedsSetup","_isSetupRequired","useEffect","initConfig","_isReconciliationPending","reconcileSession","initSession","cancelled","timer","poll","setupRequired","callMethod","socketClient","activeLiveSubscriptions","getSocket","resubscribeAll","authToken","getAuthToken","clientInfo","getClientInfo","sub","init","props","baseUrl","getClientConfig","io","channel","on","category","listener","once","off","emit","eventName","id","joinChannel","leaveChannel","liveQueryCounter","subscribeLiveQuery","method","args","onData","onError","subscriptionId","handleData","sid","data","typeMap","reviveResponseTypes","handleError","error","socket","websocketProvider","client_default","websocketClientProvider","setWebsocketClientProvider","provider","getWebsocketClientProvider","startWebsockets","queryClientRef","cacheUnsubscribe","websocketsStarted","subscriptions","connectModelenceQueryClient","queryClient","disconnectModelenceQueryClient","event","subscriptionKey","hashKey","cancelError","r","hasConnectedQueryClient","ModelenceQueryClient","modelenceQuery","methodName","modelenceLiveQuery","queryKey","resolve","reject","currentSub","modelenceMutation","defaultArgs","variables","createQueryKey","SSR_QUERY_STATE_SCRIPT_ID","readDehydratedState","node","e","ModelenceQueryProvider","client","dehydratedState","internalClient","qc","QueryClient","state","QueryClientProvider","HydrationBoundary"],"mappings":"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","file":"chunk-VCIQ5DQM.js","sourcesContent":["'use client';\n\nimport { ReactNode } from 'react';\n\n/*\n Shown by AppProvider instead of the app when a development server reports it\n has no backend at all — no Modelence Cloud connection and no local database\n (see server-side isSetupRequired). This is the state of every fresh clone:\n .modelence.env holds the environment's credentials and is gitignored, so it\n never travels with the repo.\n\n Styled inline: this renders inside arbitrary user apps, so it can't rely on\n any CSS framework being present.\n*/\n\nconst styles: Record<string, React.CSSProperties> = {\n page: {\n minHeight: '100vh',\n backgroundColor: '#f3f4f6',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 16px',\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\",\n color: '#111827',\n },\n container: {\n maxWidth: '576px',\n width: '100%',\n },\n logoWrap: {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: '32px',\n },\n title: {\n fontSize: '30px',\n lineHeight: '36px',\n fontWeight: 700,\n textAlign: 'center',\n margin: 0,\n },\n subtitle: {\n marginTop: '16px',\n color: '#4b5563',\n textAlign: 'center',\n },\n steps: {\n marginTop: '32px',\n listStyle: 'none',\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n },\n step: {\n display: 'flex',\n gap: '16px',\n alignItems: 'flex-start',\n backgroundColor: '#ffffff',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n padding: '16px',\n },\n stepNumber: {\n flex: 'none',\n width: '28px',\n height: '28px',\n borderRadius: '9999px',\n backgroundColor: '#111827',\n color: '#ffffff',\n fontSize: '14px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n stepText: {\n color: '#374151',\n lineHeight: '28px',\n },\n code: {\n fontSize: '14px',\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace\",\n backgroundColor: '#e5e7eb',\n borderRadius: '4px',\n padding: '2px 4px',\n },\n footer: {\n marginTop: '32px',\n fontSize: '14px',\n color: '#6b7280',\n textAlign: 'center',\n },\n};\n\nexport default function SetupScreen() {\n return (\n <div style={styles.page}>\n <div style={styles.container}>\n <div style={styles.logoWrap}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"80\"\n height=\"80\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-label=\"Modelence Logo\"\n >\n <path\n fill=\"#5509D9\"\n d=\"M45 22.788V12L24 0l-9.437 5.392L45 22.788ZM25.152 35.24l10.589 6.052 8.107-4.632-10.589-6.052-8.107 4.632Zm9.26-15.872v9.264L45 34.684V25.42l-10.589-6.052ZM3 25.212V36l21 12 9.441-5.392L3 25.212ZM22.848 12.76 12.26 6.708 4.152 11.34l10.589 6.052 8.107-4.632Zm-9.26 15.872v-9.264L3 13.316v9.264l10.589 6.052Z\"\n />\n </svg>\n </div>\n <h1 style={styles.title}>Connect this project to Modelence Cloud</h1>\n <p style={styles.subtitle}>One quick step before you can use this app locally.</p>\n\n <ol style={styles.steps}>\n <Step number={1}>\n Run <code style={styles.code}>npx modelence setup</code> in the project folder.\n </Step>\n <Step number={2}>Your browser opens &mdash; log in and choose your environment.</Step>\n <Step number={3}>\n Restart the dev server (<code style={styles.code}>npm run dev</code>).\n </Step>\n </ol>\n\n <p style={styles.footer}>\n This page refreshes automatically once the project is connected.\n </p>\n </div>\n </div>\n );\n}\n\nfunction Step({ number, children }: { number: number; children: ReactNode }) {\n return (\n <li style={styles.step}>\n <span style={styles.stepNumber}>{number}</span>\n <span style={styles.stepText}>{children}</span>\n </li>\n );\n}\n","/*\n The \"use client\" directive is specifically for the Next.js layout component, which is rendered on the server by default.\n Because of this, we are explicitly marking it as a client component, so we can render this component on the client\n and properly initialize config on the client side.\n\n While this is specific to Next.js, it is simply ignored outside of Next.js and should not cause errors.\n*/\n'use client';\n\nimport { useState, useEffect, ReactNode } from 'react';\nimport { callMethod } from './method';\nimport SetupScreen from './SetupScreen';\nimport {\n _isReconciliationPending,\n _isSetupRequired,\n initSession,\n isSessionInitialized,\n reconcileSession,\n} from './session';\n\nconst SSR_STATE_SCRIPT_ID = '__MODELENCE_STATE__';\nconst SETUP_POLL_INTERVAL = 3000;\n\ninterface AppProviderProps {\n children: ReactNode;\n loadingElement?: ReactNode;\n /*\n Replaces the built-in setup screen shown when a development server has no\n backend yet (see SetupScreen). Pass `null` to disable the screen entirely\n and render the app regardless.\n */\n setupElement?: ReactNode;\n}\n\nlet isInitialized = false;\n\n// Presence of the state script signals server-rendered markup in the DOM,\n// even if `hydrateSession` failed to parse it. Hiding under a loading shell\n// here would cause a hydration mismatch and a flash-of-spinner.\nfunction hasServerRenderedMarkup(): boolean {\n return typeof document !== 'undefined' && document.getElementById(SSR_STATE_SCRIPT_ID) !== null;\n}\n\nexport function AppProvider({ children, loadingElement, setupElement }: AppProviderProps) {\n const isServer = typeof window === 'undefined';\n const [isLoading, setIsLoading] = useState(\n () => !isServer && !isSessionInitialized() && !hasServerRenderedMarkup()\n );\n const [needsSetup, setNeedsSetup] = useState(\n () => !isServer && isSessionInitialized() && _isSetupRequired()\n );\n\n useEffect(() => {\n async function initConfig() {\n if (isInitialized) {\n return;\n }\n\n isInitialized = true;\n\n if (isSessionInitialized()) {\n // SSR couldn't authenticate via cookie; reconcile via body token now.\n if (_isReconciliationPending()) {\n await reconcileSession();\n }\n // The initial useState read already saw the hydrated value, but only\n // because hydrateSession() runs before the first render — re-read\n // here so the setup screen doesn't depend on that ordering.\n setNeedsSetup(_isSetupRequired());\n return;\n }\n\n await initSession();\n setNeedsSetup(_isSetupRequired());\n setIsLoading(false);\n }\n\n void initConfig();\n }, []);\n\n // While the setup screen is up, watch for the project getting connected\n // (setup writes .modelence.env and the user restarts the dev server) and\n // reload for a clean boot. Poll errors are expected mid-restart.\n // Rescheduled after each poll settles, so requests never pile up while the\n // dev server hangs mid-restart and background-tab throttling can't burst.\n useEffect(() => {\n if (!needsSetup) {\n return;\n }\n\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout>;\n\n async function poll() {\n try {\n const { setupRequired } = await callMethod<{ setupRequired: boolean }>(\n '_system.setupStatus',\n {},\n { errorHandler: () => {} }\n );\n if (!setupRequired) {\n window.location.reload();\n return;\n }\n } catch {\n // Dev server restarting — keep polling.\n }\n if (!cancelled) {\n timer = setTimeout(poll, SETUP_POLL_INTERVAL);\n }\n }\n\n timer = setTimeout(poll, SETUP_POLL_INTERVAL);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [needsSetup]);\n\n if (isLoading) {\n return loadingElement ?? <div>Loading...</div>;\n }\n\n if (needsSetup && setupElement !== null) {\n return setupElement ?? <SetupScreen />;\n }\n\n return children;\n}\n","import io, { Socket } from 'socket.io-client';\nimport { WebsocketClientProvider } from '../types';\nimport { ClientChannel } from '../clientChannel';\nimport { getAuthToken, getClientInfo } from '@/auth/client';\nimport { getClientConfig } from '@/client/clientConfig';\nimport { reviveResponseTypes } from '@/methods/serialize';\n\nlet socketClient: Socket | null = null;\n\ninterface ActiveLiveSubscription {\n subscriptionId: string;\n method: string;\n args: Record<string, unknown>;\n}\nconst activeLiveSubscriptions = new Map<string, ActiveLiveSubscription>();\n\nfunction getSocket(): Socket {\n if (!socketClient) {\n throw new Error('WebSocket not initialized. Call startWebsockets() first.');\n }\n return socketClient;\n}\n\nfunction resubscribeAll() {\n const authToken = getAuthToken();\n const clientInfo = getClientInfo();\n for (const sub of activeLiveSubscriptions.values()) {\n socketClient?.emit('subscribeLiveQuery', {\n subscriptionId: sub.subscriptionId,\n method: sub.method,\n args: sub.args,\n authToken,\n clientInfo,\n });\n }\n}\n\nfunction init(props: { channels?: ClientChannel<unknown>[] }) {\n const baseUrl = getClientConfig()?.baseUrl ?? '/';\n socketClient = io(baseUrl, {\n transports: ['websocket'],\n auth: {\n token: getAuthToken(),\n },\n });\n\n // Subscribe to all live queries on connect/reconnect\n socketClient.on('connect', () => {\n if (activeLiveSubscriptions.size > 0) {\n console.log(\n `[Modelence] WebSocket reconnected, re-subscribing to ${activeLiveSubscriptions.size} live queries`\n );\n resubscribeAll();\n }\n });\n\n props.channels?.forEach((channel) => channel.init());\n}\n\nfunction on<T = unknown>({\n category,\n listener,\n}: {\n category: string;\n listener: (data: T) => void;\n}) {\n getSocket().on(category, listener);\n}\n\nfunction once<T = unknown>({\n category,\n listener,\n}: {\n category: string;\n listener: (data: T) => void;\n}) {\n getSocket().once(category, listener);\n}\n\nfunction off<T = unknown>({\n category,\n listener,\n}: {\n category: string;\n listener: (data: T) => void;\n}) {\n getSocket().off(category, listener);\n}\n\nfunction emit({ eventName, category, id }: { eventName: string; category: string; id: string }) {\n getSocket().emit(eventName, `${category}:${id}`);\n}\n\nfunction joinChannel({ category, id }: { category: string; id: string }) {\n emit({\n eventName: 'joinChannel',\n category,\n id,\n });\n}\n\nfunction leaveChannel({ category, id }: { category: string; id: string }) {\n emit({\n eventName: 'leaveChannel',\n category,\n id,\n });\n}\n\nlet liveQueryCounter = 0;\n\nexport function subscribeLiveQuery<T = unknown>(\n method: string,\n args: Record<string, unknown>,\n onData: (data: T) => void,\n onError?: (error: string) => void\n): () => void {\n const subscriptionId = `sub-${++liveQueryCounter}-${Date.now()}`;\n\n const handleData = ({\n subscriptionId: sid,\n data,\n typeMap,\n }: {\n subscriptionId: string;\n data: T;\n typeMap?: Record<string, unknown>;\n }) => {\n if (sid === subscriptionId) {\n onData(reviveResponseTypes(data, typeMap));\n }\n };\n\n const handleError = ({\n subscriptionId: sid,\n error,\n }: {\n subscriptionId: string;\n error: string;\n }) => {\n if (sid === subscriptionId) {\n console.error(`[Modelence] Live query error for ${method}:`, error);\n onError?.(error);\n }\n };\n\n const socket = getSocket();\n socket.on('liveQueryData', handleData);\n socket.on('liveQueryError', handleError);\n\n activeLiveSubscriptions.set(subscriptionId, { subscriptionId, method, args });\n\n // Only emit if already connected; otherwise the connect handler will handle it\n if (socket.connected) {\n socket.emit('subscribeLiveQuery', {\n subscriptionId,\n method,\n args,\n authToken: getAuthToken(),\n clientInfo: getClientInfo(),\n });\n }\n\n // Return unsubscribe function\n return () => {\n activeLiveSubscriptions.delete(subscriptionId);\n socket.emit('unsubscribeLiveQuery', { subscriptionId });\n socket.off('liveQueryData', handleData);\n socket.off('liveQueryError', handleError);\n };\n}\n\nconst websocketProvider: WebsocketClientProvider = {\n init,\n on,\n once,\n off,\n emit,\n joinChannel,\n leaveChannel,\n};\n\nexport default websocketProvider;\n","import { ClientChannel } from './clientChannel';\nimport websocketProvider, { subscribeLiveQuery } from './socketio/client';\nimport { WebsocketClientProvider } from './types';\n\nexport { subscribeLiveQuery };\n\nlet websocketClientProvider: WebsocketClientProvider | null = null;\n\nexport function setWebsocketClientProvider(provider: WebsocketClientProvider | null) {\n websocketClientProvider = provider;\n}\n\nexport function getWebsocketClientProvider() {\n return websocketClientProvider;\n}\n\nexport function startWebsockets(props?: {\n provider?: WebsocketClientProvider;\n channels?: ClientChannel[];\n}) {\n if (websocketClientProvider) {\n console.warn('WebSocket already initialized. Skipping initialization.');\n return;\n }\n\n const provider = props?.provider || websocketProvider;\n setWebsocketClientProvider(provider);\n try {\n provider.init({\n channels: props?.channels,\n });\n } catch (error) {\n setWebsocketClientProvider(null);\n throw error;\n }\n}\n","'use client';\n\nimport { QueryClient, hashKey } from '@tanstack/react-query';\nimport { callMethod } from './method';\nimport { startWebsockets, subscribeLiveQuery } from '../websocket/client';\n\ntype Args = Record<string, unknown>;\n\ninterface Subscription {\n unsubscribe: () => void;\n resolvers: Set<{\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n }>;\n}\n\nlet queryClientRef: QueryClient | null = null;\nlet cacheUnsubscribe: (() => void) | null = null;\nlet websocketsStarted = false;\nconst subscriptions = new Map<string, Subscription>();\n\n/**\n * Connects a `QueryClient` to Modelence's live-query layer. Auto-called by\n * `<ModelenceQueryProvider>`; only call manually if you mount your own\n * `<QueryClientProvider>`.\n *\n * Note: WebSocket setup is deferred until the first `modelenceLiveQuery`\n * call, so apps that only use `modelenceQuery`/`modelenceMutation` never\n * open a socket.\n */\nexport function connectModelenceQueryClient(queryClient: QueryClient) {\n if (queryClientRef === queryClient) {\n return;\n }\n\n if (queryClientRef) {\n disconnectModelenceQueryClient();\n }\n\n queryClientRef = queryClient;\n\n cacheUnsubscribe = queryClient.getQueryCache().subscribe((event) => {\n if (event.type === 'removed') {\n const subscriptionKey = hashKey(event.query.queryKey);\n const sub = subscriptions.get(subscriptionKey);\n if (sub) {\n if (sub.resolvers.size > 0) {\n const cancelError = new Error('Query was removed from cache');\n sub.resolvers.forEach((r) => r.reject(cancelError));\n sub.resolvers.clear();\n }\n sub.unsubscribe();\n subscriptions.delete(subscriptionKey);\n }\n }\n });\n}\n\n/**\n * Whether a `QueryClient` is already connected to the live-query layer.\n * `renderApp` uses this to avoid injecting its own `<ModelenceQueryProvider>`\n * when the app already mounts its own provider and connects it beforehand.\n */\nexport function hasConnectedQueryClient(): boolean {\n return queryClientRef !== null;\n}\n\nexport function disconnectModelenceQueryClient() {\n if (cacheUnsubscribe) {\n cacheUnsubscribe();\n cacheUnsubscribe = null;\n }\n subscriptions.forEach((sub) => sub.unsubscribe());\n subscriptions.clear();\n queryClientRef = null;\n websocketsStarted = false;\n}\n\n/** @deprecated Use `connectModelenceQueryClient(queryClient)` instead. */\nexport class ModelenceQueryClient {\n connect(queryClient: QueryClient) {\n connectModelenceQueryClient(queryClient);\n }\n}\n\n/**\n * @example\n * ```tsx\n * const { data } = useQuery(modelenceQuery('todo.getAll'));\n * ```\n */\nexport function modelenceQuery<T = unknown>(methodName: string, args: Args = {}) {\n return {\n queryKey: [methodName, args],\n queryFn: () => callMethod<T>(methodName, args),\n };\n}\n\n/**\n * Live query — data updates in real time as the underlying collection changes.\n * Requires a `QueryClient` connected via `<ModelenceQueryProvider>` or\n * `connectModelenceQueryClient(...)`.\n */\nexport function modelenceLiveQuery<T = unknown>(methodName: string, args: Args = {}) {\n const queryKey = ['live', methodName, args] as const;\n const subscriptionKey = hashKey(queryKey);\n\n return {\n queryKey,\n queryFn: () =>\n new Promise<T>((resolve, reject) => {\n // Live queries are WebSocket subscriptions — no server snapshot. Stay\n // pending on the server so Suspense renders; client re-runs after hydration.\n if (typeof window === 'undefined') {\n return;\n }\n\n if (!queryClientRef) {\n const error = new Error(\n 'Modelence: connect a QueryClient before using modelenceLiveQuery(). Mount <ModelenceQueryProvider> or call connectModelenceQueryClient().'\n );\n console.error('[Modelence]', error.message);\n reject(error);\n return;\n }\n\n if (!websocketsStarted) {\n startWebsockets();\n websocketsStarted = true;\n }\n\n let sub = subscriptions.get(subscriptionKey);\n\n if (!sub) {\n const unsubscribe = subscribeLiveQuery<T>(\n methodName,\n args,\n (data) => {\n const currentSub = subscriptions.get(subscriptionKey);\n\n if (currentSub?.resolvers.size) {\n currentSub.resolvers.forEach((r) => r.resolve(data));\n currentSub.resolvers.clear();\n }\n\n if (queryClientRef) {\n queryClientRef.setQueryData(queryKey, data);\n }\n },\n (error) => {\n const currentSub = subscriptions.get(subscriptionKey);\n if (currentSub) {\n if (currentSub.resolvers.size) {\n currentSub.resolvers.forEach((r) => r.reject(new Error(error)));\n currentSub.resolvers.clear();\n }\n currentSub.unsubscribe();\n subscriptions.delete(subscriptionKey);\n }\n }\n );\n\n sub = { unsubscribe, resolvers: new Set() };\n subscriptions.set(subscriptionKey, sub);\n }\n\n // Shared map stores resolvers across `T` instantiations; erase the union.\n sub.resolvers.add({\n resolve: resolve as (data: unknown) => void,\n reject,\n });\n }),\n staleTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n gcTime: 0,\n };\n}\n\nexport function modelenceMutation<T = unknown>(methodName: string, defaultArgs: Args = {}) {\n return {\n mutationFn: (variables: Args = {}) =>\n callMethod<T>(methodName, { ...defaultArgs, ...variables }),\n };\n}\n\nexport type ModelenceQueryKey<T extends string, U extends Args = Args> = readonly [T, U];\n\n/** Builds a query key matching `modelenceQuery(...)` for cache operations. */\nexport function createQueryKey<T extends string, U extends Args = Args>(\n methodName: T,\n args: U = {} as U\n): ModelenceQueryKey<T, U> {\n return [methodName, args] as const;\n}\n","'use client';\n\nimport { useState, type ReactNode } from 'react';\nimport {\n QueryClient,\n QueryClientProvider,\n HydrationBoundary,\n type DehydratedState,\n} from '@tanstack/react-query';\nimport { connectModelenceQueryClient } from './query';\n\nconst SSR_QUERY_STATE_SCRIPT_ID = '__MODELENCE_QUERY_STATE__';\n\nfunction readDehydratedState(): DehydratedState | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const node = document.getElementById(SSR_QUERY_STATE_SCRIPT_ID);\n if (!node || !node.textContent) {\n return undefined;\n }\n\n try {\n return JSON.parse(node.textContent) as DehydratedState;\n } catch (e) {\n console.error('Modelence: failed to parse SSR query state', e);\n return undefined;\n }\n}\n\ninterface ModelenceQueryProviderProps {\n children: ReactNode;\n client?: QueryClient;\n dehydratedState?: DehydratedState;\n}\n\nexport function ModelenceQueryProvider({\n children,\n client,\n dehydratedState,\n}: ModelenceQueryProviderProps) {\n const [internalClient] = useState(() => {\n const qc =\n client ??\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n },\n },\n });\n if (typeof window !== 'undefined') {\n connectModelenceQueryClient(qc);\n }\n return qc;\n });\n\n const state = dehydratedState ?? readDehydratedState();\n\n return (\n <QueryClientProvider client={internalClient}>\n <HydrationBoundary state={state}>{children}</HydrationBoundary>\n </QueryClientProvider>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {a,d,g as g$1,n}from'./chunk-VCIQ5DQM.js';import {K as K$1,b as b$1,G,g,k as k$1}from'./chunk-DRLEIBGM.js';import K from'react';import v from'react-dom/client';import {jsx}from'react/jsx-runtime';function y(t){return {getConfig(e){return b$1(`${t}.${e}`)},query(e,...r){let n=r[0]??{};return {queryKey:[t,e,n],queryFn:()=>K$1(`${t}.${e}`,n)}},mutation(e){return {mutationFn:r=>K$1(`${t}.${e}`,r)}},infiniteQuery(e,r){return {queryKey:[t,e,"infinite",r(void 0)],initialPageParam:void 0,queryFn:({pageParam:n})=>K$1(`${t}.${e}`,r(n))}}}}var w=y("_system");function Q(t){let e={};if(typeof t!="string")return e;let r=t.indexOf("?");if(r===-1)return e;let n=t.indexOf("#",r),c=t.slice(r+1,n===-1?void 0:n);for(let o of c.split("&")){if(!o)continue;let i=o.indexOf("="),u=i===-1?o:o.slice(0,i),l=i===-1?"":o.slice(i+1),s=C(u);s&&(s in e||(e[s]=C(l)));}return e}function C(t){let e=t.replace(/\+/g," ");try{return decodeURIComponent(e)}catch{return e}}var h=class{constructor(e,r){this.category=e,this.onMessage=r;}init(){d()?.on({category:this.category,listener:this.onMessage});}joinChannel(e){d()?.joinChannel({category:this.category,id:e});}leaveChannel(e){d()?.leaveChannel({category:this.category,id:e});}};var k="useClient"in K?K.useClient(a):a;var O="__MODELENCE_STATE__";function L(){return typeof document>"u"?false:document.getElementById(O)!==null}function H(){if(typeof document>"u")return null;let t=document.getElementById(O);if(!t)return null;try{return JSON.parse(t.textContent??"")}catch(e){return console.error("Modelence: failed to parse SSR state",e),null}}var b="__modelence_ssr_snapshot__";function D(t){globalThis[b]=t;}function Ne(){return globalThis[b]??null}function W(t){if(typeof window>"u"){D(t);return}let{loadingElement:e,routesElement:r,favicon:n$1,errorHandler:c,router:o,setupElement:i}=t;c&&G(c),window.addEventListener("unload",()=>{});let u=L(),l=H();l?.session&&(g(l.session),k$1());let s=document.getElementById("root"),q=window.location.pathname+window.location.search,x=o?o({children:r,location:q}):r,_=g$1()?x:jsx(n,{children:x}),S=jsx(K.StrictMode,{children:jsx(k,{loadingElement:e,setupElement:i,children:_})});if(u?v.hydrateRoot(s,S):v.createRoot(s).render(S),n$1){let T=document.querySelector("link[rel~='icon']");if(T)T.href=n$1;else {let p=document.createElement("link");p.rel="icon",p.href=n$1,document.head.appendChild(p);}}}export{y as a,w as b,Ne as c,W as d,Q as e,h as f,k as g};//# sourceMappingURL=chunk-WXSRHKW3.js.map
2
+ //# sourceMappingURL=chunk-WXSRHKW3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/module.ts","../src/system/client.ts","../src/auth/client/deepLink.ts","../src/websocket/clientChannel.ts","../src/client.ts","../src/client/renderApp.tsx"],"names":["createClientModule","moduleName","key","getConfig","name","rest","args","callMethod","getArgs","pageParam","systemConfig","parseDeepLinkParams","url","params","queryStart","fragmentStart","query","pair","eq","rawKey","rawValue","safeDecode","value","plus","ClientChannel","category","onMessage","getWebsocketClientProvider","id","AppProvider","React","SSR_STATE_SCRIPT_ID","hasSsrMarker","readSsrState","node","SNAPSHOT_KEY","setSnapshot","snapshot","_getSsrSnapshot","renderApp","options","loadingElement","routesElement","favicon","errorHandler","router","setupElement","setErrorHandler","isHydrating","ssrState","hydrateSession","startSessionHeartbeat","container","location","routedTree","appTree","hasConnectedQueryClient","jsx","ModelenceQueryProvider","tree","ReactDOM","link","newLink"],"mappings":"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","file":"chunk-WXSRHKW3.js","sourcesContent":["'use client';\n\nimport type { ObjectId } from 'mongodb';\nimport type { ConfigParams, ConfigType, ValueType } from '../config/types';\nimport { callMethod, type MethodArgs } from './method';\nimport type { AnyMethodShape } from '../methods/types';\n\n// Pulls the config store value without importing server-side code\nimport { getConfig as _getClientConfig } from '../config/client';\n\n// ── type helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Recursively maps ObjectId → string to match the sanitized runtime values\n * sent over the wire. Dates are preserved (revived via typeMap on the client).\n */\ntype Sanitized<T> = T extends ObjectId\n ? string\n : T extends Date\n ? Date\n : T extends (infer U)[]\n ? Sanitized<U>[]\n : T extends object\n ? { [K in keyof T]: Sanitized<T[K]> }\n : T;\n\ntype ExtractArgs<M> = M extends (args: infer A, ...rest: any[]) => any // eslint-disable-line @typescript-eslint/no-explicit-any\n ? A\n : M extends { handler: (args: infer A, ...rest: any[]) => any } // eslint-disable-line @typescript-eslint/no-explicit-any\n ? A\n : MethodArgs;\n\ntype ExtractResult<M> = M extends (...args: any[]) => Promise<infer R> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? Sanitized<R>\n : M extends { handler: (...args: any[]) => Promise<infer R> } // eslint-disable-line @typescript-eslint/no-explicit-any\n ? Sanitized<R>\n : unknown;\n\ntype PublicKeyOf<TSchema extends Record<string, ConfigParams>> = {\n [K in keyof TSchema as TSchema[K] extends ConfigParams<ConfigType, true>\n ? string & K\n : never]: ValueType<TSchema[K]['type']>;\n};\n\ntype AnyModule = {\n name: string;\n configSchema: Record<string, ConfigParams>;\n queries: Record<string, AnyMethodShape>;\n mutations: Record<string, AnyMethodShape>;\n};\n\n// ── createClientModule ────────────────────────────────────────────────────────\n\n/**\n * Creates a typed client accessor for a module's public configs, queries, and mutations.\n *\n * Use `import type` to reference the module so no server code is bundled on the client.\n * Arg and return types for queries and mutations are inferred automatically from the\n * server-side handler signatures.\n *\n * @param moduleName - The module's name as passed to `new Module(name, ...)`.\n *\n * @example\n * ```ts\n * // src/client/payments.ts\n * import type paymentsModule from '../server/payments';\n * import { createClientModule } from 'modelence/client';\n *\n * export const payments = createClientModule<typeof paymentsModule>('payments');\n * ```\n *\n * ```ts\n * // src/components/Checkout.tsx\n * import { useQuery, useMutation } from '@tanstack/react-query';\n * import { payments } from '../client/payments';\n *\n * // Typed config — public keys only, private and secret keys excluded:\n * const currency = payments.getConfig('currency'); // string | undefined\n *\n * // Typed query — pass directly to useQuery:\n * const { data: products } = useQuery(payments.query('getProducts', { page: 1 }));\n *\n * // Typed mutation — pass directly to useMutation:\n * const { mutate: charge } = useMutation(payments.mutation('charge'));\n * charge({ amount: 100 }); // args typed from handler signature\n * ```\n */\nexport function createClientModule<TModule extends AnyModule>(moduleName: string) {\n return {\n getConfig<K extends keyof PublicKeyOf<TModule['configSchema']> & string>(\n key: K\n ): PublicKeyOf<TModule['configSchema']>[K] | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _getClientConfig(`${moduleName}.${key}`) as any;\n },\n\n query<K extends keyof TModule['queries'] & string>(\n name: K,\n ...rest: {} extends ExtractArgs<TModule['queries'][K]>\n ? [args?: ExtractArgs<TModule['queries'][K]>]\n : [args: ExtractArgs<TModule['queries'][K]>]\n ) {\n const args = (rest[0] ?? {}) as ExtractArgs<TModule['queries'][K]>;\n return {\n queryKey: [moduleName, name, args] as const,\n queryFn: (): Promise<ExtractResult<TModule['queries'][K]>> =>\n callMethod<ExtractResult<TModule['queries'][K]>>(\n `${moduleName}.${name}`,\n args as MethodArgs\n ),\n };\n },\n\n mutation<K extends keyof TModule['mutations'] & string>(name: K) {\n return {\n mutationFn: (\n args: ExtractArgs<TModule['mutations'][K]>\n ): Promise<ExtractResult<TModule['mutations'][K]>> =>\n callMethod<ExtractResult<TModule['mutations'][K]>>(\n `${moduleName}.${name}`,\n args as MethodArgs\n ),\n };\n },\n\n /**\n * Returns options for `useInfiniteQuery`. The `getArgs` callback receives the\n * current `pageParam` and returns the args to pass to the query handler.\n * Spread the result into `useInfiniteQuery` alongside `getNextPageParam`.\n *\n * Annotate the `pageParam` type in the callback so TypeScript can infer the\n * page param type — no manual generic needed on `useInfiniteQuery`.\n */\n infiniteQuery<K extends keyof TModule['queries'] & string, TPageParam = unknown>(\n name: K,\n getArgs: (pageParam: TPageParam | undefined) => ExtractArgs<TModule['queries'][K]>\n ) {\n return {\n queryKey: [moduleName, name, 'infinite', getArgs(undefined)] as const,\n // Included so TanStack infers TPageParam from the callback type, not from a bare `undefined`.\n initialPageParam: undefined as TPageParam | undefined,\n queryFn: ({\n pageParam,\n }: {\n pageParam: TPageParam | undefined;\n }): Promise<ExtractResult<TModule['queries'][K]>> =>\n callMethod<ExtractResult<TModule['queries'][K]>>(\n `${moduleName}.${name}`,\n getArgs(pageParam) as MethodArgs\n ),\n };\n },\n };\n}\n","import type systemModule from './index';\nimport { createClientModule } from '../client/module';\n\nexport const systemConfig = createClientModule<typeof systemModule>('_system');\n","/**\n * Deep-link query parsing that works on bare React Native.\n *\n * `new URL(url).searchParams` is not usable here: React Native's `URL` is a\n * partial implementation that throws on `searchParams` access, and Expo only\n * appears to work because it installs a polyfill. Parsing the query string\n * directly keeps the documented callback snippet working on both.\n */\n\n/**\n * Reads query parameters out of a deep link such as `myapp://auth?code=abc`.\n *\n * Only the query component is considered — everything from the first `?` up to\n * an optional `#` fragment. Values are percent-decoded, with `+` treated as a\n * space to match `application/x-www-form-urlencoded`, which is how the server's\n * `URL.searchParams.set` encodes them.\n */\nexport function parseDeepLinkParams(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n\n if (typeof url !== 'string') return params;\n\n const queryStart = url.indexOf('?');\n if (queryStart === -1) return params;\n\n const fragmentStart = url.indexOf('#', queryStart);\n const query = url.slice(queryStart + 1, fragmentStart === -1 ? undefined : fragmentStart);\n\n for (const pair of query.split('&')) {\n if (!pair) continue;\n\n const eq = pair.indexOf('=');\n const rawKey = eq === -1 ? pair : pair.slice(0, eq);\n const rawValue = eq === -1 ? '' : pair.slice(eq + 1);\n\n const key = safeDecode(rawKey);\n if (!key) continue;\n\n // First occurrence wins, so a crafted link cannot override an earlier\n // parameter by appending a duplicate.\n if (!(key in params)) {\n params[key] = safeDecode(rawValue);\n }\n }\n\n return params;\n}\n\n/**\n * Percent-decodes a component, falling back to the raw text.\n *\n * `decodeURIComponent` throws on malformed escapes like `%zz`; a deep link is\n * attacker-reachable input, so a bad escape must not take down the app's link\n * handler.\n */\nfunction safeDecode(value: string): string {\n const plus = value.replace(/\\+/g, ' ');\n try {\n return decodeURIComponent(plus);\n } catch {\n return plus;\n }\n}\n","import { getWebsocketClientProvider } from './client';\n\nexport class ClientChannel<T = unknown> {\n public readonly category: string;\n private readonly onMessage: (data: T) => void;\n\n constructor(category: string, onMessage: (data: T) => void) {\n this.category = category;\n this.onMessage = onMessage;\n }\n\n init() {\n getWebsocketClientProvider()?.on({\n category: this.category,\n listener: this.onMessage,\n });\n }\n\n joinChannel(id: string) {\n getWebsocketClientProvider()?.joinChannel({\n category: this.category,\n id,\n });\n }\n\n leaveChannel(id: string) {\n getWebsocketClientProvider()?.leaveChannel({\n category: this.category,\n id,\n });\n }\n}\n","import React from 'react';\n\nimport { AppProvider as OriginalAppProvider } from './client/AppProvider';\n\nexport { configureClient, type ClientConfig } from './client/clientConfig';\nexport { getConfig } from './config/client';\nexport { createClientModule } from './client/module';\nexport type { ValueType } from './config/types';\nexport { systemConfig } from './system/client';\n\nexport const AppProvider =\n 'useClient' in React\n ? // @ts-ignore: React.useClient only exists in Next.js\n React.useClient(OriginalAppProvider)\n : OriginalAppProvider;\n\nexport { renderApp } from './client/renderApp';\nexport { ModelenceQueryProvider } from './client/queryProvider';\nexport {\n modelenceQuery,\n modelenceLiveQuery,\n modelenceMutation,\n createQueryKey,\n connectModelenceQueryClient,\n disconnectModelenceQueryClient,\n ModelenceQueryClient,\n type ModelenceQueryKey,\n} from './client/query';\nexport { callMethod, MethodError, type MethodArgs, type CallMethodOptions } from './client/method';\nexport { useSession } from './client/session';\nexport {\n signupWithPassword,\n loginWithPassword,\n verifyEmail,\n updateProfile,\n resendEmailVerification,\n logout,\n sendResetPasswordToken,\n resetPassword,\n sendMagicLink,\n loginWithMagicLink,\n loginWithOneTimeCode,\n signInWithOAuth,\n loginWithOAuth,\n linkOAuthProvider,\n unlinkOAuthProvider,\n type UserInfo,\n} from './auth/client';\nexport { parseDeepLinkParams } from './auth/client/deepLink';\nexport {\n getWebsocketClientProvider,\n setWebsocketClientProvider,\n startWebsockets,\n subscribeLiveQuery,\n} from './websocket/client';\nexport { ClientChannel } from './websocket/clientChannel';\nexport { getLocalStorageSession } from './client/localStorage';\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport { AppProvider } from '../client';\nimport { setErrorHandler, ErrorHandler } from './errorHandler';\nimport { hydrateSession, startSessionHeartbeat, type SessionInitPayload } from './session';\nimport { ModelenceQueryProvider } from './queryProvider';\nimport { hasConnectedQueryClient } from './query';\n\nconst SSR_STATE_SCRIPT_ID = '__MODELENCE_STATE__';\n\ntype SsrState = {\n session?: SessionInitPayload;\n};\n\nfunction hasSsrMarker(): boolean {\n if (typeof document === 'undefined') {\n return false;\n }\n return document.getElementById(SSR_STATE_SCRIPT_ID) !== null;\n}\n\nfunction readSsrState(): SsrState | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const node = document.getElementById(SSR_STATE_SCRIPT_ID);\n if (!node) {\n return null;\n }\n\n try {\n return JSON.parse(node.textContent ?? '') as SsrState;\n } catch (e) {\n // Caller must still hydrate (marker presence drives that, not parsed payload).\n console.error('Modelence: failed to parse SSR state', e);\n return null;\n }\n}\n\nexport type SsrRouter = (props: {\n children: React.ReactNode;\n location?: string;\n}) => React.ReactElement;\n\nexport interface RenderAppOptions {\n loadingElement: React.ReactNode;\n routesElement: React.ReactNode;\n favicon?: string;\n errorHandler?: ErrorHandler;\n router?: SsrRouter;\n /*\n Replaces the built-in setup screen shown when a development server has no\n backend yet (no Modelence Cloud connection, no local database). Pass\n `null` to disable the screen entirely.\n */\n setupElement?: React.ReactNode;\n}\n\n// Shared via globalThis: ssrLoadModule loads the user's entry in a separate\n// module graph from the framework runtime.\nconst SNAPSHOT_KEY = '__modelence_ssr_snapshot__';\n\ntype GlobalWithSnapshot = typeof globalThis & {\n [SNAPSHOT_KEY]?: RenderAppOptions | null;\n};\n\nfunction setSnapshot(snapshot: RenderAppOptions | null) {\n (globalThis as GlobalWithSnapshot)[SNAPSHOT_KEY] = snapshot;\n}\n\n/** @internal Used by the SSR runtime after evaluating the user's entry. */\nexport function _getSsrSnapshot(): RenderAppOptions | null {\n return (globalThis as GlobalWithSnapshot)[SNAPSHOT_KEY] ?? null;\n}\n\nexport function renderApp(options: RenderAppOptions) {\n if (typeof window === 'undefined') {\n setSnapshot(options);\n return;\n }\n\n const { loadingElement, routesElement, favicon, errorHandler, router, setupElement } = options;\n\n if (errorHandler) {\n setErrorHandler(errorHandler);\n }\n\n // Empty 'unload' handler prevents bfcache in most browsers.\n window.addEventListener('unload', () => {});\n\n // Hydrate session BEFORE building the tree so `isSessionInitialized()` is\n // true on the first render and matches the server output. Hydration mode\n // tracks marker presence (not parse success): a parse failure still leaves\n // server-rendered DOM that must be hydrated, not replaced.\n const isHydrating = hasSsrMarker();\n const ssrState = readSsrState();\n if (ssrState?.session) {\n hydrateSession(ssrState.session);\n // Fire-and-forget: the heartbeat loop runs in the background.\n void startSessionHeartbeat();\n }\n\n const container = document.getElementById('root')!;\n // Pass the same location the server used (req.originalUrl == path + search;\n // the hash is never sent to the server) so a location-driven router (e.g. a\n // static router) resolves the same route on hydration as it did during SSR,\n // avoiding hydration mismatches.\n const location = window.location.pathname + window.location.search;\n const routedTree = router ? router({ children: routesElement, location }) : routesElement;\n\n // If the app already connected its own QueryClient (the documented\n // bring-your-own-provider pattern connects before calling renderApp), don't\n // inject ours. A second provider would shadow the user's client: useQuery\n // would read the inner client while live-query updates write to the outer\n // one, so real-time queries would never update.\n const appTree = hasConnectedQueryClient() ? (\n routedTree\n ) : (\n <ModelenceQueryProvider>{routedTree}</ModelenceQueryProvider>\n );\n\n const tree = (\n <React.StrictMode>\n <AppProvider loadingElement={loadingElement} setupElement={setupElement}>\n {appTree}\n </AppProvider>\n </React.StrictMode>\n );\n\n if (isHydrating) {\n ReactDOM.hydrateRoot(container, tree);\n } else {\n ReactDOM.createRoot(container).render(tree);\n }\n\n if (favicon) {\n const link = document.querySelector(\"link[rel~='icon']\") as HTMLLinkElement;\n if (!link) {\n const newLink = document.createElement('link');\n newLink.rel = 'icon';\n newLink.href = favicon;\n document.head.appendChild(newLink);\n } else {\n link.href = favicon;\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ var s="module",i="modelence",r="0.23.0-mobile-oauth.dev.0",o="The Node.js Framework for Real-Time MongoDB Apps",c="dist/index.js",n="dist/global.d.ts",p={".":"./dist/index.js","./client":"./dist/client.js","./server":"./dist/server.js","./telemetry":"./dist/telemetry.js","./mongodb":"./dist/mongo.js","./types":{types:"./dist/types.d.ts",default:"./dist/types.js"}},d=["dist","dist/bin"],a={modelence:"./dist/bin/modelence.js"},l={node:">=22"},m={build:"tsup",dev:"tsup --watch",format:'prettier --write "src/**/*.{ts,tsx,js,jsx,json,css,md}"',"format:check":'prettier --check "src/**/*.{ts,tsx,js,jsx,json,css,md}"',lint:"eslint src --ext .ts,.tsx --fix","lint:check":"eslint src --ext .ts,.tsx",prepublishOnly:"npm run build",bench:"tsx src/bench/index.ts",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",postversion:"git push && git push --tags",prepare:"cd ../.. && git config core.hooksPath .husky"},u={type:"git",url:"git+https://github.com/modelence/modelence.git"},g="Modelence",y="SEE LICENSE IN LICENSE",h={url:"https://github.com/modelence/modelence/issues"},v="https://modelence.com",j={"@tanstack/react-query":"^5.100.7","@types/archiver":"^6.0.3","@types/bcrypt":"^6.0.0","@types/cookie-parser":"^1.4.9","@types/express":"^5.0.0","@types/node":"^22.5.1","@types/react":"^19.0.0","@types/react-dom":"^19.0.1","@types/socket.io":"^3.0.1","@typescript-eslint/eslint-plugin":"^8.17.0","@typescript-eslint/parser":"^8.17.0","@vitest/coverage-v8":"^2.1.8",eslint:"^9.37.0",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.6.2",react:"^19.0.0","react-dom":"^19.0.0","ts-node":"^10.9.2","vite-tsconfig-paths":"^5.1.4",vitest:"^2.1.8"},x={"@socket.io/mongo-adapter":"^0.4.0","@vitejs/plugin-react":"^4.3.4",archiver:"^7.0.1",bcrypt:"^6.0.0",commander:"^12.0.0","cookie-parser":"^1.4.7",dotenv:"^16.4.5","elastic-apm-node":"^4.15.0",express:"^4.21.0",jiti:"^2.4.2",mongodb:"^6.8.1",open:"^10.1.0","socket.io":"^4.8.1","socket.io-client":"^4.8.1",tsup:"^8.3.6",tsx:"^4.19.3",typescript:"^5.7.2",vite:"^6.0.3","vite-plugin-eslint":"^1.8.1",zod:"^3.23.8",zustand:"^5.0.2"},b={"@tanstack/react-query":">=5.0.0",react:">=18.0.0","react-dom":">=18.0.0"},k={type:s,name:i,version:r,description:o,main:c,types:n,exports:p,files:d,bin:a,engines:l,scripts:m,"lint-staged":{"src/**/*.{ts,tsx,js,jsx,json,css,md}":"prettier --write"},repository:u,author:g,license:y,bugs:h,homepage:v,devDependencies:j,dependencies:x,peerDependencies:b};
2
+ export{s as a,i as b,r as c,o as d,c as e,n as f,p as g,d as h,a as i,l as j,m as k,u as l,g as m,y as n,h as o,v as p,j as q,x as r,b as s,k as t};//# sourceMappingURL=chunk-XMEOB6SD.js.map
3
+ //# sourceMappingURL=chunk-XMEOB6SD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package.json"],"names":["type","name","version","description","main","types","exports","files","bin","engines","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies","peerDependencies","package_default"],"mappings":"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","file":"chunk-XMEOB6SD.js","sourcesContent":["{\n \"type\": \"module\",\n \"name\": \"modelence\",\n \"version\": \"0.23.0-mobile-oauth.dev.0\",\n \"description\": \"The Node.js Framework for Real-Time MongoDB Apps\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/global.d.ts\",\n \"exports\": {\n \".\": \"./dist/index.js\",\n \"./client\": \"./dist/client.js\",\n \"./server\": \"./dist/server.js\",\n \"./telemetry\": \"./dist/telemetry.js\",\n \"./mongodb\": \"./dist/mongo.js\",\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"default\": \"./dist/types.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"dist/bin\"\n ],\n \"bin\": {\n \"modelence\": \"./dist/bin/modelence.js\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,css,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,css,md}\\\"\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run build\",\n \"bench\": \"tsx src/bench/index.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"postversion\": \"git push && git push --tags\",\n \"prepare\": \"cd ../.. && git config core.hooksPath .husky\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js,jsx,json,css,md}\": \"prettier --write\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/modelence/modelence.git\"\n },\n \"author\": \"Modelence\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"bugs\": {\n \"url\": \"https://github.com/modelence/modelence/issues\"\n },\n \"homepage\": \"https://modelence.com\",\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.100.7\",\n \"@types/archiver\": \"^6.0.3\",\n \"@types/bcrypt\": \"^6.0.0\",\n \"@types/cookie-parser\": \"^1.4.9\",\n \"@types/express\": \"^5.0.0\",\n \"@types/node\": \"^22.5.1\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.1\",\n \"@types/socket.io\": \"^3.0.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.17.0\",\n \"@typescript-eslint/parser\": \"^8.17.0\",\n \"@vitest/coverage-v8\": \"^2.1.8\",\n \"eslint\": \"^9.37.0\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^16.2.7\",\n \"prettier\": \"^3.6.2\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"ts-node\": \"^10.9.2\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@socket.io/mongo-adapter\": \"^0.4.0\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"archiver\": \"^7.0.1\",\n \"bcrypt\": \"^6.0.0\",\n \"commander\": \"^12.0.0\",\n \"cookie-parser\": \"^1.4.7\",\n \"dotenv\": \"^16.4.5\",\n \"elastic-apm-node\": \"^4.15.0\",\n \"express\": \"^4.21.0\",\n \"jiti\": \"^2.4.2\",\n \"mongodb\": \"^6.8.1\",\n \"open\": \"^10.1.0\",\n \"socket.io\": \"^4.8.1\",\n \"socket.io-client\": \"^4.8.1\",\n \"tsup\": \"^8.3.6\",\n \"tsx\": \"^4.19.3\",\n \"typescript\": \"^5.7.2\",\n \"vite\": \"^6.0.3\",\n \"vite-plugin-eslint\": \"^1.8.1\",\n \"zod\": \"^3.23.8\",\n \"zustand\": \"^5.0.2\"\n },\n \"peerDependencies\": {\n \"@tanstack/react-query\": \">=5.0.0\",\n \"react\": \">=18.0.0\",\n \"react-dom\": \">=18.0.0\"\n }\n}\n"]}