@farm.js/core 0.1.0-beta.54 → 0.1.0-beta.56

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 (67) hide show
  1. package/dist/{chunk-427JQ6OZ.mjs → chunk-5T2XATMK.mjs} +58 -11
  2. package/dist/chunk-5T2XATMK.mjs.map +1 -0
  3. package/dist/{chunk-J34JCW6R.mjs → chunk-FOEPWRHM.mjs} +2 -2
  4. package/dist/{chunk-BDHDDITP.mjs → chunk-FPLRESQA.mjs} +30 -18
  5. package/dist/chunk-FPLRESQA.mjs.map +1 -0
  6. package/dist/{chunk-JECGLPIS.mjs → chunk-PYIVNTDI.mjs} +4 -4
  7. package/dist/{chunk-GPHLXAFT.mjs → chunk-UH5R4J5M.mjs} +2 -2
  8. package/dist/{chunk-ENPB4CSY.mjs → chunk-XLQVJDK2.mjs} +2 -2
  9. package/dist/{chunk-ENPB4CSY.mjs.map → chunk-XLQVJDK2.mjs.map} +1 -1
  10. package/dist/{chunk-GVQ54ERX.mjs → chunk-YPKCFGA7.mjs} +9 -3
  11. package/dist/chunk-YPKCFGA7.mjs.map +1 -0
  12. package/dist/{chunk-PGZVE6P7.mjs → chunk-ZOQLQAUG.mjs} +2 -2
  13. package/dist/client/lifecycle.mjs +2 -2
  14. package/dist/client-plugins.cjs +1 -1
  15. package/dist/client-plugins.cjs.map +1 -1
  16. package/dist/client-plugins.mjs +2 -2
  17. package/dist/client.cjs +76 -23
  18. package/dist/client.cjs.map +1 -1
  19. package/dist/client.d.mts +2 -5
  20. package/dist/client.d.ts +2 -5
  21. package/dist/client.mjs +11 -11
  22. package/dist/index.cjs +85 -24
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.mts +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.mjs +17 -17
  27. package/dist/internal/build-runtime.cjs +8 -2
  28. package/dist/internal/build-runtime.cjs.map +1 -1
  29. package/dist/internal/build-runtime.mjs +3 -3
  30. package/dist/internal/client-runtime.cjs +1 -1
  31. package/dist/internal/client-runtime.cjs.map +1 -1
  32. package/dist/internal/client-runtime.mjs +2 -2
  33. package/dist/navigation.cjs +74 -20
  34. package/dist/navigation.cjs.map +1 -1
  35. package/dist/navigation.mjs +4 -4
  36. package/dist/plugin.cjs +1 -1
  37. package/dist/plugin.cjs.map +1 -1
  38. package/dist/plugin.mjs +2 -2
  39. package/dist/query/client.cjs +105 -11
  40. package/dist/query/client.cjs.map +1 -1
  41. package/dist/query/client.mjs +18 -11
  42. package/dist/query/client.mjs.map +1 -1
  43. package/dist/renderer-client.cjs +56 -12
  44. package/dist/renderer-client.cjs.map +1 -1
  45. package/dist/renderer-client.d.mts +1 -1
  46. package/dist/renderer-client.d.ts +1 -1
  47. package/dist/renderer-client.mjs +12 -11
  48. package/dist/renderer-client.mjs.map +1 -1
  49. package/dist/server.cjs +1 -1
  50. package/dist/server.cjs.map +1 -1
  51. package/dist/server.mjs +2 -2
  52. package/dist/{spa-router-BD7iUG-C.d.mts → spa-router-BV71GGW0.d.mts} +4 -3
  53. package/dist/{spa-router-swFKTqwR.d.ts → spa-router-BylM6JXm.d.ts} +4 -3
  54. package/dist/version.cjs +1 -1
  55. package/dist/version.cjs.map +1 -1
  56. package/dist/version.mjs +1 -1
  57. package/dist/vite.cjs +1 -1
  58. package/dist/vite.cjs.map +1 -1
  59. package/dist/vite.mjs +2 -2
  60. package/package.json +1 -1
  61. package/dist/chunk-427JQ6OZ.mjs.map +0 -1
  62. package/dist/chunk-BDHDDITP.mjs.map +0 -1
  63. package/dist/chunk-GVQ54ERX.mjs.map +0 -1
  64. /package/dist/{chunk-J34JCW6R.mjs.map → chunk-FOEPWRHM.mjs.map} +0 -0
  65. /package/dist/{chunk-JECGLPIS.mjs.map → chunk-PYIVNTDI.mjs.map} +0 -0
  66. /package/dist/{chunk-GPHLXAFT.mjs.map → chunk-UH5R4J5M.mjs.map} +0 -0
  67. /package/dist/{chunk-PGZVE6P7.mjs.map → chunk-ZOQLQAUG.mjs.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { FarmRouterRouteInput } from './router.mjs';
2
- import { F as FarmNavigationState, a as FarmNavigateOptions } from './spa-router-BD7iUG-C.mjs';
2
+ import { F as FarmNavigationState, a as FarmNavigateOptions } from './spa-router-BV71GGW0.mjs';
3
3
  import { F as FarmClientCacheStatus } from './client-cache-CopR_MaI.mjs';
4
4
  import { ServerFn } from './server-fn.mjs';
5
5
  import { ServerQuery } from './server-query.mjs';
@@ -1,5 +1,5 @@
1
1
  import { FarmRouterRouteInput } from './router.js';
2
- import { F as FarmNavigationState, a as FarmNavigateOptions } from './spa-router-swFKTqwR.js';
2
+ import { F as FarmNavigationState, a as FarmNavigateOptions } from './spa-router-BylM6JXm.js';
3
3
  import { F as FarmClientCacheStatus } from './client-cache-Djy_TlE8.js';
4
4
  import { ServerFn } from './server-fn.js';
5
5
  import { ServerQuery } from './server-query.js';
@@ -3,15 +3,6 @@ import {
3
3
  createServerQueryCallKey,
4
4
  fetchServerQuery
5
5
  } from "./chunk-3E2WRUR2.mjs";
6
- import {
7
- getRouter,
8
- readPageState
9
- } from "./chunk-427JQ6OZ.mjs";
10
- import {
11
- createFarmClientTranslator,
12
- getFarmI18nClientState,
13
- subscribeFarmI18n
14
- } from "./chunk-ITN462YM.mjs";
15
6
  import {
16
7
  getTheme,
17
8
  setTheme,
@@ -21,6 +12,16 @@ import {
21
12
  import {
22
13
  createFarmRouter
23
14
  } from "./chunk-ZBE6MLHL.mjs";
15
+ import {
16
+ getRouter,
17
+ readPageState,
18
+ subscribeHistoryChange
19
+ } from "./chunk-5T2XATMK.mjs";
20
+ import {
21
+ createFarmClientTranslator,
22
+ getFarmI18nClientState,
23
+ subscribeFarmI18n
24
+ } from "./chunk-ITN462YM.mjs";
24
25
  import {
25
26
  getFarmClientDataCache
26
27
  } from "./chunk-C4XSKA7P.mjs";
@@ -62,11 +63,11 @@ function createRendererRouter(options = {}) {
62
63
  listener();
63
64
  }, "notify");
64
65
  const unsubscribeNavigation = router.subscribeNavigation(notify);
65
- window.addEventListener("popstate", notify);
66
+ const unsubscribeHistory = subscribeHistoryChange(notify);
66
67
  read();
67
68
  return () => {
68
69
  unsubscribeNavigation();
69
- window.removeEventListener("popstate", notify);
70
+ unsubscribeHistory();
70
71
  };
71
72
  },
72
73
  push(href, navigateOptions) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/renderer-client.ts"],"sourcesContent":["\"use client\";\n\nimport { createFarmRouter, type FarmRouter, type FarmRouterRouteInput } from \"./router\";\nimport {\n getRouter as getSPARouter,\n readPageState,\n type FarmNavigationState,\n type FarmNavigateOptions,\n} from \"./client/spa-router\";\nimport { getFarmClientDataCache, type FarmClientCacheStatus } from \"./client-cache\";\nimport type { ServerFn } from \"./server-fn\";\nimport type { ServerQuery } from \"./server-query\";\nimport {\n createServerQueryCallKey,\n fetchServerQuery,\n type ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\nimport { getTheme, setTheme, subscribeTheme, toggleTheme } from \"./theme/runtime\";\nimport type { FarmThemePreference, FarmThemeSnapshot } from \"./theme/types\";\nimport { createFarmLocaleCookie } from \"./i18n/resolver\";\nimport { localizeFarmHref, stripFarmLocaleFromPathname } from \"./i18n/routing\";\nimport {\n createFarmClientTranslator,\n getFarmI18nClientState,\n subscribeFarmI18n,\n} from \"./i18n/client-runtime\";\nimport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmTranslator } from \"./i18n/types\";\n\nexport interface FarmClientStore<TSnapshot> {\n getSnapshot(): TSnapshot;\n subscribe(listener: () => void): () => void;\n}\n\nexport interface FarmRendererRouterOptions {\n basePath?: string;\n routes?: readonly FarmRouterRouteInput[];\n}\n\nexport interface FarmRendererRouterSnapshot {\n pathname: string;\n searchParams: URLSearchParams;\n params: Record<string, string>;\n pageState: unknown;\n navigation: FarmNavigationState;\n}\n\nexport interface FarmRendererRouter extends FarmClientStore<FarmRendererRouterSnapshot> {\n push(href: string, options?: Omit<FarmNavigateOptions, \"replace\">): Promise<void>;\n replace(href: string, options?: Omit<FarmNavigateOptions, \"replace\">): Promise<void>;\n refresh(options?: Omit<FarmNavigateOptions, \"replace\" | \"refresh\">): Promise<void>;\n prefetch(href: string): Promise<void>;\n back(): void;\n forward(): void;\n pushState<TState>(state: TState, href?: string): void;\n replaceState<TState>(state: TState, href?: string): void;\n}\n\nexport function createRendererRouter(options: FarmRendererRouterOptions = {}): FarmRendererRouter {\n const basePath = options.basePath || \"\";\n const matcher = options.routes?.length ? createFarmRouter([...options.routes]) : null;\n const router = getSPARouter();\n let snapshot = readRendererRouterSnapshot(basePath, matcher, router.getNavigationState());\n\n const read = () => {\n snapshot = readRendererRouterSnapshot(basePath, matcher, router.getNavigationState());\n return snapshot;\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n if (typeof window === \"undefined\") return () => {};\n const notify = () => {\n read();\n listener();\n };\n const unsubscribeNavigation = router.subscribeNavigation(notify);\n window.addEventListener(\"popstate\", notify);\n read();\n return () => {\n unsubscribeNavigation();\n window.removeEventListener(\"popstate\", notify);\n };\n },\n push(href, navigateOptions) {\n return typeof window === \"undefined\"\n ? Promise.resolve()\n : router.navigate(resolveRendererHref(href, basePath), navigateOptions);\n },\n replace(href, navigateOptions) {\n return typeof window === \"undefined\"\n ? Promise.resolve()\n : router.navigate(resolveRendererHref(href, basePath), {\n ...navigateOptions,\n replace: true,\n });\n },\n refresh: (refreshOptions) =>\n typeof window === \"undefined\" ? Promise.resolve() : router.refresh(refreshOptions),\n prefetch: (href) =>\n typeof window === \"undefined\"\n ? Promise.resolve()\n : router.prefetch(resolveRendererHref(href, basePath)),\n back() {\n if (typeof window !== \"undefined\") window.history.back();\n },\n forward() {\n if (typeof window !== \"undefined\") window.history.forward();\n },\n pushState(state, href) {\n if (typeof window !== \"undefined\") {\n router.pushState(state, href && resolveRendererHref(href, basePath));\n read();\n }\n },\n replaceState(state, href) {\n if (typeof window !== \"undefined\") {\n router.replaceState(state, href && resolveRendererHref(href, basePath));\n read();\n }\n },\n };\n}\n\nexport type FarmActionStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface FarmActionSnapshot<TResult, TError extends Error = Error> {\n pending: boolean;\n status: FarmActionStatus;\n data: TResult | null;\n error: TError | null;\n}\n\nexport interface FarmActionOptions<TInput, TResult, TError extends Error = Error> {\n initialResult?: TResult | null;\n resetOnSubmit?: boolean;\n optimistic?: (context: {\n input: TInput | FormData | undefined;\n formData?: FormData;\n current: TResult | null;\n }) => TResult | null | undefined;\n rollbackOnError?: boolean;\n onSuccess?: (result: TResult) => void;\n onError?: (error: TError) => void;\n onSettled?: (result: TResult | null, error: TError | null) => void;\n}\n\nexport type FarmActionSubmit<TInput, TResult> = [unknown] extends [TInput]\n ? (input?: TInput | FormData) => Promise<TResult>\n : (input: TInput | FormData) => Promise<TResult>;\n\nexport type FarmAction<TInput, TResult, TError extends Error = Error> = FarmClientStore<\n FarmActionSnapshot<TResult, TError>\n> & {\n submit: FarmActionSubmit<TInput, TResult>;\n reset(): void;\n};\n\nexport type FarmRouteActionTarget<TServerFn extends ServerFn<any, any, any>> = {\n readonly action: TServerFn;\n};\n\nexport function createRendererAction<TInput, TResult, TError extends Error = Error>(\n target:\n | ServerFn<TInput, TResult, TError>\n | FarmRouteActionTarget<ServerFn<TInput, TResult, TError>>,\n options: FarmActionOptions<TInput, TResult, TError> = {},\n): FarmAction<TInput, TResult, TError> {\n const serverFn = resolveRendererServerFn(target);\n const listeners = new Set<() => void>();\n const initialResult = options.initialResult ?? null;\n let requestId = 0;\n let pendingCount = 0;\n let snapshot: FarmActionSnapshot<TResult, TError> = {\n pending: false,\n status: \"idle\",\n data: initialResult,\n error: null,\n };\n\n const update = (next: FarmActionSnapshot<TResult, TError>) => {\n snapshot = next;\n for (const listener of listeners) listener();\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n async submit(input?: TInput | FormData) {\n const currentRequest = ++requestId;\n const previous = snapshot.data;\n const formData = isRendererFormData(input) ? input : undefined;\n const optimistic = options.optimistic?.({ input, formData, current: previous });\n const hasOptimistic = optimistic !== undefined;\n pendingCount += 1;\n update({\n pending: true,\n status: \"pending\",\n data: hasOptimistic ? optimistic : options.resetOnSubmit === false ? previous : null,\n error: null,\n });\n\n try {\n const result = await serverFn(input as TInput | FormData);\n pendingCount = Math.max(0, pendingCount - 1);\n if (currentRequest === requestId) {\n update({\n pending: pendingCount > 0,\n status: pendingCount > 0 ? \"pending\" : \"success\",\n data: result,\n error: null,\n });\n options.onSuccess?.(result);\n options.onSettled?.(result, null);\n }\n return result;\n } catch (cause) {\n pendingCount = Math.max(0, pendingCount - 1);\n const error = normalizeRendererClientError(cause) as TError;\n if (currentRequest === requestId) {\n update({\n pending: pendingCount > 0,\n status: pendingCount > 0 ? \"pending\" : \"error\",\n data:\n hasOptimistic && options.rollbackOnError\n ? previous\n : options.resetOnSubmit === false\n ? snapshot.data\n : null,\n error,\n });\n options.onError?.(error);\n options.onSettled?.(null, error);\n }\n throw error;\n }\n },\n reset() {\n requestId += 1;\n pendingCount = 0;\n update({ pending: false, status: \"idle\", data: initialResult, error: null });\n },\n } as FarmAction<TInput, TResult, TError>;\n}\n\nexport interface FarmRendererQueryOptions extends ServerQueryFetchOptions {\n enabled?: boolean;\n refetchOnWindowFocus?: boolean;\n refetchOnReconnect?: boolean;\n}\n\nexport interface FarmRendererQuerySnapshot<TData> {\n data: TData | undefined;\n error: Error | null;\n status: FarmClientCacheStatus;\n pending: boolean;\n fetching: boolean;\n stale: boolean;\n}\n\nexport interface FarmRendererQuery<TData> extends FarmClientStore<\n FarmRendererQuerySnapshot<TData>\n> {\n refetch(): Promise<TData>;\n dispose(): void;\n}\n\nexport function createRendererQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: FarmRendererQueryOptions = {},\n): FarmRendererQuery<TData> {\n const cache = getFarmClientDataCache();\n const key = createServerQueryCallKey(query, input);\n const listeners = new Set<() => void>();\n let unsubscribeCache: (() => void) | undefined;\n let cleanupBrowser: (() => void) | undefined;\n\n const run = (force = false) => fetchServerQuery(query, input, { ...options, force });\n const ensureStarted = () => {\n if (options.enabled === false || unsubscribeCache) return;\n unsubscribeCache = cache.subscribe(key, () => {\n for (const listener of listeners) listener();\n });\n if (!cache.get(key) || cache.isStale(key)) void run().catch(() => undefined);\n\n if (typeof window !== \"undefined\") {\n const refresh = () => {\n if (cache.isStale(key)) void run().catch(() => undefined);\n };\n const onFocus = options.refetchOnWindowFocus === false ? undefined : refresh;\n const onOnline = options.refetchOnReconnect === false ? undefined : refresh;\n if (onFocus) window.addEventListener(\"focus\", onFocus);\n if (onOnline) window.addEventListener(\"online\", onOnline);\n cleanupBrowser = () => {\n if (onFocus) window.removeEventListener(\"focus\", onFocus);\n if (onOnline) window.removeEventListener(\"online\", onOnline);\n };\n }\n };\n\n return {\n getSnapshot() {\n const entry = cache.get<TData>(key);\n const status = entry?.status ?? (entry ? \"success\" : \"idle\");\n return {\n data: entry?.data,\n error: entry?.error ?? null,\n status,\n pending: status === \"pending\" && (entry?.updatedAt ?? 0) === 0,\n fetching: entry?.fetching ?? false,\n stale: cache.isStale(key),\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n ensureStarted();\n return () => listeners.delete(listener);\n },\n refetch: () => run(true),\n dispose() {\n unsubscribeCache?.();\n cleanupBrowser?.();\n unsubscribeCache = undefined;\n cleanupBrowser = undefined;\n listeners.clear();\n },\n };\n}\n\nexport interface FarmRendererTheme extends FarmClientStore<FarmThemeSnapshot> {\n setTheme(theme: FarmThemePreference): void;\n toggleTheme(): FarmThemeSnapshot[\"resolvedTheme\"];\n}\n\nexport function createRendererTheme(): FarmRendererTheme {\n return {\n getSnapshot: getTheme,\n subscribe: subscribeTheme,\n setTheme,\n toggleTheme,\n };\n}\n\nexport interface FarmRendererI18n extends FarmClientStore<FarmI18nClientSnapshot | undefined> {\n readonly t: FarmTranslator;\n setLocale(locale: FarmI18nLocale): void;\n}\n\nexport function createRendererI18n(): FarmRendererI18n {\n return {\n getSnapshot: getFarmI18nClientState,\n subscribe: subscribeFarmI18n,\n t: createFarmClientTranslator(),\n setLocale(locale) {\n const snapshot = getFarmI18nClientState();\n if (!snapshot) throw new Error(\"Farm i18n is not configured or has not been hydrated.\");\n if (!snapshot.locales.includes(locale)) {\n throw new Error(`Unsupported Farm i18n locale \"${locale}\".`);\n }\n if (typeof window === \"undefined\") return;\n document.cookie = createFarmLocaleCookie(locale, { cookie: snapshot.cookie });\n const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n window.location.assign(localizeFarmHref(href, locale, snapshot));\n },\n };\n}\n\nfunction readRendererRouterSnapshot(\n basePath: string,\n matcher: FarmRouter | null,\n navigation: FarmNavigationState,\n): FarmRendererRouterSnapshot {\n if (typeof window === \"undefined\") {\n return {\n pathname: \"/\",\n searchParams: new URLSearchParams(),\n params: {},\n pageState: null,\n navigation,\n };\n }\n\n const url = new URL(window.location.href);\n const normalizedBase = basePath.replace(/\\/+$/, \"\");\n const pathname =\n normalizedBase &&\n (url.pathname === normalizedBase || url.pathname.startsWith(`${normalizedBase}/`))\n ? url.pathname.slice(normalizedBase.length) || \"/\"\n : url.pathname;\n const i18n = getFarmI18nClientState();\n const routePathname = i18n ? stripFarmLocaleFromPathname(pathname, i18n) : pathname;\n\n return {\n pathname,\n searchParams: url.searchParams,\n params: matcher?.match(routePathname)?.params || {},\n pageState: readPageState(),\n navigation,\n };\n}\n\nfunction resolveRendererHref(href: string, basePath: string): string {\n return href.startsWith(\"/\") ? `${basePath}${href}` : href;\n}\n\nfunction resolveRendererServerFn<TInput, TResult, TError extends Error>(\n target:\n | ServerFn<TInput, TResult, TError>\n | FarmRouteActionTarget<ServerFn<TInput, TResult, TError>>,\n): ServerFn<TInput, TResult, TError> {\n if (typeof target === \"function\") return target;\n if (target && typeof target.action === \"function\") return target.action;\n throw new TypeError(\n \"createRendererAction requires a server function or a route with a declared action\",\n );\n}\n\nfunction normalizeRendererClientError(cause: unknown): Error {\n if (cause instanceof Error) return cause;\n const error = new Error(typeof cause === \"string\" ? cause : \"FARMJS client operation failed\");\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n\nfunction isRendererFormData(value: unknown): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/renderer-client.ts"],"sourcesContent":["\"use client\";\n\nimport { createFarmRouter, type FarmRouter, type FarmRouterRouteInput } from \"./router\";\nimport {\n getRouter as getSPARouter,\n readPageState,\n type FarmNavigationState,\n type FarmNavigateOptions,\n} from \"./client/spa-router\";\nimport { subscribeHistoryChange } from \"./client/history-sync\";\nimport { getFarmClientDataCache, type FarmClientCacheStatus } from \"./client-cache\";\nimport type { ServerFn } from \"./server-fn\";\nimport type { ServerQuery } from \"./server-query\";\nimport {\n createServerQueryCallKey,\n fetchServerQuery,\n type ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\nimport { getTheme, setTheme, subscribeTheme, toggleTheme } from \"./theme/runtime\";\nimport type { FarmThemePreference, FarmThemeSnapshot } from \"./theme/types\";\nimport { createFarmLocaleCookie } from \"./i18n/resolver\";\nimport { localizeFarmHref, stripFarmLocaleFromPathname } from \"./i18n/routing\";\nimport {\n createFarmClientTranslator,\n getFarmI18nClientState,\n subscribeFarmI18n,\n} from \"./i18n/client-runtime\";\nimport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmTranslator } from \"./i18n/types\";\n\nexport interface FarmClientStore<TSnapshot> {\n getSnapshot(): TSnapshot;\n subscribe(listener: () => void): () => void;\n}\n\nexport interface FarmRendererRouterOptions {\n basePath?: string;\n routes?: readonly FarmRouterRouteInput[];\n}\n\nexport interface FarmRendererRouterSnapshot {\n pathname: string;\n searchParams: URLSearchParams;\n params: Record<string, string>;\n pageState: unknown;\n navigation: FarmNavigationState;\n}\n\nexport interface FarmRendererRouter extends FarmClientStore<FarmRendererRouterSnapshot> {\n push(href: string, options?: Omit<FarmNavigateOptions, \"replace\">): Promise<void>;\n replace(href: string, options?: Omit<FarmNavigateOptions, \"replace\">): Promise<void>;\n refresh(options?: Omit<FarmNavigateOptions, \"replace\" | \"refresh\">): Promise<void>;\n prefetch(href: string): Promise<void>;\n back(): void;\n forward(): void;\n pushState<TState>(state: TState, href?: string): void;\n replaceState<TState>(state: TState, href?: string): void;\n}\n\nexport function createRendererRouter(options: FarmRendererRouterOptions = {}): FarmRendererRouter {\n const basePath = options.basePath || \"\";\n const matcher = options.routes?.length ? createFarmRouter([...options.routes]) : null;\n const router = getSPARouter();\n let snapshot = readRendererRouterSnapshot(basePath, matcher, router.getNavigationState());\n\n const read = () => {\n snapshot = readRendererRouterSnapshot(basePath, matcher, router.getNavigationState());\n return snapshot;\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n if (typeof window === \"undefined\") return () => {};\n const notify = () => {\n read();\n listener();\n };\n const unsubscribeNavigation = router.subscribeNavigation(notify);\n const unsubscribeHistory = subscribeHistoryChange(notify);\n read();\n return () => {\n unsubscribeNavigation();\n unsubscribeHistory();\n };\n },\n push(href, navigateOptions) {\n return typeof window === \"undefined\"\n ? Promise.resolve()\n : router.navigate(resolveRendererHref(href, basePath), navigateOptions);\n },\n replace(href, navigateOptions) {\n return typeof window === \"undefined\"\n ? Promise.resolve()\n : router.navigate(resolveRendererHref(href, basePath), {\n ...navigateOptions,\n replace: true,\n });\n },\n refresh: (refreshOptions) =>\n typeof window === \"undefined\" ? Promise.resolve() : router.refresh(refreshOptions),\n prefetch: (href) =>\n typeof window === \"undefined\"\n ? Promise.resolve()\n : router.prefetch(resolveRendererHref(href, basePath)),\n back() {\n if (typeof window !== \"undefined\") window.history.back();\n },\n forward() {\n if (typeof window !== \"undefined\") window.history.forward();\n },\n pushState(state, href) {\n if (typeof window !== \"undefined\") {\n router.pushState(state, href && resolveRendererHref(href, basePath));\n read();\n }\n },\n replaceState(state, href) {\n if (typeof window !== \"undefined\") {\n router.replaceState(state, href && resolveRendererHref(href, basePath));\n read();\n }\n },\n };\n}\n\nexport type FarmActionStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface FarmActionSnapshot<TResult, TError extends Error = Error> {\n pending: boolean;\n status: FarmActionStatus;\n data: TResult | null;\n error: TError | null;\n}\n\nexport interface FarmActionOptions<TInput, TResult, TError extends Error = Error> {\n initialResult?: TResult | null;\n resetOnSubmit?: boolean;\n optimistic?: (context: {\n input: TInput | FormData | undefined;\n formData?: FormData;\n current: TResult | null;\n }) => TResult | null | undefined;\n rollbackOnError?: boolean;\n onSuccess?: (result: TResult) => void;\n onError?: (error: TError) => void;\n onSettled?: (result: TResult | null, error: TError | null) => void;\n}\n\nexport type FarmActionSubmit<TInput, TResult> = [unknown] extends [TInput]\n ? (input?: TInput | FormData) => Promise<TResult>\n : (input: TInput | FormData) => Promise<TResult>;\n\nexport type FarmAction<TInput, TResult, TError extends Error = Error> = FarmClientStore<\n FarmActionSnapshot<TResult, TError>\n> & {\n submit: FarmActionSubmit<TInput, TResult>;\n reset(): void;\n};\n\nexport type FarmRouteActionTarget<TServerFn extends ServerFn<any, any, any>> = {\n readonly action: TServerFn;\n};\n\nexport function createRendererAction<TInput, TResult, TError extends Error = Error>(\n target:\n | ServerFn<TInput, TResult, TError>\n | FarmRouteActionTarget<ServerFn<TInput, TResult, TError>>,\n options: FarmActionOptions<TInput, TResult, TError> = {},\n): FarmAction<TInput, TResult, TError> {\n const serverFn = resolveRendererServerFn(target);\n const listeners = new Set<() => void>();\n const initialResult = options.initialResult ?? null;\n let requestId = 0;\n let pendingCount = 0;\n let snapshot: FarmActionSnapshot<TResult, TError> = {\n pending: false,\n status: \"idle\",\n data: initialResult,\n error: null,\n };\n\n const update = (next: FarmActionSnapshot<TResult, TError>) => {\n snapshot = next;\n for (const listener of listeners) listener();\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n async submit(input?: TInput | FormData) {\n const currentRequest = ++requestId;\n const previous = snapshot.data;\n const formData = isRendererFormData(input) ? input : undefined;\n const optimistic = options.optimistic?.({ input, formData, current: previous });\n const hasOptimistic = optimistic !== undefined;\n pendingCount += 1;\n update({\n pending: true,\n status: \"pending\",\n data: hasOptimistic ? optimistic : options.resetOnSubmit === false ? previous : null,\n error: null,\n });\n\n try {\n const result = await serverFn(input as TInput | FormData);\n pendingCount = Math.max(0, pendingCount - 1);\n if (currentRequest === requestId) {\n update({\n pending: pendingCount > 0,\n status: pendingCount > 0 ? \"pending\" : \"success\",\n data: result,\n error: null,\n });\n options.onSuccess?.(result);\n options.onSettled?.(result, null);\n }\n return result;\n } catch (cause) {\n pendingCount = Math.max(0, pendingCount - 1);\n const error = normalizeRendererClientError(cause) as TError;\n if (currentRequest === requestId) {\n update({\n pending: pendingCount > 0,\n status: pendingCount > 0 ? \"pending\" : \"error\",\n data:\n hasOptimistic && options.rollbackOnError\n ? previous\n : options.resetOnSubmit === false\n ? snapshot.data\n : null,\n error,\n });\n options.onError?.(error);\n options.onSettled?.(null, error);\n }\n throw error;\n }\n },\n reset() {\n requestId += 1;\n pendingCount = 0;\n update({ pending: false, status: \"idle\", data: initialResult, error: null });\n },\n } as FarmAction<TInput, TResult, TError>;\n}\n\nexport interface FarmRendererQueryOptions extends ServerQueryFetchOptions {\n enabled?: boolean;\n refetchOnWindowFocus?: boolean;\n refetchOnReconnect?: boolean;\n}\n\nexport interface FarmRendererQuerySnapshot<TData> {\n data: TData | undefined;\n error: Error | null;\n status: FarmClientCacheStatus;\n pending: boolean;\n fetching: boolean;\n stale: boolean;\n}\n\nexport interface FarmRendererQuery<TData> extends FarmClientStore<\n FarmRendererQuerySnapshot<TData>\n> {\n refetch(): Promise<TData>;\n dispose(): void;\n}\n\nexport function createRendererQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: FarmRendererQueryOptions = {},\n): FarmRendererQuery<TData> {\n const cache = getFarmClientDataCache();\n const key = createServerQueryCallKey(query, input);\n const listeners = new Set<() => void>();\n let unsubscribeCache: (() => void) | undefined;\n let cleanupBrowser: (() => void) | undefined;\n\n const run = (force = false) => fetchServerQuery(query, input, { ...options, force });\n const ensureStarted = () => {\n if (options.enabled === false || unsubscribeCache) return;\n unsubscribeCache = cache.subscribe(key, () => {\n for (const listener of listeners) listener();\n });\n if (!cache.get(key) || cache.isStale(key)) void run().catch(() => undefined);\n\n if (typeof window !== \"undefined\") {\n const refresh = () => {\n if (cache.isStale(key)) void run().catch(() => undefined);\n };\n const onFocus = options.refetchOnWindowFocus === false ? undefined : refresh;\n const onOnline = options.refetchOnReconnect === false ? undefined : refresh;\n if (onFocus) window.addEventListener(\"focus\", onFocus);\n if (onOnline) window.addEventListener(\"online\", onOnline);\n cleanupBrowser = () => {\n if (onFocus) window.removeEventListener(\"focus\", onFocus);\n if (onOnline) window.removeEventListener(\"online\", onOnline);\n };\n }\n };\n\n return {\n getSnapshot() {\n const entry = cache.get<TData>(key);\n const status = entry?.status ?? (entry ? \"success\" : \"idle\");\n return {\n data: entry?.data,\n error: entry?.error ?? null,\n status,\n pending: status === \"pending\" && (entry?.updatedAt ?? 0) === 0,\n fetching: entry?.fetching ?? false,\n stale: cache.isStale(key),\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n ensureStarted();\n return () => listeners.delete(listener);\n },\n refetch: () => run(true),\n dispose() {\n unsubscribeCache?.();\n cleanupBrowser?.();\n unsubscribeCache = undefined;\n cleanupBrowser = undefined;\n listeners.clear();\n },\n };\n}\n\nexport interface FarmRendererTheme extends FarmClientStore<FarmThemeSnapshot> {\n setTheme(theme: FarmThemePreference): void;\n toggleTheme(): FarmThemeSnapshot[\"resolvedTheme\"];\n}\n\nexport function createRendererTheme(): FarmRendererTheme {\n return {\n getSnapshot: getTheme,\n subscribe: subscribeTheme,\n setTheme,\n toggleTheme,\n };\n}\n\nexport interface FarmRendererI18n extends FarmClientStore<FarmI18nClientSnapshot | undefined> {\n readonly t: FarmTranslator;\n setLocale(locale: FarmI18nLocale): void;\n}\n\nexport function createRendererI18n(): FarmRendererI18n {\n return {\n getSnapshot: getFarmI18nClientState,\n subscribe: subscribeFarmI18n,\n t: createFarmClientTranslator(),\n setLocale(locale) {\n const snapshot = getFarmI18nClientState();\n if (!snapshot) throw new Error(\"Farm i18n is not configured or has not been hydrated.\");\n if (!snapshot.locales.includes(locale)) {\n throw new Error(`Unsupported Farm i18n locale \"${locale}\".`);\n }\n if (typeof window === \"undefined\") return;\n document.cookie = createFarmLocaleCookie(locale, { cookie: snapshot.cookie });\n const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n window.location.assign(localizeFarmHref(href, locale, snapshot));\n },\n };\n}\n\nfunction readRendererRouterSnapshot(\n basePath: string,\n matcher: FarmRouter | null,\n navigation: FarmNavigationState,\n): FarmRendererRouterSnapshot {\n if (typeof window === \"undefined\") {\n return {\n pathname: \"/\",\n searchParams: new URLSearchParams(),\n params: {},\n pageState: null,\n navigation,\n };\n }\n\n const url = new URL(window.location.href);\n const normalizedBase = basePath.replace(/\\/+$/, \"\");\n const pathname =\n normalizedBase &&\n (url.pathname === normalizedBase || url.pathname.startsWith(`${normalizedBase}/`))\n ? url.pathname.slice(normalizedBase.length) || \"/\"\n : url.pathname;\n const i18n = getFarmI18nClientState();\n const routePathname = i18n ? stripFarmLocaleFromPathname(pathname, i18n) : pathname;\n\n return {\n pathname,\n searchParams: url.searchParams,\n params: matcher?.match(routePathname)?.params || {},\n pageState: readPageState(),\n navigation,\n };\n}\n\nfunction resolveRendererHref(href: string, basePath: string): string {\n return href.startsWith(\"/\") ? `${basePath}${href}` : href;\n}\n\nfunction resolveRendererServerFn<TInput, TResult, TError extends Error>(\n target:\n | ServerFn<TInput, TResult, TError>\n | FarmRouteActionTarget<ServerFn<TInput, TResult, TError>>,\n): ServerFn<TInput, TResult, TError> {\n if (typeof target === \"function\") return target;\n if (target && typeof target.action === \"function\") return target.action;\n throw new TypeError(\n \"createRendererAction requires a server function or a route with a declared action\",\n );\n}\n\nfunction normalizeRendererClientError(cause: unknown): Error {\n if (cause instanceof Error) return cause;\n const error = new Error(typeof cause === \"string\" ? cause : \"FARMJS client operation failed\");\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n\nfunction isRendererFormData(value: unknown): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n"],"mappings":"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","names":[]}
package/dist/server.cjs CHANGED
@@ -21251,7 +21251,7 @@ _setFarmThemeServerSnapshotResolver(() => {
21251
21251
  });
21252
21252
 
21253
21253
  // package.json
21254
- var version = "0.1.0-beta.54";
21254
+ var version = "0.1.0-beta.56";
21255
21255
 
21256
21256
  // src/version.ts
21257
21257
  var FARM_VERSION = version;