@alepha/react 0.14.2 → 0.14.3

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 (34) hide show
  1. package/dist/auth/index.js +2 -2
  2. package/dist/auth/index.js.map +1 -1
  3. package/dist/core/index.d.ts +4 -0
  4. package/dist/core/index.d.ts.map +1 -1
  5. package/dist/core/index.js +7 -4
  6. package/dist/core/index.js.map +1 -1
  7. package/dist/head/index.d.ts +17 -17
  8. package/dist/head/index.d.ts.map +1 -1
  9. package/dist/head/index.js +2 -1
  10. package/dist/head/index.js.map +1 -1
  11. package/dist/router/index.d.ts.map +1 -1
  12. package/dist/router/index.js +2 -2
  13. package/dist/router/index.js.map +1 -1
  14. package/package.json +3 -3
  15. package/src/auth/__tests__/$auth.spec.ts +188 -0
  16. package/src/core/__tests__/Router.spec.tsx +169 -0
  17. package/src/core/hooks/useAction.browser.spec.tsx +569 -0
  18. package/src/core/hooks/useAction.ts +11 -0
  19. package/src/form/hooks/useForm.browser.spec.tsx +366 -0
  20. package/src/head/__tests__/expandSeo.spec.ts +203 -0
  21. package/src/head/__tests__/page-head.spec.ts +39 -0
  22. package/src/head/__tests__/seo-head.spec.ts +121 -0
  23. package/src/head/hooks/useHead.spec.tsx +288 -0
  24. package/src/head/index.ts +2 -1
  25. package/src/head/providers/BrowserHeadProvider.browser.spec.ts +271 -0
  26. package/src/head/providers/ServerHeadProvider.spec.ts +163 -0
  27. package/src/i18n/__tests__/integration.spec.tsx +239 -0
  28. package/src/i18n/components/Localize.spec.tsx +357 -0
  29. package/src/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  30. package/src/i18n/providers/I18nProvider.spec.ts +389 -0
  31. package/src/router/primitives/$page.browser.spec.tsx +702 -0
  32. package/src/router/primitives/$page.spec.tsx +702 -0
  33. package/src/router/providers/ReactServerProvider.spec.tsx +316 -0
  34. package/src/router/providers/ReactServerProvider.ts +4 -3
@@ -326,6 +326,10 @@ interface UseActionReturn<Args extends any[], Result> {
326
326
  * ```
327
327
  */
328
328
  cancel: () => void;
329
+ /**
330
+ * The result data from the last successful action execution.
331
+ */
332
+ result?: Result;
329
333
  }
330
334
  //#endregion
331
335
  //#region ../../src/core/hooks/useAlepha.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/core/components/ClientOnly.tsx","../../src/core/components/ErrorBoundary.tsx","../../src/core/contexts/AlephaProvider.tsx","../../src/core/contexts/AlephaContext.ts","../../src/core/hooks/useAction.ts","../../src/core/hooks/useAlepha.ts","../../src/core/hooks/useEvents.ts","../../src/core/hooks/useInject.ts","../../src/core/hooks/useClient.ts","../../src/core/hooks/useStore.ts","../../src/core/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/core/components/ClientOnly.tsx","../../src/core/components/ErrorBoundary.tsx","../../src/core/contexts/AlephaProvider.tsx","../../src/core/contexts/AlephaContext.ts","../../src/core/hooks/useAction.ts","../../src/core/hooks/useAlepha.ts","../../src/core/hooks/useEvents.ts","../../src/core/hooks/useInject.ts","../../src/core/hooks/useClient.ts","../../src/core/hooks/useStore.ts","../../src/core/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -240,6 +240,7 @@ function useAction(options, deps) {
240
240
  const dateTimeProvider = useInject(DateTimeProvider);
241
241
  const [loading, setLoading] = useState(false);
242
242
  const [error, setError] = useState();
243
+ const [result, setResult] = useState();
243
244
  const isExecutingRef = useRef(false);
244
245
  const debounceTimerRef = useRef(void 0);
245
246
  const abortControllerRef = useRef(void 0);
@@ -275,14 +276,15 @@ function useAction(options, deps) {
275
276
  id: options.id
276
277
  });
277
278
  try {
278
- const result = await options.handler(...args, { signal: abortController.signal });
279
+ const result$1 = await options.handler(...args, { signal: abortController.signal });
280
+ setResult(result$1);
279
281
  if (!isMountedRef.current || abortController.signal.aborted) return;
280
282
  await alepha.events.emit("react:action:success", {
281
283
  type: "custom",
282
284
  id: options.id
283
285
  });
284
- if (options.onSuccess) await options.onSuccess(result);
285
- return result;
286
+ if (options.onSuccess) await options.onSuccess(result$1);
287
+ return result$1;
286
288
  } catch (err) {
287
289
  if (err instanceof Error && err.name === "AbortError") return;
288
290
  if (!isMountedRef.current) return;
@@ -352,7 +354,8 @@ function useAction(options, deps) {
352
354
  run: handler,
353
355
  loading,
354
356
  error,
355
- cancel
357
+ cancel,
358
+ result
356
359
  };
357
360
  }
358
361
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["error"],"sources":["../../src/core/components/ClientOnly.tsx","../../src/core/components/ErrorBoundary.tsx","../../src/core/contexts/AlephaContext.ts","../../src/core/contexts/AlephaProvider.tsx","../../src/core/hooks/useAlepha.ts","../../src/core/hooks/useInject.ts","../../src/core/hooks/useAction.ts","../../src/core/hooks/useEvents.ts","../../src/core/hooks/useClient.ts","../../src/core/hooks/useStore.ts","../../src/core/index.ts"],"sourcesContent":["import {\n type PropsWithChildren,\n type ReactNode,\n useEffect,\n useState,\n} from \"react\";\n\nexport interface ClientOnlyProps {\n fallback?: ReactNode;\n disabled?: boolean;\n}\n\n/**\n * A small utility component that renders its children only on the client side.\n *\n * Optionally, you can provide a fallback React node that will be rendered.\n *\n * You should use this component when\n * - you have code that relies on browser-specific APIs\n * - you want to avoid server-side rendering for a specific part of your application\n * - you want to prevent pre-rendering of a component\n *\n * @example\n * ```tsx\n * import { ClientOnly } from \"@alepha/react\";\n *\n * const MyComponent = () => {\n * // Avoids SSR issues with Date API\n * return (\n * <ClientOnly>\n * {new Date().toLocaleTimeString()}\n * </ClientOnly>\n * );\n * }\n * ```\n */\nconst ClientOnly = (props: PropsWithChildren<ClientOnlyProps>) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => setMounted(true), []);\n\n if (props.disabled) {\n return props.children;\n }\n\n return mounted ? props.children : props.fallback;\n};\n\nexport default ClientOnly;\n","import React, {\n type ErrorInfo,\n type PropsWithChildren,\n type ReactNode,\n} from \"react\";\n\n/**\n * Props for the ErrorBoundary component.\n */\nexport interface ErrorBoundaryProps {\n /**\n * Fallback React node to render when an error is caught.\n * If not provided, a default error message will be shown.\n */\n fallback: (error: Error) => ReactNode;\n\n /**\n * Optional callback that receives the error and error info.\n * Use this to log errors to a monitoring service.\n */\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\n/**\n * State of the ErrorBoundary component.\n */\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\n/**\n * A reusable error boundary for catching rendering errors in any part of the React component tree.\n *\n * It's already included in the Alepha React framework when using page or layout components.\n */\nexport class ErrorBoundary extends React.Component<\n PropsWithChildren<ErrorBoundaryProps>,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n /**\n * Update state so the next render shows the fallback UI.\n */\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return {\n error,\n };\n }\n\n /**\n * Lifecycle method called when an error is caught.\n * You can log the error or perform side effects here.\n */\n componentDidCatch(error: Error, info: ErrorInfo): void {\n if (this.props.onError) {\n this.props.onError(error, info);\n }\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return this.props.fallback(this.state.error);\n }\n\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n","import type { Alepha } from \"alepha\";\nimport { createContext } from \"react\";\n\n/**\n * React context to provide the Alepha instance throughout the component tree.\n */\nexport const AlephaContext = createContext<Alepha | undefined>(undefined);\n","import { Alepha } from \"alepha\";\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { AlephaContext } from \"./AlephaContext.ts\";\n\nexport interface AlephaProviderProps {\n children: ReactNode;\n onError: (error: Error) => ReactNode;\n onLoading: () => ReactNode;\n}\n\n/**\n * AlephaProvider component to initialize and provide Alepha instance to the app.\n *\n * This isn't recommended for apps using `@alepha/react/router`, as Router will handle this for you.\n */\nexport const AlephaProvider = (props: AlephaProviderProps) => {\n const alepha = useMemo(() => Alepha.create(), []);\n\n const [started, setStarted] = useState(false);\n const [error, setError] = useState<Error | undefined>();\n\n useEffect(() => {\n alepha\n .start()\n .then(() => setStarted(true))\n .catch((err) => setError(err));\n }, [alepha]);\n\n if (error) {\n return props.onError(error);\n }\n\n if (!started) {\n return props.onLoading();\n }\n\n return (\n <AlephaContext.Provider value={alepha}>\n {props.children}\n </AlephaContext.Provider>\n );\n};\n","import { type Alepha, AlephaError } from \"alepha\";\nimport { useContext } from \"react\";\nimport { AlephaContext } from \"../contexts/AlephaContext.ts\";\n\n/**\n * Main Alepha hook.\n *\n * It provides access to the Alepha instance within a React component.\n *\n * With Alepha, you can access the core functionalities of the framework:\n *\n * - alepha.state() for state management\n * - alepha.inject() for dependency injection\n * - alepha.events.emit() for event handling\n * etc...\n */\nexport const useAlepha = (): Alepha => {\n const alepha = useContext(AlephaContext);\n if (!alepha) {\n throw new AlephaError(\n \"Hook 'useAlepha()' must be used within an AlephaContext.Provider\",\n );\n }\n\n return alepha;\n};\n","import type { Service } from \"alepha\";\nimport { useMemo } from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\n\n/**\n * Hook to inject a service instance.\n * It's a wrapper of `useAlepha().inject(service)` with a memoization.\n */\nexport const useInject = <T extends object>(service: Service<T>): T => {\n const alepha = useAlepha();\n return useMemo(() => alepha.inject(service), []);\n};\n","import {\n DateTimeProvider,\n type DurationLike,\n type Interval,\n type Timeout,\n} from \"alepha/datetime\";\nimport {\n type DependencyList,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\nimport { useInject } from \"./useInject.ts\";\nimport type { Async } from \"alepha\";\n\n/**\n * Hook for handling async actions with automatic error handling and event emission.\n *\n * By default, prevents concurrent executions - if an action is running and you call it again,\n * the second call will be ignored. Use `debounce` option to delay execution instead.\n *\n * Emits lifecycle events:\n * - `react:action:begin` - When action starts\n * - `react:action:success` - When action completes successfully\n * - `react:action:error` - When action throws an error\n * - `react:action:end` - Always emitted at the end\n *\n * @example Basic usage\n * ```tsx\n * const action = useAction({\n * handler: async (data) => {\n * await api.save(data);\n * }\n * }, []);\n *\n * <button onClick={() => action.run(data)} disabled={action.loading}>\n * Save\n * </button>\n * ```\n *\n * @example With debounce (search input)\n * ```tsx\n * const search = useAction({\n * handler: async (query: string) => {\n * await api.search(query);\n * },\n * debounce: 300 // Wait 300ms after last call\n * }, []);\n *\n * <input onChange={(e) => search.run(e.target.value)} />\n * ```\n *\n * @example Run on component mount\n * ```tsx\n * const fetchData = useAction({\n * handler: async () => {\n * const data = await api.getData();\n * return data;\n * },\n * runOnInit: true // Runs once when component mounts\n * }, []);\n * ```\n *\n * @example Run periodically (polling)\n * ```tsx\n * const pollStatus = useAction({\n * handler: async () => {\n * const status = await api.getStatus();\n * return status;\n * },\n * runEvery: 5000 // Run every 5 seconds\n * }, []);\n *\n * // Or with duration tuple\n * const pollStatus = useAction({\n * handler: async () => {\n * const status = await api.getStatus();\n * return status;\n * },\n * runEvery: [30, 'seconds'] // Run every 30 seconds\n * }, []);\n * ```\n *\n * @example With AbortController\n * ```tsx\n * const fetch = useAction({\n * handler: async (url, { signal }) => {\n * const response = await fetch(url, { signal });\n * return response.json();\n * }\n * }, []);\n * // Automatically cancelled on unmount or when new request starts\n * ```\n *\n * @example With error handling\n * ```tsx\n * const deleteAction = useAction({\n * handler: async (id: string) => {\n * await api.delete(id);\n * },\n * onError: (error) => {\n * if (error.code === 'NOT_FOUND') {\n * // Custom error handling\n * }\n * }\n * }, []);\n *\n * {deleteAction.error && <div>Error: {deleteAction.error.message}</div>}\n * ```\n *\n * @example Global error handling\n * ```tsx\n * // In your root app setup\n * alepha.events.on(\"react:action:error\", ({ error }) => {\n * toast.danger(error.message);\n * Sentry.captureException(error);\n * });\n * ```\n */\nexport function useAction<Args extends any[], Result = void>(\n options: UseActionOptions<Args, Result>,\n deps: DependencyList,\n): UseActionReturn<Args, Result> {\n const alepha = useAlepha();\n const dateTimeProvider = useInject(DateTimeProvider);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>();\n const isExecutingRef = useRef(false);\n const debounceTimerRef = useRef<Timeout | undefined>(undefined);\n const abortControllerRef = useRef<AbortController | undefined>(undefined);\n const isMountedRef = useRef(true);\n const intervalRef = useRef<Interval | undefined>(undefined);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n\n // clear debounce timer\n if (debounceTimerRef.current) {\n dateTimeProvider.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n\n // clear interval\n if (intervalRef.current) {\n dateTimeProvider.clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n\n // abort in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = undefined;\n }\n };\n }, []);\n\n const executeAction = useCallback(\n async (...args: Args): Promise<Result | undefined> => {\n // Prevent concurrent executions\n if (isExecutingRef.current) {\n return;\n }\n\n // Abort previous request if still running\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n isExecutingRef.current = true;\n setLoading(true);\n setError(undefined);\n\n await alepha.events.emit(\"react:action:begin\", {\n type: \"custom\",\n id: options.id,\n });\n\n try {\n // Pass abort signal as last argument to handler\n const result = await options.handler(...args, {\n signal: abortController.signal,\n } as any);\n\n // Only update state if still mounted and not aborted\n if (!isMountedRef.current || abortController.signal.aborted) {\n return;\n }\n\n await alepha.events.emit(\"react:action:success\", {\n type: \"custom\",\n id: options.id,\n });\n\n if (options.onSuccess) {\n await options.onSuccess(result);\n }\n\n return result;\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n // Only update state if still mounted\n if (!isMountedRef.current) {\n return;\n }\n\n const error = err as Error;\n setError(error);\n\n await alepha.events.emit(\"react:action:error\", {\n type: \"custom\",\n id: options.id,\n error,\n });\n\n if (options.onError) {\n await options.onError(error);\n } else {\n // Re-throw if no custom error handler\n throw error;\n }\n } finally {\n isExecutingRef.current = false;\n setLoading(false);\n\n await alepha.events.emit(\"react:action:end\", {\n type: \"custom\",\n id: options.id,\n });\n\n // Clean up abort controller\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [...deps, options.id, options.onError, options.onSuccess],\n );\n\n const handler = useCallback(\n async (...args: Args): Promise<Result | undefined> => {\n if (options.debounce) {\n // clear existing timer\n if (debounceTimerRef.current) {\n dateTimeProvider.clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer\n return new Promise((resolve) => {\n debounceTimerRef.current = dateTimeProvider.createTimeout(\n async () => {\n const result = await executeAction(...args);\n resolve(result);\n },\n options.debounce ?? 0,\n );\n });\n }\n\n return executeAction(...args);\n },\n [executeAction, options.debounce],\n );\n\n const cancel = useCallback(() => {\n // clear debounce timer\n if (debounceTimerRef.current) {\n dateTimeProvider.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n\n // abort in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = undefined;\n }\n\n // reset state\n if (isMountedRef.current) {\n isExecutingRef.current = false;\n setLoading(false);\n }\n }, []);\n\n // Run action on mount if runOnInit is true\n useEffect(() => {\n if (options.runOnInit) {\n handler(...([] as any));\n }\n }, deps);\n\n // Run action periodically if runEvery is specified\n useEffect(() => {\n if (!options.runEvery) {\n return;\n }\n\n // Set up interval\n intervalRef.current = dateTimeProvider.createInterval(\n () => handler(...([] as any)),\n options.runEvery,\n true,\n );\n\n // cleanup on unmount or when runEvery changes\n return () => {\n if (intervalRef.current) {\n dateTimeProvider.clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n };\n }, [handler, options.runEvery]);\n\n return {\n run: handler,\n loading,\n error,\n cancel,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Context object passed as the last argument to action handlers.\n * Contains an AbortSignal that can be used to cancel the request.\n */\nexport interface ActionContext {\n /**\n * AbortSignal that can be passed to fetch or other async operations.\n * The signal will be aborted when:\n * - The component unmounts\n * - A new action is triggered (cancels previous)\n * - The cancel() method is called\n *\n * @example\n * ```tsx\n * const action = useAction({\n * handler: async (url, { signal }) => {\n * const response = await fetch(url, { signal });\n * return response.json();\n * }\n * }, []);\n * ```\n */\n signal: AbortSignal;\n}\n\nexport interface UseActionOptions<Args extends any[] = any[], Result = any> {\n /**\n * The async action handler function.\n * Receives the action arguments plus an ActionContext as the last parameter.\n */\n handler: (...args: [...Args, ActionContext]) => Async<Result>;\n\n /**\n * Custom error handler. If provided, prevents default error re-throw.\n */\n onError?: (error: Error) => void | Promise<void>;\n\n /**\n * Custom success handler.\n */\n onSuccess?: (result: Result) => void | Promise<void>;\n\n /**\n * Optional identifier for this action (useful for debugging/analytics)\n */\n id?: string;\n\n name?: string;\n\n /**\n * Debounce delay in milliseconds. If specified, the action will only execute\n * after the specified delay has passed since the last call. Useful for search inputs\n * or other high-frequency events.\n *\n * @example\n * ```tsx\n * // Execute search 300ms after user stops typing\n * const search = useAction({ handler: search, debounce: 300 }, [])\n * ```\n */\n debounce?: number;\n\n /**\n * If true, the action will be executed once when the component mounts.\n *\n * @example\n * ```tsx\n * const fetchData = useAction({\n * handler: async () => await api.getData(),\n * runOnInit: true\n * }, []);\n * ```\n */\n runOnInit?: boolean;\n\n /**\n * If specified, the action will be executed periodically at the given interval.\n * The interval is specified as a DurationLike value (number in ms, Duration object, or [number, unit] tuple).\n *\n * @example\n * ```tsx\n * // Run every 5 seconds\n * const poll = useAction({\n * handler: async () => await api.poll(),\n * runEvery: 5000\n * }, []);\n * ```\n *\n * @example\n * ```tsx\n * // Run every 1 minute\n * const poll = useAction({\n * handler: async () => await api.poll(),\n * runEvery: [1, 'minute']\n * }, []);\n * ```\n */\n runEvery?: DurationLike;\n}\n\nexport interface UseActionReturn<Args extends any[], Result> {\n /**\n * Execute the action with the provided arguments.\n *\n * @example\n * ```tsx\n * const action = useAction({ handler: async (data) => { ... } }, []);\n * action.run(data);\n * ```\n */\n run: (...args: Args) => Promise<Result | undefined>;\n\n /**\n * Loading state - true when action is executing.\n */\n loading: boolean;\n\n /**\n * Error state - contains error if action failed, undefined otherwise.\n */\n error?: Error;\n\n /**\n * Cancel any pending debounced action or abort the current in-flight request.\n *\n * @example\n * ```tsx\n * const action = useAction({ ... }, []);\n *\n * <button onClick={action.cancel} disabled={!action.loading}>\n * Cancel\n * </button>\n * ```\n */\n cancel: () => void;\n}\n","import type { Async, Hook, Hooks } from \"alepha\";\nimport { type DependencyList, useEffect } from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\n\n/**\n * Allow subscribing to multiple Alepha events. See {@link Hooks} for available events.\n *\n * useEvents is fully typed to ensure correct event callback signatures.\n *\n * @example\n * ```tsx\n * useEvents(\n * {\n * \"react:transition:begin\": (ev) => {\n * console.log(\"Transition began to:\", ev.to);\n * },\n * \"react:transition:error\": {\n * priority: \"first\",\n * callback: (ev) => {\n * console.error(\"Transition error:\", ev.error);\n * },\n * },\n * },\n * [],\n * );\n * ```\n */\nexport const useEvents = (opts: UseEvents, deps: DependencyList) => {\n const alepha = useAlepha();\n\n useEffect(() => {\n if (!alepha.isBrowser()) {\n return;\n }\n\n const subs: Function[] = [];\n for (const [name, hook] of Object.entries(opts)) {\n subs.push(alepha.events.on(name as any, hook as any));\n }\n\n return () => {\n for (const clear of subs) {\n clear();\n }\n };\n }, deps);\n};\n\ntype UseEvents = {\n [T in keyof Hooks]?: Hook<T> | ((payload: Hooks[T]) => Async<void>);\n};\n","import {\n type ClientScope,\n type HttpVirtualClient,\n LinkProvider,\n} from \"alepha/server/links\";\nimport { useInject } from \"./useInject.ts\";\n\n/**\n * Hook to get a virtual client for the specified scope.\n *\n * It's the React-hook version of `$client()`, from `AlephaServerLinks` module.\n */\nexport const useClient = <T extends object>(\n scope?: ClientScope,\n): HttpVirtualClient<T> => {\n return useInject(LinkProvider).client<T>(scope);\n};\n","import type { State, Static, TAtomObject } from \"alepha\";\nimport { Atom } from \"alepha\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\n\n/**\n * Hook to access and mutate the Alepha state.\n */\nfunction useStore<T extends TAtomObject>(\n target: Atom<T>,\n defaultValue?: Static<T>,\n): UseStoreReturn<Static<T>>;\nfunction useStore<Key extends keyof State>(\n target: Key,\n defaultValue?: State[Key],\n): UseStoreReturn<State[Key]>;\nfunction useStore(target: any, defaultValue?: any): any {\n const alepha = useAlepha();\n\n useMemo(() => {\n if (defaultValue != null && alepha.store.get(target) == null) {\n alepha.store.set(target, defaultValue);\n }\n }, [defaultValue]);\n\n const [state, setState] = useState(alepha.store.get(target));\n\n useEffect(() => {\n if (!alepha.isBrowser()) {\n return;\n }\n\n const key = target instanceof Atom ? target.key : target;\n\n return alepha.events.on(\"state:mutate\", (ev) => {\n if (ev.key === key) {\n setState(ev.value);\n }\n });\n }, []);\n\n return [\n state,\n (value: any) => {\n alepha.store.set(target, value);\n },\n ] as const;\n}\n\nexport type UseStoreReturn<T> = [T, (value: T) => void];\n\nexport { useStore };\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { default as ClientOnly } from \"./components/ClientOnly.tsx\";\nexport type * from \"./components/ClientOnly.tsx\";\nexport { default as ErrorBoundary } from \"./components/ErrorBoundary.tsx\";\nexport type * from \"./components/ErrorBoundary.tsx\";\nexport * from \"./contexts/AlephaProvider.tsx\";\nexport * from \"./contexts/AlephaContext.ts\";\nexport * from \"./hooks/useAction.ts\";\nexport * from \"./hooks/useAlepha.ts\";\nexport * from \"./hooks/useEvents.ts\";\nexport * from \"./hooks/useInject.ts\";\nexport * from \"./hooks/useClient.ts\";\nexport * from \"./hooks/useStore.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Fires when a user action is starting.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:begin\": {\n type: string;\n id?: string;\n };\n /**\n * Fires when a user action has succeeded.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:success\": {\n type: string;\n id?: string;\n };\n /**\n * Fires when a user action has failed.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:error\": {\n type: string;\n id?: string;\n error: Error;\n };\n /**\n * Fires when a user action has completed, regardless of success or failure.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:end\": {\n type: string;\n id?: string;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Provides full-stack React development with declarative routing, server-side rendering, and client-side hydration.\n *\n * The React module enables building modern React applications using the `$page` primitive on class properties.\n * It delivers seamless server-side rendering, automatic code splitting, and client-side navigation with full\n * type safety and schema validation for route parameters and data.\n *\n * @see {@link $page}\n * @module alepha.react\n */\nexport const AlephaReact = $module({\n name: \"alepha.react.core\",\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["result","error"],"sources":["../../src/core/components/ClientOnly.tsx","../../src/core/components/ErrorBoundary.tsx","../../src/core/contexts/AlephaContext.ts","../../src/core/contexts/AlephaProvider.tsx","../../src/core/hooks/useAlepha.ts","../../src/core/hooks/useInject.ts","../../src/core/hooks/useAction.ts","../../src/core/hooks/useEvents.ts","../../src/core/hooks/useClient.ts","../../src/core/hooks/useStore.ts","../../src/core/index.ts"],"sourcesContent":["import {\n type PropsWithChildren,\n type ReactNode,\n useEffect,\n useState,\n} from \"react\";\n\nexport interface ClientOnlyProps {\n fallback?: ReactNode;\n disabled?: boolean;\n}\n\n/**\n * A small utility component that renders its children only on the client side.\n *\n * Optionally, you can provide a fallback React node that will be rendered.\n *\n * You should use this component when\n * - you have code that relies on browser-specific APIs\n * - you want to avoid server-side rendering for a specific part of your application\n * - you want to prevent pre-rendering of a component\n *\n * @example\n * ```tsx\n * import { ClientOnly } from \"@alepha/react\";\n *\n * const MyComponent = () => {\n * // Avoids SSR issues with Date API\n * return (\n * <ClientOnly>\n * {new Date().toLocaleTimeString()}\n * </ClientOnly>\n * );\n * }\n * ```\n */\nconst ClientOnly = (props: PropsWithChildren<ClientOnlyProps>) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => setMounted(true), []);\n\n if (props.disabled) {\n return props.children;\n }\n\n return mounted ? props.children : props.fallback;\n};\n\nexport default ClientOnly;\n","import React, {\n type ErrorInfo,\n type PropsWithChildren,\n type ReactNode,\n} from \"react\";\n\n/**\n * Props for the ErrorBoundary component.\n */\nexport interface ErrorBoundaryProps {\n /**\n * Fallback React node to render when an error is caught.\n * If not provided, a default error message will be shown.\n */\n fallback: (error: Error) => ReactNode;\n\n /**\n * Optional callback that receives the error and error info.\n * Use this to log errors to a monitoring service.\n */\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\n/**\n * State of the ErrorBoundary component.\n */\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\n/**\n * A reusable error boundary for catching rendering errors in any part of the React component tree.\n *\n * It's already included in the Alepha React framework when using page or layout components.\n */\nexport class ErrorBoundary extends React.Component<\n PropsWithChildren<ErrorBoundaryProps>,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n /**\n * Update state so the next render shows the fallback UI.\n */\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return {\n error,\n };\n }\n\n /**\n * Lifecycle method called when an error is caught.\n * You can log the error or perform side effects here.\n */\n componentDidCatch(error: Error, info: ErrorInfo): void {\n if (this.props.onError) {\n this.props.onError(error, info);\n }\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return this.props.fallback(this.state.error);\n }\n\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n","import type { Alepha } from \"alepha\";\nimport { createContext } from \"react\";\n\n/**\n * React context to provide the Alepha instance throughout the component tree.\n */\nexport const AlephaContext = createContext<Alepha | undefined>(undefined);\n","import { Alepha } from \"alepha\";\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { AlephaContext } from \"./AlephaContext.ts\";\n\nexport interface AlephaProviderProps {\n children: ReactNode;\n onError: (error: Error) => ReactNode;\n onLoading: () => ReactNode;\n}\n\n/**\n * AlephaProvider component to initialize and provide Alepha instance to the app.\n *\n * This isn't recommended for apps using `@alepha/react/router`, as Router will handle this for you.\n */\nexport const AlephaProvider = (props: AlephaProviderProps) => {\n const alepha = useMemo(() => Alepha.create(), []);\n\n const [started, setStarted] = useState(false);\n const [error, setError] = useState<Error | undefined>();\n\n useEffect(() => {\n alepha\n .start()\n .then(() => setStarted(true))\n .catch((err) => setError(err));\n }, [alepha]);\n\n if (error) {\n return props.onError(error);\n }\n\n if (!started) {\n return props.onLoading();\n }\n\n return (\n <AlephaContext.Provider value={alepha}>\n {props.children}\n </AlephaContext.Provider>\n );\n};\n","import { type Alepha, AlephaError } from \"alepha\";\nimport { useContext } from \"react\";\nimport { AlephaContext } from \"../contexts/AlephaContext.ts\";\n\n/**\n * Main Alepha hook.\n *\n * It provides access to the Alepha instance within a React component.\n *\n * With Alepha, you can access the core functionalities of the framework:\n *\n * - alepha.state() for state management\n * - alepha.inject() for dependency injection\n * - alepha.events.emit() for event handling\n * etc...\n */\nexport const useAlepha = (): Alepha => {\n const alepha = useContext(AlephaContext);\n if (!alepha) {\n throw new AlephaError(\n \"Hook 'useAlepha()' must be used within an AlephaContext.Provider\",\n );\n }\n\n return alepha;\n};\n","import type { Service } from \"alepha\";\nimport { useMemo } from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\n\n/**\n * Hook to inject a service instance.\n * It's a wrapper of `useAlepha().inject(service)` with a memoization.\n */\nexport const useInject = <T extends object>(service: Service<T>): T => {\n const alepha = useAlepha();\n return useMemo(() => alepha.inject(service), []);\n};\n","import {\n DateTimeProvider,\n type DurationLike,\n type Interval,\n type Timeout,\n} from \"alepha/datetime\";\nimport {\n type DependencyList,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\nimport { useInject } from \"./useInject.ts\";\nimport type { Async } from \"alepha\";\n\n/**\n * Hook for handling async actions with automatic error handling and event emission.\n *\n * By default, prevents concurrent executions - if an action is running and you call it again,\n * the second call will be ignored. Use `debounce` option to delay execution instead.\n *\n * Emits lifecycle events:\n * - `react:action:begin` - When action starts\n * - `react:action:success` - When action completes successfully\n * - `react:action:error` - When action throws an error\n * - `react:action:end` - Always emitted at the end\n *\n * @example Basic usage\n * ```tsx\n * const action = useAction({\n * handler: async (data) => {\n * await api.save(data);\n * }\n * }, []);\n *\n * <button onClick={() => action.run(data)} disabled={action.loading}>\n * Save\n * </button>\n * ```\n *\n * @example With debounce (search input)\n * ```tsx\n * const search = useAction({\n * handler: async (query: string) => {\n * await api.search(query);\n * },\n * debounce: 300 // Wait 300ms after last call\n * }, []);\n *\n * <input onChange={(e) => search.run(e.target.value)} />\n * ```\n *\n * @example Run on component mount\n * ```tsx\n * const fetchData = useAction({\n * handler: async () => {\n * const data = await api.getData();\n * return data;\n * },\n * runOnInit: true // Runs once when component mounts\n * }, []);\n * ```\n *\n * @example Run periodically (polling)\n * ```tsx\n * const pollStatus = useAction({\n * handler: async () => {\n * const status = await api.getStatus();\n * return status;\n * },\n * runEvery: 5000 // Run every 5 seconds\n * }, []);\n *\n * // Or with duration tuple\n * const pollStatus = useAction({\n * handler: async () => {\n * const status = await api.getStatus();\n * return status;\n * },\n * runEvery: [30, 'seconds'] // Run every 30 seconds\n * }, []);\n * ```\n *\n * @example With AbortController\n * ```tsx\n * const fetch = useAction({\n * handler: async (url, { signal }) => {\n * const response = await fetch(url, { signal });\n * return response.json();\n * }\n * }, []);\n * // Automatically cancelled on unmount or when new request starts\n * ```\n *\n * @example With error handling\n * ```tsx\n * const deleteAction = useAction({\n * handler: async (id: string) => {\n * await api.delete(id);\n * },\n * onError: (error) => {\n * if (error.code === 'NOT_FOUND') {\n * // Custom error handling\n * }\n * }\n * }, []);\n *\n * {deleteAction.error && <div>Error: {deleteAction.error.message}</div>}\n * ```\n *\n * @example Global error handling\n * ```tsx\n * // In your root app setup\n * alepha.events.on(\"react:action:error\", ({ error }) => {\n * toast.danger(error.message);\n * Sentry.captureException(error);\n * });\n * ```\n */\nexport function useAction<Args extends any[], Result = void>(\n options: UseActionOptions<Args, Result>,\n deps: DependencyList,\n): UseActionReturn<Args, Result> {\n const alepha = useAlepha();\n const dateTimeProvider = useInject(DateTimeProvider);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>();\n const [result, setResult] = useState<Result | undefined>();\n const isExecutingRef = useRef(false);\n const debounceTimerRef = useRef<Timeout | undefined>(undefined);\n const abortControllerRef = useRef<AbortController | undefined>(undefined);\n const isMountedRef = useRef(true);\n const intervalRef = useRef<Interval | undefined>(undefined);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n\n // clear debounce timer\n if (debounceTimerRef.current) {\n dateTimeProvider.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n\n // clear interval\n if (intervalRef.current) {\n dateTimeProvider.clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n\n // abort in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = undefined;\n }\n };\n }, []);\n\n const executeAction = useCallback(\n async (...args: Args): Promise<Result | undefined> => {\n // Prevent concurrent executions\n if (isExecutingRef.current) {\n return;\n }\n\n // Abort previous request if still running\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n isExecutingRef.current = true;\n setLoading(true);\n setError(undefined);\n\n await alepha.events.emit(\"react:action:begin\", {\n type: \"custom\",\n id: options.id,\n });\n\n try {\n // Pass abort signal as last argument to handler\n const result = await options.handler(...args, {\n signal: abortController.signal,\n } as any);\n\n // TODO: it should be after onSuccess?\n setResult(result as Result);\n\n // Only update state if still mounted and not aborted\n if (!isMountedRef.current || abortController.signal.aborted) {\n return;\n }\n\n await alepha.events.emit(\"react:action:success\", {\n type: \"custom\",\n id: options.id,\n });\n\n if (options.onSuccess) {\n await options.onSuccess(result);\n }\n\n\n return result;\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n // Only update state if still mounted\n if (!isMountedRef.current) {\n return;\n }\n\n const error = err as Error;\n setError(error);\n\n await alepha.events.emit(\"react:action:error\", {\n type: \"custom\",\n id: options.id,\n error,\n });\n\n if (options.onError) {\n await options.onError(error);\n } else {\n // Re-throw if no custom error handler\n throw error;\n }\n } finally {\n isExecutingRef.current = false;\n setLoading(false);\n\n await alepha.events.emit(\"react:action:end\", {\n type: \"custom\",\n id: options.id,\n });\n\n // Clean up abort controller\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [...deps, options.id, options.onError, options.onSuccess],\n );\n\n const handler = useCallback(\n async (...args: Args): Promise<Result | undefined> => {\n if (options.debounce) {\n // clear existing timer\n if (debounceTimerRef.current) {\n dateTimeProvider.clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer\n return new Promise((resolve) => {\n debounceTimerRef.current = dateTimeProvider.createTimeout(\n async () => {\n const result = await executeAction(...args);\n resolve(result);\n },\n options.debounce ?? 0,\n );\n });\n }\n\n return executeAction(...args);\n },\n [executeAction, options.debounce],\n );\n\n const cancel = useCallback(() => {\n // clear debounce timer\n if (debounceTimerRef.current) {\n dateTimeProvider.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n\n // abort in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = undefined;\n }\n\n // reset state\n if (isMountedRef.current) {\n isExecutingRef.current = false;\n setLoading(false);\n }\n }, []);\n\n // Run action on mount if runOnInit is true\n useEffect(() => {\n if (options.runOnInit) {\n handler(...([] as any));\n }\n }, deps);\n\n // Run action periodically if runEvery is specified\n useEffect(() => {\n if (!options.runEvery) {\n return;\n }\n\n // Set up interval\n intervalRef.current = dateTimeProvider.createInterval(\n () => handler(...([] as any)),\n options.runEvery,\n true,\n );\n\n // cleanup on unmount or when runEvery changes\n return () => {\n if (intervalRef.current) {\n dateTimeProvider.clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n };\n }, [handler, options.runEvery]);\n\n return {\n run: handler,\n loading,\n error,\n cancel,\n result,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Context object passed as the last argument to action handlers.\n * Contains an AbortSignal that can be used to cancel the request.\n */\nexport interface ActionContext {\n /**\n * AbortSignal that can be passed to fetch or other async operations.\n * The signal will be aborted when:\n * - The component unmounts\n * - A new action is triggered (cancels previous)\n * - The cancel() method is called\n *\n * @example\n * ```tsx\n * const action = useAction({\n * handler: async (url, { signal }) => {\n * const response = await fetch(url, { signal });\n * return response.json();\n * }\n * }, []);\n * ```\n */\n signal: AbortSignal;\n}\n\nexport interface UseActionOptions<Args extends any[] = any[], Result = any> {\n /**\n * The async action handler function.\n * Receives the action arguments plus an ActionContext as the last parameter.\n */\n handler: (...args: [...Args, ActionContext]) => Async<Result>;\n\n /**\n * Custom error handler. If provided, prevents default error re-throw.\n */\n onError?: (error: Error) => void | Promise<void>;\n\n /**\n * Custom success handler.\n */\n onSuccess?: (result: Result) => void | Promise<void>;\n\n /**\n * Optional identifier for this action (useful for debugging/analytics)\n */\n id?: string;\n\n name?: string;\n\n /**\n * Debounce delay in milliseconds. If specified, the action will only execute\n * after the specified delay has passed since the last call. Useful for search inputs\n * or other high-frequency events.\n *\n * @example\n * ```tsx\n * // Execute search 300ms after user stops typing\n * const search = useAction({ handler: search, debounce: 300 }, [])\n * ```\n */\n debounce?: number;\n\n /**\n * If true, the action will be executed once when the component mounts.\n *\n * @example\n * ```tsx\n * const fetchData = useAction({\n * handler: async () => await api.getData(),\n * runOnInit: true\n * }, []);\n * ```\n */\n runOnInit?: boolean;\n\n /**\n * If specified, the action will be executed periodically at the given interval.\n * The interval is specified as a DurationLike value (number in ms, Duration object, or [number, unit] tuple).\n *\n * @example\n * ```tsx\n * // Run every 5 seconds\n * const poll = useAction({\n * handler: async () => await api.poll(),\n * runEvery: 5000\n * }, []);\n * ```\n *\n * @example\n * ```tsx\n * // Run every 1 minute\n * const poll = useAction({\n * handler: async () => await api.poll(),\n * runEvery: [1, 'minute']\n * }, []);\n * ```\n */\n runEvery?: DurationLike;\n}\n\nexport interface UseActionReturn<Args extends any[], Result> {\n /**\n * Execute the action with the provided arguments.\n *\n * @example\n * ```tsx\n * const action = useAction({ handler: async (data) => { ... } }, []);\n * action.run(data);\n * ```\n */\n run: (...args: Args) => Promise<Result | undefined>;\n\n /**\n * Loading state - true when action is executing.\n */\n loading: boolean;\n\n /**\n * Error state - contains error if action failed, undefined otherwise.\n */\n error?: Error;\n\n /**\n * Cancel any pending debounced action or abort the current in-flight request.\n *\n * @example\n * ```tsx\n * const action = useAction({ ... }, []);\n *\n * <button onClick={action.cancel} disabled={!action.loading}>\n * Cancel\n * </button>\n * ```\n */\n cancel: () => void;\n\n /**\n * The result data from the last successful action execution.\n */\n result?: Result;\n}\n","import type { Async, Hook, Hooks } from \"alepha\";\nimport { type DependencyList, useEffect } from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\n\n/**\n * Allow subscribing to multiple Alepha events. See {@link Hooks} for available events.\n *\n * useEvents is fully typed to ensure correct event callback signatures.\n *\n * @example\n * ```tsx\n * useEvents(\n * {\n * \"react:transition:begin\": (ev) => {\n * console.log(\"Transition began to:\", ev.to);\n * },\n * \"react:transition:error\": {\n * priority: \"first\",\n * callback: (ev) => {\n * console.error(\"Transition error:\", ev.error);\n * },\n * },\n * },\n * [],\n * );\n * ```\n */\nexport const useEvents = (opts: UseEvents, deps: DependencyList) => {\n const alepha = useAlepha();\n\n useEffect(() => {\n if (!alepha.isBrowser()) {\n return;\n }\n\n const subs: Function[] = [];\n for (const [name, hook] of Object.entries(opts)) {\n subs.push(alepha.events.on(name as any, hook as any));\n }\n\n return () => {\n for (const clear of subs) {\n clear();\n }\n };\n }, deps);\n};\n\ntype UseEvents = {\n [T in keyof Hooks]?: Hook<T> | ((payload: Hooks[T]) => Async<void>);\n};\n","import {\n type ClientScope,\n type HttpVirtualClient,\n LinkProvider,\n} from \"alepha/server/links\";\nimport { useInject } from \"./useInject.ts\";\n\n/**\n * Hook to get a virtual client for the specified scope.\n *\n * It's the React-hook version of `$client()`, from `AlephaServerLinks` module.\n */\nexport const useClient = <T extends object>(\n scope?: ClientScope,\n): HttpVirtualClient<T> => {\n return useInject(LinkProvider).client<T>(scope);\n};\n","import type { State, Static, TAtomObject } from \"alepha\";\nimport { Atom } from \"alepha\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useAlepha } from \"./useAlepha.ts\";\n\n/**\n * Hook to access and mutate the Alepha state.\n */\nfunction useStore<T extends TAtomObject>(\n target: Atom<T>,\n defaultValue?: Static<T>,\n): UseStoreReturn<Static<T>>;\nfunction useStore<Key extends keyof State>(\n target: Key,\n defaultValue?: State[Key],\n): UseStoreReturn<State[Key]>;\nfunction useStore(target: any, defaultValue?: any): any {\n const alepha = useAlepha();\n\n useMemo(() => {\n if (defaultValue != null && alepha.store.get(target) == null) {\n alepha.store.set(target, defaultValue);\n }\n }, [defaultValue]);\n\n const [state, setState] = useState(alepha.store.get(target));\n\n useEffect(() => {\n if (!alepha.isBrowser()) {\n return;\n }\n\n const key = target instanceof Atom ? target.key : target;\n\n return alepha.events.on(\"state:mutate\", (ev) => {\n if (ev.key === key) {\n setState(ev.value);\n }\n });\n }, []);\n\n return [\n state,\n (value: any) => {\n alepha.store.set(target, value);\n },\n ] as const;\n}\n\nexport type UseStoreReturn<T> = [T, (value: T) => void];\n\nexport { useStore };\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { default as ClientOnly } from \"./components/ClientOnly.tsx\";\nexport type * from \"./components/ClientOnly.tsx\";\nexport { default as ErrorBoundary } from \"./components/ErrorBoundary.tsx\";\nexport type * from \"./components/ErrorBoundary.tsx\";\nexport * from \"./contexts/AlephaProvider.tsx\";\nexport * from \"./contexts/AlephaContext.ts\";\nexport * from \"./hooks/useAction.ts\";\nexport * from \"./hooks/useAlepha.ts\";\nexport * from \"./hooks/useEvents.ts\";\nexport * from \"./hooks/useInject.ts\";\nexport * from \"./hooks/useClient.ts\";\nexport * from \"./hooks/useStore.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Fires when a user action is starting.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:begin\": {\n type: string;\n id?: string;\n };\n /**\n * Fires when a user action has succeeded.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:success\": {\n type: string;\n id?: string;\n };\n /**\n * Fires when a user action has failed.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:error\": {\n type: string;\n id?: string;\n error: Error;\n };\n /**\n * Fires when a user action has completed, regardless of success or failure.\n * Action can be a form submission, a route transition, or a custom action.\n */\n \"react:action:end\": {\n type: string;\n id?: string;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Provides full-stack React development with declarative routing, server-side rendering, and client-side hydration.\n *\n * The React module enables building modern React applications using the `$page` primitive on class properties.\n * It delivers seamless server-side rendering, automatic code splitting, and client-side navigation with full\n * type safety and schema validation for route parameters and data.\n *\n * @see {@link $page}\n * @module alepha.react\n */\nexport const AlephaReact = $module({\n name: \"alepha.react.core\",\n});\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ClientOnlyProps } from "@alepha/react";
2
- import * as alepha15 from "alepha";
2
+ import * as alepha4 from "alepha";
3
3
  import { Alepha, AlephaError, Async, KIND, Primitive, Static, TSchema } from "alepha";
4
4
  import { ServerRequest, ServerTimingProvider } from "alepha/server";
5
5
  import { FC, ReactNode } from "react";
@@ -37,8 +37,8 @@ declare class Redirection extends AlephaError {
37
37
  }
38
38
  //#endregion
39
39
  //#region ../../src/router/providers/ReactPageProvider.d.ts
40
- declare const envSchema$2: alepha15.TObject<{
41
- REACT_STRICT_MODE: alepha15.TBoolean;
40
+ declare const envSchema$2: alepha4.TObject<{
41
+ REACT_STRICT_MODE: alepha4.TBoolean;
42
42
  }>;
43
43
  declare module "alepha" {
44
44
  interface Env extends Partial<Static<typeof envSchema$2>> {}
@@ -405,8 +405,8 @@ declare module "alepha" {
405
405
  */
406
406
  //#endregion
407
407
  //#region ../../src/router/providers/ReactBrowserProvider.d.ts
408
- declare const envSchema$1: alepha15.TObject<{
409
- REACT_ROOT_ID: alepha15.TString;
408
+ declare const envSchema$1: alepha4.TObject<{
409
+ REACT_ROOT_ID: alepha4.TString;
410
410
  }>;
411
411
  declare module "alepha" {
412
412
  interface Env extends Partial<Static<typeof envSchema$1>> {}
@@ -414,8 +414,8 @@ declare module "alepha" {
414
414
  /**
415
415
  * React browser renderer configuration atom
416
416
  */
417
- declare const reactBrowserOptions: alepha15.Atom<alepha15.TObject<{
418
- scrollRestoration: alepha15.TUnsafe<"top" | "manual">;
417
+ declare const reactBrowserOptions: alepha4.Atom<alepha4.TObject<{
418
+ scrollRestoration: alepha4.TUnsafe<"top" | "manual">;
419
419
  }>, "alepha.react.browser.options">;
420
420
  type ReactBrowserRendererOptions = Static<typeof reactBrowserOptions.schema>;
421
421
  declare module "alepha" {
@@ -430,9 +430,9 @@ type ReactHydrationState = {
430
430
  };
431
431
  //#endregion
432
432
  //#region ../../src/router/providers/ReactServerProvider.d.ts
433
- declare const envSchema: alepha15.TObject<{
434
- REACT_SSR_ENABLED: alepha15.TOptional<alepha15.TBoolean>;
435
- REACT_ROOT_ID: alepha15.TString;
433
+ declare const envSchema: alepha4.TObject<{
434
+ REACT_SSR_ENABLED: alepha4.TOptional<alepha4.TBoolean>;
435
+ REACT_ROOT_ID: alepha4.TString;
436
436
  }>;
437
437
  declare module "alepha" {
438
438
  interface Env extends Partial<Static<typeof envSchema>> {}
@@ -444,11 +444,11 @@ declare module "alepha" {
444
444
  /**
445
445
  * React server provider configuration atom
446
446
  */
447
- declare const reactServerOptions: alepha15.Atom<alepha15.TObject<{
448
- publicDir: alepha15.TString;
449
- staticServer: alepha15.TObject<{
450
- disabled: alepha15.TBoolean;
451
- path: alepha15.TString;
447
+ declare const reactServerOptions: alepha4.Atom<alepha4.TObject<{
448
+ publicDir: alepha4.TString;
449
+ staticServer: alepha4.TObject<{
450
+ disabled: alepha4.TBoolean;
451
+ path: alepha4.TString;
452
452
  }>;
453
453
  }>, "alepha.react.server.options">;
454
454
  type ReactServerProviderOptions = Static<typeof reactServerOptions.schema>;
@@ -707,7 +707,7 @@ type UseHeadReturn = [Head, (head?: Head | ((previous?: Head) => Head)) => void]
707
707
  declare class ServerHeadProvider {
708
708
  protected readonly headProvider: HeadProvider;
709
709
  protected readonly serverTimingProvider: ServerTimingProvider;
710
- protected readonly onServerRenderEnd: alepha15.HookPrimitive<"react:server:render:end">;
710
+ protected readonly onServerRenderEnd: alepha4.HookPrimitive<"react:server:render:end">;
711
711
  renderHead(template: string, head: SimpleHead): string;
712
712
  protected mergeAttributes(existing: string, attrs: Record<string, string>): string;
713
713
  protected parseAttributes(attrStr: string): Record<string, string>;
@@ -738,7 +738,7 @@ declare module "@alepha/react/router" {
738
738
  * @see {@link ServerHeadProvider}
739
739
  * @module alepha.react.head
740
740
  */
741
- declare const AlephaReactHead: alepha15.Service<alepha15.Module>;
741
+ declare const AlephaReactHead: alepha4.Service<alepha4.Module>;
742
742
  //#endregion
743
743
  export { $head, AlephaReactHead, Head, HeadMeta, HeadPrimitive, HeadPrimitiveOptions, Seo, SeoExpander, ServerHeadProvider, SimpleHead, UseHeadOptions, UseHeadReturn, useHead };
744
744
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/router/errors/Redirection.ts","../../src/router/providers/ReactPageProvider.ts","../../src/router/services/ReactPageService.ts","../../src/router/primitives/$page.ts","../../src/core/index.ts","../../src/router/providers/ReactBrowserProvider.ts","../../src/router/providers/ReactServerProvider.ts","../../src/router/index.ts","../../src/head/interfaces/Head.ts","../../src/head/helpers/SeoExpander.ts","../../src/head/providers/HeadProvider.ts","../../src/head/primitives/$head.ts","../../src/head/hooks/useHead.ts","../../src/head/providers/ServerHeadProvider.ts","../../src/head/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/router/errors/Redirection.ts","../../src/router/providers/ReactPageProvider.ts","../../src/router/services/ReactPageService.ts","../../src/router/primitives/$page.ts","../../src/core/index.ts","../../src/router/providers/ReactBrowserProvider.ts","../../src/router/providers/ReactServerProvider.ts","../../src/router/index.ts","../../src/head/interfaces/Head.ts","../../src/head/helpers/SeoExpander.ts","../../src/head/providers/HeadProvider.ts","../../src/head/primitives/$head.ts","../../src/head/hooks/useHead.ts","../../src/head/providers/ServerHeadProvider.ts","../../src/head/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -428,7 +428,8 @@ const AlephaReactHead = $module({
428
428
  services: [
429
429
  AlephaReact,
430
430
  ServerHeadProvider,
431
- HeadProvider
431
+ HeadProvider,
432
+ SeoExpander
432
433
  ]
433
434
  });
434
435
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/head/helpers/SeoExpander.ts","../../src/head/providers/HeadProvider.ts","../../src/head/primitives/$head.ts","../../src/head/providers/ServerHeadProvider.ts","../../src/head/providers/BrowserHeadProvider.ts","../../src/head/hooks/useHead.ts","../../src/head/index.ts"],"sourcesContent":["import type { Head, HeadMeta } from \"../interfaces/Head.ts\";\n\n/**\n * Expands Head configuration into SEO meta tags.\n *\n * Generates:\n * - `<meta name=\"description\">` from head.description\n * - `<meta property=\"og:*\">` OpenGraph tags\n * - `<meta name=\"twitter:*\">` Twitter Card tags\n *\n * @example\n * ```ts\n * const helper = new SeoExpander();\n * const { meta, link } = helper.expand({\n * title: \"My App\",\n * description: \"Build amazing apps\",\n * image: \"https://example.com/og.png\",\n * url: \"https://example.com/\",\n * });\n * ```\n */\nexport class SeoExpander {\n public expand(head: Head): {\n meta: HeadMeta[];\n link: Array<{ rel: string; href: string }>;\n } {\n const meta: HeadMeta[] = [];\n const link: Array<{ rel: string; href: string }> = [];\n\n // Only expand SEO if there's meaningful content beyond just title\n const hasSeoContent =\n head.description ||\n head.image ||\n head.url ||\n head.siteName ||\n head.locale ||\n head.type ||\n head.og ||\n head.twitter;\n\n if (!hasSeoContent) {\n return { meta, link };\n }\n\n // Base description\n if (head.description) {\n meta.push({ name: \"description\", content: head.description });\n }\n\n // Canonical URL\n if (head.url) {\n link.push({ rel: \"canonical\", href: head.url });\n }\n\n // OpenGraph tags\n this.expandOpenGraph(head, meta);\n\n // Twitter Card tags\n this.expandTwitter(head, meta);\n\n return { meta, link };\n }\n\n protected expandOpenGraph(head: Head, meta: HeadMeta[]): void {\n const ogTitle = head.og?.title ?? head.title;\n const ogDescription = head.og?.description ?? head.description;\n const ogImage = head.og?.image ?? head.image;\n\n if (head.type || ogTitle) {\n meta.push({ property: \"og:type\", content: head.type ?? \"website\" });\n }\n if (head.url) {\n meta.push({ property: \"og:url\", content: head.url });\n }\n if (ogTitle) {\n meta.push({ property: \"og:title\", content: ogTitle });\n }\n if (ogDescription) {\n meta.push({ property: \"og:description\", content: ogDescription });\n }\n if (ogImage) {\n meta.push({ property: \"og:image\", content: ogImage });\n if (head.imageWidth) {\n meta.push({\n property: \"og:image:width\",\n content: String(head.imageWidth),\n });\n }\n if (head.imageHeight) {\n meta.push({\n property: \"og:image:height\",\n content: String(head.imageHeight),\n });\n }\n if (head.imageAlt) {\n meta.push({ property: \"og:image:alt\", content: head.imageAlt });\n }\n }\n if (head.siteName) {\n meta.push({ property: \"og:site_name\", content: head.siteName });\n }\n if (head.locale) {\n meta.push({ property: \"og:locale\", content: head.locale });\n }\n }\n\n protected expandTwitter(head: Head, meta: HeadMeta[]): void {\n const twitterTitle = head.twitter?.title ?? head.title;\n const twitterDescription = head.twitter?.description ?? head.description;\n const twitterImage = head.twitter?.image ?? head.image;\n\n if (head.twitter?.card || twitterTitle || twitterImage) {\n meta.push({\n name: \"twitter:card\",\n content:\n head.twitter?.card ?? (twitterImage ? \"summary_large_image\" : \"summary\"),\n });\n }\n if (head.url) {\n meta.push({ name: \"twitter:url\", content: head.url });\n }\n if (twitterTitle) {\n meta.push({ name: \"twitter:title\", content: twitterTitle });\n }\n if (twitterDescription) {\n meta.push({ name: \"twitter:description\", content: twitterDescription });\n }\n if (twitterImage) {\n meta.push({ name: \"twitter:image\", content: twitterImage });\n if (head.imageAlt) {\n meta.push({ name: \"twitter:image:alt\", content: head.imageAlt });\n }\n }\n if (head.twitter?.site) {\n meta.push({ name: \"twitter:site\", content: head.twitter.site });\n }\n if (head.twitter?.creator) {\n meta.push({ name: \"twitter:creator\", content: head.twitter.creator });\n }\n }\n}\n","import type { PageRoute, ReactRouterState } from \"@alepha/react/router\";\nimport { $inject } from \"alepha\";\nimport { SeoExpander } from \"../helpers/SeoExpander.ts\";\nimport type { Head } from \"../interfaces/Head.ts\";\n\nexport class HeadProvider {\n protected readonly seoExpander = $inject(SeoExpander);\n\n public global?: Array<Head | (() => Head)> = [];\n\n public fillHead(state: ReactRouterState) {\n state.head = {\n ...state.head,\n };\n\n for (const h of this.global ?? []) {\n const head = typeof h === \"function\" ? h() : h;\n this.mergeHead(state, head);\n }\n\n for (const layer of state.layers) {\n if (layer.route?.head && !layer.error) {\n this.fillHeadByPage(layer.route, state, layer.props ?? {});\n }\n }\n }\n\n protected mergeHead(state: ReactRouterState, head: Head): void {\n // Expand SEO fields into meta tags\n const { meta, link } = this.seoExpander.expand(head);\n state.head = {\n ...state.head,\n ...head,\n meta: [...(state.head.meta ?? []), ...meta, ...(head.meta ?? [])],\n link: [...(state.head.link ?? []), ...link, ...(head.link ?? [])],\n script: [...(state.head.script ?? []), ...(head.script ?? [])],\n };\n }\n\n protected fillHeadByPage(\n page: PageRoute,\n state: ReactRouterState,\n props: Record<string, any>,\n ): void {\n if (!page.head) {\n return;\n }\n\n state.head ??= {};\n\n const head =\n typeof page.head === \"function\"\n ? page.head(props, state.head)\n : page.head;\n\n // Expand SEO fields into meta tags\n const { meta, link } = this.seoExpander.expand(head);\n state.head.meta = [...(state.head.meta ?? []), ...meta];\n state.head.link = [...(state.head.link ?? []), ...link];\n\n if (head.title) {\n state.head ??= {};\n\n if (state.head.titleSeparator) {\n state.head.title = `${head.title}${state.head.titleSeparator}${state.head.title}`;\n } else {\n state.head.title = head.title;\n }\n\n state.head.titleSeparator = head.titleSeparator;\n }\n\n if (head.htmlAttributes) {\n state.head.htmlAttributes = {\n ...state.head.htmlAttributes,\n ...head.htmlAttributes,\n };\n }\n\n if (head.bodyAttributes) {\n state.head.bodyAttributes = {\n ...state.head.bodyAttributes,\n ...head.bodyAttributes,\n };\n }\n\n if (head.meta) {\n state.head.meta = [...(state.head.meta ?? []), ...(head.meta ?? [])];\n }\n\n if (head.link) {\n state.head.link = [...(state.head.link ?? []), ...(head.link ?? [])];\n }\n\n if (head.script) {\n state.head.script = [...(state.head.script ?? []), ...(head.script ?? [])];\n }\n }\n}\n","import { $inject, createPrimitive, Primitive, KIND } from \"alepha\";\nimport type { Head } from \"../interfaces/Head.ts\";\nimport { HeadProvider } from \"../providers/HeadProvider.ts\";\n\n/**\n * Set global `<head>` options for the application.\n */\nexport const $head = (options: HeadPrimitiveOptions) => {\n return createPrimitive(HeadPrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type HeadPrimitiveOptions = Head | (() => Head);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class HeadPrimitive extends Primitive<HeadPrimitiveOptions> {\n protected readonly provider = $inject(HeadProvider);\n protected onInit() {\n this.provider.global = [\n ...(this.provider.global ?? []),\n this.options,\n ];\n }\n}\n\n$head[KIND] = HeadPrimitive;\n","import { $hook, $inject } from \"alepha\";\nimport { ServerTimingProvider } from \"alepha/server\";\nimport type { HeadMeta, SimpleHead } from \"../interfaces/Head.ts\";\nimport { HeadProvider } from \"./HeadProvider.ts\";\n\nexport class ServerHeadProvider {\n protected readonly headProvider = $inject(HeadProvider);\n protected readonly serverTimingProvider = $inject(ServerTimingProvider);\n\n protected readonly onServerRenderEnd = $hook({\n on: \"react:server:render:end\",\n handler: async (ev) => {\n this.serverTimingProvider.beginTiming(\"renderHead\");\n this.headProvider.fillHead(ev.state);\n if (ev.state.head) {\n ev.html = this.renderHead(ev.html, ev.state.head);\n }\n this.serverTimingProvider.endTiming(\"renderHead\");\n },\n });\n\n public renderHead(template: string, head: SimpleHead): string {\n let result = template;\n\n // Inject htmlAttributes\n const htmlAttributes = head.htmlAttributes;\n if (htmlAttributes) {\n result = result.replace(\n /<html([^>]*)>/i,\n (_, existingAttrs) =>\n `<html${this.mergeAttributes(existingAttrs, htmlAttributes)}>`,\n );\n }\n\n // Inject bodyAttributes\n const bodyAttributes = head.bodyAttributes;\n if (bodyAttributes) {\n result = result.replace(\n /<body([^>]*)>/i,\n (_, existingAttrs) =>\n `<body${this.mergeAttributes(existingAttrs, bodyAttributes)}>`,\n );\n }\n\n // Build head content\n let headContent = \"\";\n const title = head.title;\n if (title) {\n if (template.includes(\"<title>\")) {\n result = result.replace(\n /<title>(.*?)<\\/title>/i,\n () => `<title>${this.escapeHtml(title)}</title>`,\n );\n } else {\n headContent += `<title>${this.escapeHtml(title)}</title>\\n`;\n }\n }\n\n if (head.meta) {\n for (const meta of head.meta) {\n headContent += this.renderMetaTag(meta);\n }\n }\n\n if (head.link) {\n for (const link of head.link) {\n headContent += `<link rel=\"${this.escapeHtml(link.rel)}\" href=\"${this.escapeHtml(link.href)}\">\\n`;\n }\n }\n\n if (head.script) {\n for (const script of head.script) {\n headContent += this.renderScriptTag(script);\n }\n }\n\n // Inject into <head>...</head>\n result = result.replace(\n /<head([^>]*)>(.*?)<\\/head>/is,\n (_, existingAttrs, existingHead) =>\n `<head${existingAttrs}>${existingHead}${headContent}</head>`,\n );\n\n return result.trim();\n }\n\n protected mergeAttributes(\n existing: string,\n attrs: Record<string, string>,\n ): string {\n const existingAttrs = this.parseAttributes(existing);\n const merged = { ...existingAttrs, ...attrs };\n return Object.entries(merged)\n .map(([k, v]) => ` ${k}=\"${this.escapeHtml(v)}\"`)\n .join(\"\");\n }\n\n protected parseAttributes(attrStr: string): Record<string, string> {\n attrStr = attrStr.replaceAll(\"'\", '\"');\n\n const attrs: Record<string, string> = {};\n const attrRegex = /([^\\s=]+)(?:=\"([^\"]*)\")?/g;\n let match: RegExpExecArray | null = attrRegex.exec(attrStr);\n\n while (match) {\n attrs[match[1]] = match[2] ?? \"\";\n match = attrRegex.exec(attrStr);\n }\n\n return attrs;\n }\n\n protected escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n }\n\n protected renderMetaTag(meta: HeadMeta): string {\n // OpenGraph tags use property attribute\n if (meta.property) {\n return `<meta property=\"${this.escapeHtml(meta.property)}\" content=\"${this.escapeHtml(meta.content)}\">\\n`;\n }\n // Standard meta tags use name attribute\n if (meta.name) {\n return `<meta name=\"${this.escapeHtml(meta.name)}\" content=\"${this.escapeHtml(meta.content)}\">\\n`;\n }\n return \"\";\n }\n\n protected renderScriptTag(script: Record<string, string | boolean>): string {\n const attrs = Object.entries(script)\n .filter(([, value]) => value !== false)\n .map(([key, value]) => {\n // Boolean attributes - render without value if true\n if (value === true) {\n return key;\n }\n return `${key}=\"${this.escapeHtml(String(value))}\"`;\n })\n .join(\" \");\n return `<script ${attrs}></script>\\n`;\n }\n}\n","import { $hook, $inject } from \"alepha\";\nimport type { Head, HeadMeta } from \"../interfaces/Head.ts\";\nimport { HeadProvider } from \"./HeadProvider.ts\";\n\nexport class BrowserHeadProvider {\n protected readonly headProvider = $inject(HeadProvider);\n\n protected get document(): Document {\n return window.document;\n }\n\n protected readonly onBrowserRender = $hook({\n on: \"react:browser:render\",\n handler: async ({ state }) => {\n this.headProvider.fillHead(state);\n if (state.head) {\n this.renderHead(this.document, state.head);\n }\n },\n });\n\n protected readonly onTransitionEnd = $hook({\n on: \"react:transition:end\",\n handler: async ({ state }) => {\n this.headProvider.fillHead(state);\n if (state.head) {\n this.renderHead(this.document, state.head);\n }\n },\n });\n\n public getHead(document: Document): Head {\n return {\n get title() {\n return document.title;\n },\n get htmlAttributes() {\n const attrs: Record<string, string> = {};\n for (const attr of document.documentElement.attributes) {\n attrs[attr.name] = attr.value;\n }\n return attrs;\n },\n get bodyAttributes() {\n const attrs: Record<string, string> = {};\n for (const attr of document.body.attributes) {\n attrs[attr.name] = attr.value;\n }\n return attrs;\n },\n get meta() {\n const metas: HeadMeta[] = [];\n // Get meta tags with name attribute\n for (const meta of document.head.querySelectorAll(\"meta[name]\")) {\n const name = meta.getAttribute(\"name\");\n const content = meta.getAttribute(\"content\");\n if (name && content) {\n metas.push({ name, content });\n }\n }\n // Get meta tags with property attribute (OpenGraph)\n for (const meta of document.head.querySelectorAll(\"meta[property]\")) {\n const property = meta.getAttribute(\"property\");\n const content = meta.getAttribute(\"content\");\n if (property && content) {\n metas.push({ property, content });\n }\n }\n return metas;\n },\n };\n }\n\n public renderHead(document: Document, head: Head): void {\n if (head.title) {\n document.title = head.title;\n }\n\n if (head.bodyAttributes) {\n for (const [key, value] of Object.entries(head.bodyAttributes)) {\n if (value) {\n document.body.setAttribute(key, value);\n } else {\n document.body.removeAttribute(key);\n }\n }\n }\n\n if (head.htmlAttributes) {\n for (const [key, value] of Object.entries(head.htmlAttributes)) {\n if (value) {\n document.documentElement.setAttribute(key, value);\n } else {\n document.documentElement.removeAttribute(key);\n }\n }\n }\n\n if (head.meta) {\n for (const it of head.meta) {\n this.renderMetaTag(document, it);\n }\n }\n\n if (head.link) {\n for (const it of head.link) {\n const { rel, href } = it;\n let link = document.querySelector(`link[rel=\"${rel}\"][href=\"${href}\"]`);\n if (!link) {\n link = document.createElement(\"link\");\n link.setAttribute(\"rel\", rel);\n link.setAttribute(\"href\", href);\n document.head.appendChild(link);\n }\n }\n }\n }\n\n protected renderMetaTag(document: Document, meta: HeadMeta): void {\n const { content } = meta;\n\n // Handle OpenGraph tags (property attribute)\n if (meta.property) {\n const existing = document.querySelector(\n `meta[property=\"${meta.property}\"]`,\n );\n if (existing) {\n existing.setAttribute(\"content\", content);\n } else {\n const newMeta = document.createElement(\"meta\");\n newMeta.setAttribute(\"property\", meta.property);\n newMeta.setAttribute(\"content\", content);\n document.head.appendChild(newMeta);\n }\n return;\n }\n\n // Handle standard meta tags (name attribute)\n if (meta.name) {\n const existing = document.querySelector(`meta[name=\"${meta.name}\"]`);\n if (existing) {\n existing.setAttribute(\"content\", content);\n } else {\n const newMeta = document.createElement(\"meta\");\n newMeta.setAttribute(\"name\", meta.name);\n newMeta.setAttribute(\"content\", content);\n document.head.appendChild(newMeta);\n }\n }\n }\n}\n","import { useInject } from \"@alepha/react\";\nimport { Alepha } from \"alepha\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport type { Head } from \"../interfaces/Head.ts\";\nimport { BrowserHeadProvider } from \"../providers/BrowserHeadProvider.ts\";\n\n/**\n * ```tsx\n * const App = () => {\n * const [head, setHead] = useHead({\n * // will set the document title on the first render\n * title: \"My App\",\n * });\n *\n * return (\n * // This will update the document title when the button is clicked\n * <button onClick={() => setHead({ title: \"Change Title\" })}>\n * Change Title {head.title}\n * </button>\n * );\n * }\n * ```\n */\nexport const useHead = (options?: UseHeadOptions): UseHeadReturn => {\n const alepha = useInject(Alepha);\n\n const current = useMemo(() => {\n if (!alepha.isBrowser()) {\n return {};\n }\n\n return alepha.inject(BrowserHeadProvider).getHead(window.document);\n }, []);\n\n const setHead = useCallback((head?: Head | ((previous?: Head) => Head)) => {\n if (!alepha.isBrowser()) {\n return;\n }\n\n alepha\n .inject(BrowserHeadProvider)\n .renderHead(\n window.document,\n typeof head === \"function\" ? head(current) : head || {},\n );\n }, []);\n\n useEffect(() => {\n if (options) {\n setHead(options);\n }\n }, []);\n\n return [current, setHead];\n};\n\nexport type UseHeadOptions = Head | ((previous?: Head) => Head);\n\nexport type UseHeadReturn = [\n Head,\n (head?: Head | ((previous?: Head) => Head)) => void,\n];\n","import { AlephaReact } from \"@alepha/react\";\nimport type {\n PageConfigSchema,\n TPropsDefault,\n TPropsParentDefault,\n} from \"@alepha/react/router\";\nimport { $module } from \"alepha\";\nimport { $head } from \"./primitives/$head.ts\";\nimport type { Head } from \"./interfaces/Head.ts\";\nimport { ServerHeadProvider } from \"./providers/ServerHeadProvider.ts\";\nimport { HeadProvider } from \"./providers/HeadProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$head.ts\";\nexport * from \"./hooks/useHead.ts\";\nexport * from \"./interfaces/Head.ts\";\nexport * from \"./helpers/SeoExpander.ts\";\nexport * from \"./providers/ServerHeadProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Augment PagePrimitiveOptions in router module\ndeclare module \"@alepha/react/router\" {\n interface PagePrimitiveOptions<\n TConfig extends PageConfigSchema = PageConfigSchema,\n TProps extends object = TPropsDefault,\n TPropsParent extends object = TPropsParentDefault,\n > {\n head?: Head | ((props: TProps, previous?: Head) => Head);\n }\n}\n\n// Augment ReactRouterState in router module\ndeclare module \"@alepha/react/router\" {\n interface ReactRouterState {\n head: Head;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Fill `<head>` server & client side.\n *\n * Generate SEO-friendly meta tags and titles for your React application using AlephaReactHead module.\n *\n * This module provides services and primitives to manage the document head both on the server and client side,\n * ensuring that your application is optimized for search engines and social media sharing.\n *\n * @see {@link ServerHeadProvider}\n * @module alepha.react.head\n */\nexport const AlephaReactHead = $module({\n name: \"alepha.react.head\",\n primitives: [$head],\n services: [AlephaReact, ServerHeadProvider, HeadProvider],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/head/helpers/SeoExpander.ts","../../src/head/providers/HeadProvider.ts","../../src/head/primitives/$head.ts","../../src/head/providers/ServerHeadProvider.ts","../../src/head/providers/BrowserHeadProvider.ts","../../src/head/hooks/useHead.ts","../../src/head/index.ts"],"sourcesContent":["import type { Head, HeadMeta } from \"../interfaces/Head.ts\";\n\n/**\n * Expands Head configuration into SEO meta tags.\n *\n * Generates:\n * - `<meta name=\"description\">` from head.description\n * - `<meta property=\"og:*\">` OpenGraph tags\n * - `<meta name=\"twitter:*\">` Twitter Card tags\n *\n * @example\n * ```ts\n * const helper = new SeoExpander();\n * const { meta, link } = helper.expand({\n * title: \"My App\",\n * description: \"Build amazing apps\",\n * image: \"https://example.com/og.png\",\n * url: \"https://example.com/\",\n * });\n * ```\n */\nexport class SeoExpander {\n public expand(head: Head): {\n meta: HeadMeta[];\n link: Array<{ rel: string; href: string }>;\n } {\n const meta: HeadMeta[] = [];\n const link: Array<{ rel: string; href: string }> = [];\n\n // Only expand SEO if there's meaningful content beyond just title\n const hasSeoContent =\n head.description ||\n head.image ||\n head.url ||\n head.siteName ||\n head.locale ||\n head.type ||\n head.og ||\n head.twitter;\n\n if (!hasSeoContent) {\n return { meta, link };\n }\n\n // Base description\n if (head.description) {\n meta.push({ name: \"description\", content: head.description });\n }\n\n // Canonical URL\n if (head.url) {\n link.push({ rel: \"canonical\", href: head.url });\n }\n\n // OpenGraph tags\n this.expandOpenGraph(head, meta);\n\n // Twitter Card tags\n this.expandTwitter(head, meta);\n\n return { meta, link };\n }\n\n protected expandOpenGraph(head: Head, meta: HeadMeta[]): void {\n const ogTitle = head.og?.title ?? head.title;\n const ogDescription = head.og?.description ?? head.description;\n const ogImage = head.og?.image ?? head.image;\n\n if (head.type || ogTitle) {\n meta.push({ property: \"og:type\", content: head.type ?? \"website\" });\n }\n if (head.url) {\n meta.push({ property: \"og:url\", content: head.url });\n }\n if (ogTitle) {\n meta.push({ property: \"og:title\", content: ogTitle });\n }\n if (ogDescription) {\n meta.push({ property: \"og:description\", content: ogDescription });\n }\n if (ogImage) {\n meta.push({ property: \"og:image\", content: ogImage });\n if (head.imageWidth) {\n meta.push({\n property: \"og:image:width\",\n content: String(head.imageWidth),\n });\n }\n if (head.imageHeight) {\n meta.push({\n property: \"og:image:height\",\n content: String(head.imageHeight),\n });\n }\n if (head.imageAlt) {\n meta.push({ property: \"og:image:alt\", content: head.imageAlt });\n }\n }\n if (head.siteName) {\n meta.push({ property: \"og:site_name\", content: head.siteName });\n }\n if (head.locale) {\n meta.push({ property: \"og:locale\", content: head.locale });\n }\n }\n\n protected expandTwitter(head: Head, meta: HeadMeta[]): void {\n const twitterTitle = head.twitter?.title ?? head.title;\n const twitterDescription = head.twitter?.description ?? head.description;\n const twitterImage = head.twitter?.image ?? head.image;\n\n if (head.twitter?.card || twitterTitle || twitterImage) {\n meta.push({\n name: \"twitter:card\",\n content:\n head.twitter?.card ?? (twitterImage ? \"summary_large_image\" : \"summary\"),\n });\n }\n if (head.url) {\n meta.push({ name: \"twitter:url\", content: head.url });\n }\n if (twitterTitle) {\n meta.push({ name: \"twitter:title\", content: twitterTitle });\n }\n if (twitterDescription) {\n meta.push({ name: \"twitter:description\", content: twitterDescription });\n }\n if (twitterImage) {\n meta.push({ name: \"twitter:image\", content: twitterImage });\n if (head.imageAlt) {\n meta.push({ name: \"twitter:image:alt\", content: head.imageAlt });\n }\n }\n if (head.twitter?.site) {\n meta.push({ name: \"twitter:site\", content: head.twitter.site });\n }\n if (head.twitter?.creator) {\n meta.push({ name: \"twitter:creator\", content: head.twitter.creator });\n }\n }\n}\n","import type { PageRoute, ReactRouterState } from \"@alepha/react/router\";\nimport { $inject } from \"alepha\";\nimport { SeoExpander } from \"../helpers/SeoExpander.ts\";\nimport type { Head } from \"../interfaces/Head.ts\";\n\nexport class HeadProvider {\n protected readonly seoExpander = $inject(SeoExpander);\n\n public global?: Array<Head | (() => Head)> = [];\n\n public fillHead(state: ReactRouterState) {\n state.head = {\n ...state.head,\n };\n\n for (const h of this.global ?? []) {\n const head = typeof h === \"function\" ? h() : h;\n this.mergeHead(state, head);\n }\n\n for (const layer of state.layers) {\n if (layer.route?.head && !layer.error) {\n this.fillHeadByPage(layer.route, state, layer.props ?? {});\n }\n }\n }\n\n protected mergeHead(state: ReactRouterState, head: Head): void {\n // Expand SEO fields into meta tags\n const { meta, link } = this.seoExpander.expand(head);\n state.head = {\n ...state.head,\n ...head,\n meta: [...(state.head.meta ?? []), ...meta, ...(head.meta ?? [])],\n link: [...(state.head.link ?? []), ...link, ...(head.link ?? [])],\n script: [...(state.head.script ?? []), ...(head.script ?? [])],\n };\n }\n\n protected fillHeadByPage(\n page: PageRoute,\n state: ReactRouterState,\n props: Record<string, any>,\n ): void {\n if (!page.head) {\n return;\n }\n\n state.head ??= {};\n\n const head =\n typeof page.head === \"function\"\n ? page.head(props, state.head)\n : page.head;\n\n // Expand SEO fields into meta tags\n const { meta, link } = this.seoExpander.expand(head);\n state.head.meta = [...(state.head.meta ?? []), ...meta];\n state.head.link = [...(state.head.link ?? []), ...link];\n\n if (head.title) {\n state.head ??= {};\n\n if (state.head.titleSeparator) {\n state.head.title = `${head.title}${state.head.titleSeparator}${state.head.title}`;\n } else {\n state.head.title = head.title;\n }\n\n state.head.titleSeparator = head.titleSeparator;\n }\n\n if (head.htmlAttributes) {\n state.head.htmlAttributes = {\n ...state.head.htmlAttributes,\n ...head.htmlAttributes,\n };\n }\n\n if (head.bodyAttributes) {\n state.head.bodyAttributes = {\n ...state.head.bodyAttributes,\n ...head.bodyAttributes,\n };\n }\n\n if (head.meta) {\n state.head.meta = [...(state.head.meta ?? []), ...(head.meta ?? [])];\n }\n\n if (head.link) {\n state.head.link = [...(state.head.link ?? []), ...(head.link ?? [])];\n }\n\n if (head.script) {\n state.head.script = [...(state.head.script ?? []), ...(head.script ?? [])];\n }\n }\n}\n","import { $inject, createPrimitive, Primitive, KIND } from \"alepha\";\nimport type { Head } from \"../interfaces/Head.ts\";\nimport { HeadProvider } from \"../providers/HeadProvider.ts\";\n\n/**\n * Set global `<head>` options for the application.\n */\nexport const $head = (options: HeadPrimitiveOptions) => {\n return createPrimitive(HeadPrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type HeadPrimitiveOptions = Head | (() => Head);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class HeadPrimitive extends Primitive<HeadPrimitiveOptions> {\n protected readonly provider = $inject(HeadProvider);\n protected onInit() {\n this.provider.global = [\n ...(this.provider.global ?? []),\n this.options,\n ];\n }\n}\n\n$head[KIND] = HeadPrimitive;\n","import { $hook, $inject } from \"alepha\";\nimport { ServerTimingProvider } from \"alepha/server\";\nimport type { HeadMeta, SimpleHead } from \"../interfaces/Head.ts\";\nimport { HeadProvider } from \"./HeadProvider.ts\";\n\nexport class ServerHeadProvider {\n protected readonly headProvider = $inject(HeadProvider);\n protected readonly serverTimingProvider = $inject(ServerTimingProvider);\n\n protected readonly onServerRenderEnd = $hook({\n on: \"react:server:render:end\",\n handler: async (ev) => {\n this.serverTimingProvider.beginTiming(\"renderHead\");\n this.headProvider.fillHead(ev.state);\n if (ev.state.head) {\n ev.html = this.renderHead(ev.html, ev.state.head);\n }\n this.serverTimingProvider.endTiming(\"renderHead\");\n },\n });\n\n public renderHead(template: string, head: SimpleHead): string {\n let result = template;\n\n // Inject htmlAttributes\n const htmlAttributes = head.htmlAttributes;\n if (htmlAttributes) {\n result = result.replace(\n /<html([^>]*)>/i,\n (_, existingAttrs) =>\n `<html${this.mergeAttributes(existingAttrs, htmlAttributes)}>`,\n );\n }\n\n // Inject bodyAttributes\n const bodyAttributes = head.bodyAttributes;\n if (bodyAttributes) {\n result = result.replace(\n /<body([^>]*)>/i,\n (_, existingAttrs) =>\n `<body${this.mergeAttributes(existingAttrs, bodyAttributes)}>`,\n );\n }\n\n // Build head content\n let headContent = \"\";\n const title = head.title;\n if (title) {\n if (template.includes(\"<title>\")) {\n result = result.replace(\n /<title>(.*?)<\\/title>/i,\n () => `<title>${this.escapeHtml(title)}</title>`,\n );\n } else {\n headContent += `<title>${this.escapeHtml(title)}</title>\\n`;\n }\n }\n\n if (head.meta) {\n for (const meta of head.meta) {\n headContent += this.renderMetaTag(meta);\n }\n }\n\n if (head.link) {\n for (const link of head.link) {\n headContent += `<link rel=\"${this.escapeHtml(link.rel)}\" href=\"${this.escapeHtml(link.href)}\">\\n`;\n }\n }\n\n if (head.script) {\n for (const script of head.script) {\n headContent += this.renderScriptTag(script);\n }\n }\n\n // Inject into <head>...</head>\n result = result.replace(\n /<head([^>]*)>(.*?)<\\/head>/is,\n (_, existingAttrs, existingHead) =>\n `<head${existingAttrs}>${existingHead}${headContent}</head>`,\n );\n\n return result.trim();\n }\n\n protected mergeAttributes(\n existing: string,\n attrs: Record<string, string>,\n ): string {\n const existingAttrs = this.parseAttributes(existing);\n const merged = { ...existingAttrs, ...attrs };\n return Object.entries(merged)\n .map(([k, v]) => ` ${k}=\"${this.escapeHtml(v)}\"`)\n .join(\"\");\n }\n\n protected parseAttributes(attrStr: string): Record<string, string> {\n attrStr = attrStr.replaceAll(\"'\", '\"');\n\n const attrs: Record<string, string> = {};\n const attrRegex = /([^\\s=]+)(?:=\"([^\"]*)\")?/g;\n let match: RegExpExecArray | null = attrRegex.exec(attrStr);\n\n while (match) {\n attrs[match[1]] = match[2] ?? \"\";\n match = attrRegex.exec(attrStr);\n }\n\n return attrs;\n }\n\n protected escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n }\n\n protected renderMetaTag(meta: HeadMeta): string {\n // OpenGraph tags use property attribute\n if (meta.property) {\n return `<meta property=\"${this.escapeHtml(meta.property)}\" content=\"${this.escapeHtml(meta.content)}\">\\n`;\n }\n // Standard meta tags use name attribute\n if (meta.name) {\n return `<meta name=\"${this.escapeHtml(meta.name)}\" content=\"${this.escapeHtml(meta.content)}\">\\n`;\n }\n return \"\";\n }\n\n protected renderScriptTag(script: Record<string, string | boolean>): string {\n const attrs = Object.entries(script)\n .filter(([, value]) => value !== false)\n .map(([key, value]) => {\n // Boolean attributes - render without value if true\n if (value === true) {\n return key;\n }\n return `${key}=\"${this.escapeHtml(String(value))}\"`;\n })\n .join(\" \");\n return `<script ${attrs}></script>\\n`;\n }\n}\n","import { $hook, $inject } from \"alepha\";\nimport type { Head, HeadMeta } from \"../interfaces/Head.ts\";\nimport { HeadProvider } from \"./HeadProvider.ts\";\n\nexport class BrowserHeadProvider {\n protected readonly headProvider = $inject(HeadProvider);\n\n protected get document(): Document {\n return window.document;\n }\n\n protected readonly onBrowserRender = $hook({\n on: \"react:browser:render\",\n handler: async ({ state }) => {\n this.headProvider.fillHead(state);\n if (state.head) {\n this.renderHead(this.document, state.head);\n }\n },\n });\n\n protected readonly onTransitionEnd = $hook({\n on: \"react:transition:end\",\n handler: async ({ state }) => {\n this.headProvider.fillHead(state);\n if (state.head) {\n this.renderHead(this.document, state.head);\n }\n },\n });\n\n public getHead(document: Document): Head {\n return {\n get title() {\n return document.title;\n },\n get htmlAttributes() {\n const attrs: Record<string, string> = {};\n for (const attr of document.documentElement.attributes) {\n attrs[attr.name] = attr.value;\n }\n return attrs;\n },\n get bodyAttributes() {\n const attrs: Record<string, string> = {};\n for (const attr of document.body.attributes) {\n attrs[attr.name] = attr.value;\n }\n return attrs;\n },\n get meta() {\n const metas: HeadMeta[] = [];\n // Get meta tags with name attribute\n for (const meta of document.head.querySelectorAll(\"meta[name]\")) {\n const name = meta.getAttribute(\"name\");\n const content = meta.getAttribute(\"content\");\n if (name && content) {\n metas.push({ name, content });\n }\n }\n // Get meta tags with property attribute (OpenGraph)\n for (const meta of document.head.querySelectorAll(\"meta[property]\")) {\n const property = meta.getAttribute(\"property\");\n const content = meta.getAttribute(\"content\");\n if (property && content) {\n metas.push({ property, content });\n }\n }\n return metas;\n },\n };\n }\n\n public renderHead(document: Document, head: Head): void {\n if (head.title) {\n document.title = head.title;\n }\n\n if (head.bodyAttributes) {\n for (const [key, value] of Object.entries(head.bodyAttributes)) {\n if (value) {\n document.body.setAttribute(key, value);\n } else {\n document.body.removeAttribute(key);\n }\n }\n }\n\n if (head.htmlAttributes) {\n for (const [key, value] of Object.entries(head.htmlAttributes)) {\n if (value) {\n document.documentElement.setAttribute(key, value);\n } else {\n document.documentElement.removeAttribute(key);\n }\n }\n }\n\n if (head.meta) {\n for (const it of head.meta) {\n this.renderMetaTag(document, it);\n }\n }\n\n if (head.link) {\n for (const it of head.link) {\n const { rel, href } = it;\n let link = document.querySelector(`link[rel=\"${rel}\"][href=\"${href}\"]`);\n if (!link) {\n link = document.createElement(\"link\");\n link.setAttribute(\"rel\", rel);\n link.setAttribute(\"href\", href);\n document.head.appendChild(link);\n }\n }\n }\n }\n\n protected renderMetaTag(document: Document, meta: HeadMeta): void {\n const { content } = meta;\n\n // Handle OpenGraph tags (property attribute)\n if (meta.property) {\n const existing = document.querySelector(\n `meta[property=\"${meta.property}\"]`,\n );\n if (existing) {\n existing.setAttribute(\"content\", content);\n } else {\n const newMeta = document.createElement(\"meta\");\n newMeta.setAttribute(\"property\", meta.property);\n newMeta.setAttribute(\"content\", content);\n document.head.appendChild(newMeta);\n }\n return;\n }\n\n // Handle standard meta tags (name attribute)\n if (meta.name) {\n const existing = document.querySelector(`meta[name=\"${meta.name}\"]`);\n if (existing) {\n existing.setAttribute(\"content\", content);\n } else {\n const newMeta = document.createElement(\"meta\");\n newMeta.setAttribute(\"name\", meta.name);\n newMeta.setAttribute(\"content\", content);\n document.head.appendChild(newMeta);\n }\n }\n }\n}\n","import { useInject } from \"@alepha/react\";\nimport { Alepha } from \"alepha\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport type { Head } from \"../interfaces/Head.ts\";\nimport { BrowserHeadProvider } from \"../providers/BrowserHeadProvider.ts\";\n\n/**\n * ```tsx\n * const App = () => {\n * const [head, setHead] = useHead({\n * // will set the document title on the first render\n * title: \"My App\",\n * });\n *\n * return (\n * // This will update the document title when the button is clicked\n * <button onClick={() => setHead({ title: \"Change Title\" })}>\n * Change Title {head.title}\n * </button>\n * );\n * }\n * ```\n */\nexport const useHead = (options?: UseHeadOptions): UseHeadReturn => {\n const alepha = useInject(Alepha);\n\n const current = useMemo(() => {\n if (!alepha.isBrowser()) {\n return {};\n }\n\n return alepha.inject(BrowserHeadProvider).getHead(window.document);\n }, []);\n\n const setHead = useCallback((head?: Head | ((previous?: Head) => Head)) => {\n if (!alepha.isBrowser()) {\n return;\n }\n\n alepha\n .inject(BrowserHeadProvider)\n .renderHead(\n window.document,\n typeof head === \"function\" ? head(current) : head || {},\n );\n }, []);\n\n useEffect(() => {\n if (options) {\n setHead(options);\n }\n }, []);\n\n return [current, setHead];\n};\n\nexport type UseHeadOptions = Head | ((previous?: Head) => Head);\n\nexport type UseHeadReturn = [\n Head,\n (head?: Head | ((previous?: Head) => Head)) => void,\n];\n","import { AlephaReact } from \"@alepha/react\";\nimport type {\n PageConfigSchema,\n TPropsDefault,\n TPropsParentDefault,\n} from \"@alepha/react/router\";\nimport { $module } from \"alepha\";\nimport { $head } from \"./primitives/$head.ts\";\nimport type { Head } from \"./interfaces/Head.ts\";\nimport { ServerHeadProvider } from \"./providers/ServerHeadProvider.ts\";\nimport { HeadProvider } from \"./providers/HeadProvider.ts\";\nimport { SeoExpander } from \"./helpers/SeoExpander.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$head.ts\";\nexport * from \"./hooks/useHead.ts\";\nexport * from \"./interfaces/Head.ts\";\nexport * from \"./helpers/SeoExpander.ts\";\nexport * from \"./providers/ServerHeadProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Augment PagePrimitiveOptions in router module\ndeclare module \"@alepha/react/router\" {\n interface PagePrimitiveOptions<\n TConfig extends PageConfigSchema = PageConfigSchema,\n TProps extends object = TPropsDefault,\n TPropsParent extends object = TPropsParentDefault,\n > {\n head?: Head | ((props: TProps, previous?: Head) => Head);\n }\n}\n\n// Augment ReactRouterState in router module\ndeclare module \"@alepha/react/router\" {\n interface ReactRouterState {\n head: Head;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Fill `<head>` server & client side.\n *\n * Generate SEO-friendly meta tags and titles for your React application using AlephaReactHead module.\n *\n * This module provides services and primitives to manage the document head both on the server and client side,\n * ensuring that your application is optimized for search engines and social media sharing.\n *\n * @see {@link ServerHeadProvider}\n * @module alepha.react.head\n */\nexport const AlephaReactHead = $module({\n name: \"alepha.react.head\",\n primitives: [$head],\n services: [AlephaReact, ServerHeadProvider, HeadProvider, SeoExpander],\n});\n"],"mappings":"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"}