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