next-safe-action-query
Version:
Type-safe server actions with built-in validation for Next.js
107 lines (106 loc) • 3.49 kB
JavaScript
"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
;