UNPKG

next-safe-action-query

Version:

Type-safe server actions with built-in validation for Next.js

107 lines (106 loc) 3.49 kB
"use strict"; "use client"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var index_exports = {}; __export(index_exports, { SafeActionError: () => SafeActionError, useSafeActionQuery: () => useSafeActionQuery }); module.exports = __toCommonJS(index_exports); var import_react_query = require("@tanstack/react-query"); class SafeActionError extends Error { constructor(message, type, details) { super(message); this.type = type; this.details = details; this.name = "SafeActionError"; } } function useSafeActionQuery(queryKey, action, options) { const { actionInput, onServerError, onValidationErrors, onNetworkError, onSuccess, onError, ...queryOptions } = options; return (0, import_react_query.useQuery)({ queryKey, queryFn: async () => { try { const result = await action(actionInput); if (result?.serverError) { onServerError?.(result.serverError); onError?.(new Error(result.serverError)); throw new SafeActionError(result.serverError, "server"); } if (result?.validationErrors) { const errors = result.validationErrors._errors ?? []; onValidationErrors?.(errors); onError?.(new Error(errors.join(", ") || "Validation failed")); throw new SafeActionError( errors.join(", ") || "Validation failed", "validation", result.validationErrors ); } if (result?.data === void 0 || result?.data === null) { throw new SafeActionError("No data returned from action", "server"); } onSuccess?.(result.data); return result.data; } catch (error) { if (error instanceof SafeActionError) { throw error; } const networkError = error instanceof Error ? error : new Error("Unknown error occurred"); onNetworkError?.(networkError); onError?.(networkError); throw new SafeActionError( `Network error: ${networkError.message}`, "network", networkError ); } }, retry: (failureCount, error) => { if (error instanceof SafeActionError && error.type === "validation") { return false; } if (error instanceof SafeActionError && error.type === "server") { return false; } return failureCount < 3; }, // Set reasonable defaults staleTime: 30 * 1e3, // 30 seconds default throwOnError: false, // Return errors as state by default ...queryOptions }); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SafeActionError, useSafeActionQuery }); //# sourceMappingURL=index.cjs.map