modelence 0.23.0-setup.dev.1 → 0.23.0-setup.dev.10

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 (45) hide show
  1. package/dist/bin/modelence.js +8 -4
  2. package/dist/bin/modelence.js.map +1 -1
  3. package/dist/chunk-4EHMYUFO.js +41 -0
  4. package/dist/chunk-4EHMYUFO.js.map +1 -0
  5. package/dist/{chunk-VW6ML4HX.js → chunk-5DF3HHWJ.js} +2 -2
  6. package/dist/{chunk-VW6ML4HX.js.map → chunk-5DF3HHWJ.js.map} +1 -1
  7. package/dist/chunk-ILNPNRGJ.js +3 -0
  8. package/dist/chunk-ILNPNRGJ.js.map +1 -0
  9. package/dist/chunk-KDOTVIEY.js +4 -0
  10. package/dist/chunk-KDOTVIEY.js.map +1 -0
  11. package/dist/chunk-NCJCE4XN.js +3 -0
  12. package/dist/chunk-NCJCE4XN.js.map +1 -0
  13. package/dist/{chunk-SIKRUWRN.js → chunk-UJ2WYHH7.js} +2 -2
  14. package/dist/{chunk-SIKRUWRN.js.map → chunk-UJ2WYHH7.js.map} +1 -1
  15. package/dist/chunk-UW37F3GV.js +2 -0
  16. package/dist/chunk-UW37F3GV.js.map +1 -0
  17. package/dist/client.js +1 -1
  18. package/dist/package-4N23FMUL.js +2 -0
  19. package/dist/{package-XAQYEUWG.js.map → package-4N23FMUL.js.map} +1 -1
  20. package/dist/{render-RN75WGWX.js → render-FRLQDLXI.js} +2 -2
  21. package/dist/{render-RN75WGWX.js.map → render-FRLQDLXI.js.map} +1 -1
  22. package/dist/renderApp-YNRUDPRK.js +2 -0
  23. package/dist/{renderApp-DDIZBBPN.js.map → renderApp-YNRUDPRK.js.map} +1 -1
  24. package/dist/server-6OSZ242A.js +2 -0
  25. package/dist/{server-46L3FOLX.js.map → server-6OSZ242A.js.map} +1 -1
  26. package/dist/server.d.ts +50 -0
  27. package/dist/server.js +1 -1
  28. package/dist/telemetry.js +1 -1
  29. package/dist/transport-LWVQ4TUY.js +2 -0
  30. package/dist/{transport-JPOZOWQ6.js.map → transport-LWVQ4TUY.js.map} +1 -1
  31. package/package.json +4 -3
  32. package/dist/chunk-B5WLEHNH.js +0 -3
  33. package/dist/chunk-B5WLEHNH.js.map +0 -1
  34. package/dist/chunk-B7EXKTEZ.js +0 -3
  35. package/dist/chunk-B7EXKTEZ.js.map +0 -1
  36. package/dist/chunk-I25TKIJW.js +0 -37
  37. package/dist/chunk-I25TKIJW.js.map +0 -1
  38. package/dist/chunk-PGNYB3ZP.js +0 -3
  39. package/dist/chunk-PGNYB3ZP.js.map +0 -1
  40. package/dist/chunk-WHC2SP5P.js +0 -4
  41. package/dist/chunk-WHC2SP5P.js.map +0 -1
  42. package/dist/package-XAQYEUWG.js +0 -2
  43. package/dist/renderApp-DDIZBBPN.js +0 -2
  44. package/dist/server-46L3FOLX.js +0 -2
  45. package/dist/transport-JPOZOWQ6.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-NCJCE4XN.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"]}
@@ -1,2 +1,2 @@
1
- import {E}from'./chunk-WHC2SP5P.js';import {a,b,c}from'./chunk-5M6FUMUK.js';import {AsyncLocalStorage}from'async_hooks';async function x(t,e,u){let n=a(await E(t,e,u)),a$1=b(n),y=JSON.parse(JSON.stringify(n));return c(y,a$1??void 0)}var p=new AsyncLocalStorage;function g(t,e){return p.run(t,e)}function d(){return p.getStore()}export{x as a,g as b,d as c};//# sourceMappingURL=chunk-SIKRUWRN.js.map
2
- //# sourceMappingURL=chunk-SIKRUWRN.js.map
1
+ import {E}from'./chunk-KDOTVIEY.js';import {a,b,c}from'./chunk-5M6FUMUK.js';import {AsyncLocalStorage}from'async_hooks';async function x(t,e,u){let n=a(await E(t,e,u)),a$1=b(n),y=JSON.parse(JSON.stringify(n));return c(y,a$1??void 0)}var p=new AsyncLocalStorage;function g(t,e){return p.run(t,e)}function d(){return p.getStore()}export{x as a,g as b,d as c};//# sourceMappingURL=chunk-UJ2WYHH7.js.map
2
+ //# sourceMappingURL=chunk-UJ2WYHH7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ssr/callInProcess.ts","../src/ssr/context.ts"],"names":["callInProcessMethod","methodName","args","context","sanitized","sanitizeResult","runMethod","typeMap","getResponseTypeMap","jsonRoundTripped","reviveResponseTypes","storage","AsyncLocalStorage","runWithSsrContext","ctx","fn","getSsrContext"],"mappings":"wHAOA,eAAsBA,CAAAA,CACpBC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAYC,CAAAA,CAAe,MAAMC,CAAAA,CAAUL,CAAAA,CAAYC,CAAAA,CAAMC,CAAO,CAAC,CAAA,CACrEI,GAAAA,CAAUC,CAAAA,CAAmBJ,CAAS,CAAA,CACtCK,CAAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUL,CAAS,CAAC,CAAA,CAC7D,OAAOM,CAAAA,CAAoBD,CAAAA,CAAkBF,GAAAA,EAAW,MAAS,CACnE,CCAA,IAAMI,CAAAA,CAAU,IAAIC,iBAAAA,CAEb,SAASC,CAAAA,CAAqBC,CAAAA,CAAwBC,CAAAA,CAAgB,CAC3E,OAAOJ,CAAAA,CAAQ,GAAA,CAAIG,CAAAA,CAAKC,CAAE,CAC5B,CAEO,SAASC,CAAAA,EAA+C,CAC7D,OAAOL,CAAAA,CAAQ,QAAA,EACjB","file":"chunk-SIKRUWRN.js","sourcesContent":["import { runMethod } from '../methods';\nimport { sanitizeResult, getResponseTypeMap, reviveResponseTypes } from '../methods/serialize';\nimport type { Context, Args } from '../methods/types';\n\n// Invoke a method in-process and round-trip through the same JSON pipeline\n// as the HTTP transport so SSR output matches the dehydrated query cache.\n// The JSON.stringify/parse step is load-bearing: strips `undefined` props.\nexport async function callInProcessMethod<T = unknown>(\n methodName: string,\n args: Args,\n context: Context\n): Promise<T> {\n const sanitized = sanitizeResult(await runMethod(methodName, args, context));\n const typeMap = getResponseTypeMap(sanitized);\n const jsonRoundTripped = JSON.parse(JSON.stringify(sanitized));\n return reviveResponseTypes(jsonRoundTripped, typeMap ?? undefined) as T;\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { QueryClient } from '@tanstack/react-query';\nimport type { Context } from '../methods/types';\nimport type { Configs } from '../config/types';\n\nexport type SsrSessionSnapshot = {\n user: unknown;\n configs: Configs;\n};\n\nexport type SsrRequestContext = {\n callContext: Context;\n queryClient: QueryClient;\n session: SsrSessionSnapshot;\n};\n\nconst storage = new AsyncLocalStorage<SsrRequestContext>();\n\nexport function runWithSsrContext<T>(ctx: SsrRequestContext, fn: () => T): T {\n return storage.run(ctx, fn);\n}\n\nexport function getSsrContext(): SsrRequestContext | undefined {\n return storage.getStore();\n}\n"]}
1
+ {"version":3,"sources":["../src/ssr/callInProcess.ts","../src/ssr/context.ts"],"names":["callInProcessMethod","methodName","args","context","sanitized","sanitizeResult","runMethod","typeMap","getResponseTypeMap","jsonRoundTripped","reviveResponseTypes","storage","AsyncLocalStorage","runWithSsrContext","ctx","fn","getSsrContext"],"mappings":"wHAOA,eAAsBA,CAAAA,CACpBC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAYC,CAAAA,CAAe,MAAMC,CAAAA,CAAUL,CAAAA,CAAYC,CAAAA,CAAMC,CAAO,CAAC,CAAA,CACrEI,GAAAA,CAAUC,CAAAA,CAAmBJ,CAAS,CAAA,CACtCK,CAAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUL,CAAS,CAAC,CAAA,CAC7D,OAAOM,CAAAA,CAAoBD,CAAAA,CAAkBF,GAAAA,EAAW,MAAS,CACnE,CCAA,IAAMI,CAAAA,CAAU,IAAIC,iBAAAA,CAEb,SAASC,CAAAA,CAAqBC,CAAAA,CAAwBC,CAAAA,CAAgB,CAC3E,OAAOJ,CAAAA,CAAQ,GAAA,CAAIG,CAAAA,CAAKC,CAAE,CAC5B,CAEO,SAASC,CAAAA,EAA+C,CAC7D,OAAOL,CAAAA,CAAQ,QAAA,EACjB","file":"chunk-UJ2WYHH7.js","sourcesContent":["import { runMethod } from '../methods';\nimport { sanitizeResult, getResponseTypeMap, reviveResponseTypes } from '../methods/serialize';\nimport type { Context, Args } from '../methods/types';\n\n// Invoke a method in-process and round-trip through the same JSON pipeline\n// as the HTTP transport so SSR output matches the dehydrated query cache.\n// The JSON.stringify/parse step is load-bearing: strips `undefined` props.\nexport async function callInProcessMethod<T = unknown>(\n methodName: string,\n args: Args,\n context: Context\n): Promise<T> {\n const sanitized = sanitizeResult(await runMethod(methodName, args, context));\n const typeMap = getResponseTypeMap(sanitized);\n const jsonRoundTripped = JSON.parse(JSON.stringify(sanitized));\n return reviveResponseTypes(jsonRoundTripped, typeMap ?? undefined) as T;\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { QueryClient } from '@tanstack/react-query';\nimport type { Context } from '../methods/types';\nimport type { Configs } from '../config/types';\n\nexport type SsrSessionSnapshot = {\n user: unknown;\n configs: Configs;\n};\n\nexport type SsrRequestContext = {\n callContext: Context;\n queryClient: QueryClient;\n session: SsrSessionSnapshot;\n};\n\nconst storage = new AsyncLocalStorage<SsrRequestContext>();\n\nexport function runWithSsrContext<T>(ctx: SsrRequestContext, fn: () => T): T {\n return storage.run(ctx, fn);\n}\n\nexport function getSsrContext(): SsrRequestContext | undefined {\n return storage.getStore();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import S from'elastic-apm-node';var a={},l={},E=false;function p(e){return l[e]?.value??a[e]?.default}function R(){if(!E)throw new Error("Config is not initialized: an attempt was made to access configs before they were loaded");return Object.fromEntries(Object.entries(a).filter(([e,t])=>t.isPublic).map(([e,t])=>[e,{key:e,type:t.type,value:l[e]?.value??t.default}]))}function K(e){e.forEach(({key:t,type:r,value:n})=>{!t.toLowerCase().startsWith("_system.")&&!a[t]||(l[t]={key:t,type:r,value:n});}),E=true;}function N(){return a}function O(e){Object.entries(e).forEach(([t,r])=>{let{type:n,isPublic:o}=r;if(n==="secret"&&o)throw new Error(`Config ${t} with type "secret" cannot be public`)}),a=e;}var s=null;function z(){}function P(e){s=Object.assign({},s,e);}function b(){return s?.environmentId}function v(){return s?.appAlias}function A(){return s?.environmentAlias}function C(){return s?.telemetry?.serviceName}function c(){return !!s?.telemetry?.isEnabled}var x=false,f=null,G=async()=>{if(x)throw new Error('Metrics are already initialized, duplicate "initMetrics" call received');x=true,c()&&L();};function L(){let e=p("_system.elastic.apmEndpoint"),t=p("_system.elastic.apiKey"),r=v()??"unknown",n=A()??"unknown",o=b()??"unknown",i=C();f=S.start({serviceName:i,apiKey:t,serverUrl:e,transactionSampleRate:1,centralConfig:false,globalLabels:{modelenceEnv:"dev",appEnv:"dev",environmentId:o,appAlias:r,environmentAlias:n}});}function u(){if(!f)throw new Error("APM is not initialized");return f}var h=["token","password","secret","nonce","code"];function g(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(g);let t={};for(let[r,n]of Object.entries(e)){let o=h.some(i=>r.toLowerCase().includes(i));t[r]=o?"[redacted]":g(n);}return t}function m(){return process.env.MODELENCE_LOG_LEVEL||"info"}function T(e,t){m()==="debug"&&console.debug(e,t);}function I(e,t){["debug","info"].includes(m())&&console.info(e,t);}function j(e,t){["debug","info","error"].includes(m())&&console.error(e,t);}function k(e,t,r){if(!c())return {end:()=>{},setContext:()=>{}};let n=u(),o=n.startTransaction(t,e);return r&&n.setCustomContext(r),{end:(i,{endTime:y,context:d}={})=>{d&&n.setCustomContext(d),o.end(i,y);},setContext:i=>{n.setCustomContext(i);}}}function M(e){if(!c()){console.error(e);return}u().captureError(e);}export{p as a,R as b,K as c,N as d,O as e,z as f,P as g,b as h,G as i,g as j,T as k,I as l,j as m,k as n,M as o};//# sourceMappingURL=chunk-UW37F3GV.js.map
2
+ //# sourceMappingURL=chunk-UW37F3GV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/server.ts","../src/app/state.ts","../src/app/metrics.ts","../src/telemetry/index.ts"],"names":["configSchema","config","isInitialized","getConfig","key","getPublicConfigs","_","schema","loadConfigs","configs","type","value","getSchema","setSchema","isPublic","metadata","markAppStarted","setMetadata","_metadata","getEnvironmentId","getAppAlias","getEnvironmentAlias","getTelemetryServiceName","isTelemetryEnabled","apm","initMetrics","initElasticApm","elasticApmEndpoint","elasticApiKey","appAlias","environmentAlias","environmentId","serviceName","elasticApm","getApm","SENSITIVE_KEYS","redactSensitive","result","val","isSensitive","k","getLogLevel","logDebug","message","args","logInfo","logError","startTransaction","name","context","transaction","endTime","captureError","error"],"mappings":"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","file":"chunk-UW37F3GV.js","sourcesContent":["import { AppConfig, ConfigKey, ConfigSchema } from './types';\n\nlet configSchema: ConfigSchema = {};\nlet config: Record<ConfigKey, AppConfig> = {};\nlet isInitialized = false;\n\n/**\n * @sidebarTitle getConfig (server)\n *\n * @param key - The configuration key to retrieve\n * @returns The configuration value (string, number, or boolean)\n *\n * @example\n * ```ts\n * import { getConfig } from 'modelence/server';\n *\n * // Get the site URL\n * const siteUrl = getConfig('_system.site.url');\n * ```\n *\n * Set via environment variable:\n * ```bash\n * MODELENCE_SITE_URL=https://myapp.com\n * ```\n *\n * @example\n * ```ts\n * import { getConfig } from 'modelence/server';\n *\n * // Get the current environment (e.g., 'development', 'staging', 'production')\n * const env = getConfig('_system.env');\n *\n * if (env === 'production') {\n * // Enable production features\n * }\n * ```\n *\n * Set via environment variable:\n * ```bash\n * MODELENCE_SITE_ENV=production\n * ```\n */\nexport function getConfig(key: ConfigKey): string | number | boolean | undefined {\n return config[key]?.value ?? configSchema[key]?.default;\n}\n\nexport function getPublicConfigs() {\n if (!isInitialized) {\n throw new Error(\n 'Config is not initialized: an attempt was made to access configs before they were loaded'\n );\n }\n\n return Object.fromEntries(\n Object.entries(configSchema)\n .filter(([_, schema]) => schema.isPublic)\n .map(([key, schema]) => {\n return [\n key,\n {\n key,\n type: schema.type,\n value: config[key]?.value ?? schema.default,\n },\n ];\n })\n );\n}\n\nexport function loadConfigs(configs: AppConfig[]) {\n configs.forEach(({ key, type, value }) => {\n const isSystemConfig = key.toLowerCase().startsWith('_system.');\n\n if (!isSystemConfig && !configSchema[key]) {\n // Ignore unknown configs\n return;\n }\n\n config[key] = {\n key,\n type,\n value,\n };\n });\n\n isInitialized = true;\n}\n\nexport function getSchema() {\n return configSchema;\n}\n\nexport function setSchema(schema: ConfigSchema) {\n // TODO: more validation on the schema structure\n Object.entries(schema).forEach(([key, value]) => {\n const { type, isPublic } = value;\n\n if (type === 'secret' && isPublic) {\n throw new Error(`Config ${key} with type \"secret\" cannot be public`);\n }\n });\n\n configSchema = schema;\n}\n","type AppMetadata = {\n environmentId: string;\n appAlias: string;\n environmentAlias: string;\n telemetry: {\n isEnabled: boolean;\n serviceName: string;\n };\n};\n\nlet appStarted = false;\nlet metadata: AppMetadata | null = null;\n\nexport function markAppStarted() {\n appStarted = true;\n}\n\nexport function isAppStarted() {\n return appStarted;\n}\n\nexport function setMetadata(_metadata: AppMetadata) {\n metadata = Object.assign({}, metadata, _metadata);\n}\n\nexport function getEnvironmentId() {\n return metadata?.environmentId;\n}\n\nexport function getAppAlias() {\n return metadata?.appAlias;\n}\n\nexport function getEnvironmentAlias() {\n return metadata?.environmentAlias;\n}\n\nexport function getTelemetryServiceName() {\n return metadata?.telemetry?.serviceName;\n}\n\nexport function isTelemetryEnabled() {\n return Boolean(metadata?.telemetry?.isEnabled);\n}\n","import elasticApm from 'elastic-apm-node';\n\nimport { getConfig } from '../config/server';\nimport {\n getAppAlias,\n getEnvironmentAlias,\n getEnvironmentId,\n getTelemetryServiceName,\n isTelemetryEnabled,\n} from './state';\n\nlet isInitialized = false;\nlet apm: typeof elasticApm | null = null;\n\nexport const initMetrics = async () => {\n if (isInitialized) {\n throw new Error('Metrics are already initialized, duplicate \"initMetrics\" call received');\n }\n\n isInitialized = true;\n\n if (isTelemetryEnabled()) {\n initElasticApm();\n }\n};\n\nfunction initElasticApm() {\n const elasticApmEndpoint = getConfig('_system.elastic.apmEndpoint') as string;\n const elasticApiKey = getConfig('_system.elastic.apiKey') as string;\n\n const appAlias = getAppAlias() ?? 'unknown';\n const environmentAlias = getEnvironmentAlias() ?? 'unknown';\n const environmentId = getEnvironmentId() ?? 'unknown';\n const serviceName = getTelemetryServiceName();\n\n apm = elasticApm.start({\n serviceName,\n apiKey: elasticApiKey,\n serverUrl: elasticApmEndpoint,\n transactionSampleRate: 1.0,\n centralConfig: false,\n globalLabels: {\n modelenceEnv: 'dev',\n appEnv: 'dev',\n environmentId,\n appAlias,\n environmentAlias,\n },\n });\n}\n\nexport function getApm() {\n if (!apm) {\n throw new Error('APM is not initialized');\n }\n return apm;\n}\n","import { getApm } from '@/app/metrics';\nimport { isTelemetryEnabled } from '@/app/state';\n\ntype LogLevel = 'error' | 'info' | 'debug' | '';\n\n// Secret-bearing keys to scrub before request args/query/body reach the APM sink.\n// Matched case-insensitively as a substring (`authToken` matches `token`).\nconst SENSITIVE_KEYS = ['token', 'password', 'secret', 'nonce', 'code'];\n\n/**\n * Deep-copies `value`, replacing any {@link SENSITIVE_KEYS} match with\n * `'[redacted]'`. Non-object values pass through unchanged.\n */\nexport function redactSensitive(value: unknown): unknown {\n if (!value || typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(redactSensitive);\n }\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n const isSensitive = SENSITIVE_KEYS.some((k) => key.toLowerCase().includes(k));\n result[key] = isSensitive ? '[redacted]' : redactSensitive(val);\n }\n return result;\n}\n\n/**\n * Gets the logging level for console logs based on the MODELENCE_LOG_LEVEL environment variable.\n *\n * Logs go to stdout/stderr only, where the hosting infrastructure (e.g. CloudWatch\n * via the container log driver) picks them up.\n *\n * @returns The log level ('error' | 'info' | 'debug'), defaulting to 'info'\n */\nfunction getLogLevel(): LogLevel {\n return (process.env.MODELENCE_LOG_LEVEL as LogLevel) || 'info';\n}\n\nexport function logDebug(message: string, args: object) {\n if (getLogLevel() === 'debug') {\n console.debug(message, args);\n }\n}\n\nexport function logInfo(message: string, args: object) {\n if (['debug', 'info'].includes(getLogLevel())) {\n console.info(message, args);\n }\n}\n\nexport function logError(message: string, args: object) {\n if (['debug', 'info', 'error'].includes(getLogLevel())) {\n console.error(message, args);\n }\n}\n\ninterface WrappedTransaction {\n end(result?: string, context?: Record<string, unknown>): void;\n setContext(context: Record<string, unknown>): void;\n}\n\nexport function startTransaction(\n type: 'method' | 'cron' | 'ai' | 'custom' | 'route',\n name: string,\n context?: Record<string, unknown>\n): WrappedTransaction {\n if (!isTelemetryEnabled()) {\n return {\n end: () => {\n // do nothing\n },\n setContext: () => {\n // do nothing\n },\n };\n }\n\n const apm = getApm();\n const transaction = apm.startTransaction(name, type);\n if (context) {\n apm.setCustomContext(context);\n }\n\n return {\n end: (\n result?: string,\n { endTime, context }: { endTime?: number; context?: Record<string, unknown> } = {}\n ) => {\n if (context) {\n apm.setCustomContext(context);\n }\n transaction.end(result, endTime);\n },\n setContext: (context: Record<string, unknown>) => {\n apm.setCustomContext(context);\n },\n };\n}\n\nexport function captureError(error: Error) {\n if (!isTelemetryEnabled()) {\n console.error(error);\n return;\n }\n\n getApm().captureError(error);\n}\n"]}
package/dist/client.js CHANGED
@@ -1,2 +1,2 @@
1
- export{f as AppProvider,e as ClientChannel,a as createClientModule,d as renderApp,b as systemConfig}from'./chunk-VW6ML4HX.js';export{i as ModelenceQueryClient,n as ModelenceQueryProvider,f as connectModelenceQueryClient,m as createQueryKey,h as disconnectModelenceQueryClient,d as getWebsocketClientProvider,k as modelenceLiveQuery,l as modelenceMutation,j as modelenceQuery,c as setWebsocketClientProvider,e as startWebsockets,b as subscribeLiveQuery}from'./chunk-B7EXKTEZ.js';export{F as MethodError,I as callMethod,d as configureClient,b as getConfig,c as getLocalStorageSession,A as linkOAuthProvider,x as loginWithMagicLink,y as loginWithOneTimeCode,q as loginWithPassword,u as logout,t as resendEmailVerification,z as resetPassword,w as sendMagicLink,v as sendResetPasswordToken,p as signupWithPassword,B as unlinkOAuthProvider,r as updateProfile,o as useSession,s as verifyEmail}from'./chunk-MTG3OZWX.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';//# sourceMappingURL=client.js.map
1
+ export{f as AppProvider,e as ClientChannel,a as createClientModule,d as renderApp,b as systemConfig}from'./chunk-5DF3HHWJ.js';export{i as ModelenceQueryClient,n as ModelenceQueryProvider,f as connectModelenceQueryClient,m as createQueryKey,h as disconnectModelenceQueryClient,d as getWebsocketClientProvider,k as modelenceLiveQuery,l as modelenceMutation,j as modelenceQuery,c as setWebsocketClientProvider,e as startWebsockets,b as subscribeLiveQuery}from'./chunk-NCJCE4XN.js';export{F as MethodError,I as callMethod,d as configureClient,b as getConfig,c as getLocalStorageSession,A as linkOAuthProvider,x as loginWithMagicLink,y as loginWithOneTimeCode,q as loginWithPassword,u as logout,t as resendEmailVerification,z as resetPassword,w as sendMagicLink,v as sendResetPasswordToken,p as signupWithPassword,B as unlinkOAuthProvider,r as updateProfile,o as useSession,s as verifyEmail}from'./chunk-MTG3OZWX.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';//# sourceMappingURL=client.js.map
2
2
  //# sourceMappingURL=client.js.map
@@ -0,0 +1,2 @@
1
+ export{m as author,i as bin,o as bugs,t as default,r as dependencies,d as description,q as devDependencies,j as engines,g as exports,h as files,p as homepage,n as license,e as main,b as name,s as peerDependencies,l as repository,k as scripts,a as type,f as types,c as version}from'./chunk-ILNPNRGJ.js';//# sourceMappingURL=package-4N23FMUL.js.map
2
+ //# sourceMappingURL=package-4N23FMUL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"package-XAQYEUWG.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"package-4N23FMUL.js"}
@@ -1,2 +1,2 @@
1
- import {a,b,c}from'./chunk-SIKRUWRN.js';import'./chunk-WHC2SP5P.js';import'./chunk-B5WLEHNH.js';import {a as a$1,n}from'./chunk-B7EXKTEZ.js';import {m,a as a$2,n as n$1}from'./chunk-MTG3OZWX.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';import {renderToPipeableStream}from'react-dom/server';import {Writable}from'stream';import {QueryClient,dehydrate}from'@tanstack/react-query';import {jsx}from'react/jsx-runtime';var J=()=>{let r=c();return r?n$1(r.session.user):null},M=r=>{let n=c();if(n)return n.session.configs[r]?.value};function D(){m(J),a$2(M);}async function X(r){let{callContext:n$1,loadingElement:C,routesElement:S,router:u,location:x,onShellReady:E,onError:b$1}=r;D();let l=await a("_system.session.init",{},n$1),i=new QueryClient({defaultOptions:{queries:{retry:false,gcTime:0}}}),O=u?u({children:S,location:x}):S,Q=jsx(a$1,{loadingElement:C,children:jsx(n,{client:i,children:O})}),a$2=null;await new Promise((s,m)=>{b({callContext:n$1,queryClient:i,session:{user:l.user,configs:l.configs??{}}},()=>{let e=renderToPipeableStream(Q,{onShellReady(){a$2=e,E?.(),s(e);},onShellError(t){m(t);},onError(t){b$1?.(t);}});return e});});let d=null,_=s=>new Promise((m,e)=>{if(!a$2){e(new Error("SSR stream was not initialized"));return}let t=new Writable({write(o,c,I){s.write(o,N=>I(N??void 0));},final(o){try{let c=dehydrate(i);d=JSON.stringify(c);}finally{i.clear();}o(),m();}});t.on("error",o=>{s.destroy(o),e(o);}),s.on("error",e),a$2.pipe(t);});return {sessionState:JSON.stringify({session:l}),pipe:_,getQueryState:()=>{if(d===null)throw new Error("getQueryState() called before stream finished");return d}}}export{X as renderSsrTreeStream};//# sourceMappingURL=render-RN75WGWX.js.map
2
- //# sourceMappingURL=render-RN75WGWX.js.map
1
+ import {a,b,c}from'./chunk-UJ2WYHH7.js';import'./chunk-KDOTVIEY.js';import'./chunk-UW37F3GV.js';import {a as a$1,n}from'./chunk-NCJCE4XN.js';import {m,a as a$2,n as n$1}from'./chunk-MTG3OZWX.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';import {renderToPipeableStream}from'react-dom/server';import {Writable}from'stream';import {QueryClient,dehydrate}from'@tanstack/react-query';import {jsx}from'react/jsx-runtime';var J=()=>{let r=c();return r?n$1(r.session.user):null},M=r=>{let n=c();if(n)return n.session.configs[r]?.value};function D(){m(J),a$2(M);}async function X(r){let{callContext:n$1,loadingElement:C,routesElement:S,router:u,location:x,onShellReady:E,onError:b$1}=r;D();let l=await a("_system.session.init",{},n$1),i=new QueryClient({defaultOptions:{queries:{retry:false,gcTime:0}}}),O=u?u({children:S,location:x}):S,Q=jsx(a$1,{loadingElement:C,children:jsx(n,{client:i,children:O})}),a$2=null;await new Promise((s,m)=>{b({callContext:n$1,queryClient:i,session:{user:l.user,configs:l.configs??{}}},()=>{let e=renderToPipeableStream(Q,{onShellReady(){a$2=e,E?.(),s(e);},onShellError(t){m(t);},onError(t){b$1?.(t);}});return e});});let d=null,_=s=>new Promise((m,e)=>{if(!a$2){e(new Error("SSR stream was not initialized"));return}let t=new Writable({write(o,c,I){s.write(o,N=>I(N??void 0));},final(o){try{let c=dehydrate(i);d=JSON.stringify(c);}finally{i.clear();}o(),m();}});t.on("error",o=>{s.destroy(o),e(o);}),s.on("error",e),a$2.pipe(t);});return {sessionState:JSON.stringify({session:l}),pipe:_,getQueryState:()=>{if(d===null)throw new Error("getQueryState() called before stream finished");return d}}}export{X as renderSsrTreeStream};//# sourceMappingURL=render-FRLQDLXI.js.map
2
+ //# sourceMappingURL=render-FRLQDLXI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ssr/render.tsx"],"names":["sessionResolver","ctx","getSsrContext","_parseSessionUser","configResolver","key","ensureSsrResolversInstalled","_setSsrSessionResolver","_setSsrConfigResolver","renderSsrTreeStream","options","callContext","loadingElement","routesElement","router","location","onShellReady","onError","sessionPayload","callInProcessMethod","queryClient","QueryClient","routedTree","tree","jsx","AppProvider","ModelenceQueryProvider","streamRef","resolve","reject","runWithSsrContext","stream","renderToPipeableStream","error","queryStateJson","pipe","destination","passthrough","Writable","chunk","_encoding","callback","err","dehydratedState","dehydrate"],"mappings":"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","file":"render-RN75WGWX.js","sourcesContent":["import React from 'react';\nimport { renderToPipeableStream, type PipeableStream } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport { QueryClient, dehydrate, type DehydratedState } from '@tanstack/react-query';\nimport { AppProvider } from '../client/AppProvider';\nimport { ModelenceQueryProvider } from '../client/queryProvider';\nimport { getSsrContext, runWithSsrContext } from './context';\nimport { callInProcessMethod } from './callInProcess';\nimport type { Context } from '../methods/types';\nimport {\n _parseSessionUser,\n _setSsrSessionResolver,\n type SessionInitPayload,\n} from '../client/session';\nimport { _setSsrConfigResolver } from '../config/client';\nimport type { ConfigKey, Configs } from '../config/types';\nimport type { SsrRouter } from '../client/renderApp';\n\nconst sessionResolver = () => {\n const ctx = getSsrContext();\n if (!ctx) {\n return null;\n }\n return _parseSessionUser(ctx.session.user);\n};\n\nconst configResolver = (key: ConfigKey) => {\n const ctx = getSsrContext();\n if (!ctx) {\n return undefined;\n }\n return ctx.session.configs[key]?.value;\n};\n\nfunction ensureSsrResolversInstalled() {\n _setSsrSessionResolver(sessionResolver);\n _setSsrConfigResolver(configResolver);\n}\n\nexport type SsrRenderOptions = {\n callContext: Context;\n loadingElement: React.ReactNode;\n routesElement: React.ReactNode;\n router?: SsrRouter;\n location?: string;\n};\n\nexport type SsrStreamHandle = {\n /** Session bootstrap payload — inline before the shell flushes. */\n sessionState: string;\n /** Pipe React's HTML into `destination`. Resolves when streaming finishes. */\n pipe: (destination: Writable) => Promise<void>;\n /** Dehydrated query state. Only call after `pipe()` resolves. */\n getQueryState: () => string;\n};\n\nexport type SsrStreamOptions = SsrRenderOptions & {\n /** Fires when the shell is flushed; caller writes prelude + state here. */\n onShellReady?: () => void;\n /** Non-fatal SSR errors (Suspense fallbacks, etc.). */\n onError?: (error: unknown) => void;\n};\n\nexport async function renderSsrTreeStream(options: SsrStreamOptions): Promise<SsrStreamHandle> {\n const { callContext, loadingElement, routesElement, router, location, onShellReady, onError } =\n options;\n\n ensureSsrResolversInstalled();\n\n const sessionPayload = await callInProcessMethod<SessionInitPayload>(\n '_system.session.init',\n {},\n callContext\n );\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n gcTime: 0,\n },\n },\n });\n\n const routedTree = router ? router({ children: routesElement, location }) : routesElement;\n const tree = (\n <AppProvider loadingElement={loadingElement}>\n <ModelenceQueryProvider client={queryClient}>{routedTree}</ModelenceQueryProvider>\n </AppProvider>\n );\n\n let streamRef: PipeableStream | null = null;\n // Resolves with the stream once React renders above-fallback content;\n // rejects on shell errors so the caller can fall back to a static response.\n const shellReady = new Promise<PipeableStream>((resolve, reject) => {\n // Run the render inside the SSR context so components can resolve\n // session/config/query state from the per-request scope.\n runWithSsrContext(\n {\n callContext,\n queryClient,\n session: {\n user: sessionPayload.user,\n configs: (sessionPayload.configs as Configs) ?? {},\n },\n },\n () => {\n const stream = renderToPipeableStream(tree, {\n onShellReady() {\n streamRef = stream;\n onShellReady?.();\n resolve(stream);\n },\n onShellError(error) {\n reject(error);\n },\n onError(error) {\n onError?.(error);\n },\n });\n return stream;\n }\n );\n });\n\n // Await so shell errors surface before the caller starts piping.\n await shellReady;\n\n let queryStateJson: string | null = null;\n\n const pipe = (destination: Writable): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (!streamRef) {\n reject(new Error('SSR stream was not initialized'));\n return;\n }\n\n // react-dom calls `destination.end()` when done. The caller still needs\n // to write the epilogue + query state, so wrap with a passthrough whose\n // `final()` resolves the pipe promise without closing the response.\n const passthrough = new Writable({\n write(chunk, _encoding, callback) {\n destination.write(chunk, (err) => callback(err ?? undefined));\n },\n final(callback) {\n try {\n const dehydratedState: DehydratedState = dehydrate(queryClient);\n queryStateJson = JSON.stringify(dehydratedState);\n } finally {\n queryClient.clear();\n }\n callback();\n resolve();\n },\n });\n\n passthrough.on('error', (err) => {\n destination.destroy(err);\n reject(err);\n });\n destination.on('error', reject);\n\n streamRef.pipe(passthrough);\n });\n };\n\n return {\n sessionState: JSON.stringify({ session: sessionPayload }),\n pipe,\n getQueryState: () => {\n if (queryStateJson === null) {\n throw new Error('getQueryState() called before stream finished');\n }\n return queryStateJson;\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/ssr/render.tsx"],"names":["sessionResolver","ctx","getSsrContext","_parseSessionUser","configResolver","key","ensureSsrResolversInstalled","_setSsrSessionResolver","_setSsrConfigResolver","renderSsrTreeStream","options","callContext","loadingElement","routesElement","router","location","onShellReady","onError","sessionPayload","callInProcessMethod","queryClient","QueryClient","routedTree","tree","jsx","AppProvider","ModelenceQueryProvider","streamRef","resolve","reject","runWithSsrContext","stream","renderToPipeableStream","error","queryStateJson","pipe","destination","passthrough","Writable","chunk","_encoding","callback","err","dehydratedState","dehydrate"],"mappings":"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","file":"render-FRLQDLXI.js","sourcesContent":["import React from 'react';\nimport { renderToPipeableStream, type PipeableStream } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport { QueryClient, dehydrate, type DehydratedState } from '@tanstack/react-query';\nimport { AppProvider } from '../client/AppProvider';\nimport { ModelenceQueryProvider } from '../client/queryProvider';\nimport { getSsrContext, runWithSsrContext } from './context';\nimport { callInProcessMethod } from './callInProcess';\nimport type { Context } from '../methods/types';\nimport {\n _parseSessionUser,\n _setSsrSessionResolver,\n type SessionInitPayload,\n} from '../client/session';\nimport { _setSsrConfigResolver } from '../config/client';\nimport type { ConfigKey, Configs } from '../config/types';\nimport type { SsrRouter } from '../client/renderApp';\n\nconst sessionResolver = () => {\n const ctx = getSsrContext();\n if (!ctx) {\n return null;\n }\n return _parseSessionUser(ctx.session.user);\n};\n\nconst configResolver = (key: ConfigKey) => {\n const ctx = getSsrContext();\n if (!ctx) {\n return undefined;\n }\n return ctx.session.configs[key]?.value;\n};\n\nfunction ensureSsrResolversInstalled() {\n _setSsrSessionResolver(sessionResolver);\n _setSsrConfigResolver(configResolver);\n}\n\nexport type SsrRenderOptions = {\n callContext: Context;\n loadingElement: React.ReactNode;\n routesElement: React.ReactNode;\n router?: SsrRouter;\n location?: string;\n};\n\nexport type SsrStreamHandle = {\n /** Session bootstrap payload — inline before the shell flushes. */\n sessionState: string;\n /** Pipe React's HTML into `destination`. Resolves when streaming finishes. */\n pipe: (destination: Writable) => Promise<void>;\n /** Dehydrated query state. Only call after `pipe()` resolves. */\n getQueryState: () => string;\n};\n\nexport type SsrStreamOptions = SsrRenderOptions & {\n /** Fires when the shell is flushed; caller writes prelude + state here. */\n onShellReady?: () => void;\n /** Non-fatal SSR errors (Suspense fallbacks, etc.). */\n onError?: (error: unknown) => void;\n};\n\nexport async function renderSsrTreeStream(options: SsrStreamOptions): Promise<SsrStreamHandle> {\n const { callContext, loadingElement, routesElement, router, location, onShellReady, onError } =\n options;\n\n ensureSsrResolversInstalled();\n\n const sessionPayload = await callInProcessMethod<SessionInitPayload>(\n '_system.session.init',\n {},\n callContext\n );\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n gcTime: 0,\n },\n },\n });\n\n const routedTree = router ? router({ children: routesElement, location }) : routesElement;\n const tree = (\n <AppProvider loadingElement={loadingElement}>\n <ModelenceQueryProvider client={queryClient}>{routedTree}</ModelenceQueryProvider>\n </AppProvider>\n );\n\n let streamRef: PipeableStream | null = null;\n // Resolves with the stream once React renders above-fallback content;\n // rejects on shell errors so the caller can fall back to a static response.\n const shellReady = new Promise<PipeableStream>((resolve, reject) => {\n // Run the render inside the SSR context so components can resolve\n // session/config/query state from the per-request scope.\n runWithSsrContext(\n {\n callContext,\n queryClient,\n session: {\n user: sessionPayload.user,\n configs: (sessionPayload.configs as Configs) ?? {},\n },\n },\n () => {\n const stream = renderToPipeableStream(tree, {\n onShellReady() {\n streamRef = stream;\n onShellReady?.();\n resolve(stream);\n },\n onShellError(error) {\n reject(error);\n },\n onError(error) {\n onError?.(error);\n },\n });\n return stream;\n }\n );\n });\n\n // Await so shell errors surface before the caller starts piping.\n await shellReady;\n\n let queryStateJson: string | null = null;\n\n const pipe = (destination: Writable): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (!streamRef) {\n reject(new Error('SSR stream was not initialized'));\n return;\n }\n\n // react-dom calls `destination.end()` when done. The caller still needs\n // to write the epilogue + query state, so wrap with a passthrough whose\n // `final()` resolves the pipe promise without closing the response.\n const passthrough = new Writable({\n write(chunk, _encoding, callback) {\n destination.write(chunk, (err) => callback(err ?? undefined));\n },\n final(callback) {\n try {\n const dehydratedState: DehydratedState = dehydrate(queryClient);\n queryStateJson = JSON.stringify(dehydratedState);\n } finally {\n queryClient.clear();\n }\n callback();\n resolve();\n },\n });\n\n passthrough.on('error', (err) => {\n destination.destroy(err);\n reject(err);\n });\n destination.on('error', reject);\n\n streamRef.pipe(passthrough);\n });\n };\n\n return {\n sessionState: JSON.stringify({ session: sessionPayload }),\n pipe,\n getQueryState: () => {\n if (queryStateJson === null) {\n throw new Error('getQueryState() called before stream finished');\n }\n return queryStateJson;\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export{c as _getSsrSnapshot,d as renderApp}from'./chunk-5DF3HHWJ.js';import'./chunk-NCJCE4XN.js';import'./chunk-MTG3OZWX.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';//# sourceMappingURL=renderApp-YNRUDPRK.js.map
2
+ //# sourceMappingURL=renderApp-YNRUDPRK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"renderApp-DDIZBBPN.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"renderApp-YNRUDPRK.js"}
@@ -0,0 +1,2 @@
1
+ export{g as getCallContext,f as startServer}from'./chunk-4EHMYUFO.js';import'./chunk-ILNPNRGJ.js';import'./chunk-KDOTVIEY.js';import'./chunk-VYR7VQMQ.js';import'./chunk-UW37F3GV.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';//# sourceMappingURL=server-6OSZ242A.js.map
2
+ //# sourceMappingURL=server-6OSZ242A.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"server-46L3FOLX.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"server-6OSZ242A.js"}
package/dist/server.d.ts CHANGED
@@ -234,6 +234,27 @@ type GenerateHandleProps = {
234
234
  firstName?: string;
235
235
  lastName?: string;
236
236
  };
237
+ /**
238
+ * The password-setting flow that invoked {@link AuthConfig.validatePassword}.
239
+ *
240
+ * Every path that writes a password hash passes one of these, so a policy can
241
+ * be uniform by default while still special-casing a flow if it needs to.
242
+ */
243
+ type PasswordContext = 'signup' | 'reset';
244
+ /**
245
+ * Props passed to {@link AuthConfig.validatePassword}.
246
+ */
247
+ type ValidatePasswordProps = {
248
+ /** The candidate plaintext password, after the built-in length checks. */
249
+ password: string;
250
+ /**
251
+ * Lowercased email address of the account the password is being set on.
252
+ * Useful for rejecting passwords that contain the local-part.
253
+ */
254
+ email: string;
255
+ /** Which flow is setting the password. */
256
+ context: PasswordContext;
257
+ };
237
258
  /**
238
259
  * Props passed to {@link AuthConfig.onBeforeSignup}.
239
260
  *
@@ -310,6 +331,35 @@ type AuthConfig = {
310
331
  * `firstName`, `lastName`, `avatarUrl`, `handle`). May be async.
311
332
  */
312
333
  validateSignup?: (props: SignupProps) => void | Promise<void>;
334
+ /**
335
+ * Password policy hook. Runs on **every** path that sets a password — signup
336
+ * and password reset today, plus any future change-password flow — after the
337
+ * built-in length checks (`MIN_PASSWORD_LENGTH`..`MAX_PASSWORD_LENGTH`) and
338
+ * before the password is hashed. Throw to reject the password; the thrown
339
+ * message is surfaced to the client.
340
+ *
341
+ * Prefer this over {@link AuthConfig.validateSignup} for password rules.
342
+ * `validateSignup` only runs at signup, so a policy enforced there alone can
343
+ * be bypassed by signing up with a compliant password and immediately
344
+ * resetting to a weaker one.
345
+ *
346
+ * Receives `{ password, email, context }`, where `context` is the flow that
347
+ * triggered the check (`'signup'` or `'reset'`). May be async.
348
+ *
349
+ * @example Enforce a 12-character minimum everywhere.
350
+ * ```typescript
351
+ * startApp({
352
+ * auth: {
353
+ * validatePassword: ({ password }) => {
354
+ * if (password.length < 12) {
355
+ * throw new Error('Password must be at least 12 characters');
356
+ * }
357
+ * },
358
+ * },
359
+ * });
360
+ * ```
361
+ */
362
+ validatePassword?: (props: ValidatePasswordProps) => void | Promise<void>;
313
363
  /**
314
364
  * Pre-update validation hook. Runs before a user's profile fields
315
365
  * (`firstName`, `lastName`, `avatarUrl`, `handle`) are written.
package/dist/server.js CHANGED
@@ -1,2 +1,2 @@
1
- export{m as ObjectId,k as ServerChannel,a as consumeRateLimit,c as deleteFile,j as deleteUser,i as disableUser,d as downloadFile,e as getFileUrl,b as getUploadUrl,l as sendEmail,h as startApp}from'./chunk-I25TKIJW.js';import'./chunk-PGNYB3ZP.js';export{y as LiveData,a as Module,c as Store,x as authenticate,k as clearSessionUser,A as createQuery,m as createSession,h as dbSessions,q as dbUsers,l as invalidateAllUserSessions,i as obtainSession,d as schema,n as setAuthTokenCookie,j as setSessionUser}from'./chunk-WHC2SP5P.js';import'./chunk-VYR7VQMQ.js';export{a as getConfig,h as getEnvironmentId}from'./chunk-B5WLEHNH.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';//# sourceMappingURL=server.js.map
1
+ export{m as ObjectId,k as ServerChannel,a as consumeRateLimit,c as deleteFile,j as deleteUser,i as disableUser,d as downloadFile,e as getFileUrl,b as getUploadUrl,l as sendEmail,h as startApp}from'./chunk-4EHMYUFO.js';import'./chunk-ILNPNRGJ.js';export{y as LiveData,a as Module,c as Store,x as authenticate,k as clearSessionUser,A as createQuery,m as createSession,h as dbSessions,q as dbUsers,l as invalidateAllUserSessions,i as obtainSession,d as schema,n as setAuthTokenCookie,j as setSessionUser}from'./chunk-KDOTVIEY.js';import'./chunk-VYR7VQMQ.js';export{a as getConfig,h as getEnvironmentId}from'./chunk-UW37F3GV.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';//# sourceMappingURL=server.js.map
2
2
  //# sourceMappingURL=server.js.map
package/dist/telemetry.js CHANGED
@@ -1,2 +1,2 @@
1
- export{o as captureError,k as logDebug,m as logError,l as logInfo,j as redactSensitive,n as startTransaction}from'./chunk-B5WLEHNH.js';//# sourceMappingURL=telemetry.js.map
1
+ export{o as captureError,k as logDebug,m as logError,l as logInfo,j as redactSensitive,n as startTransaction}from'./chunk-UW37F3GV.js';//# sourceMappingURL=telemetry.js.map
2
2
  //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1,2 @@
1
+ import {c,a}from'./chunk-UJ2WYHH7.js';import'./chunk-KDOTVIEY.js';import'./chunk-UW37F3GV.js';import {H,G}from'./chunk-MTG3OZWX.js';import'./chunk-5M6FUMUK.js';import'./chunk-DO5TZLF5.js';function d(){return H(async(t,r)=>{let o=c();return o?a(t,r,o.callContext):G(t,r)})}export{d as installSsrCallMethodTransport};//# sourceMappingURL=transport-LWVQ4TUY.js.map
2
+ //# sourceMappingURL=transport-LWVQ4TUY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ssr/transport.ts"],"names":["installSsrCallMethodTransport","setCallMethodTransport","methodName","args","ssrCtx","getSsrContext","callInProcessMethod","defaultCallMethodTransport"],"mappings":"4LAcO,SAASA,CAAAA,EAA4C,CAC1D,OAAOC,CAAAA,CAAuB,MAAUC,EAAoBC,CAAAA,GAAqB,CAC/E,IAAMC,CAAAA,CAASC,CAAAA,EAAc,CAC7B,OAAKD,CAAAA,CAIEE,CAAAA,CAAuBJ,CAAAA,CAAYC,CAAAA,CAAMC,CAAAA,CAAO,WAAW,CAAA,CAHzDG,CAAAA,CAA8BL,CAAAA,CAAYC,CAAI,CAIzD,CAAC,CACH","file":"transport-JPOZOWQ6.js","sourcesContent":["import {\n setCallMethodTransport,\n defaultCallMethodTransport,\n type MethodArgs,\n} from '../client/method';\nimport { callInProcessMethod } from './callInProcess';\nimport { getSsrContext } from './context';\n\n/**\n * Routes `callMethod` through `runMethod` in-process during an active SSR\n * render. Outside a render (e.g. server-side `callMethod` from jobs or other\n * non-render code) there is no request context, so it falls back to the\n * default HTTP transport — installing SSR must not break those call sites.\n */\nexport function installSsrCallMethodTransport(): () => void {\n return setCallMethodTransport(async <T>(methodName: string, args: MethodArgs) => {\n const ssrCtx = getSsrContext();\n if (!ssrCtx) {\n return defaultCallMethodTransport<T>(methodName, args);\n }\n\n return callInProcessMethod<T>(methodName, args, ssrCtx.callContext);\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/ssr/transport.ts"],"names":["installSsrCallMethodTransport","setCallMethodTransport","methodName","args","ssrCtx","getSsrContext","callInProcessMethod","defaultCallMethodTransport"],"mappings":"4LAcO,SAASA,CAAAA,EAA4C,CAC1D,OAAOC,CAAAA,CAAuB,MAAUC,EAAoBC,CAAAA,GAAqB,CAC/E,IAAMC,CAAAA,CAASC,CAAAA,EAAc,CAC7B,OAAKD,CAAAA,CAIEE,CAAAA,CAAuBJ,CAAAA,CAAYC,CAAAA,CAAMC,CAAAA,CAAO,WAAW,CAAA,CAHzDG,CAAAA,CAA8BL,CAAAA,CAAYC,CAAI,CAIzD,CAAC,CACH","file":"transport-LWVQ4TUY.js","sourcesContent":["import {\n setCallMethodTransport,\n defaultCallMethodTransport,\n type MethodArgs,\n} from '../client/method';\nimport { callInProcessMethod } from './callInProcess';\nimport { getSsrContext } from './context';\n\n/**\n * Routes `callMethod` through `runMethod` in-process during an active SSR\n * render. Outside a render (e.g. server-side `callMethod` from jobs or other\n * non-render code) there is no request context, so it falls back to the\n * default HTTP transport — installing SSR must not break those call sites.\n */\nexport function installSsrCallMethodTransport(): () => void {\n return setCallMethodTransport(async <T>(methodName: string, args: MethodArgs) => {\n const ssrCtx = getSsrContext();\n if (!ssrCtx) {\n return defaultCallMethodTransport<T>(methodName, args);\n }\n\n return callInProcessMethod<T>(methodName, args, ssrCtx.callContext);\n });\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "modelence",
4
- "version": "0.23.0-setup.dev.1",
4
+ "version": "0.23.0-setup.dev.10",
5
5
  "description": "The Node.js Framework for Real-Time MongoDB Apps",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/global.d.ts",
@@ -23,6 +23,9 @@
23
23
  "bin": {
24
24
  "modelence": "./dist/bin/modelence.js"
25
25
  },
26
+ "engines": {
27
+ "node": ">=22"
28
+ },
26
29
  "scripts": {
27
30
  "build": "tsup",
28
31
  "dev": "tsup --watch",
@@ -94,8 +97,6 @@
94
97
  "typescript": "^5.7.2",
95
98
  "vite": "^6.0.3",
96
99
  "vite-plugin-eslint": "^1.8.1",
97
- "winston": "^3.15.0",
98
- "winston-elasticsearch": "^0.19.0",
99
100
  "zod": "^3.23.8",
100
101
  "zustand": "^5.0.2"
101
102
  },
@@ -1,3 +0,0 @@
1
- import P from'elastic-apm-node';import v from'winston';import {ElasticsearchTransport}from'winston-elasticsearch';import l from'process';var f={},L={},S=false;function d(t){return L[t]?.value??f[t]?.default}function G(){if(!S)throw new Error("Config is not initialized: an attempt was made to access configs before they were loaded");return Object.fromEntries(Object.entries(f).filter(([t,e])=>e.isPublic).map(([t,e])=>[t,{key:t,type:e.type,value:L[t]?.value??e.default}]))}function Y(t){t.forEach(({key:e,type:o,value:n})=>{!e.toLowerCase().startsWith("_system.")&&!f[e]||(L[e]={key:e,type:o,value:n});}),S=true;}function $(){return f}function F(t){Object.entries(t).forEach(([e,o])=>{let{type:n,isPublic:r}=o;if(n==="secret"&&r)throw new Error(`Config ${e} with type "secret" cannot be public`)}),f=t;}var s={stdout:[{log:"",timestamp:null}],stderr:[{log:"",timestamp:null}]},z=1;function I({elasticCloudId:t,elasticApiKey:e}){let o=l.stdout.write,n=l.stderr.write;l.stdout.write=function(r,...i){return h(r.toString(),s.stdout),o.call(l.stdout,r,...i)},l.stderr.write=function(r,...i){return h(r.toString(),s.stderr),n.call(l.stderr,r,...i)},T();}function h(t,e){if(t.length===0)return;let o=new Date;for(let n=0;n<t.length;n++){let r=e[e.length-1];r.timestamp||(r.timestamp=o,r.sequenceId=z++),t[n]===`
2
- `?e.push({log:"",timestamp:null}):r.log+=t[n];}}async function N(){let t=s.stdout.slice(0,-1);s.stdout=[s.stdout[s.stdout.length-1]];let e=s.stderr.slice(0,-1);s.stderr=[s.stderr[s.stderr.length-1]],t.forEach(({log:o,timestamp:n,sequenceId:r})=>{b(o,{timestamp:n,source:"console",sequenceId:r});}),e.forEach(({log:o,timestamp:n,sequenceId:r})=>{w(o,{timestamp:n,source:"console",sequenceId:r});});}function T(){setTimeout(()=>{N(),T();},1e3);}var c=null;function Z(){}function tt(t){c=Object.assign({},c,t);}function j(){return c?.environmentId}function K(){return c?.appAlias}function R(){return c?.environmentAlias}function M(){return c?.telemetry?.serviceName}function a(){return !!c?.telemetry?.isEnabled}var _=false,p=null,m=null,ct=async()=>{if(_)throw new Error('Metrics are already initialized, duplicate "initMetrics" call received');_=true,a()&&await W();};async function W(){let t=d("_system.elastic.apmEndpoint"),e=d("_system.elastic.cloudId"),o=d("_system.elastic.apiKey"),n=K()??"unknown",r=R()??"unknown",i=j()??"unknown",g=M();p=P.start({serviceName:g,apiKey:o,serverUrl:t,transactionSampleRate:1,centralConfig:false,globalLabels:{modelenceEnv:"dev",appEnv:"dev",environmentId:i,appAlias:n,environmentAlias:r}});let u=new ElasticsearchTransport({apm:p,level:"debug",clientOpts:{cloud:{id:e},auth:{apiKey:o},requestTimeout:1e4,tls:{rejectUnauthorized:false}},bufferLimit:1e3,silent:false});u.on("error",O=>{console.error("Elasticsearch Transport Error:",O);}),m=v.createLogger({level:"debug",defaultMeta:{serviceName:g},format:v.format.combine(v.format.json()),transports:[u]}),I({elasticCloudId:e,elasticApiKey:o});}function A(){if(!p)throw new Error("APM is not initialized");return p}function y(){return m!==null}function E(){if(!m)throw new Error("Logger is not initialized");return m}var k=["token","password","secret","nonce","code"];function C(t){if(!t||typeof t!="object")return t;if(Array.isArray(t))return t.map(C);let e={};for(let[o,n]of Object.entries(t)){let r=k.some(i=>o.toLowerCase().includes(i));e[o]=r?"[redacted]":C(n);}return e}function x(){let t="";return a()||(t="info"),process.env.MODELENCE_LOG_LEVEL||t}function q(t,e){a()&&y()&&E().debug(t,e),x()==="debug"&&console.debug(t,e);}function b(t,e){a()&&y()&&E().info(t,e),["debug","info"].includes(x())&&console.info(t,e);}function w(t,e){a()&&y()&&E().error(t,e),["debug","info","error"].includes(x())&&console.error(t,e);}function U(t,e,o){if(!a())return {end:()=>{},setContext:()=>{}};let n=A(),r=n.startTransaction(e,t);return o&&n.setCustomContext(o),{end:(i,{endTime:g,context:u}={})=>{u&&n.setCustomContext(u),r.end(i,g);},setContext:i=>{n.setCustomContext(i);}}}function V(t){if(!a()){console.error(t);return}A().captureError(t);}export{d as a,G as b,Y as c,$ as d,F as e,Z as f,tt as g,j as h,ct as i,C as j,q as k,b as l,w as m,U as n,V as o};//# sourceMappingURL=chunk-B5WLEHNH.js.map
3
- //# sourceMappingURL=chunk-B5WLEHNH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/server.ts","../src/app/loggerProcess.ts","../src/app/state.ts","../src/app/metrics.ts","../src/telemetry/index.ts"],"names":["configSchema","config","isInitialized","getConfig","key","getPublicConfigs","_","schema","loadConfigs","configs","type","value","getSchema","setSchema","isPublic","buffer","sequenceId","startLoggerProcess","_elasticCloudId","_elasticApiKey","originalStdoutWrite","process","originalStderrWrite","chunk","args","addToBuffer","loopSendLogs","timestamp","i","current","sendLogs","stdoutLogs","stderrLogs","log","logInfo","logError","metadata","markAppStarted","setMetadata","_metadata","getEnvironmentId","getAppAlias","getEnvironmentAlias","getTelemetryServiceName","isTelemetryEnabled","apm","logger","initMetrics","initElasticApm","elasticApmEndpoint","elasticCloudId","elasticApiKey","appAlias","environmentAlias","environmentId","serviceName","elasticApm","esTransport","ElasticsearchTransport","error","winston","getApm","isLoggerReady","getLogger","SENSITIVE_KEYS","redactSensitive","result","val","isSensitive","k","getLogLevel","defaultLoglevel","logDebug","message","startTransaction","name","context","transaction","endTime","captureError"],"mappings":"yIAEA,IAAIA,CAAAA,CAA6B,EAAC,CAC9BC,CAAAA,CAAuC,EAAC,CACxCC,CAAAA,CAAgB,KAAA,CAsCb,SAASC,EAAUC,CAAAA,CAAuD,CAC/E,OAAOH,CAAAA,CAAOG,CAAG,CAAA,EAAG,KAAA,EAASJ,CAAAA,CAAaI,CAAG,GAAG,OAClD,CAEO,SAASC,CAAAA,EAAmB,CACjC,GAAI,CAACH,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,0FACF,CAAA,CAGF,OAAO,MAAA,CAAO,WAAA,CACZ,MAAA,CAAO,OAAA,CAAQF,CAAY,CAAA,CACxB,MAAA,CAAO,CAAC,CAACM,EAAGC,CAAM,CAAA,GAAMA,CAAAA,CAAO,QAAQ,EACvC,GAAA,CAAI,CAAC,CAACH,CAAAA,CAAKG,CAAM,CAAA,GACT,CACLH,CAAAA,CACA,CACE,IAAAA,CAAAA,CACA,IAAA,CAAMG,CAAAA,CAAO,IAAA,CACb,MAAON,CAAAA,CAAOG,CAAG,CAAA,EAAG,KAAA,EAASG,CAAAA,CAAO,OACtC,CACF,CACD,CACL,CACF,CAEO,SAASC,CAAAA,CAAYC,EAAsB,CAChDA,CAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAE,GAAA,CAAAL,CAAAA,CAAK,IAAA,CAAAM,CAAAA,CAAM,MAAAC,CAAM,CAAA,GAAM,CAGpC,CAFmBP,EAAI,WAAA,EAAY,CAAE,UAAA,CAAW,UAAU,GAEvC,CAACJ,CAAAA,CAAaI,CAAG,CAAA,GAKxCH,EAAOG,CAAG,CAAA,CAAI,CACZ,GAAA,CAAAA,CAAAA,CACA,IAAA,CAAAM,CAAAA,CACA,KAAA,CAAAC,CACF,CAAA,EACF,CAAC,CAAA,CAEDT,CAAAA,CAAgB,KAClB,CAEO,SAASU,CAAAA,EAAY,CAC1B,OAAOZ,CACT,CAEO,SAASa,CAAAA,CAAUN,EAAsB,CAE9C,MAAA,CAAO,OAAA,CAAQA,CAAM,EAAE,OAAA,CAAQ,CAAC,CAACH,CAAAA,CAAKO,CAAK,CAAA,GAAM,CAC/C,GAAM,CAAE,KAAAD,CAAAA,CAAM,QAAA,CAAAI,CAAS,CAAA,CAAIH,CAAAA,CAE3B,GAAID,CAAAA,GAAS,QAAA,EAAYI,EACvB,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAUV,CAAG,CAAA,oCAAA,CAAsC,CAEvE,CAAC,CAAA,CAEDJ,EAAeO,EACjB,CC9FA,IAAMQ,CAAAA,CAAmD,CACvD,MAAA,CAAQ,CAAC,CAAE,GAAA,CAAK,EAAA,CAAI,SAAA,CAAW,IAAK,CAAC,CAAA,CACrC,MAAA,CAAQ,CAAC,CAAE,GAAA,CAAK,EAAA,CAAI,SAAA,CAAW,IAAK,CAAC,CACvC,CAAA,CAEIC,CAAAA,CAAa,EAEV,SAASC,CAAAA,CAAmB,CACjC,cAAA,CAAgBC,EAChB,aAAA,CAAeC,CACjB,CAAA,CAGG,CACD,IAAMC,CAAAA,CAAsBC,CAAAA,CAAQ,MAAA,CAAO,KAAA,CACrCC,EAAsBD,CAAAA,CAAQ,MAAA,CAAO,KAAA,CAG3CA,CAAAA,CAAQ,OAAO,KAAA,CAAQ,SAAUE,CAAAA,CAAAA,GAA+BC,CAAAA,CAAa,CAC3E,OAAAC,CAAAA,CAAYF,CAAAA,CAAM,QAAA,GAAYR,CAAAA,CAAO,MAAM,CAAA,CACpCK,CAAAA,CAAoB,IAAA,CAAKC,CAAAA,CAAQ,MAAA,CAAQE,CAAAA,CAAO,GAAGC,CAAI,CAChE,CAAA,CAGAH,CAAAA,CAAQ,OAAO,KAAA,CAAQ,SAAUE,CAAAA,CAAAA,GAA+BC,CAAAA,CAAa,CAC3E,OAAAC,CAAAA,CAAYF,CAAAA,CAAM,QAAA,GAAYR,CAAAA,CAAO,MAAM,CAAA,CACpCO,CAAAA,CAAoB,KAAKD,CAAAA,CAAQ,MAAA,CAAQE,CAAAA,CAAO,GAAGC,CAAI,CAChE,CAAA,CAEAE,CAAAA,GAkCF,CAEA,SAASD,CAAAA,CAAYF,CAAAA,CAAeR,CAAAA,CAAmB,CACrD,GAAIQ,CAAAA,CAAM,MAAA,GAAW,EACnB,OAGF,IAAMI,CAAAA,CAAY,IAAI,KAEtB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIL,EAAM,MAAA,CAAQK,CAAAA,EAAAA,CAAK,CACrC,IAAMC,EAAUd,CAAAA,CAAOA,CAAAA,CAAO,MAAA,CAAS,CAAC,EACnCc,CAAAA,CAAQ,SAAA,GACXA,CAAAA,CAAQ,SAAA,CAAYF,EACpBE,CAAAA,CAAQ,UAAA,CAAab,CAAAA,EAAAA,CAAAA,CAGnBO,CAAAA,CAAMK,CAAC,CAAA,GAAM;AAAA,CAAA,CACfb,EAAO,IAAA,CAAK,CAAE,GAAA,CAAK,EAAA,CAAI,UAAW,IAAK,CAAC,CAAA,CAExCc,CAAAA,CAAQ,KAAON,CAAAA,CAAMK,CAAC,EAE1B,CACF,CAEA,eAAeE,CAAAA,EAAW,CACxB,IAAMC,EAAahB,CAAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC5CA,CAAAA,CAAO,MAAA,CAAS,CAACA,EAAO,MAAA,CAAOA,CAAAA,CAAO,MAAA,CAAO,MAAA,CAAS,CAAC,CAAC,CAAA,CAExD,IAAMiB,CAAAA,CAAajB,EAAO,MAAA,CAAO,KAAA,CAAM,CAAA,CAAG,EAAE,EAC5CA,CAAAA,CAAO,MAAA,CAAS,CAACA,CAAAA,CAAO,OAAOA,CAAAA,CAAO,MAAA,CAAO,MAAA,CAAS,CAAC,CAAC,CAAA,CAExDgB,CAAAA,CAAW,OAAA,CAAQ,CAAC,CAAE,GAAA,CAAAE,CAAAA,CAAK,SAAA,CAAAN,CAAAA,CAAW,WAAAX,CAAW,CAAA,GAAgB,CAC/DkB,CAAAA,CAAQD,EAAK,CAAE,SAAA,CAAAN,EAAW,MAAA,CAAQ,SAAA,CAAW,WAAAX,CAAW,CAAC,EAC3D,CAAC,EACDgB,CAAAA,CAAW,OAAA,CAAQ,CAAC,CAAE,IAAAC,CAAAA,CAAK,SAAA,CAAAN,CAAAA,CAAW,UAAA,CAAAX,CAAW,CAAA,GAAgB,CAC/DmB,CAAAA,CAASF,CAAAA,CAAK,CAAE,SAAA,CAAAN,CAAAA,CAAW,MAAA,CAAQ,SAAA,CAAW,WAAAX,CAAW,CAAC,EAC5D,CAAC,EACH,CAEA,SAASU,CAAAA,EAAe,CACtB,WAAW,IAAM,CACVI,CAAAA,EAAS,CACdJ,IACF,CAAA,CAAG,GAAI,EACT,CC1GA,IACIU,CAAAA,CAA+B,KAE5B,SAASC,CAAAA,EAAiB,CAEjC,CAMO,SAASC,EAAAA,CAAYC,CAAAA,CAAwB,CAClDH,CAAAA,CAAW,MAAA,CAAO,MAAA,CAAO,GAAIA,CAAAA,CAAUG,CAAS,EAClD,CAEO,SAASC,CAAAA,EAAmB,CACjC,OAAOJ,CAAAA,EAAU,aACnB,CAEO,SAASK,GAAc,CAC5B,OAAOL,GAAU,QACnB,CAEO,SAASM,CAAAA,EAAsB,CACpC,OAAON,CAAAA,EAAU,gBACnB,CAEO,SAASO,CAAAA,EAA0B,CACxC,OAAOP,CAAAA,EAAU,WAAW,WAC9B,CAEO,SAASQ,CAAAA,EAAqB,CACnC,OAAO,CAAA,CAAQR,CAAAA,EAAU,SAAA,EAAW,SACtC,CC7BA,IAAIlC,CAAAA,CAAgB,KAAA,CAChB2C,EAAgC,IAAA,CAChCC,CAAAA,CAAgC,IAAA,CAEvBC,EAAAA,CAAc,SAAY,CACrC,GAAI7C,CAAAA,CACF,MAAM,IAAI,KAAA,CAAM,wEAAwE,CAAA,CAG1FA,CAAAA,CAAgB,KAEZ0C,CAAAA,EAAmB,EACrB,MAAMI,CAAAA,GAEV,EAEA,eAAeA,CAAAA,EAAiB,CAC9B,IAAMC,CAAAA,CAAqB9C,CAAAA,CAAU,6BAA6B,CAAA,CAC5D+C,EAAiB/C,CAAAA,CAAU,yBAAyB,CAAA,CACpDgD,CAAAA,CAAgBhD,EAAU,wBAAwB,CAAA,CAElDiD,CAAAA,CAAWX,CAAAA,IAAiB,SAAA,CAC5BY,CAAAA,CAAmBX,CAAAA,EAAoB,EAAK,UAC5CY,CAAAA,CAAgBd,CAAAA,IAAsB,SAAA,CACtCe,CAAAA,CAAcZ,GAAwB,CAE5CE,CAAAA,CAAMW,CAAAA,CAAW,KAAA,CAAM,CACrB,WAAA,CAAAD,CAAAA,CACA,MAAA,CAAQJ,CAAAA,CACR,UAAWF,CAAAA,CAEX,qBAAA,CAAuB,CAAA,CACvB,aAAA,CAAe,MACf,YAAA,CAAc,CACZ,YAAA,CAAc,KAAA,CACd,OAAQ,KAAA,CACR,aAAA,CAAAK,CAAAA,CACA,QAAA,CAAAF,EACA,gBAAA,CAAAC,CACF,CAEF,CAAC,EAED,IAAMI,CAAAA,CAAc,IAAIC,sBAAAA,CAAuB,CAC7C,GAAA,CAAAb,CAAAA,CACA,KAAA,CAAO,OAAA,CACP,WAAY,CACV,KAAA,CAAO,CACL,EAAA,CAAIK,CACN,CAAA,CACA,IAAA,CAAM,CACJ,MAAA,CAAQC,CACV,CAAA,CACA,cAAA,CAAgB,GAAA,CAChB,GAAA,CAAK,CACH,kBAAA,CAAoB,KACtB,CACF,CAAA,CACA,YAAa,GAAA,CACb,MAAA,CAAQ,KACV,CAAC,EAEDM,CAAAA,CAAY,EAAA,CAAG,OAAA,CAAUE,CAAAA,EAAU,CACjC,OAAA,CAAQ,KAAA,CAAM,gCAAA,CAAkCA,CAAK,EACvD,CAAC,CAAA,CAEDb,EAASc,CAAAA,CAAQ,YAAA,CAAa,CAC5B,KAAA,CAAO,OAAA,CACP,WAAA,CAAa,CACX,YAAAL,CACF,CAAA,CACA,MAAA,CAAQK,CAAAA,CAAQ,OAAO,OAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAA,CACpD,UAAA,CAAY,CAACH,CAAW,CAC1B,CAAC,CAAA,CAEDxC,CAAAA,CAAmB,CACjB,eAAAiC,CAAAA,CACA,aAAA,CAAAC,CACF,CAAC,EACH,CAEO,SAASU,CAAAA,EAAS,CACvB,GAAI,CAAChB,CAAAA,CACH,MAAM,IAAI,MAAM,wBAAwB,CAAA,CAE1C,OAAOA,CACT,CAEO,SAASiB,CAAAA,EAAgB,CAC9B,OAAOhB,IAAW,IACpB,CAEO,SAASiB,CAAAA,EAAY,CAC1B,GAAI,CAACjB,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA,CAE7C,OAAOA,CACT,CCxGA,IAAMkB,CAAAA,CAAiB,CAAC,QAAS,UAAA,CAAY,QAAA,CAAU,OAAA,CAAS,MAAM,EAM/D,SAASC,CAAAA,CAAgBtD,EAAyB,CACvD,GAAI,CAACA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAC7B,OAAOA,CAAAA,CAET,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACrB,OAAOA,CAAAA,CAAM,GAAA,CAAIsD,CAAe,CAAA,CAElC,IAAMC,CAAAA,CAAkC,GACxC,IAAA,GAAW,CAAC9D,CAAAA,CAAK+D,CAAG,IAAK,MAAA,CAAO,OAAA,CAAQxD,CAAgC,CAAA,CAAG,CACzE,IAAMyD,CAAAA,CAAcJ,CAAAA,CAAe,IAAA,CAAMK,GAAMjE,CAAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAASiE,CAAC,CAAC,CAAA,CAC5EH,CAAAA,CAAO9D,CAAG,EAAIgE,CAAAA,CAAc,YAAA,CAAeH,CAAAA,CAAgBE,CAAG,EAChE,CACA,OAAOD,CACT,CAYA,SAASI,CAAAA,EAAwB,CAC/B,IAAIC,CAAAA,CAA4B,GAChC,OAAK3B,CAAAA,EAAmB,GACtB2B,CAAAA,CAAkB,QAGZ,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAoCA,CAC1D,CAEO,SAASC,CAAAA,CAASC,CAAAA,CAAiBjD,CAAAA,CAAc,CAClDoB,CAAAA,EAAmB,EAAKkB,GAAc,EACxCC,CAAAA,GAAY,KAAA,CAAMU,CAAAA,CAASjD,CAAI,CAAA,CAE7B8C,GAAY,GAAM,OAAA,EACpB,OAAA,CAAQ,KAAA,CAAMG,EAASjD,CAAI,EAE/B,CAEO,SAASU,EAAQuC,CAAAA,CAAiBjD,CAAAA,CAAc,CACjDoB,CAAAA,IAAwBkB,CAAAA,EAAc,EACxCC,CAAAA,EAAU,CAAE,KAAKU,CAAAA,CAASjD,CAAI,CAAA,CAE5B,CAAC,QAAS,MAAM,CAAA,CAAE,QAAA,CAAS8C,CAAAA,EAAa,CAAA,EAC1C,OAAA,CAAQ,IAAA,CAAKG,CAAAA,CAASjD,CAAI,EAE9B,CAEO,SAASW,CAAAA,CAASsC,EAAiBjD,CAAAA,CAAc,CAClDoB,CAAAA,EAAmB,EAAKkB,GAAc,EACxCC,CAAAA,EAAU,CAAE,KAAA,CAAMU,EAASjD,CAAI,CAAA,CAE7B,CAAC,OAAA,CAAS,OAAQ,OAAO,CAAA,CAAE,QAAA,CAAS8C,CAAAA,EAAa,CAAA,EACnD,OAAA,CAAQ,KAAA,CAAMG,CAAAA,CAASjD,CAAI,EAE/B,CAOO,SAASkD,CAAAA,CACdhE,EACAiE,CAAAA,CACAC,CAAAA,CACoB,CACpB,GAAI,CAAChC,GAAmB,CACtB,OAAO,CACL,GAAA,CAAK,IAAM,CAEX,CAAA,CACA,UAAA,CAAY,IAAM,CAElB,CACF,CAAA,CAGF,IAAMC,CAAAA,CAAMgB,GAAO,CACbgB,CAAAA,CAAchC,CAAAA,CAAI,gBAAA,CAAiB8B,EAAMjE,CAAI,CAAA,CACnD,OAAIkE,CAAAA,EACF/B,EAAI,gBAAA,CAAiB+B,CAAO,CAAA,CAGvB,CACL,IAAK,CACHV,CAAAA,CACA,CAAE,OAAA,CAAAY,EAAS,OAAA,CAAAF,CAAQ,CAAA,CAA6D,KAC7E,CACCA,CAAAA,EACF/B,CAAAA,CAAI,gBAAA,CAAiB+B,CAAO,CAAA,CAE9BC,CAAAA,CAAY,GAAA,CAAIX,CAAAA,CAAQY,CAAO,EACjC,CAAA,CACA,UAAA,CAAaF,CAAAA,EAAqC,CAChD/B,CAAAA,CAAI,gBAAA,CAAiB+B,CAAO,EAC9B,CACF,CACF,CAEO,SAASG,CAAAA,CAAapB,EAAc,CACzC,GAAI,CAACf,CAAAA,GAAsB,CACzB,OAAA,CAAQ,KAAA,CAAMe,CAAK,EACnB,MACF,CAEAE,GAAO,CAAE,YAAA,CAAaF,CAAK,EAC7B","file":"chunk-B5WLEHNH.js","sourcesContent":["import { AppConfig, ConfigKey, ConfigSchema } from './types';\n\nlet configSchema: ConfigSchema = {};\nlet config: Record<ConfigKey, AppConfig> = {};\nlet isInitialized = false;\n\n/**\n * @sidebarTitle getConfig (server)\n *\n * @param key - The configuration key to retrieve\n * @returns The configuration value (string, number, or boolean)\n *\n * @example\n * ```ts\n * import { getConfig } from 'modelence/server';\n *\n * // Get the site URL\n * const siteUrl = getConfig('_system.site.url');\n * ```\n *\n * Set via environment variable:\n * ```bash\n * MODELENCE_SITE_URL=https://myapp.com\n * ```\n *\n * @example\n * ```ts\n * import { getConfig } from 'modelence/server';\n *\n * // Get the current environment (e.g., 'development', 'staging', 'production')\n * const env = getConfig('_system.env');\n *\n * if (env === 'production') {\n * // Enable production features\n * }\n * ```\n *\n * Set via environment variable:\n * ```bash\n * MODELENCE_SITE_ENV=production\n * ```\n */\nexport function getConfig(key: ConfigKey): string | number | boolean | undefined {\n return config[key]?.value ?? configSchema[key]?.default;\n}\n\nexport function getPublicConfigs() {\n if (!isInitialized) {\n throw new Error(\n 'Config is not initialized: an attempt was made to access configs before they were loaded'\n );\n }\n\n return Object.fromEntries(\n Object.entries(configSchema)\n .filter(([_, schema]) => schema.isPublic)\n .map(([key, schema]) => {\n return [\n key,\n {\n key,\n type: schema.type,\n value: config[key]?.value ?? schema.default,\n },\n ];\n })\n );\n}\n\nexport function loadConfigs(configs: AppConfig[]) {\n configs.forEach(({ key, type, value }) => {\n const isSystemConfig = key.toLowerCase().startsWith('_system.');\n\n if (!isSystemConfig && !configSchema[key]) {\n // Ignore unknown configs\n return;\n }\n\n config[key] = {\n key,\n type,\n value,\n };\n });\n\n isInitialized = true;\n}\n\nexport function getSchema() {\n return configSchema;\n}\n\nexport function setSchema(schema: ConfigSchema) {\n // TODO: more validation on the schema structure\n Object.entries(schema).forEach(([key, value]) => {\n const { type, isPublic } = value;\n\n if (type === 'secret' && isPublic) {\n throw new Error(`Config ${key} with type \"secret\" cannot be public`);\n }\n });\n\n configSchema = schema;\n}\n","// import { spawn } from 'child_process';\n// import { fileURLToPath } from 'url';\n// import { dirname, join } from 'path';\nimport { logInfo, logError } from '@/telemetry';\nimport process from 'process';\n\ntype LogEntry = { log: string; timestamp: Date | null; sequenceId?: number };\ntype LogBuffer = LogEntry[];\n\nconst buffer: { stdout: LogBuffer; stderr: LogBuffer } = {\n stdout: [{ log: '', timestamp: null }],\n stderr: [{ log: '', timestamp: null }],\n};\n\nlet sequenceId = 1;\n\nexport function startLoggerProcess({\n elasticCloudId: _elasticCloudId,\n elasticApiKey: _elasticApiKey,\n}: {\n elasticCloudId: string;\n elasticApiKey: string;\n}) {\n const originalStdoutWrite = process.stdout.write;\n const originalStderrWrite = process.stderr.write;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n process.stdout.write = function (chunk: string | Uint8Array, ...args: any[]) {\n addToBuffer(chunk.toString(), buffer.stdout);\n return originalStdoutWrite.call(process.stdout, chunk, ...args);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n process.stderr.write = function (chunk: string | Uint8Array, ...args: any[]) {\n addToBuffer(chunk.toString(), buffer.stderr);\n return originalStderrWrite.call(process.stderr, chunk, ...args);\n };\n\n loopSendLogs();\n\n // const currentFilePath = fileURLToPath(import.meta.url);\n // const projectRoot = dirname(dirname(currentFilePath));\n // const loggerPath = join(projectRoot, 'bin', 'modelence-logger', 'index.js');\n // const logger = spawn(process.execPath, [loggerPath], {\n // env: {\n // NODE_ENV: process.env.NODE_ENV,\n // ELASTIC_CLOUD_ID: elasticCloudId,\n // ELASTIC_API_KEY: elasticApiKey\n // },\n // stdio: ['pipe', 'inherit', 'inherit'],\n // detached: true\n // });\n\n // const originalStdoutWrite = process.stdout.write;\n // const originalStderrWrite = process.stderr.write;\n\n // process.stdout.write = function(chunk: any, ...args: any[]) {\n // logger.stdin.write(chunk);\n // return originalStdoutWrite.apply(process.stdout, [chunk, ...args]);\n // };\n\n // process.stderr.write = function(chunk: any, ...args: any[]) {\n // logger.stdin.write(chunk);\n // return originalStderrWrite.apply(process.stderr, [chunk, ...args]);\n // };\n\n // process.on('exit', () => {\n // process.stdout.write = originalStdoutWrite;\n // process.stderr.write = originalStderrWrite;\n // });\n\n // logger.unref();\n}\n\nfunction addToBuffer(chunk: string, buffer: LogBuffer) {\n if (chunk.length === 0) {\n return;\n }\n\n const timestamp = new Date();\n\n for (let i = 0; i < chunk.length; i++) {\n const current = buffer[buffer.length - 1];\n if (!current.timestamp) {\n current.timestamp = timestamp;\n current.sequenceId = sequenceId++;\n }\n\n if (chunk[i] === '\\n') {\n buffer.push({ log: '', timestamp: null });\n } else {\n current.log += chunk[i];\n }\n }\n}\n\nasync function sendLogs() {\n const stdoutLogs = buffer.stdout.slice(0, -1);\n buffer.stdout = [buffer.stdout[buffer.stdout.length - 1]];\n\n const stderrLogs = buffer.stderr.slice(0, -1);\n buffer.stderr = [buffer.stderr[buffer.stderr.length - 1]];\n\n stdoutLogs.forEach(({ log, timestamp, sequenceId }: LogEntry) => {\n logInfo(log, { timestamp, source: 'console', sequenceId });\n });\n stderrLogs.forEach(({ log, timestamp, sequenceId }: LogEntry) => {\n logError(log, { timestamp, source: 'console', sequenceId });\n });\n}\n\nfunction loopSendLogs() {\n setTimeout(() => {\n void sendLogs();\n loopSendLogs();\n }, 1000);\n}\n","type AppMetadata = {\n environmentId: string;\n appAlias: string;\n environmentAlias: string;\n telemetry: {\n isEnabled: boolean;\n serviceName: string;\n };\n};\n\nlet appStarted = false;\nlet metadata: AppMetadata | null = null;\n\nexport function markAppStarted() {\n appStarted = true;\n}\n\nexport function isAppStarted() {\n return appStarted;\n}\n\nexport function setMetadata(_metadata: AppMetadata) {\n metadata = Object.assign({}, metadata, _metadata);\n}\n\nexport function getEnvironmentId() {\n return metadata?.environmentId;\n}\n\nexport function getAppAlias() {\n return metadata?.appAlias;\n}\n\nexport function getEnvironmentAlias() {\n return metadata?.environmentAlias;\n}\n\nexport function getTelemetryServiceName() {\n return metadata?.telemetry?.serviceName;\n}\n\nexport function isTelemetryEnabled() {\n return Boolean(metadata?.telemetry?.isEnabled);\n}\n","import elasticApm from 'elastic-apm-node';\nimport winston from 'winston';\nimport { ElasticsearchTransport } from 'winston-elasticsearch';\n\nimport { getConfig } from '../config/server';\nimport { startLoggerProcess } from './loggerProcess';\nimport {\n getAppAlias,\n getEnvironmentAlias,\n getEnvironmentId,\n getTelemetryServiceName,\n isTelemetryEnabled,\n} from './state';\n\nlet isInitialized = false;\nlet apm: typeof elasticApm | null = null;\nlet logger: winston.Logger | null = null;\n\nexport const initMetrics = async () => {\n if (isInitialized) {\n throw new Error('Metrics are already initialized, duplicate \"initMetrics\" call received');\n }\n\n isInitialized = true;\n\n if (isTelemetryEnabled()) {\n await initElasticApm();\n }\n};\n\nasync function initElasticApm() {\n const elasticApmEndpoint = getConfig('_system.elastic.apmEndpoint') as string;\n const elasticCloudId = getConfig('_system.elastic.cloudId') as string;\n const elasticApiKey = getConfig('_system.elastic.apiKey') as string;\n\n const appAlias = getAppAlias() ?? 'unknown';\n const environmentAlias = getEnvironmentAlias() ?? 'unknown';\n const environmentId = getEnvironmentId() ?? 'unknown';\n const serviceName = getTelemetryServiceName();\n\n apm = elasticApm.start({\n serviceName,\n apiKey: elasticApiKey,\n serverUrl: elasticApmEndpoint,\n // environment: 'dev',\n transactionSampleRate: 1.0,\n centralConfig: false,\n globalLabels: {\n modelenceEnv: 'dev',\n appEnv: 'dev',\n environmentId,\n appAlias,\n environmentAlias,\n },\n // logLevel: 'debug'\n });\n\n const esTransport = new ElasticsearchTransport({\n apm,\n level: 'debug',\n clientOpts: {\n cloud: {\n id: elasticCloudId,\n },\n auth: {\n apiKey: elasticApiKey,\n },\n requestTimeout: 10000,\n tls: {\n rejectUnauthorized: false,\n },\n },\n bufferLimit: 1000,\n silent: false,\n });\n\n esTransport.on('error', (error) => {\n console.error('Elasticsearch Transport Error:', error);\n });\n\n logger = winston.createLogger({\n level: 'debug',\n defaultMeta: {\n serviceName,\n },\n format: winston.format.combine(winston.format.json()),\n transports: [esTransport],\n });\n\n startLoggerProcess({\n elasticCloudId,\n elasticApiKey,\n });\n}\n\nexport function getApm() {\n if (!apm) {\n throw new Error('APM is not initialized');\n }\n return apm;\n}\n\nexport function isLoggerReady() {\n return logger !== null;\n}\n\nexport function getLogger() {\n if (!logger) {\n throw new Error('Logger is not initialized');\n }\n return logger;\n}\n","import { getLogger, getApm, isLoggerReady } from '@/app/metrics';\nimport { isTelemetryEnabled } from '@/app/state';\n\ntype LogLevel = 'error' | 'info' | 'debug' | '';\n\n// Secret-bearing keys to scrub before request args/query/body reach the APM sink.\n// Matched case-insensitively as a substring (`authToken` matches `token`).\nconst SENSITIVE_KEYS = ['token', 'password', 'secret', 'nonce', 'code'];\n\n/**\n * Deep-copies `value`, replacing any {@link SENSITIVE_KEYS} match with\n * `'[redacted]'`. Non-object values pass through unchanged.\n */\nexport function redactSensitive(value: unknown): unknown {\n if (!value || typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(redactSensitive);\n }\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n const isSensitive = SENSITIVE_KEYS.some((k) => key.toLowerCase().includes(k));\n result[key] = isSensitive ? '[redacted]' : redactSensitive(val);\n }\n return result;\n}\n\n/**\n * Gets the logging level for console logs based on the MODELENCE_LOG_LEVEL environment variable.\n *\n * @returns The log level ('error' | 'info' | 'debug' | '')\n *\n * Behavior:\n * - If MODELENCE_LOG_LEVEL is set, returns that value\n * - If telemetry is disabled and MODELENCE_LOG_LEVEL is not set, defaults to 'info'\n * - If telemetry is enabled and MODELENCE_LOG_LEVEL is not set, returns '' (no console logging)\n */\nfunction getLogLevel(): LogLevel {\n let defaultLoglevel: LogLevel = '';\n if (!isTelemetryEnabled()) {\n defaultLoglevel = 'info';\n }\n\n return (process.env.MODELENCE_LOG_LEVEL as LogLevel) || defaultLoglevel;\n}\n\nexport function logDebug(message: string, args: object) {\n if (isTelemetryEnabled() && isLoggerReady()) {\n getLogger().debug(message, args);\n }\n if (getLogLevel() === 'debug') {\n console.debug(message, args);\n }\n}\n\nexport function logInfo(message: string, args: object) {\n if (isTelemetryEnabled() && isLoggerReady()) {\n getLogger().info(message, args);\n }\n if (['debug', 'info'].includes(getLogLevel())) {\n console.info(message, args);\n }\n}\n\nexport function logError(message: string, args: object) {\n if (isTelemetryEnabled() && isLoggerReady()) {\n getLogger().error(message, args);\n }\n if (['debug', 'info', 'error'].includes(getLogLevel())) {\n console.error(message, args);\n }\n}\n\ninterface WrappedTransaction {\n end(result?: string, context?: Record<string, unknown>): void;\n setContext(context: Record<string, unknown>): void;\n}\n\nexport function startTransaction(\n type: 'method' | 'cron' | 'ai' | 'custom' | 'route',\n name: string,\n context?: Record<string, unknown>\n): WrappedTransaction {\n if (!isTelemetryEnabled()) {\n return {\n end: () => {\n // do nothing\n },\n setContext: () => {\n // do nothing\n },\n };\n }\n\n const apm = getApm();\n const transaction = apm.startTransaction(name, type);\n if (context) {\n apm.setCustomContext(context);\n }\n\n return {\n end: (\n result?: string,\n { endTime, context }: { endTime?: number; context?: Record<string, unknown> } = {}\n ) => {\n if (context) {\n apm.setCustomContext(context);\n }\n transaction.end(result, endTime);\n },\n setContext: (context: Record<string, unknown>) => {\n apm.setCustomContext(context);\n },\n };\n}\n\nexport function captureError(error: Error) {\n if (!isTelemetryEnabled()) {\n console.error(error);\n return;\n }\n\n getApm().captureError(error);\n}\n"]}
@@ -1,3 +0,0 @@
1
- import {l,f as f$1,I as I$1,D,C as C$1,i,h as h$1,j as j$1,e}from'./chunk-MTG3OZWX.js';import {c}from'./chunk-5M6FUMUK.js';import {useState,useEffect}from'react';import {jsx,jsxs}from'react/jsx-runtime';import Y from'socket.io-client';import {hashKey,QueryClient,QueryClientProvider,HydrationBoundary}from'@tanstack/react-query';var a={page:{minHeight:"100vh",backgroundColor:"#f3f4f6",display:"flex",alignItems:"center",justifyContent:"center",padding:"0 16px",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",color:"#111827"},container:{maxWidth:"576px",width:"100%"},logoWrap:{display:"flex",justifyContent:"center",marginBottom:"32px"},title:{fontSize:"30px",lineHeight:"36px",fontWeight:700,textAlign:"center",margin:0},subtitle:{marginTop:"16px",color:"#4b5563",textAlign:"center"},steps:{marginTop:"32px",listStyle:"none",padding:0,display:"flex",flexDirection:"column",gap:"16px"},step:{display:"flex",gap:"16px",alignItems:"flex-start",backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e5e7eb",padding:"16px"},stepNumber:{flex:"none",width:"28px",height:"28px",borderRadius:"9999px",backgroundColor:"#111827",color:"#ffffff",fontSize:"14px",fontWeight:600,display:"flex",alignItems:"center",justifyContent:"center"},stepText:{color:"#374151",lineHeight:"28px"},code:{fontSize:"14px",fontFamily:"ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace",backgroundColor:"#e5e7eb",borderRadius:"4px",padding:"2px 4px"},footer:{marginTop:"32px",fontSize:"14px",color:"#6b7280",textAlign:"center"}};function Q(){return jsx("div",{style:a.page,children:jsxs("div",{style:a.container,children:[jsx("div",{style:a.logoWrap,children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"80",height:"80",viewBox:"0 0 48 48",fill:"none","aria-label":"Modelence Logo",children:jsx("path",{fill:"#5509D9",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"})})}),jsx("h1",{style:a.title,children:"Connect this project to Modelence Cloud"}),jsx("p",{style:a.subtitle,children:"One quick step before you can use this app locally."}),jsxs("ol",{style:a.steps,children:[jsxs(T,{number:1,children:["Run ",jsx("code",{style:a.code,children:"npx modelence setup"})," in the project folder."]}),jsx(T,{number:2,children:"Your browser opens \u2014 log in and choose your environment."}),jsxs(T,{number:3,children:["Restart the dev server (",jsx("code",{style:a.code,children:"npm run dev"}),")."]})]}),jsx("p",{style:a.footer,children:"This page refreshes automatically once the project is connected."})]})})}function T({number:e,children:t}){return jsxs("li",{style:a.step,children:[jsx("span",{style:a.stepNumber,children:e}),jsx("span",{style:a.stepText,children:t})]})}var Z="__MODELENCE_STATE__",$=3e3,z=false;function V(){return typeof document<"u"&&document.getElementById(Z)!==null}function Se({children:e,loadingElement:t,setupElement:n}){let r=typeof window>"u",[i$1,c]=useState(()=>!r&&!l()&&!V()),[d,s]=useState(()=>!r&&l()&&f$1());return useEffect(()=>{async function l$1(){if(!z){if(z=true,l()){i()&&await h$1();return}await j$1(),s(f$1()),c(false);}}l$1();},[]),useEffect(()=>{if(!d)return;let l=setInterval(async()=>{try{let{setupRequired:o}=await I$1("_system.setupStatus",{},{errorHandler:()=>{}});o||window.location.reload();}catch{}},$);return ()=>clearInterval(l)},[d]),i$1?t??jsx("div",{children:"Loading..."}):d&&n!==null?n??jsx(Q,{}):e}var b=null,m=new Map;function h(){if(!b)throw new Error("WebSocket not initialized. Call startWebsockets() first.");return b}function J(){let e=C$1(),t=D();for(let n of m.values())b?.emit("subscribeLiveQuery",{subscriptionId:n.subscriptionId,method:n.method,args:n.args,authToken:e,clientInfo:t});}function G(e$1){let t=e()?.baseUrl??"/";b=Y(t,{transports:["websocket"],auth:{token:C$1()}}),b.on("connect",()=>{m.size>0&&(console.log(`[Modelence] WebSocket reconnected, re-subscribing to ${m.size} live queries`),J());}),e$1.channels?.forEach(n=>n.init());}function X({category:e,listener:t}){h().on(e,t);}function ee({category:e,listener:t}){h().once(e,t);}function te({category:e,listener:t}){h().off(e,t);}function R({eventName:e,category:t,id:n}){h().emit(e,`${t}:${n}`);}function ne({category:e,id:t}){R({eventName:"joinChannel",category:e,id:t});}function re({category:e,id:t}){R({eventName:"leaveChannel",category:e,id:t});}var oe=0;function M(e,t,n,r){let i=`sub-${++oe}-${Date.now()}`,c$1=({subscriptionId:l,data:o,typeMap:y})=>{l===i&&n(c(o,y));},d=({subscriptionId:l,error:o})=>{l===i&&(console.error(`[Modelence] Live query error for ${e}:`,o),r?.(o));},s=h();return s.on("liveQueryData",c$1),s.on("liveQueryError",d),m.set(i,{subscriptionId:i,method:e,args:t}),s.connected&&s.emit("subscribeLiveQuery",{subscriptionId:i,method:e,args:t,authToken:C$1(),clientInfo:D()}),()=>{m.delete(i),s.emit("unsubscribeLiveQuery",{subscriptionId:i}),s.off("liveQueryData",c$1),s.off("liveQueryError",d);}}var ie={init:G,on:X,once:ee,off:te,emit:R,joinChannel:ne,leaveChannel:re},K=ie;var E=null;function O(e){E=e;}function Pe(){return E}function F(e){if(E){console.warn("WebSocket already initialized. Skipping initialization.");return}let t=e?.provider||K;O(t);try{t.init({channels:e?.channels});}catch(n){throw O(null),n}}var p=null,C=null,P=false,f=new Map;function I(e){p!==e&&(p&&se(),p=e,C=e.getQueryCache().subscribe(t=>{if(t.type==="removed"){let n=hashKey(t.query.queryKey),r=f.get(n);if(r){if(r.resolvers.size>0){let i=new Error("Query was removed from cache");r.resolvers.forEach(c=>c.reject(i)),r.resolvers.clear();}r.unsubscribe(),f.delete(n);}}}));}function Ne(){return p!==null}function se(){C&&(C(),C=null),f.forEach(e=>e.unsubscribe()),f.clear(),p=null,P=false;}var j=class{connect(t){I(t);}};function De(e,t={}){return {queryKey:[e,t],queryFn:()=>I$1(e,t)}}function qe(e,t={}){let n=["live",e,t],r=hashKey(n);return {queryKey:n,queryFn:()=>new Promise((i,c)=>{if(typeof window>"u")return;if(!p){let s=new Error("Modelence: connect a QueryClient before using modelenceLiveQuery(). Mount <ModelenceQueryProvider> or call connectModelenceQueryClient().");console.error("[Modelence]",s.message),c(s);return}P||(F(),P=true);let d=f.get(r);d||(d={unsubscribe:M(e,t,l=>{let o=f.get(r);o?.resolvers.size&&(o.resolvers.forEach(y=>y.resolve(l)),o.resolvers.clear()),p&&p.setQueryData(n,l);},l=>{let o=f.get(r);o&&(o.resolvers.size&&(o.resolvers.forEach(y=>y.reject(new Error(l))),o.resolvers.clear()),o.unsubscribe(),f.delete(r));}),resolvers:new Set},f.set(r,d)),d.resolvers.add({resolve:i,reject:c});}),staleTime:1/0,refetchOnWindowFocus:false,refetchOnMount:false,refetchOnReconnect:false,gcTime:0}}function ze(e,t={}){return {mutationFn:(n={})=>I$1(e,{...t,...n})}}function Ue(e,t={}){return [e,t]}var de="__MODELENCE_QUERY_STATE__";function fe(){if(typeof document>"u")return;let e=document.getElementById(de);if(!(!e||!e.textContent))try{return JSON.parse(e.textContent)}catch(t){console.error("Modelence: failed to parse SSR query state",t);return}}function Be({children:e,client:t,dehydratedState:n}){let[r]=useState(()=>{let c=t??new QueryClient({defaultOptions:{queries:{staleTime:6e4}}});return typeof window<"u"&&I(c),c}),i=n??fe();return jsx(QueryClientProvider,{client:r,children:jsx(HydrationBoundary,{state:i,children:e})})}
2
- export{Se as a,M as b,O as c,Pe as d,F as e,I as f,Ne as g,se as h,j as i,De as j,qe as k,ze as l,Ue as m,Be as n};//# sourceMappingURL=chunk-B7EXKTEZ.js.map
3
- //# sourceMappingURL=chunk-B7EXKTEZ.js.map
@@ -1 +0,0 @@
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","timer","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-B7EXKTEZ.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 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 useEffect(() => {\n if (!needsSetup) {\n return;\n }\n\n const timer = setInterval(async () => {\n try {\n const { setupRequired } = await callMethod<{ setupRequired: boolean }>(\n '_system.setupStatus',\n {},\n { errorHandler: () => {} }\n );\n if (!setupRequired) {\n window.location.reload();\n }\n } catch {\n // Dev server restarting — keep polling.\n }\n }, SETUP_POLL_INTERVAL);\n\n return () => clearInterval(timer);\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"]}