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
JavaScript
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
};