@withstudiocms/effect
Version:
Effect-TS Utilities for Astro
50 lines (49 loc) • 1.63 kB
JavaScript
import { Effect, Schema } from "../effect.js";
const readAPIContextJson = ({ request }) => Effect.tryPromise({
try: () => request.json(),
catch: () => new Error("Failed to parse JSON from Request")
});
const parseAPIContextJson = (context, schema) => Effect.gen(function* () {
const json = yield* readAPIContextJson(context);
if (schema) return yield* Schema.decodeUnknown(schema)(json);
return json;
}).pipe(
Effect.catchAll((error) => {
console.error("Failed to read JSON:", error);
return Effect.fail(new Error("Failed to read JSON"));
})
);
const readAPIContextFormData = ({
request
}) => Effect.tryPromise({
try: () => request.formData(),
catch: () => new Error("Failed to parse formData from Request")
});
const parseAPIContextFormDataToObject = (context, schema) => Effect.gen(function* () {
const formData = yield* readAPIContextFormData(context);
const entries = Object.fromEntries(formData.entries());
if (schema) return yield* Schema.decodeUnknown(schema)(entries);
return entries;
}).pipe(
Effect.catchAll((error) => {
console.error("Failed to read form data:", error);
return Effect.fail(new Error("Failed to read form data"));
})
);
const parseFormDataEntryToString = (formData, key) => Effect.try({
try: () => {
const value = formData.get(key);
if (typeof value !== "string") {
return null;
}
return value;
},
catch: () => new Error(`Failed to parse FormData entry for key: ${key}`)
});
export {
parseAPIContextFormDataToObject,
parseAPIContextJson,
parseFormDataEntryToString,
readAPIContextFormData,
readAPIContextJson
};