@coursebuilder/core
Version:
Core package for Course Builder
262 lines (257 loc) • 8.66 kB
JavaScript
;
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