UNPKG

drizzle-cube

Version:

Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.

248 lines (247 loc) 7.17 kB
import { NextResponse as n } from "next/server"; import { d as i, f as x, a as E, b as N, c as S, h as b, S as C } from "../compiler-DdaSPwZs.js"; function j(a) { const { cubes: t, drizzle: s, schema: o, engineType: y } = a; if (!t || t.length === 0) throw new Error("At least one cube must be provided in the cubes array"); const r = new C({ drizzle: s, schema: o, engineType: y }); return t.forEach((c) => { r.registerCube(c); }), r; } function m(a, t) { const s = a.headers.get("origin"), o = {}; return t.origin && (typeof t.origin == "string" ? o["Access-Control-Allow-Origin"] = t.origin : Array.isArray(t.origin) ? s && t.origin.includes(s) && (o["Access-Control-Allow-Origin"] = s) : typeof t.origin == "function" && s && t.origin(s) && (o["Access-Control-Allow-Origin"] = s)), t.methods && (o["Access-Control-Allow-Methods"] = t.methods.join(", ")), t.allowedHeaders && (o["Access-Control-Allow-Headers"] = t.allowedHeaders.join(", ")), t.credentials && (o["Access-Control-Allow-Credentials"] = "true"), o; } function M(a) { return async function(s) { const o = m(s, a); return new Response(null, { status: 200, headers: o }); }; } function v(a) { const { extractSecurityContext: t, cors: s } = a, o = j(a); return async function(r, c) { try { let e; if (r.method === "POST") { const f = await r.json(); e = f.query || f; } else if (r.method === "GET") { const f = r.nextUrl.searchParams.get("query"); if (!f) return n.json( i("Query parameter is required", 400), { status: 400 } ); try { e = JSON.parse(f); } catch { return n.json( i("Invalid JSON in query parameter", 400), { status: 400 } ); } } else return n.json( i("Method not allowed", 405), { status: 405 } ); const l = await t(r, c), d = o.validateQuery(e); if (!d.isValid) return n.json( i(`Query validation failed: ${d.errors.join(", ")}`, 400), { status: 400 } ); const u = await o.executeMultiCubeQuery(e, l), g = x(e, u, o); return n.json(g, { headers: s ? m(r, s) : {} }); } catch (e) { return process.env.NODE_ENV !== "test" && console.error("Next.js load handler error:", e), n.json( i( e instanceof Error ? e.message : "Query execution failed", 500 ), { status: 500 } ); } }; } function p(a) { const { cors: t } = a, s = j(a); return async function(y, r) { try { const c = s.getMetadata(), e = E(c); return n.json(e, { headers: t ? m(y, t) : {} }); } catch (c) { return process.env.NODE_ENV !== "test" && console.error("Next.js meta handler error:", c), n.json( i( c instanceof Error ? c.message : "Failed to fetch metadata", 500 ), { status: 500 } ); } }; } function H(a) { const { extractSecurityContext: t, cors: s } = a, o = j(a); return async function(r, c) { try { let e; if (r.method === "POST") { const h = await r.json(); e = h.query || h; } else if (r.method === "GET") { const h = r.nextUrl.searchParams.get("query"); if (!h) return n.json( i("Query parameter is required", 400), { status: 400 } ); try { e = JSON.parse(h); } catch { return n.json( i("Invalid JSON in query parameter", 400), { status: 400 } ); } } else return n.json( i("Method not allowed", 405), { status: 405 } ); const l = await t(r, c), d = o.validateQuery(e); if (!d.isValid) return n.json( i(`Query validation failed: ${d.errors.join(", ")}`, 400), { status: 400 } ); const u = e.measures?.[0] || e.dimensions?.[0]; if (!u) return n.json( i("No measures or dimensions specified", 400), { status: 400 } ); const g = u.split(".")[0], f = await o.generateSQL(g, e, l), w = N(e, f); return n.json(w, { headers: s ? m(r, s) : {} }); } catch (e) { return process.env.NODE_ENV !== "test" && console.error("Next.js SQL handler error:", e), n.json( i( e instanceof Error ? e.message : "SQL generation failed", 500 ), { status: 500 } ); } }; } function A(a) { const { extractSecurityContext: t, cors: s } = a, o = j(a); return async function(r, c) { try { let e; if (r.method === "POST") { const u = await r.json(); e = u.query || u; } else if (r.method === "GET") { const u = r.nextUrl.searchParams.get("query"); if (!u) return n.json( { error: "Query parameter is required", valid: !1 }, { status: 400 } ); try { e = JSON.parse(u); } catch { return n.json( { error: "Invalid JSON in query parameter", valid: !1 }, { status: 400 } ); } } else return n.json( { error: "Method not allowed", valid: !1 }, { status: 405 } ); const l = await t(r, c), d = await S(e, l, o); return n.json(d, { headers: s ? m(r, s) : {} }); } catch (e) { return process.env.NODE_ENV !== "test" && console.error("Next.js dry-run handler error:", e), n.json( { error: e instanceof Error ? e.message : "Dry-run validation failed", valid: !1 }, { status: 400 } ); } }; } function R(a) { const { extractSecurityContext: t, cors: s } = a, o = j(a); return async function(r, c) { try { if (r.method !== "POST") return n.json( i("Method not allowed - use POST", 405), { status: 405 } ); const e = await r.json(), { queries: l } = e; if (!l || !Array.isArray(l)) return n.json( i('Request body must contain a "queries" array', 400), { status: 400 } ); if (l.length === 0) return n.json( i("Queries array cannot be empty", 400), { status: 400 } ); const d = await t(r, c), u = await b(l, d, o); return n.json(u, { headers: s ? m(r, s) : {} }); } catch (e) { return process.env.NODE_ENV !== "test" && console.error("Next.js batch handler error:", e), n.json( i( e instanceof Error ? e.message : "Batch execution failed", 500 ), { status: 500 } ); } }; } function q(a) { return { load: v(a), meta: p(a), sql: H(a), dryRun: A(a), batch: R(a) }; } export { R as createBatchHandler, q as createCubeHandlers, A as createDryRunHandler, v as createLoadHandler, p as createMetaHandler, M as createOptionsHandler, H as createSqlHandler };