UNPKG

@coursebuilder/core

Version:

Core package for Course Builder

262 lines (257 loc) 8.66 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); 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 __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; // src/lib/utils/web.ts var web_exports = {}; __export(web_exports, { UnknownAction: () => UnknownAction, parseActionAndProviderId: () => parseActionAndProviderId, toInternalRequest: () => toInternalRequest, toResponse: () => toResponse }); module.exports = __toCommonJS(web_exports); var import_cookie = require("cookie"); // src/errors.ts var _CourseBuilderError = class _CourseBuilderError extends Error { constructor(message, errorOptions) { var __super = (...args) => { super(...args); /** The error type. Used to identify the error in the logs. */ __publicField(this, "type"); /** * Determines on which page an error should be handled. Typically `signIn` errors can be handled in-page. * Default is `"error"`. * @internal */ __publicField(this, "kind"); __publicField(this, "cause"); return this; }; if (message instanceof Error) { __super(void 0, { cause: { err: message, ...message.cause, ...errorOptions } }); } else if (typeof message === "string") { if (errorOptions instanceof Error) { errorOptions = { err: errorOptions, ...errorOptions.cause }; } __super(message, errorOptions); } else { __super(void 0, message); } this.name = this.constructor.name; this.type = this.constructor.type ?? "CourseBuilderError"; this.kind = this.constructor.kind ?? "error"; Error.captureStackTrace?.(this, this.constructor); const url = `https://errors.authjs.dev#${this.type.toLowerCase()}`; this.message += `${this.message ? ". " : ""}Read more at ${url}`; } }; __name(_CourseBuilderError, "CourseBuilderError"); var CourseBuilderError = _CourseBuilderError; // src/lib/utils/actions.ts var actions = [ "webhook", "srt", "session", "subscribe-to-list", "checkout", "redeem", "prices-formatted", "subscriber", "purchases", "lookup", "claimed", "nameUpdate", "transfer", "refund", "create-magic-link" ]; function isCourseBuilderAction(action) { return actions.includes(action); } __name(isCourseBuilderAction, "isCourseBuilderAction"); // src/lib/utils/logger.ts var red = "\x1B[31m"; var yellow = "\x1B[33m"; var grey = "\x1B[38;5;246m"; var reset = "\x1B[0m"; var logger = { error(error) { const name = error instanceof CourseBuilderError ? error.type : error.name; console.error(`${red}[coursebuilder][error]${reset} ${name}: ${error.message}`); if (error.cause && typeof error.cause === "object" && "err" in error.cause && error.cause.err instanceof Error) { const { err, ...data } = error.cause; console.error(`${red}[coursebuilder][cause]${reset}:`, err.stack); if (data) console.error(`${red}[coursebuilder][details]${reset}:`, JSON.stringify(data, null, 2)); } else if (error.stack) { console.error(error.stack.replace(/.*/, "").substring(1)); } }, warn(code) { const url = `https://warnings.coursebuilder.dev#${code}`; console.warn(`${yellow}[coursebuilder][warn][${code}]${reset}`, `Read more: ${url}`); }, debug(message, metadata) { console.log(`${grey}[coursebuilder][debug]:${reset} ${message}`, JSON.stringify(metadata, null, 2)); } }; // src/lib/utils/web.ts async function getBody(req, config) { const headers = Object.fromEntries(req.headers); const isStripeWebhook = [ "stripe-signature" ].every((prop) => { return prop in headers; }); if (isStripeWebhook) { let parsedBody; const stripeProvider = config.providers.find((p) => p.id === "stripe"); parsedBody = await req.text(); stripeProvider?.options?.paymentsAdapter.verifyWebhookSignature(parsedBody, headers["stripe-signature"]); parsedBody = JSON.parse(parsedBody); return parsedBody; } if (!("body" in req) || !req.body || req.method !== "POST") return; const contentType = req.headers.get("content-type"); if (contentType?.includes("application/json")) { try { return await req.json(); } catch (e) { logger.error(e); return void 0; } } else if (contentType?.includes("application/x-www-form-urlencoded")) { const params = new URLSearchParams(await req.text()); return Object.fromEntries(params); } } __name(getBody, "getBody"); async function toInternalRequest(req, config) { try { config.basePath ?? (config.basePath = "/coursebuilder"); const url = new URL(req.url); const { action, providerId } = parseActionAndProviderId(url.pathname, config.basePath); console.debug({ url, action, providerId }); return { url, action, providerId, method: req.method, headers: Object.fromEntries(req.headers), body: req.body ? await getBody(req, config) : void 0, cookies: (0, import_cookie.parse)(req.headers.get("cookie") ?? "") ?? {}, error: url.searchParams.get("error") ?? void 0, query: Object.fromEntries(url.searchParams) }; } catch (e) { logger.error(e); logger.debug("request", req); } } __name(toInternalRequest, "toInternalRequest"); function parseActionAndProviderId(pathname, base) { const a = pathname.match(new RegExp(`^${base}(.+)`)); if (a === null) throw new UnknownAction(`Cannot parse action at ${pathname}`); const [_, actionAndProviderId] = a; const b = actionAndProviderId.replace(/^\//, "").split("/"); if (b.length !== 1 && b.length !== 2) throw new UnknownAction(`**Cannot parse action at ${pathname}`); const [action, providerId] = b; if (!isCourseBuilderAction(action)) throw new UnknownAction(`***Cannot parse action at ${pathname}`); if (providerId && ![ "webhook", "srt", "session", "subscribe-to-list", "checkout", "redeem", "subscriber", "lookup", "claimed", "nameUpdate", "transfer", "refund", "create-magic-link" ].includes(action)) throw new UnknownAction(`**** Cannot parse action at ${pathname}. add it to the list in web.ts?`); return { action, providerId }; } __name(parseActionAndProviderId, "parseActionAndProviderId"); var _UnknownAction = class _UnknownAction extends CourseBuilderError { }; __name(_UnknownAction, "UnknownAction"); __publicField(_UnknownAction, "type", "UnknownAction"); var UnknownAction = _UnknownAction; function toResponse(res) { const headers = new Headers(res.headers); res.cookies?.forEach((cookie) => { const { name, value, options } = cookie; const cookieHeader = (0, import_cookie.serialize)(name, value, options); if (headers.has("Set-Cookie")) headers.append("Set-Cookie", cookieHeader); else headers.set("Set-Cookie", cookieHeader); }); let body = res.body; if (headers.get("content-type") === "application/json") body = JSON.stringify(res.body); else if (headers.get("content-type") === "application/x-www-form-urlencoded") body = new URLSearchParams(res.body).toString(); const status = res.redirect ? 302 : res.status ?? 200; const response = new Response(body, { headers, status }); if (res.redirect) response.headers.set("Location", res.redirect); return response; } __name(toResponse, "toResponse"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { UnknownAction, parseActionAndProviderId, toInternalRequest, toResponse }); //# sourceMappingURL=web.cjs.map