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