@luckystack/core 0.10.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/AGENTS.md +11 -0
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +2 -88
  4. package/dist/apiInterceptors.d.ts +36 -0
  5. package/dist/apiMethodMapRegistry.d.ts +5 -0
  6. package/dist/apiRequest.d.ts +71 -0
  7. package/dist/apiTypeStubs.d.ts +3 -5
  8. package/dist/avatarConfig.d.ts +22 -0
  9. package/dist/bindAddress.d.ts +15 -0
  10. package/dist/bootUuid.d.ts +24 -0
  11. package/dist/cancelRegistry.d.ts +7 -0
  12. package/dist/checkOrigin.d.ts +6 -0
  13. package/dist/client.d.ts +46 -335
  14. package/dist/client.js +2 -2
  15. package/dist/client.js.map +1 -1
  16. package/dist/clientHookBus.d.ts +62 -0
  17. package/dist/clients.d.ts +16 -0
  18. package/dist/config.d.ts +8 -2
  19. package/dist/configUtils.d.ts +16 -0
  20. package/dist/consoleLog.d.ts +1 -0
  21. package/dist/cookies.d.ts +28 -0
  22. package/dist/createRegistry.d.ts +39 -0
  23. package/dist/csrf.d.ts +30 -0
  24. package/dist/csrfConfig.d.ts +32 -0
  25. package/dist/db.d.ts +12 -0
  26. package/dist/dbHealthCheck.d.ts +6 -0
  27. package/dist/{config-CwW3KY9r.d.ts → deployConfigRegistry.d.ts} +8 -43
  28. package/dist/emailRegistry.d.ts +139 -0
  29. package/dist/env.d.ts +38 -0
  30. package/dist/errorFormatterRegistry.d.ts +54 -0
  31. package/dist/errorTrackerIdentity.d.ts +14 -0
  32. package/dist/errorTrackerRegistry.d.ts +85 -0
  33. package/dist/escapeHtml.d.ts +6 -0
  34. package/dist/eslint/index.d.ts +5 -8
  35. package/dist/eslint/internal/hasPackage.d.ts +1 -0
  36. package/dist/eslint/internal/ruleTypes.d.ts +4 -0
  37. package/dist/eslint/rules/no-arbitrary-tailwind-color.d.ts +3 -0
  38. package/dist/eslint/rules/no-direct-prisma-import-in-components.d.ts +3 -0
  39. package/dist/eslint/rules/no-local-socket-enumeration.d.ts +3 -0
  40. package/dist/eslint/rules/no-raw-fetch-in-src.d.ts +3 -0
  41. package/dist/eslint/rules/no-raw-try-catch.d.ts +3 -0
  42. package/dist/eslint/rules/no-unsafe-api-wrappers.d.ts +3 -0
  43. package/dist/eslint/rules/no-unsafe-sync-wrappers.d.ts +3 -0
  44. package/dist/eslint/rules/prefer-luckystack-confirm.d.ts +3 -0
  45. package/dist/eslint/rules/prefer-luckystack-dropdown.d.ts +3 -0
  46. package/dist/eslint/rules/prefer-luckystack-notify.d.ts +3 -0
  47. package/dist/extractToken.d.ts +12 -0
  48. package/dist/extractTokenFromRequest.d.ts +12 -0
  49. package/dist/getParams.d.ts +9 -0
  50. package/dist/hooks/registry.d.ts +12 -0
  51. package/dist/hooks/types.d.ts +446 -0
  52. package/dist/httpApiUtils.d.ts +54 -0
  53. package/dist/index.d.ts +110 -1892
  54. package/dist/index.js.map +1 -1
  55. package/dist/lease.d.ts +18 -0
  56. package/dist/localSocketEnumerationGuard.d.ts +22 -0
  57. package/dist/localeReloader.d.ts +3 -0
  58. package/dist/localesRegistry.d.ts +8 -0
  59. package/dist/localizedNormalizer.d.ts +50 -0
  60. package/dist/loggerRegistry.d.ts +12 -0
  61. package/dist/middlewareRegistry.d.ts +45 -0
  62. package/dist/notifier.d.ts +17 -0
  63. package/dist/offlineQueue.d.ts +48 -0
  64. package/dist/oneTimeToken.d.ts +43 -0
  65. package/dist/pageRouteValidation.d.ts +37 -0
  66. package/dist/paths.d.ts +35 -0
  67. package/dist/peerDeps.d.ts +23 -0
  68. package/dist/portOverrideRegistry.d.ts +3 -0
  69. package/dist/processUpload.d.ts +44 -0
  70. package/dist/{sessionTypes-DanjuPaE.d.ts → projectConfig.d.ts} +32 -129
  71. package/dist/rateLimiter.d.ts +90 -0
  72. package/dist/react/AvatarProvider.d.ts +11 -0
  73. package/dist/react/Middleware.d.ts +10 -0
  74. package/dist/react/Router.d.ts +1 -0
  75. package/dist/react/TranslationProvider.d.ts +22 -0
  76. package/dist/react/notify.d.ts +12 -0
  77. package/dist/react/sessionContext.d.ts +31 -0
  78. package/dist/react/useTheme.d.ts +5 -0
  79. package/dist/redactedLogKeys.d.ts +22 -0
  80. package/dist/redis.d.ts +15 -0
  81. package/dist/redisKeyFormatter.d.ts +7 -0
  82. package/dist/resolveClientIp.d.ts +51 -0
  83. package/dist/responseNormalizer.d.ts +33 -0
  84. package/dist/roomNameFormatterRegistry.d.ts +36 -0
  85. package/dist/roomSockets.d.ts +23 -0
  86. package/dist/routedDataQuery.d.ts +7 -0
  87. package/dist/routedHttpInvocation.d.ts +20 -0
  88. package/dist/runtimeMapsRegistry.d.ts +18 -0
  89. package/dist/runtimeTypeValidation.d.ts +13 -0
  90. package/dist/secretsResolved.d.ts +3 -0
  91. package/dist/sentrySetup.d.ts +21 -0
  92. package/dist/serveAvatars.d.ts +5 -0
  93. package/dist/serviceRoute.d.ts +27 -0
  94. package/dist/servicesConfigRegistry.d.ts +22 -0
  95. package/dist/sessionProviderRegistry.d.ts +46 -0
  96. package/dist/sessionTypes.d.ts +79 -0
  97. package/dist/sleep.d.ts +1 -0
  98. package/dist/socketEvents.d.ts +37 -0
  99. package/dist/socketMiddlewareRegistry.d.ts +20 -0
  100. package/dist/socketRedisAdapter.d.ts +21 -0
  101. package/dist/socketState.d.ts +5 -0
  102. package/dist/socketStatusTypes.d.ts +6 -0
  103. package/dist/socketTypes.d.ts +34 -0
  104. package/dist/synchronizedEnvHashes.d.ts +66 -0
  105. package/dist/testFileConvention.d.ts +11 -0
  106. package/dist/testResetTargets.d.ts +5 -0
  107. package/dist/tryCatch.d.ts +1 -0
  108. package/dist/tryCatchClient.d.ts +1 -0
  109. package/dist/tryCatchSync.d.ts +1 -0
  110. package/dist/validateRequest.d.ts +50 -0
  111. package/docs/app-bootstrap.md +4 -449
  112. package/docs/config-registry.md +3 -346
  113. package/docs/csrf-config.md +3 -86
  114. package/docs/error-tracker-registry.md +3 -192
  115. package/docs/hooks.md +2 -295
  116. package/docs/rate-limit-strategy.md +3 -168
  117. package/docs/redis-adapter.md +5 -110
  118. package/docs/session-types.md +3 -178
  119. package/docs/socket-bootstrap.md +5 -385
  120. package/package.json +2 -2
  121. package/CLAUDE.md +0 -256
  122. package/dist/pageRouteValidation-B4Cmtfjv.d.ts +0 -280
package/dist/client.d.ts CHANGED
@@ -1,335 +1,46 @@
1
- import { StreamPayload, ApiTypeMap } from './apiTypeStubs.js';
2
- export { SyncTypeMap } from './apiTypeStubs.js';
3
- import { H as HttpMethodLiteral } from './pageRouteValidation-B4Cmtfjv.js';
4
- export { A as ApiMethodMap, D as DEFAULT_PAGE_ROUTE_RULES, L as Logger, a as LoggerContext, N as Notifier, b as NotifyInput, c as NotifyParam, P as PagePathValidationResult, d as PageRouteRules, R as ROUTED_DATA_QUERY_KEY, S as SOCKETSTATUS, e as buildApiResponseEventName, f as buildApiStreamEventName, g as buildGetJoinedRoomsResponseEventName, h as buildJoinRoomResponseEventName, i as buildLeaveRoomResponseEventName, j as buildRoutedGetUrl, k as buildSyncProgressEventName, l as buildSyncResponseEventName, m as clearCsrfToken, n as enqueueApiRequest, o as enqueueSyncRequest, p as flushApiQueue, q as flushSyncQueue, r as getApiQueueSize, s as getCsrfToken, t as getLogger, u as getNotifier, v as getRegisteredApiMethod, w as getSyncQueueSize, x as httpFetch, y as incrementResponseIndex, z as isApiMethodMapRegistered, B as isOnline, C as normalizeErrorResponseCore, E as notify, F as parseServiceRouteName, G as registerApiMethodMap, I as registerLogger, J as registerNotifier, K as removeApiQueueItem, M as removeApiQueueItemsByKey, O as removeSyncQueueItem, Q as setSocket, T as sleep, U as socket, V as socketEventNames, W as statusContent, X as tryCatchSync, Y as validatePagePath, Z as waitForSocket } from './pageRouteValidation-B4Cmtfjv.js';
5
- import { B as BaseSessionLayout } from './sessionTypes-DanjuPaE.js';
6
- export { A as AppConfig, a as AuthProps, L as LoggingConfig, P as ProjectConfig, R as RateLimitingConfig, S as SessionConfig, b as SessionLocation, T as TransportConfig, g as getProjectConfig, i as isProjectConfigRegistered, r as registerProjectConfig } from './sessionTypes-DanjuPaE.js';
7
- import * as react from 'react';
8
- import { ReactNode, Dispatch, SetStateAction } from 'react';
9
- import 'socket.io-client';
10
-
11
- type ApiStreamEvent<T extends StreamPayload = StreamPayload> = T;
12
- type DataRequired<T> = Record<string, never> extends T ? false : true;
13
- type UnionToIntersection<U> = (U extends unknown ? (arg: U) => void : never) extends ((arg: infer I) => void) ? I : never;
14
- type ApiRouteRecord = UnionToIntersection<{
15
- [P in keyof ApiTypeMap]: {
16
- [N in keyof ApiTypeMap[P] as P extends 'root' ? `system/${Extract<N, string>}` : `${Extract<P, string>}/${Extract<N, string>}`]: ApiTypeMap[P][N];
17
- };
18
- }[keyof ApiTypeMap]>;
19
- type ApiFullName = Extract<keyof ApiRouteRecord, string>;
20
- type VersionsForFullName<F extends ApiFullName> = keyof ApiRouteRecord[F] & string;
21
- type Prettify<T> = {
22
- [K in keyof T]: T[K];
23
- } & {};
24
- type InputForFullName<F extends ApiFullName, V extends VersionsForFullName<F>> = ApiRouteRecord[F][V] extends {
25
- input: infer I;
26
- } ? I : never;
27
- type OutputForFullName<F extends ApiFullName, V extends VersionsForFullName<F>> = ApiRouteRecord[F][V] extends {
28
- output: infer O;
29
- } ? O : never;
30
- type StreamForFullName<F extends ApiFullName, V extends VersionsForFullName<F>> = ApiRouteRecord[F][V] extends {
31
- stream: infer S;
32
- } ? S : never;
33
- type ApiStreamCallbackForFullName<F extends ApiFullName, V extends VersionsForFullName<F>> = [
34
- StreamForFullName<F, V>
35
- ] extends [never] ? never : (event: ApiStreamEvent<Prettify<StreamForFullName<F, V> extends StreamPayload ? StreamForFullName<F, V> : StreamPayload>>) => void;
36
- type ApiParamsForFullName<F extends ApiFullName, V extends VersionsForFullName<F>> = DataRequired<InputForFullName<F, V>> extends true ? {
37
- name: F;
38
- version: V;
39
- data: Prettify<InputForFullName<F, V>>;
40
- abortable?: boolean;
41
- disableErrorMessage?: boolean;
42
- onStream?: ApiStreamCallbackForFullName<F, V>;
43
- signal?: AbortSignal;
44
- timeoutMs?: number | false;
45
- } : {
46
- name: F;
47
- version: V;
48
- data?: Prettify<InputForFullName<F, V>>;
49
- abortable?: boolean;
50
- disableErrorMessage?: boolean;
51
- onStream?: ApiStreamCallbackForFullName<F, V>;
52
- signal?: AbortSignal;
53
- timeoutMs?: number | false;
54
- };
55
- interface ApiErrorResponse extends Record<string, unknown> {
56
- status: 'error';
57
- httpStatus: number;
58
- message: string;
59
- errorCode: string;
60
- errorParams?: {
61
- key: string;
62
- value: string | number | boolean;
63
- }[];
64
- }
65
- /**
66
- * Type-safe API request function.
67
- *
68
- * @example
69
- * ```typescript
70
- * // Full name usage - includes page in the name
71
- * const result = await apiRequest({ name: 'examples/publicApi', version: 'v1', data: { message: 'hello' } });
72
- * // result is typed correctly for publicApi
73
- *
74
- * // Global APIs use service-first naming
75
- * await apiRequest({ name: 'system/session', version: 'v1' });
76
- * ```
77
- */
78
- declare function apiRequest<F extends ApiFullName, V extends VersionsForFullName<F>>(params: ApiParamsForFullName<F, V>): Promise<Prettify<OutputForFullName<F, V>> | ApiErrorResponse>;
79
-
80
- declare function tryCatch<T, P = void>(func: (values: P) => Promise<T> | T, params?: P, context?: Record<string, unknown>): Promise<[Error | null, T | null]>;
81
-
82
- type RoutedInvocationMethod = HttpMethodLiteral;
83
- interface RoutedInvocationResponse<TResponse> {
84
- kind: 'response';
85
- response: TResponse;
86
- httpStatus: number;
87
- }
88
- interface RoutedInvocationFailure {
89
- kind: 'aborted' | 'timeout' | 'network-error' | 'invalid-response';
90
- }
91
- type RoutedInvocationResult<TResponse> = RoutedInvocationResponse<TResponse> | RoutedInvocationFailure;
92
- interface RoutedHttpInvocationInput<TStream> {
93
- path: string;
94
- method: RoutedInvocationMethod;
95
- data: Record<string, unknown>;
96
- stream?: (payload: TStream) => void;
97
- signals?: readonly (AbortSignal | null | undefined)[];
98
- timeoutMs?: number | false;
99
- }
100
- declare const invokeRoutedHttp: <TResponse, TStream = Record<string, unknown>>({ path, method, data, stream, signals, timeoutMs, }: RoutedHttpInvocationInput<TStream>) => Promise<RoutedInvocationResult<TResponse>>;
101
-
102
- type LocalesMap = Record<string, unknown>;
103
- type LanguageSource = () => string | null | undefined;
104
- declare const registerLocales: (locales: LocalesMap) => void;
105
- declare const getRegisteredLocales: () => LocalesMap;
106
- declare const getDefaultLocale: () => string;
107
- declare const registerLanguageSource: (fn: LanguageSource) => void;
108
- declare const getActiveLanguage: () => string;
109
- declare const getLocaleByCode: (code: string) => unknown;
110
-
111
- interface MiddlewareInput {
112
- location: string;
113
- searchParams: Record<string, string>;
114
- session: BaseSessionLayout | null;
115
- }
116
- type MiddlewareResult = {
117
- success: true;
118
- redirect?: undefined;
119
- status?: undefined;
120
- } | {
121
- success: false;
122
- redirect: string;
123
- status?: undefined;
124
- } | {
125
- success: false;
126
- redirect?: undefined;
127
- status: number;
128
- } | undefined;
129
- /** Normalized decision derived from a {@link MiddlewareResult}. */
130
- type MiddlewareOutcome = {
131
- kind: 'allow';
132
- } | {
133
- kind: 'redirect';
134
- to: string;
135
- } | {
136
- kind: 'deny';
137
- status: number;
138
- } | {
139
- kind: 'fallback';
140
- };
141
- type MiddlewareHandler = (input: MiddlewareInput) => MiddlewareResult | Promise<MiddlewareResult>;
142
- declare const registerMiddlewareHandler: (handler: MiddlewareHandler) => void;
143
- declare const getMiddlewareHandler: () => MiddlewareHandler;
144
- type PageMiddleware<TSession extends BaseSessionLayout = BaseSessionLayout> = (input: {
145
- location: string;
146
- searchParams: Record<string, string>;
147
- session: TSession | null;
148
- }) => MiddlewareResult | Promise<MiddlewareResult>;
149
- declare const registerPageMiddleware: (path: string, middleware: PageMiddleware) => void;
150
- declare const getPageMiddleware: (path: string) => PageMiddleware | undefined;
151
- declare const hasPageMiddleware: (path: string) => boolean;
152
-
153
- interface ClientHookPayloadMap {
154
- preLogin: {
155
- candidateSession: BaseSessionLayout;
156
- };
157
- postLogin: {
158
- session: BaseSessionLayout;
159
- };
160
- postLogout: {
161
- previousSession: BaseSessionLayout;
162
- };
163
- queueItemDropped: {
164
- queue: 'api' | 'sync';
165
- key: string;
166
- reason: 'queue-full' | 'expired';
167
- dropPolicy: 'drop-oldest' | 'drop-newest' | 'reject';
168
- };
169
- }
170
- type ClientHookName = keyof ClientHookPayloadMap;
171
- interface ClientHookStopSignal {
172
- stop: true;
173
- errorCode: string;
174
- }
175
- type ClientHookResult = void | undefined | ClientHookStopSignal;
176
- type ClientDispatchResult = {
177
- stopped: false;
178
- } | {
179
- stopped: true;
180
- signal: ClientHookStopSignal;
181
- };
182
- type ClientHookHandler<N extends ClientHookName> = (payload: ClientHookPayloadMap[N]) => ClientHookResult | Promise<ClientHookResult>;
183
- /**
184
- * Subscribe to a client-side lifecycle hook. Returns an unsubscribe function
185
- * — call it to remove the handler (e.g. inside a React effect cleanup).
186
- *
187
- * Multiple handlers can be registered for the same hook; they all fire on
188
- * each dispatch. A handler that throws (sync) or rejects (async) is logged
189
- * to `console.error` and does not affect other handlers.
190
- */
191
- declare function registerClientHook<N extends ClientHookName>(name: N, handler: ClientHookHandler<N>): () => void;
192
- /**
193
- * Fire a client-side hook (fire-and-forget). Framework-internal — consumers
194
- * should not call this directly. Used for `post*` hooks where any stop-signal
195
- * returned by a handler is intentionally ignored: a `postLogin` listener that
196
- * tried to "stop" the framework would be too late — the transition already
197
- * happened. Use `dispatchVetoableClientHook` for `pre*` hooks where the
198
- * caller actually awaits the veto decision.
199
- */
200
- declare function dispatchClientHook<N extends ClientHookName>(name: N, payload: ClientHookPayloadMap[N]): void;
201
- /**
202
- * Awaits every registered handler for a `pre*` client hook. If any handler
203
- * returns a `ClientHookStopSignal`, dispatch short-circuits and returns
204
- * `{ stopped: true, signal }`; callers must respect the veto (skip the
205
- * pending action). Handlers that throw or reject are logged but treated as
206
- * `undefined` — a buggy handler must not silently block the user flow.
207
- *
208
- * Mirrors `dispatchHook` from `@luckystack/core` so consumer/framework code
209
- * can use the same stop-signal pattern on both sides of the wire.
210
- */
211
- declare function dispatchVetoableClientHook<N extends ClientHookName>(name: N, payload: ClientHookPayloadMap[N]): Promise<ClientDispatchResult>;
212
-
213
- interface ApiRequestInterceptorContext {
214
- /** Resolved route name (`<page>/<api>` or `system/<api>`). */
215
- name: string;
216
- /** Route version literal (e.g. `'v1'`). */
217
- version: string;
218
- /**
219
- * Outgoing request payload. Mutate this object in place to augment the
220
- * request (correlation id, feature-flag context, ...). Replacing the
221
- * reference has no effect — mutate keys on the existing object.
222
- */
223
- data: Record<string, unknown>;
224
- }
225
- interface ApiResponseInterceptorContext {
226
- name: string;
227
- version: string;
228
- /** The response envelope the caller is about to receive (read-only intent). */
229
- response: {
230
- status: 'success' | 'error';
231
- [key: string]: unknown;
232
- };
233
- }
234
- type ApiRequestInterceptor = (ctx: ApiRequestInterceptorContext) => void | Promise<void>;
235
- type ApiResponseInterceptor = (ctx: ApiResponseInterceptorContext) => void | Promise<void>;
236
- /**
237
- * Register an outgoing-request interceptor. Returns an unsubscribe function.
238
- * Multiple interceptors run in registration order; each may mutate `ctx.data`.
239
- */
240
- declare function registerApiRequestInterceptor(interceptor: ApiRequestInterceptor): () => void;
241
- /**
242
- * Register an incoming-response interceptor. Returns an unsubscribe function.
243
- */
244
- declare function registerApiResponseInterceptor(interceptor: ApiResponseInterceptor): () => void;
245
-
246
- interface SessionContextValue<TSession extends BaseSessionLayout = BaseSessionLayout> {
247
- session: TSession | null;
248
- sessionLoaded: boolean;
249
- }
250
- declare const SessionContext: react.Context<SessionContextValue<BaseSessionLayout>>;
251
- declare function useSession<TSession extends BaseSessionLayout = BaseSessionLayout>(): SessionContextValue<TSession>;
252
- declare const setLatestSession: (session: BaseSessionLayout | null) => void;
253
- declare const getCurrentSession: <TSession extends BaseSessionLayout = BaseSessionLayout>() => TSession | null;
254
- /**
255
- * Vetoable entry point for committing a null → session transition (i.e. a
256
- * fresh login or a page-load session restore). Dispatches the `preLogin`
257
- * client hook to every registered handler in parallel; if any returns a
258
- * stop signal, the transition is aborted and `{ committed: false, signal }`
259
- * is returned. Otherwise, `setLatestSession(session)` runs synchronously
260
- * (which fires `postLogin`) and `{ committed: true }` comes back.
261
- *
262
- * Consumer's `SessionProvider` should `await` this for non-null session
263
- * commits and roll local React state back to `null` when a veto comes
264
- * through, so the UI doesn't render a half-logged-in state.
265
- */
266
- type ProposeLoginResult = {
267
- stopped: false;
268
- committed: true;
269
- } | {
270
- stopped: true;
271
- signal: ClientHookStopSignal;
272
- committed: false;
273
- };
274
- declare const proposeLogin: (session: BaseSessionLayout) => Promise<ProposeLoginResult>;
275
-
276
- type AvatarStatus = 'avatar' | 'fallback';
277
- interface AvatarContextType {
278
- avatarStatuses: Record<string, AvatarStatus>;
279
- setAvatarStatus: (key: string, status: AvatarStatus) => void;
280
- }
281
- declare const AvatarProvider: ({ children }: {
282
- children: ReactNode;
283
- }) => react.JSX.Element;
284
- declare function useAvatarContext(): AvatarContextType;
285
-
286
- type Theme = 'light' | 'dark';
287
- declare const useTheme: () => {
288
- theme: Theme;
289
- setTheme: (next: Theme) => void;
290
- };
291
-
292
- type TranslationRecord = Record<string, unknown>;
293
- declare function TranslationProvider({ children }: {
294
- children: ReactNode;
295
- }): react.JSX.Element;
296
- declare function useTranslation(): TranslationRecord;
297
- declare function useUpdateLanguage(): Dispatch<SetStateAction<string>>;
298
- interface TranslateParam {
299
- key: string;
300
- value: string | number | boolean;
301
- }
302
- declare function translate({ translationList, key, params }: {
303
- translationList: TranslationRecord;
304
- key: unknown;
305
- params?: TranslateParam[];
306
- }): string;
307
- declare const useTranslator: () => ({ key, params }: {
308
- key: string;
309
- params?: TranslateParam[];
310
- }) => string;
311
-
312
- interface NotifyInput {
313
- key: string;
314
- params?: TranslateParam[];
315
- }
316
- declare const notify: {
317
- success: (input: NotifyInput) => void;
318
- error: (input: NotifyInput) => void;
319
- info: (input: NotifyInput) => void;
320
- warning: (input: NotifyInput) => void;
321
- };
322
-
323
- declare function Middleware({ children, denied, }: {
324
- children: ReactNode;
325
- /**
326
- * Rendered instead of the page when middleware denies IN PLACE
327
- * (`{ success: false, status }`) — the URL is kept. Pass a node, or a
328
- * function to vary by status. Defaults to a minimal built-in view.
329
- */
330
- denied?: ReactNode | ((status: number) => ReactNode);
331
- }): react.JSX.Element | null;
332
-
333
- declare function useRouter(): (path: string) => Promise<void>;
334
-
335
- export { type ApiErrorResponse, type ApiRequestInterceptor, type ApiRequestInterceptorContext, type ApiResponseInterceptor, type ApiResponseInterceptorContext, type ApiStreamEvent, ApiTypeMap, AvatarProvider, type AvatarStatus, BaseSessionLayout, type ClientDispatchResult, type ClientHookHandler, type ClientHookName, type ClientHookPayloadMap, type ClientHookResult, type ClientHookStopSignal, HttpMethodLiteral, type LanguageSource, type LocalesMap, Middleware, type MiddlewareHandler, type MiddlewareInput, type MiddlewareOutcome, type MiddlewareResult, type PageMiddleware, type RoutedHttpInvocationInput, type RoutedInvocationFailure, type RoutedInvocationMethod, type RoutedInvocationResponse, type RoutedInvocationResult, SessionContext, type SessionContextValue, StreamPayload, type Theme, type TranslateParam, TranslationProvider, type TranslationRecord, apiRequest, dispatchClientHook, dispatchVetoableClientHook, getActiveLanguage, getCurrentSession, getDefaultLocale, getLocaleByCode, getMiddlewareHandler, getPageMiddleware, getRegisteredLocales, hasPageMiddleware, notify as i18nNotify, invokeRoutedHttp, proposeLogin, registerApiRequestInterceptor, registerApiResponseInterceptor, registerClientHook, registerLanguageSource, registerLocales, registerMiddlewareHandler, registerPageMiddleware, setLatestSession, translate, tryCatch, useAvatarContext, useRouter, useSession, useTheme, useTranslation, useTranslator, useUpdateLanguage };
1
+ export { apiRequest } from './apiRequest.js';
2
+ export type { ApiStreamEvent, ApiErrorResponse } from './apiRequest.js';
3
+ export { default as sleep } from './sleep.js';
4
+ export { default as tryCatch } from './tryCatchClient.js';
5
+ export { default as tryCatchSync } from './tryCatchSync.js';
6
+ export { getProjectConfig, registerProjectConfig, isProjectConfigRegistered, } from './projectConfig.js';
7
+ export type { ProjectConfig, AppConfig, LoggingConfig, RateLimitingConfig, SessionConfig, TransportConfig, } from './projectConfig.js';
8
+ export { notify, registerNotifier, getNotifier } from './notifier.js';
9
+ export type { Notifier, NotifyInput, NotifyParam } from './notifier.js';
10
+ export { socket, setSocket, incrementResponseIndex, waitForSocket, } from './socketState.js';
11
+ export { isOnline, enqueueApiRequest, enqueueSyncRequest, removeApiQueueItem, removeSyncQueueItem, removeApiQueueItemsByKey, flushApiQueue, flushSyncQueue, getApiQueueSize, getSyncQueueSize, } from './offlineQueue.js';
12
+ export { normalizeErrorResponseCore } from './responseNormalizer.js';
13
+ export { getCsrfToken, clearCsrfToken, httpFetch } from './csrf.js';
14
+ export { invokeRoutedHttp } from './routedHttpInvocation.js';
15
+ export { ROUTED_DATA_QUERY_KEY, buildRoutedGetUrl } from './routedDataQuery.js';
16
+ export type { RoutedHttpInvocationInput, RoutedInvocationFailure, RoutedInvocationMethod, RoutedInvocationResponse, RoutedInvocationResult, } from './routedHttpInvocation.js';
17
+ export { parseServiceRouteName } from './serviceRoute.js';
18
+ export { buildApiResponseEventName, buildApiStreamEventName, buildSyncProgressEventName, buildSyncResponseEventName, buildJoinRoomResponseEventName, buildLeaveRoomResponseEventName, buildGetJoinedRoomsResponseEventName, socketEventNames, } from './socketEvents.js';
19
+ export type { statusContent, SOCKETSTATUS } from './socketStatusTypes.js';
20
+ export type { ApiTypeMap, SyncTypeMap, StreamPayload } from './apiTypeStubs.js';
21
+ export type { BaseSessionLayout, SessionLocation, AuthProps } from './sessionTypes.js';
22
+ export { getLogger, registerLogger } from './loggerRegistry.js';
23
+ export type { Logger, LoggerContext } from './loggerRegistry.js';
24
+ export { registerApiMethodMap, getRegisteredApiMethod, isApiMethodMapRegistered, } from './apiMethodMapRegistry.js';
25
+ export type { HttpMethodLiteral, ApiMethodMap } from './apiMethodMapRegistry.js';
26
+ export { registerLocales, getRegisteredLocales, getDefaultLocale, registerLanguageSource, getActiveLanguage, getLocaleByCode, } from './localesRegistry.js';
27
+ export type { LocalesMap, LanguageSource } from './localesRegistry.js';
28
+ export { registerMiddlewareHandler, getMiddlewareHandler, registerPageMiddleware, getPageMiddleware, hasPageMiddleware, } from './middlewareRegistry.js';
29
+ export type { MiddlewareInput, MiddlewareResult, MiddlewareOutcome, MiddlewareHandler, PageMiddleware, } from './middlewareRegistry.js';
30
+ export { registerClientHook, dispatchClientHook, dispatchVetoableClientHook, } from './clientHookBus.js';
31
+ export type { ClientHookName, ClientHookHandler, ClientHookPayloadMap, ClientHookStopSignal, ClientHookResult, ClientDispatchResult, } from './clientHookBus.js';
32
+ export { registerApiRequestInterceptor, registerApiResponseInterceptor, } from './apiInterceptors.js';
33
+ export type { ApiRequestInterceptor, ApiResponseInterceptor, ApiRequestInterceptorContext, ApiResponseInterceptorContext, } from './apiInterceptors.js';
34
+ export { validatePagePath, DEFAULT_PAGE_ROUTE_RULES, } from './pageRouteValidation.js';
35
+ export type { PageRouteRules, PagePathValidationResult, } from './pageRouteValidation.js';
36
+ export { SessionContext, useSession, setLatestSession, getCurrentSession, proposeLogin, } from './react/sessionContext.js';
37
+ export type { SessionContextValue } from './react/sessionContext.js';
38
+ export { AvatarProvider, useAvatarContext } from './react/AvatarProvider.js';
39
+ export type { AvatarStatus } from './react/AvatarProvider.js';
40
+ export { useTheme } from './react/useTheme.js';
41
+ export type { Theme } from './react/useTheme.js';
42
+ export { TranslationProvider, useTranslation, useUpdateLanguage, translate, useTranslator, } from './react/TranslationProvider.js';
43
+ export type { TranslationRecord, TranslateParam } from './react/TranslationProvider.js';
44
+ export { default as i18nNotify } from './react/notify.js';
45
+ export { default as Middleware } from './react/Middleware.js';
46
+ export { default as useRouter } from './react/Router.js';
package/dist/client.js CHANGED
@@ -818,12 +818,12 @@ var applyDomClass = (theme) => {
818
818
  };
819
819
  var useTheme = () => {
820
820
  const initialTheme = getProjectConfig().defaultTheme ?? "light";
821
- const [theme, setThemeState] = useState2(initialTheme);
821
+ const [themeState, setThemeState] = useState2(initialTheme);
822
822
  const setTheme = useCallback2((next) => {
823
823
  setThemeState(next);
824
824
  applyDomClass(next);
825
825
  }, []);
826
- return { theme, setTheme };
826
+ return { theme: themeState, setTheme };
827
827
  };
828
828
 
829
829
  // src/react/TranslationProvider.tsx