UNPKG

@withstudiocms/effect

Version:

Effect-TS Utilities for Astro

50 lines (49 loc) 1.63 kB
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 };