@farm.js/core 0.1.0-beta.13 → 0.1.0-beta.16

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 (94) hide show
  1. package/dist/api/route-manager.cjs.map +1 -1
  2. package/dist/api/route-manager.mjs +2 -2
  3. package/dist/api/runtime.cjs.map +1 -1
  4. package/dist/api/runtime.mjs +1 -1
  5. package/dist/api.cjs +18 -10
  6. package/dist/api.cjs.map +1 -1
  7. package/dist/api.mjs +3 -3
  8. package/dist/{chunk-B232I2GP.mjs → chunk-3HIVDX7J.mjs} +12 -1
  9. package/dist/chunk-3HIVDX7J.mjs.map +1 -0
  10. package/dist/{chunk-JDEOUK5V.mjs → chunk-6YXKHAFU.mjs} +3 -3
  11. package/dist/{chunk-VSDZEB5M.mjs → chunk-AN3PQVKH.mjs} +14 -16
  12. package/dist/{chunk-VSDZEB5M.mjs.map → chunk-AN3PQVKH.mjs.map} +1 -1
  13. package/dist/{chunk-Z5CQMP54.mjs → chunk-ARRYKOI5.mjs} +2 -2
  14. package/dist/{chunk-KLA67WKG.mjs → chunk-B3FFOIWS.mjs} +2 -2
  15. package/dist/{chunk-3WIRO3N7.mjs → chunk-BWJC5ZOD.mjs} +2 -2
  16. package/dist/{chunk-3WIRO3N7.mjs.map → chunk-BWJC5ZOD.mjs.map} +1 -1
  17. package/dist/{chunk-PFE6GMNE.mjs → chunk-HMRFYJK6.mjs} +19 -11
  18. package/dist/chunk-HMRFYJK6.mjs.map +1 -0
  19. package/dist/{chunk-32W4QEJP.mjs → chunk-KFTGPFRD.mjs} +1 -1
  20. package/dist/chunk-KFTGPFRD.mjs.map +1 -0
  21. package/dist/{chunk-Z3YG4OZT.mjs → chunk-OSWV5IJB.mjs} +140 -41
  22. package/dist/chunk-OSWV5IJB.mjs.map +1 -0
  23. package/dist/{chunk-OPHK6OJN.mjs → chunk-SLDBGSC3.mjs} +2 -2
  24. package/dist/{chunk-L2PE36GQ.mjs → chunk-T2KL7VEL.mjs} +3 -3
  25. package/dist/{chunk-WDU6QXNK.mjs → chunk-UCYWGN2P.mjs} +1 -1
  26. package/dist/chunk-UCYWGN2P.mjs.map +1 -0
  27. package/dist/{chunk-65A7QIKI.mjs → chunk-UMVLB3PN.mjs} +3 -3
  28. package/dist/chunk-UMVLB3PN.mjs.map +1 -0
  29. package/dist/{chunk-VY2UYN5R.mjs → chunk-VPCFICID.mjs} +82 -3
  30. package/dist/chunk-VPCFICID.mjs.map +1 -0
  31. package/dist/{chunk-H3TE3LOV.mjs → chunk-XMFTIVJH.mjs} +2 -2
  32. package/dist/{chunk-UB5UOSHB.mjs → chunk-ZVMV3THA.mjs} +71 -2
  33. package/dist/chunk-ZVMV3THA.mjs.map +1 -0
  34. package/dist/client.cjs.map +1 -1
  35. package/dist/client.mjs +3 -3
  36. package/dist/deployment.cjs +12 -0
  37. package/dist/deployment.cjs.map +1 -1
  38. package/dist/deployment.mjs +3 -1
  39. package/dist/{devtools-GAZ7F3KL.mjs → devtools-E4YNCY5J.mjs} +4 -4
  40. package/dist/docs.cjs.map +1 -1
  41. package/dist/docs.mjs +4 -4
  42. package/dist/index.cjs +332 -58
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.mjs +28 -16
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/internal/build-runtime.cjs +159 -46
  47. package/dist/internal/build-runtime.cjs.map +1 -1
  48. package/dist/internal/build-runtime.mjs +11 -11
  49. package/dist/internal/config-runtime.cjs.map +1 -1
  50. package/dist/internal/config-runtime.mjs +3 -3
  51. package/dist/navigation.cjs.map +1 -1
  52. package/dist/navigation.mjs +3 -3
  53. package/dist/plugin.cjs +141 -34
  54. package/dist/plugin.cjs.map +1 -1
  55. package/dist/plugin.mjs +8 -8
  56. package/dist/server-action-security.cjs +23 -1
  57. package/dist/server-action-security.cjs.map +1 -1
  58. package/dist/server-action-security.mjs +1 -1
  59. package/dist/server-fn-client.cjs.map +1 -1
  60. package/dist/server-fn-client.mjs +1 -1
  61. package/dist/server-fn.cjs +140 -3
  62. package/dist/server-fn.cjs.map +1 -1
  63. package/dist/server-fn.mjs +14 -3
  64. package/dist/server-query.cjs +99 -1
  65. package/dist/server-query.cjs.map +1 -1
  66. package/dist/server-query.mjs +3 -3
  67. package/dist/server.cjs +260 -37
  68. package/dist/server.cjs.map +1 -1
  69. package/dist/server.mjs +11 -11
  70. package/dist/testing.cjs.map +1 -1
  71. package/dist/testing.mjs +3 -3
  72. package/dist/version.cjs +1 -1
  73. package/dist/version.cjs.map +1 -1
  74. package/dist/version.mjs +1 -1
  75. package/dist/vite.cjs +142 -35
  76. package/dist/vite.cjs.map +1 -1
  77. package/dist/vite.mjs +8 -8
  78. package/package.json +1 -1
  79. package/types/client.d.ts +115 -4
  80. package/dist/chunk-32W4QEJP.mjs.map +0 -1
  81. package/dist/chunk-65A7QIKI.mjs.map +0 -1
  82. package/dist/chunk-B232I2GP.mjs.map +0 -1
  83. package/dist/chunk-PFE6GMNE.mjs.map +0 -1
  84. package/dist/chunk-UB5UOSHB.mjs.map +0 -1
  85. package/dist/chunk-VY2UYN5R.mjs.map +0 -1
  86. package/dist/chunk-WDU6QXNK.mjs.map +0 -1
  87. package/dist/chunk-Z3YG4OZT.mjs.map +0 -1
  88. /package/dist/{chunk-JDEOUK5V.mjs.map → chunk-6YXKHAFU.mjs.map} +0 -0
  89. /package/dist/{chunk-Z5CQMP54.mjs.map → chunk-ARRYKOI5.mjs.map} +0 -0
  90. /package/dist/{chunk-KLA67WKG.mjs.map → chunk-B3FFOIWS.mjs.map} +0 -0
  91. /package/dist/{chunk-OPHK6OJN.mjs.map → chunk-SLDBGSC3.mjs.map} +0 -0
  92. /package/dist/{chunk-L2PE36GQ.mjs.map → chunk-T2KL7VEL.mjs.map} +0 -0
  93. /package/dist/{chunk-H3TE3LOV.mjs.map → chunk-XMFTIVJH.mjs.map} +0 -0
  94. /package/dist/{devtools-GAZ7F3KL.mjs.map → devtools-E4YNCY5J.mjs.map} +0 -0
@@ -806,6 +806,26 @@ __name(stableSerialize, "stableSerialize");
806
806
 
807
807
  // src/server-action-security.ts
808
808
  var import_node_async_hooks = require("async_hooks");
809
+
810
+ // src/server-fn-error.ts
811
+ var FARM_SERVER_FN_FAILURE_SYMBOL = /* @__PURE__ */ Symbol.for("farm.server-fn.failure");
812
+ var _ServerFnFailure = class _ServerFnFailure extends Error {
813
+ constructor(code, data, options) {
814
+ super(options.message);
815
+ this.name = "ServerFnFailure";
816
+ this.code = code;
817
+ this.data = data;
818
+ this.status = options.status;
819
+ Object.defineProperty(this, FARM_SERVER_FN_FAILURE_SYMBOL, {
820
+ value: true,
821
+ enumerable: false
822
+ });
823
+ }
824
+ };
825
+ __name(_ServerFnFailure, "ServerFnFailure");
826
+ var ServerFnFailure = _ServerFnFailure;
827
+
828
+ // src/server-action-security.ts
809
829
  var SERVER_ACTION_STORAGE_KEY = /* @__PURE__ */ Symbol.for("farm.serverActionStorage");
810
830
  var FALLBACK_ABORT_CONTROLLER_KEY = /* @__PURE__ */ Symbol.for("farm.serverActionFallbackAbortController");
811
831
  function getServerActionExecutionContext() {
@@ -858,6 +878,8 @@ function createServerFn(options) {
858
878
  throw new TypeError("createServerFn requires a handler function");
859
879
  }
860
880
  const middleware = resolveServerFnMiddleware(options.middleware);
881
+ const errors = normalizeServerFnErrors(options.errors);
882
+ const error = createServerFnErrorHandler(errors);
861
883
  const serverFn = /* @__PURE__ */ __name(async (value) => {
862
884
  const formData = isFormData(value) ? value : void 0;
863
885
  const rawInput = formData ? formDataToObject(formData) : value;
@@ -875,7 +897,7 @@ function createServerFn(options) {
875
897
  let resolvedContext = Object.freeze(/* @__PURE__ */ Object.create(null));
876
898
  const result = await runServerFnMiddleware(middleware, handlerContext, async (context) => {
877
899
  resolvedContext = context.context;
878
- return options.handler(context);
900
+ return options.handler({ ...context, error });
879
901
  });
880
902
  const parsedResult = await _parseServerFnSchema(options.output, result, "output");
881
903
  if (options.invalidates) {
@@ -905,6 +927,10 @@ function createServerFn(options) {
905
927
  value: options.output,
906
928
  enumerable: false
907
929
  },
930
+ __farmServerFnError: {
931
+ value: void 0,
932
+ enumerable: false
933
+ },
908
934
  __farmServerFnMiddleware: {
909
935
  value: middleware,
910
936
  enumerable: false
@@ -943,6 +969,78 @@ async function runServerFnMiddleware(middleware, handlerContext, handler) {
943
969
  return dispatch(0, Object.freeze(/* @__PURE__ */ Object.create(null)));
944
970
  }
945
971
  __name(runServerFnMiddleware, "runServerFnMiddleware");
972
+ function normalizeServerFnErrors(definitions) {
973
+ if (definitions === void 0) return Object.freeze({});
974
+ if (!isPlainServerFnObject(definitions)) {
975
+ throw new TypeError("createServerFn errors must be an object");
976
+ }
977
+ const normalized = /* @__PURE__ */ Object.create(null);
978
+ for (const [code, definition] of Object.entries(definitions)) {
979
+ if (!code.trim()) {
980
+ throw new TypeError("Server function error codes cannot be empty");
981
+ }
982
+ if (!definition || typeof definition !== "object") {
983
+ throw new TypeError(`Server function error "${code}" must be an object`);
984
+ }
985
+ if (!Number.isInteger(definition.status) || definition.status < 400 || definition.status > 599) {
986
+ throw new TypeError(
987
+ `Server function error "${code}" status must be an integer between 400 and 599`
988
+ );
989
+ }
990
+ if (!definition.data || typeof definition.data.parse !== "function" && typeof definition.data.safeParse !== "function") {
991
+ throw new TypeError(
992
+ `Server function error "${code}" data must provide synchronous parse() or safeParse()`
993
+ );
994
+ }
995
+ if (definition.message !== void 0 && typeof definition.message !== "string") {
996
+ throw new TypeError(`Server function error "${code}" message must be a string`);
997
+ }
998
+ normalized[code] = Object.freeze({ ...definition });
999
+ }
1000
+ return Object.freeze(normalized);
1001
+ }
1002
+ __name(normalizeServerFnErrors, "normalizeServerFnErrors");
1003
+ function createServerFnErrorHandler(definitions) {
1004
+ return ((code, data) => {
1005
+ const definition = definitions[code];
1006
+ if (!definition) {
1007
+ throw new TypeError(`Server function error "${code}" is not declared`);
1008
+ }
1009
+ const parsed = parseServerFnFailureData(code, definition.data, data);
1010
+ throw new ServerFnFailure(code, parsed, {
1011
+ status: definition.status,
1012
+ message: definition.message ?? "Server function failed"
1013
+ });
1014
+ });
1015
+ }
1016
+ __name(createServerFnErrorHandler, "createServerFnErrorHandler");
1017
+ function parseServerFnFailureData(code, schema, value) {
1018
+ if (typeof schema.safeParse === "function") {
1019
+ const result2 = schema.safeParse(value);
1020
+ if (isPromiseLike(result2)) {
1021
+ throw new TypeError(`Server function error "${code}" data schema must parse synchronously`);
1022
+ }
1023
+ return unwrapSafeParseResult(result2);
1024
+ }
1025
+ const result = schema.parse(value);
1026
+ if (isPromiseLike(result)) {
1027
+ throw new TypeError(`Server function error "${code}" data schema must parse synchronously`);
1028
+ }
1029
+ return result;
1030
+ }
1031
+ __name(parseServerFnFailureData, "parseServerFnFailureData");
1032
+ function isPlainServerFnObject(value) {
1033
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
1034
+ const prototype = Object.getPrototypeOf(value);
1035
+ return prototype === Object.prototype || prototype === null;
1036
+ }
1037
+ __name(isPlainServerFnObject, "isPlainServerFnObject");
1038
+ function isPromiseLike(value) {
1039
+ return Boolean(
1040
+ value && (typeof value === "object" || typeof value === "function") && "then" in value && typeof value.then === "function"
1041
+ );
1042
+ }
1043
+ __name(isPromiseLike, "isPromiseLike");
946
1044
  function resolveServerFnMiddleware(middleware) {
947
1045
  const resolved = [];
948
1046
  const seen = /* @__PURE__ */ new Set();