UNPKG

drizzle-cube

Version:

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

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