@farm.js/core 0.1.0-beta.51 → 0.1.0-beta.53

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 (49) hide show
  1. package/dist/{chunk-HSHA3H3U.mjs → chunk-3E2WRUR2.mjs} +15 -1
  2. package/dist/chunk-3E2WRUR2.mjs.map +1 -0
  3. package/dist/{chunk-QCSOE6HT.mjs → chunk-FCY7TXMA.mjs} +52 -9
  4. package/dist/chunk-FCY7TXMA.mjs.map +1 -0
  5. package/dist/{chunk-235ZOXDY.mjs → chunk-HAMMDSJM.mjs} +2 -2
  6. package/dist/{chunk-FRN7PNL4.mjs → chunk-LN2BAU5H.mjs} +2 -2
  7. package/dist/{chunk-ZAW3D2TI.mjs → chunk-M2DI67UZ.mjs} +2 -2
  8. package/dist/{chunk-7XJV5RZO.mjs → chunk-RPEYD7TD.mjs} +2 -2
  9. package/dist/{chunk-7XJV5RZO.mjs.map → chunk-RPEYD7TD.mjs.map} +1 -1
  10. package/dist/client/lifecycle.mjs +2 -2
  11. package/dist/client-plugins.cjs +1 -1
  12. package/dist/client-plugins.cjs.map +1 -1
  13. package/dist/client-plugins.mjs +2 -2
  14. package/dist/client.cjs +15 -1
  15. package/dist/client.cjs.map +1 -1
  16. package/dist/client.mjs +4 -4
  17. package/dist/index.cjs +72 -8
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.mjs +6 -6
  20. package/dist/internal/build-runtime.cjs +58 -8
  21. package/dist/internal/build-runtime.cjs.map +1 -1
  22. package/dist/internal/build-runtime.mjs +3 -3
  23. package/dist/internal/client-runtime.cjs +1 -1
  24. package/dist/internal/client-runtime.cjs.map +1 -1
  25. package/dist/internal/client-runtime.mjs +2 -2
  26. package/dist/plugin.cjs +51 -8
  27. package/dist/plugin.cjs.map +1 -1
  28. package/dist/plugin.mjs +2 -2
  29. package/dist/renderer-client.cjs +14 -0
  30. package/dist/renderer-client.cjs.map +1 -1
  31. package/dist/renderer-client.mjs +1 -1
  32. package/dist/server-query-client.cjs +14 -0
  33. package/dist/server-query-client.cjs.map +1 -1
  34. package/dist/server-query-client.mjs +2 -2
  35. package/dist/server.cjs +51 -8
  36. package/dist/server.cjs.map +1 -1
  37. package/dist/server.mjs +2 -2
  38. package/dist/version.cjs +1 -1
  39. package/dist/version.cjs.map +1 -1
  40. package/dist/version.mjs +1 -1
  41. package/dist/vite.cjs +51 -8
  42. package/dist/vite.cjs.map +1 -1
  43. package/dist/vite.mjs +2 -2
  44. package/package.json +3 -3
  45. package/dist/chunk-HSHA3H3U.mjs.map +0 -1
  46. package/dist/chunk-QCSOE6HT.mjs.map +0 -1
  47. /package/dist/{chunk-235ZOXDY.mjs.map → chunk-HAMMDSJM.mjs.map} +0 -0
  48. /package/dist/{chunk-FRN7PNL4.mjs.map → chunk-LN2BAU5H.mjs.map} +0 -0
  49. /package/dist/{chunk-ZAW3D2TI.mjs.map → chunk-M2DI67UZ.mjs.map} +0 -0
@@ -19,6 +19,19 @@ var serverQueryClientState = serverQueryClientGlobal[FARM_SERVER_QUERY_CLIENT_ST
19
19
  nextFunctionId: 0,
20
20
  active: []
21
21
  });
22
+ var RAW_SERVER_QUERY_SYMBOL = /* @__PURE__ */ Symbol.for("farm.server-query");
23
+ function assertNotRawServerQueryInBrowser(query) {
24
+ if (typeof window === "undefined" || typeof document === "undefined") return;
25
+ if (!query?.[RAW_SERVER_QUERY_SYMBOL]) return;
26
+ throw new Error(
27
+ [
28
+ "useServerQuery received a raw server query implementation in the browser.",
29
+ "Server query handlers run only on the server. Enable the server-function transform (add @farm.js/plugin/rsc and set experimental.serverActions: true in farm.config.ts) so client imports become server references,",
30
+ "or call the query from server code / an API route (createAPIClient) instead."
31
+ ].join("\n")
32
+ );
33
+ }
34
+ __name(assertNotRawServerQueryInBrowser, "assertNotRawServerQueryInBrowser");
22
35
  function beginFarmServerQueryAction(actionId, args) {
23
36
  const active = serverQueryClientState.active.at(-1);
24
37
  return {
@@ -75,6 +88,7 @@ function prefetchServerQuery(query, input, options = {}) {
75
88
  }
76
89
  __name(prefetchServerQuery, "prefetchServerQuery");
77
90
  async function executeServerQuery(query, input, provisionalKey, options) {
91
+ assertNotRawServerQueryInBrowser(query);
78
92
  const cache = getFarmClientDataCache();
79
93
  const inflight = cache.getInflight(provisionalKey);
80
94
  if (inflight) return inflight;
@@ -149,4 +163,4 @@ export {
149
163
  fetchServerQuery,
150
164
  prefetchServerQuery
151
165
  };
152
- //# sourceMappingURL=chunk-HSHA3H3U.mjs.map
166
+ //# sourceMappingURL=chunk-3E2WRUR2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server-query-runtime.ts"],"sourcesContent":["\"use client\";\n\nimport { createFarmCacheKey } from \"./cache\";\nimport { getFarmClientDataCache } from \"./client-cache\";\nimport type { ServerQuery } from \"./server-query\";\nimport { isFarmServerQueryResult, type FarmServerQueryResult } from \"./server-query-protocol\";\n\nexport type ServerQueryFetchOptions = {\n /** Used only when a non-Farm transport returns plain data. Farm transports use the declaration. */\n staleTime?: number | false;\n /** Return stale data immediately while refreshing it in the background. Default true. */\n swr?: boolean;\n /** Always wait for a new result. */\n force?: boolean;\n};\n\nexport type FarmServerQueryActionInvocation = {\n actionId: string;\n args: readonly unknown[];\n provisionalKey?: string;\n};\n\ntype ActiveServerQueryInvocation = {\n provisionalKey: string;\n};\n\ntype ServerQueryClientState = {\n functionIds: WeakMap<Function, number>;\n nextFunctionId: number;\n active: ActiveServerQueryInvocation[];\n};\n\nconst FARM_SERVER_QUERY_CLIENT_STATE = Symbol.for(\"farm.serverQueryClientState\");\nconst serverQueryClientGlobal = globalThis as typeof globalThis & {\n [FARM_SERVER_QUERY_CLIENT_STATE]?: ServerQueryClientState;\n};\nconst serverQueryClientState = (serverQueryClientGlobal[FARM_SERVER_QUERY_CLIENT_STATE] ??= {\n functionIds: new WeakMap(),\n nextFunctionId: 0,\n active: [],\n});\n\n// Global symbol registry key set on raw server query implementations by\n// createServerQuery. Referenced via Symbol.for instead of importing\n// server-query.ts, which would pull the server handler pipeline into the\n// client bundle.\nconst RAW_SERVER_QUERY_SYMBOL = Symbol.for(\"farm.server-query\");\n\n/**\n * A query reaching the browser should be a transformed server reference. The\n * raw implementation carries the server query symbol; executing it here would\n * run the server handler in the browser (#408). During SSR the raw\n * implementation is expected and runs directly.\n */\nfunction assertNotRawServerQueryInBrowser(query: unknown): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n if (!(query as Record<symbol, unknown> | null)?.[RAW_SERVER_QUERY_SYMBOL]) return;\n throw new Error(\n [\n \"useServerQuery received a raw server query implementation in the browser.\",\n \"Server query handlers run only on the server. Enable the server-function transform (add @farm.js/plugin/rsc and set experimental.serverActions: true in farm.config.ts) so client imports become server references,\",\n \"or call the query from server code / an API route (createAPIClient) instead.\",\n ].join(\"\\n\"),\n );\n}\n\nexport function beginFarmServerQueryAction(\n actionId: string,\n args: readonly unknown[],\n): FarmServerQueryActionInvocation {\n const active = serverQueryClientState.active.at(-1);\n return {\n actionId,\n args,\n provisionalKey: active?.provisionalKey,\n };\n}\n\nexport function completeFarmServerQueryAction<TData>(\n invocation: FarmServerQueryActionInvocation,\n value: TData | FarmServerQueryResult<TData>,\n): TData {\n if (!isFarmServerQueryResult(value)) return value as TData;\n\n const cache = getFarmClientDataCache();\n const metadata = value.__farmServerQuery;\n if (invocation.provisionalKey) {\n cache.alias(invocation.provisionalKey, metadata.key);\n }\n\n cache.set(metadata.key, {\n data: value.data,\n updatedAt: metadata.updatedAt,\n staleAt:\n metadata.staleTime === false\n ? Number.POSITIVE_INFINITY\n : metadata.updatedAt + metadata.staleTime,\n status: \"success\",\n error: null,\n fetching: false,\n });\n\n return value.data as TData;\n}\n\nexport function createServerQueryCallKey<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n): string {\n let id = serverQueryClientState.functionIds.get(query);\n if (!id) {\n id = ++serverQueryClientState.nextFunctionId;\n serverQueryClientState.functionIds.set(query, id);\n }\n return createFarmCacheKey([\"server-query-call\", id, input]);\n}\n\nexport async function fetchServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: ServerQueryFetchOptions = {},\n): Promise<TData> {\n const cache = getFarmClientDataCache();\n const provisionalKey = createServerQueryCallKey(query, input);\n const entry = cache.get<TData>(provisionalKey);\n const stale = cache.isStale(provisionalKey);\n const inflight = cache.getInflight<TData>(provisionalKey);\n\n if (inflight) return inflight;\n if (!options.force && entry && !stale && entry.status !== \"error\") return entry.data;\n\n if (\n !options.force &&\n entry &&\n stale &&\n entry.status !== \"pending\" &&\n entry.status !== \"error\" &&\n (options.swr ?? true)\n ) {\n void executeServerQuery(query, input, provisionalKey, options).catch(() => undefined);\n return entry.data;\n }\n\n return executeServerQuery(query, input, provisionalKey, options);\n}\n\nexport function prefetchServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: Omit<ServerQueryFetchOptions, \"force\"> = {},\n): Promise<TData> {\n return fetchServerQuery(query, input, options);\n}\n\nasync function executeServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n provisionalKey: string,\n options: ServerQueryFetchOptions,\n): Promise<TData> {\n assertNotRawServerQueryInBrowser(query);\n const cache = getFarmClientDataCache();\n const inflight = cache.getInflight<TData>(provisionalKey);\n if (inflight) return inflight;\n\n const previous = cache.get<TData>(provisionalKey);\n cache.set(provisionalKey, {\n data: previous?.data as TData,\n updatedAt: previous?.updatedAt ?? 0,\n staleAt: previous?.staleAt ?? 0,\n gcAt: previous?.gcAt,\n invalidatedAt: previous?.invalidatedAt,\n status: \"pending\",\n error: null,\n fetching: true,\n });\n\n const promise = (async () => {\n try {\n serverQueryClientState.active.push({ provisionalKey });\n let pending: Promise<TData>;\n try {\n pending = query(input);\n } finally {\n serverQueryClientState.active.pop();\n }\n\n const data = await pending;\n const transported = cache.get<TData>(provisionalKey);\n if (!transported || transported.fetching) {\n const updatedAt = Date.now();\n cache.set(provisionalKey, {\n data,\n updatedAt,\n staleAt:\n options.staleTime === false\n ? Number.POSITIVE_INFINITY\n : updatedAt + (options.staleTime ?? 0),\n status: \"success\",\n error: null,\n fetching: false,\n });\n }\n return data;\n } catch (cause) {\n const error = normalizeServerQueryError(cause);\n const current = cache.get<TData>(provisionalKey);\n cache.set(provisionalKey, {\n data: current?.data as TData,\n updatedAt: current?.updatedAt ?? 0,\n staleAt: current?.staleAt ?? 0,\n gcAt: current?.gcAt,\n invalidatedAt: current?.invalidatedAt,\n status: \"error\",\n error,\n fetching: false,\n });\n throw error;\n } finally {\n cache.deleteInflight(provisionalKey);\n }\n })();\n\n cache.setInflight(provisionalKey, promise);\n return promise;\n}\n\nfunction normalizeServerQueryError(cause: unknown): Error {\n if (cause instanceof Error) return cause;\n const error = new Error(typeof cause === \"string\" ? cause : \"Server query failed\");\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n"],"mappings":"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","names":[]}
@@ -227,7 +227,7 @@ import {
227
227
  } from "./chunk-7ZMKVETU.mjs";
228
228
  import {
229
229
  FARM_VERSION
230
- } from "./chunk-7XJV5RZO.mjs";
230
+ } from "./chunk-RPEYD7TD.mjs";
231
231
  import {
232
232
  __name,
233
233
  __require
@@ -6858,6 +6858,14 @@ import { pathToFileURL as pathToFileURL3 } from "url";
6858
6858
  // src/dev-static.ts
6859
6859
  import * as fs6 from "fs";
6860
6860
  import * as path11 from "path";
6861
+ function shouldBypassFarmRouterForDottedPath(pathname, routeManager, baseDirs) {
6862
+ if (!pathname.includes(".") || pathname.endsWith(".html")) return false;
6863
+ const matchesAppRoute = Boolean(
6864
+ routeManager?.matchRoute(pathname)?.route || routeManager?.matchMetadataRoute(pathname) || routeManager?.matchMetadataImage(pathname)
6865
+ );
6866
+ return !matchesAppRoute || devServableFileExists(pathname, baseDirs);
6867
+ }
6868
+ __name(shouldBypassFarmRouterForDottedPath, "shouldBypassFarmRouterForDottedPath");
6861
6869
  function devServableFileExists(pathname, baseDirs) {
6862
6870
  let decodedPathname;
6863
6871
  try {
@@ -6883,6 +6891,34 @@ function devServableFileExists(pathname, baseDirs) {
6883
6891
  }
6884
6892
  __name(devServableFileExists, "devServableFileExists");
6885
6893
 
6894
+ // src/server-query-boundary.ts
6895
+ var SERVER_FN_FACTORIES = ["createServerQuery", "createServerFn"];
6896
+ var FARM_CORE_IMPORT_RE = /import\s*(?!type\b)(?:[\w$]+\s*,\s*)?\{([^}]*)\}\s*from\s*(["'])@farm\.js\/core(?:\/[\w./-]+)?\2/g;
6897
+ function findClientServerFnViolation(code, id) {
6898
+ if (id.startsWith("\0") || id.startsWith("virtual:") || id.includes("node_modules")) return null;
6899
+ if (!code.includes("@farm.js/core")) return null;
6900
+ for (const match of code.matchAll(FARM_CORE_IMPORT_RE)) {
6901
+ const specifiers = match[1];
6902
+ for (const factory of SERVER_FN_FACTORIES) {
6903
+ if (!new RegExp(`(?:^|[\\s{,])${factory}(?:[\\s},]|$)`).test(specifiers)) continue;
6904
+ if (new RegExp(`(?<![\\w$.])${factory}\\s*(?:<[^>]*>)?\\s*\\(`).test(code)) {
6905
+ return { factory };
6906
+ }
6907
+ }
6908
+ }
6909
+ return null;
6910
+ }
6911
+ __name(findClientServerFnViolation, "findClientServerFnViolation");
6912
+ function formatServerFnBoundaryError(violation, id) {
6913
+ return [
6914
+ `${violation.factory} handlers run only on the server, but ${id} is being bundled into the client.`,
6915
+ `Importing a ${violation.factory} module from client code executes the server handler (and its Node-only imports) in the browser.`,
6916
+ `Either enable the server-function transform (add @farm.js/plugin/rsc and set experimental.serverActions: true in farm.config.ts) so client imports become server references,`,
6917
+ `or keep the query on the server: call it from server components, or expose an API route and use createAPIClient from the client.`
6918
+ ].join("\n");
6919
+ }
6920
+ __name(formatServerFnBoundaryError, "formatServerFnBoundaryError");
6921
+
6886
6922
  // src/image-vite.ts
6887
6923
  import { readFile as readFile4 } from "fs/promises";
6888
6924
  import path12 from "path";
@@ -8427,13 +8463,11 @@ window.__FARM_MANIFEST__ = ${inlineValue({
8427
8463
  if (req.url?.startsWith("/@") || req.url?.startsWith("/node_modules")) {
8428
8464
  return next();
8429
8465
  }
8430
- if (requestPathname.includes(".") && !requestPathname.endsWith(".html")) {
8431
- const matchesAppRoute = Boolean(
8432
- farmApp?.getRouteManager()?.matchRoute(requestPathname)?.route
8433
- );
8434
- if (!matchesAppRoute || devServableFileExists(requestPathname, [server.config.publicDir, server.config.root])) {
8435
- return next();
8436
- }
8466
+ if (shouldBypassFarmRouterForDottedPath(requestPathname, farmApp?.getRouteManager(), [
8467
+ server.config.publicDir,
8468
+ server.config.root
8469
+ ])) {
8470
+ return next();
8437
8471
  }
8438
8472
  if (req.url?.startsWith("/__farm/page-data")) {
8439
8473
  const urlObj = new URL(req.url, `http://${req.headers.host || "localhost:3000"}`);
@@ -9087,6 +9121,15 @@ export const manifest = getManifest();
9087
9121
  }
9088
9122
  },
9089
9123
  async transform(code, id, transformOptions) {
9124
+ if (!transformOptions?.ssr) {
9125
+ const currentConfig = farmApp?.getConfig() ?? options;
9126
+ if (currentConfig.experimental?.serverActions !== true) {
9127
+ const violation = findClientServerFnViolation(code, id);
9128
+ if (violation) {
9129
+ this.error(formatServerFnBoundaryError(violation, id));
9130
+ }
9131
+ }
9132
+ }
9090
9133
  if (typeof imageImports.transform === "function") {
9091
9134
  const imageModule = await imageImports.transform.call(this, code, id, transformOptions);
9092
9135
  if (imageModule) return imageModule;
@@ -11328,4 +11371,4 @@ export {
11328
11371
  farmPlugin,
11329
11372
  defineConfig
11330
11373
  };
11331
- //# sourceMappingURL=chunk-QCSOE6HT.mjs.map
11374
+ //# sourceMappingURL=chunk-FCY7TXMA.mjs.map