UNPKG

drizzle-cube

Version:

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

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