/** * @emdash-cms/x402 -- x402 Payment Integration for Astro * * An Astro integration that provides x402 payment enforcement via * Astro.locals.x402. Supports bot-only mode using Cloudflare Bot Management. * * @example * ```ts * // astro.config.mjs * import { x402 } from "@emdash-cms/x402"; * * export default defineConfig({ * integrations: [ * x402({ * payTo: "0xYourWallet", * network: "eip155:8453", * defaultPrice: "$0.01", * botOnly: true, * }), * ], * }); * ``` * * ```astro * --- * const { x402 } = Astro.locals; * * const result = await x402.enforce(Astro.request, { price: "$0.05" }); * if (result instanceof Response) return result; * * x402.applyHeaders(result, Astro.response); * --- *
Premium content here
* ``` */ import type { AstroIntegration } from "astro"; import type { X402Config } from "./types.js"; const VIRTUAL_MODULE_ID = "virtual:x402/config"; const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID; /** * Create the x402 Astro integration. */ export function x402(config: X402Config): AstroIntegration { return { name: "@emdash-cms/x402", hooks: { "astro:config:setup": ({ addMiddleware, updateConfig }) => { // Inject the virtual module that provides config to the middleware updateConfig({ vite: { plugins: [ { name: "x402-virtual-config", resolveId(id: string) { if (id === VIRTUAL_MODULE_ID) return RESOLVED_VIRTUAL_MODULE_ID; }, load(id: string) { if (id === RESOLVED_VIRTUAL_MODULE_ID) { return `export default ${JSON.stringify(config)}`; } }, }, ], }, }); // Register the middleware that puts the enforcer on locals addMiddleware({ entrypoint: "@emdash-cms/x402/middleware", order: "pre", }); }, }, }; } // Re-export types for convenience export type { EnforceOptions, EnforceResult, Network, Price, X402Config, X402Enforcer, } from "./types.js";