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