drizzle-cube 0.2.24 → 0.2.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/adapters/compiler-C6JQHGrF.cjs +22 -0
  2. package/dist/adapters/{compiler-DkzdLcxq.js → compiler-Ddwn99Ja.js} +1419 -1287
  3. package/dist/adapters/express/index.cjs +1 -1
  4. package/dist/adapters/express/index.d.ts +6 -1
  5. package/dist/adapters/express/index.js +22 -20
  6. package/dist/adapters/fastify/index.cjs +1 -1
  7. package/dist/adapters/fastify/index.d.ts +6 -1
  8. package/dist/adapters/fastify/index.js +18 -16
  9. package/dist/adapters/hono/index.cjs +1 -1
  10. package/dist/adapters/hono/index.d.ts +6 -1
  11. package/dist/adapters/hono/index.js +87 -85
  12. package/dist/adapters/nextjs/index.cjs +1 -1
  13. package/dist/adapters/nextjs/index.d.ts +6 -1
  14. package/dist/adapters/nextjs/index.js +64 -63
  15. package/dist/adapters/utils.d.ts +18 -0
  16. package/dist/client/charts.js +2 -2
  17. package/dist/client/chunks/{charts-DboFPJFN.js → charts-BsXrHSCm.js} +32 -32
  18. package/dist/client/chunks/{charts-DboFPJFN.js.map → charts-BsXrHSCm.js.map} +1 -1
  19. package/dist/client/chunks/{charts--hFH-bsu.js → charts-BvLb1eub.js} +710 -703
  20. package/dist/client/chunks/charts-BvLb1eub.js.map +1 -0
  21. package/dist/client/chunks/{components-D7wTB56l.js → components-DhA8GIUY.js} +6019 -5299
  22. package/dist/client/chunks/components-DhA8GIUY.js.map +1 -0
  23. package/dist/client/chunks/core-DcwgBEzv.js +6 -0
  24. package/dist/client/chunks/core-DcwgBEzv.js.map +1 -0
  25. package/dist/client/chunks/{index-yc7cf-yE.js → index-9x0R-Fme.js} +2 -2
  26. package/dist/client/chunks/{index-yc7cf-yE.js.map → index-9x0R-Fme.js.map} +1 -1
  27. package/dist/client/components/AnalysisBuilder/AnalysisQueryPanel.d.ts +3 -2
  28. package/dist/client/components/AnalysisBuilder/types.d.ts +63 -15
  29. package/dist/client/components/DashboardPortletCard.d.ts +12 -0
  30. package/dist/client/components/DebugModal.d.ts +7 -1
  31. package/dist/client/components.js +2 -2
  32. package/dist/client/hooks/useMultiCubeQuery.d.ts +36 -0
  33. package/dist/client/hooks.js +2 -2
  34. package/dist/client/icons.js +1 -1
  35. package/dist/client/index.d.ts +7 -1
  36. package/dist/client/index.js +70 -52
  37. package/dist/client/providers.js +1 -1
  38. package/dist/client/styles.css +1 -1
  39. package/dist/client/types.d.ts +32 -0
  40. package/dist/client/utils/multiQueryUtils.d.ts +86 -0
  41. package/dist/client/utils/multiQueryValidation.d.ts +69 -0
  42. package/dist/client/utils/shareUtils.d.ts +3 -3
  43. package/dist/client-bundle-stats.html +1 -1
  44. package/dist/server/index.cjs +17 -17
  45. package/dist/server/index.d.ts +326 -1
  46. package/dist/server/index.js +2429 -2148
  47. package/package.json +1 -1
  48. package/dist/adapters/compiler-BFqMax9M.cjs +0 -22
  49. package/dist/client/chunks/charts--hFH-bsu.js.map +0 -1
  50. package/dist/client/chunks/components-D7wTB56l.js.map +0 -1
  51. package/dist/client/chunks/core-PxWXpBbW.js +0 -6
  52. package/dist/client/chunks/core-PxWXpBbW.js.map +0 -1
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("next/server"),c=require("../compiler-BFqMax9M.cjs");function p(s){const{cubes:t,drizzle:o,schema:a,engineType:f}=s;if(!t||t.length===0)throw new Error("At least one cube must be provided in the cubes array");const r=new c.SemanticLayerCompiler({drizzle:o,schema:a,engineType:f});return t.forEach(i=>{r.registerCube(i)}),r}function m(s,t){const o=s.headers.get("origin"),a={};return t.origin&&(typeof t.origin=="string"?a["Access-Control-Allow-Origin"]=t.origin:Array.isArray(t.origin)?o&&t.origin.includes(o)&&(a["Access-Control-Allow-Origin"]=o):typeof t.origin=="function"&&o&&t.origin(o)&&(a["Access-Control-Allow-Origin"]=o)),t.methods&&(a["Access-Control-Allow-Methods"]=t.methods.join(", ")),t.allowedHeaders&&(a["Access-Control-Allow-Headers"]=t.allowedHeaders.join(", ")),t.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:t,cors:o}=s,a=p(s);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 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 t(r,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(r,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:t}=s,o=p(s);return async function(f,r){try{const i=o.getMetadata(),e=c.formatMetaResponse(i);return n.NextResponse.json(e,{headers:t?m(f,t):{}})}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:t,cors:o}=s,a=p(s);return async function(r,i){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.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 t(r,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(r,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:t,cors:o}=s,a=p(s);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 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 t(r,i),d=await c.handleDryRun(e,u,a);return n.NextResponse.json(d,{headers:o?m(r,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:t,cors:o}=s,a=p(s);return async function(r,i){try{if(r.method!=="POST")return n.NextResponse.json(c.formatErrorResponse("Method not allowed - use POST",405),{status:405});const e=await r.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 t(r,i),l=await c.handleBatchRequest(u,d,a);return n.NextResponse.json(l,{headers:o?m(r,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;
1
+ "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;
@@ -1,5 +1,5 @@
1
1
  import { NextRequest } from 'next/server';
2
- import { SemanticQuery, SecurityContext, DatabaseExecutor, DrizzleDatabase, Cube } from '../../server';
2
+ import { SemanticQuery, SecurityContext, DatabaseExecutor, DrizzleDatabase, Cube, CacheConfig } from '../../server';
3
3
  import { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
4
4
  import { MySql2Database } from 'drizzle-orm/mysql2';
5
5
  import { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
@@ -75,6 +75,11 @@ export interface NextAdapterOptions {
75
75
  * 'edge' for Edge Runtime, 'nodejs' for Node.js Runtime
76
76
  */
77
77
  runtime?: 'edge' | 'nodejs';
78
+ /**
79
+ * Cache configuration for query result caching
80
+ * When provided, query results will be cached using the specified provider
81
+ */
82
+ cache?: CacheConfig;
78
83
  }
79
84
  export interface RouteContext {
80
85
  params?: Record<string, string | string[]>;
@@ -1,21 +1,22 @@
1
1
  import { NextResponse as a } from "next/server";
2
- import { d as i, f as x, a as N, b as S, c as b, h as C, S as E } from "../compiler-DkzdLcxq.js";
2
+ import { d as c, f as x, a as N, b as S, c as b, h as C, S as E } from "../compiler-Ddwn99Ja.js";
3
3
  function j(n) {
4
- const { cubes: t, drizzle: s, schema: o, engineType: y } = n;
5
- if (!t || t.length === 0)
4
+ const { cubes: r, drizzle: s, schema: o, engineType: y, cache: t } = n;
5
+ if (!r || r.length === 0)
6
6
  throw new Error("At least one cube must be provided in the cubes array");
7
- const r = new E({
7
+ const i = new E({
8
8
  drizzle: s,
9
9
  schema: o,
10
- engineType: y
10
+ engineType: y,
11
+ cache: t
11
12
  });
12
- return t.forEach((c) => {
13
- r.registerCube(c);
14
- }), r;
13
+ return r.forEach((e) => {
14
+ i.registerCube(e);
15
+ }), i;
15
16
  }
16
- function m(n, t) {
17
+ function m(n, r) {
17
18
  const s = n.headers.get("origin"), o = {};
18
- 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;
19
+ return r.origin && (typeof r.origin == "string" ? o["Access-Control-Allow-Origin"] = r.origin : Array.isArray(r.origin) ? s && r.origin.includes(s) && (o["Access-Control-Allow-Origin"] = s) : typeof r.origin == "function" && s && r.origin(s) && (o["Access-Control-Allow-Origin"] = s)), r.methods && (o["Access-Control-Allow-Methods"] = r.methods.join(", ")), r.allowedHeaders && (o["Access-Control-Allow-Headers"] = r.allowedHeaders.join(", ")), r.credentials && (o["Access-Control-Allow-Credentials"] = "true"), o;
19
20
  }
20
21
  function P(n) {
21
22
  return async function(s) {
@@ -27,46 +28,46 @@ function P(n) {
27
28
  };
28
29
  }
29
30
  function v(n) {
30
- const { extractSecurityContext: t, cors: s } = n, o = j(n);
31
- return async function(r, c) {
31
+ const { extractSecurityContext: r, cors: s } = n, o = j(n);
32
+ return async function(t, i) {
32
33
  try {
33
34
  let e;
34
- if (r.method === "POST") {
35
- const f = await r.json();
35
+ if (t.method === "POST") {
36
+ const f = await t.json();
36
37
  e = f.query || f;
37
- } else if (r.method === "GET") {
38
- const f = r.nextUrl.searchParams.get("query");
38
+ } else if (t.method === "GET") {
39
+ const f = t.nextUrl.searchParams.get("query");
39
40
  if (!f)
40
41
  return a.json(
41
- i("Query parameter is required", 400),
42
+ c("Query parameter is required", 400),
42
43
  { status: 400 }
43
44
  );
44
45
  try {
45
46
  e = JSON.parse(f);
46
47
  } catch {
47
48
  return a.json(
48
- i("Invalid JSON in query parameter", 400),
49
+ c("Invalid JSON in query parameter", 400),
49
50
  { status: 400 }
50
51
  );
51
52
  }
52
53
  } else
53
54
  return a.json(
54
- i("Method not allowed", 405),
55
+ c("Method not allowed", 405),
55
56
  { status: 405 }
56
57
  );
57
- const l = await t(r, c), d = o.validateQuery(e);
58
+ const l = await r(t, i), d = o.validateQuery(e);
58
59
  if (!d.isValid)
59
60
  return a.json(
60
- i(`Query validation failed: ${d.errors.join(", ")}`, 400),
61
+ c(`Query validation failed: ${d.errors.join(", ")}`, 400),
61
62
  { status: 400 }
62
63
  );
63
64
  const u = await o.executeMultiCubeQuery(e, l), g = x(e, u, o);
64
65
  return a.json(g, {
65
- headers: s ? m(r, s) : {}
66
+ headers: s ? m(t, s) : {}
66
67
  });
67
68
  } catch (e) {
68
69
  return process.env.NODE_ENV !== "test" && console.error("Next.js load handler error:", e), a.json(
69
- i(
70
+ c(
70
71
  e instanceof Error ? e.message : "Query execution failed",
71
72
  500
72
73
  ),
@@ -76,17 +77,17 @@ function v(n) {
76
77
  };
77
78
  }
78
79
  function H(n) {
79
- const { cors: t } = n, s = j(n);
80
- return async function(y, r) {
80
+ const { cors: r } = n, s = j(n);
81
+ return async function(y, t) {
81
82
  try {
82
- const c = s.getMetadata(), e = N(c);
83
+ const i = s.getMetadata(), e = N(i);
83
84
  return a.json(e, {
84
- headers: t ? m(y, t) : {}
85
+ headers: r ? m(y, r) : {}
85
86
  });
86
- } catch (c) {
87
- return process.env.NODE_ENV !== "test" && console.error("Next.js meta handler error:", c), a.json(
88
- i(
89
- c instanceof Error ? c.message : "Failed to fetch metadata",
87
+ } catch (i) {
88
+ return process.env.NODE_ENV !== "test" && console.error("Next.js meta handler error:", i), a.json(
89
+ c(
90
+ i instanceof Error ? i.message : "Failed to fetch metadata",
90
91
  500
91
92
  ),
92
93
  { status: 500 }
@@ -95,52 +96,52 @@ function H(n) {
95
96
  };
96
97
  }
97
98
  function A(n) {
98
- const { extractSecurityContext: t, cors: s } = n, o = j(n);
99
- return async function(r, c) {
99
+ const { extractSecurityContext: r, cors: s } = n, o = j(n);
100
+ return async function(t, i) {
100
101
  try {
101
102
  let e;
102
- if (r.method === "POST") {
103
- const h = await r.json();
103
+ if (t.method === "POST") {
104
+ const h = await t.json();
104
105
  e = h.query || h;
105
- } else if (r.method === "GET") {
106
- const h = r.nextUrl.searchParams.get("query");
106
+ } else if (t.method === "GET") {
107
+ const h = t.nextUrl.searchParams.get("query");
107
108
  if (!h)
108
109
  return a.json(
109
- i("Query parameter is required", 400),
110
+ c("Query parameter is required", 400),
110
111
  { status: 400 }
111
112
  );
112
113
  try {
113
114
  e = JSON.parse(h);
114
115
  } catch {
115
116
  return a.json(
116
- i("Invalid JSON in query parameter", 400),
117
+ c("Invalid JSON in query parameter", 400),
117
118
  { status: 400 }
118
119
  );
119
120
  }
120
121
  } else
121
122
  return a.json(
122
- i("Method not allowed", 405),
123
+ c("Method not allowed", 405),
123
124
  { status: 405 }
124
125
  );
125
- const l = await t(r, c), d = o.validateQuery(e);
126
+ const l = await r(t, i), d = o.validateQuery(e);
126
127
  if (!d.isValid)
127
128
  return a.json(
128
- i(`Query validation failed: ${d.errors.join(", ")}`, 400),
129
+ c(`Query validation failed: ${d.errors.join(", ")}`, 400),
129
130
  { status: 400 }
130
131
  );
131
132
  const u = e.measures?.[0] || e.dimensions?.[0];
132
133
  if (!u)
133
134
  return a.json(
134
- i("No measures or dimensions specified", 400),
135
+ c("No measures or dimensions specified", 400),
135
136
  { status: 400 }
136
137
  );
137
138
  const g = u.split(".")[0], f = await o.generateSQL(g, e, l), w = S(e, f);
138
139
  return a.json(w, {
139
- headers: s ? m(r, s) : {}
140
+ headers: s ? m(t, s) : {}
140
141
  });
141
142
  } catch (e) {
142
143
  return process.env.NODE_ENV !== "test" && console.error("Next.js SQL handler error:", e), a.json(
143
- i(
144
+ c(
144
145
  e instanceof Error ? e.message : "SQL generation failed",
145
146
  500
146
147
  ),
@@ -150,15 +151,15 @@ function A(n) {
150
151
  };
151
152
  }
152
153
  function p(n) {
153
- const { extractSecurityContext: t, cors: s } = n, o = j(n);
154
- return async function(r, c) {
154
+ const { extractSecurityContext: r, cors: s } = n, o = j(n);
155
+ return async function(t, i) {
155
156
  try {
156
157
  let e;
157
- if (r.method === "POST") {
158
- const u = await r.json();
158
+ if (t.method === "POST") {
159
+ const u = await t.json();
159
160
  e = u.query || u;
160
- } else if (r.method === "GET") {
161
- const u = r.nextUrl.searchParams.get("query");
161
+ } else if (t.method === "GET") {
162
+ const u = t.nextUrl.searchParams.get("query");
162
163
  if (!u)
163
164
  return a.json(
164
165
  { error: "Query parameter is required", valid: !1 },
@@ -177,9 +178,9 @@ function p(n) {
177
178
  { error: "Method not allowed", valid: !1 },
178
179
  { status: 405 }
179
180
  );
180
- const l = await t(r, c), d = await b(e, l, o);
181
+ const l = await r(t, i), d = await b(e, l, o);
181
182
  return a.json(d, {
182
- headers: s ? m(r, s) : {}
183
+ headers: s ? m(t, s) : {}
183
184
  });
184
185
  } catch (e) {
185
186
  return process.env.NODE_ENV !== "test" && console.error("Next.js dry-run handler error:", e), a.json(
@@ -193,32 +194,32 @@ function p(n) {
193
194
  };
194
195
  }
195
196
  function R(n) {
196
- const { extractSecurityContext: t, cors: s } = n, o = j(n);
197
- return async function(r, c) {
197
+ const { extractSecurityContext: r, cors: s } = n, o = j(n);
198
+ return async function(t, i) {
198
199
  try {
199
- if (r.method !== "POST")
200
+ if (t.method !== "POST")
200
201
  return a.json(
201
- i("Method not allowed - use POST", 405),
202
+ c("Method not allowed - use POST", 405),
202
203
  { status: 405 }
203
204
  );
204
- const e = await r.json(), { queries: l } = e;
205
+ const e = await t.json(), { queries: l } = e;
205
206
  if (!l || !Array.isArray(l))
206
207
  return a.json(
207
- i('Request body must contain a "queries" array', 400),
208
+ c('Request body must contain a "queries" array', 400),
208
209
  { status: 400 }
209
210
  );
210
211
  if (l.length === 0)
211
212
  return a.json(
212
- i("Queries array cannot be empty", 400),
213
+ c("Queries array cannot be empty", 400),
213
214
  { status: 400 }
214
215
  );
215
- const d = await t(r, c), u = await C(l, d, o);
216
+ const d = await r(t, i), u = await C(l, d, o);
216
217
  return a.json(u, {
217
- headers: s ? m(r, s) : {}
218
+ headers: s ? m(t, s) : {}
218
219
  });
219
220
  } catch (e) {
220
221
  return process.env.NODE_ENV !== "test" && console.error("Next.js batch handler error:", e), a.json(
221
- i(
222
+ c(
222
223
  e instanceof Error ? e.message : "Batch execution failed",
223
224
  500
224
225
  ),
@@ -66,9 +66,21 @@ export declare function handleDryRun(query: SemanticQuery, securityContext: Secu
66
66
  export declare function formatCubeResponse(query: SemanticQuery, result: {
67
67
  data: any[];
68
68
  annotation?: any;
69
+ cache?: {
70
+ hit: true;
71
+ cachedAt: string;
72
+ ttlMs: number;
73
+ ttlRemainingMs: number;
74
+ };
69
75
  }, semanticLayer: SemanticLayerCompiler): {
70
76
  queryType: string;
71
77
  results: {
78
+ cache?: {
79
+ hit: true;
80
+ cachedAt: string;
81
+ ttlMs: number;
82
+ ttlRemainingMs: number;
83
+ } | undefined;
72
84
  query: SemanticQuery;
73
85
  lastRefreshTime: string;
74
86
  usedPreAggregations: {};
@@ -136,6 +148,12 @@ export declare function handleBatchRequest(queries: SemanticQuery[], securityCon
136
148
  results: ({
137
149
  queryType: string;
138
150
  results: {
151
+ cache?: {
152
+ hit: true;
153
+ cachedAt: string;
154
+ ttlMs: number;
155
+ ttlRemainingMs: number;
156
+ } | undefined;
139
157
  query: SemanticQuery;
140
158
  lastRefreshTime: string;
141
159
  usedPreAggregations: {};
@@ -1,5 +1,5 @@
1
- import { L as s, r as t, f as C, g as e, k as h, l as o, m as R, i, q as l, p as c, n as f, o as g, a as n, u as d } from "./chunks/charts-DboFPJFN.js";
2
- import { H as A, J as T, G as L, N as O, I as S, A as y, B as I, z as m, P as E, R as _, E as B, S as G, F as H } from "./chunks/charts--hFH-bsu.js";
1
+ import { L as s, r as t, f as C, g as e, k as h, l as o, m as R, i, q as l, p as c, n as f, o as g, a as n, u as d } from "./chunks/charts-BsXrHSCm.js";
2
+ import { H as A, J as T, G as L, N as O, I as S, A as y, B as I, z as m, P as E, R as _, E as B, S as G, F as H } from "./chunks/charts-BvLb1eub.js";
3
3
  export {
4
4
  A as CHART_COLORS,
5
5
  T as CHART_MARGINS,
@@ -1,22 +1,22 @@
1
1
  import { jsx as u } from "react/jsx-runtime";
2
2
  import { Suspense as C, lazy as g, useState as c, useEffect as y } from "react";
3
- import "./charts--hFH-bsu.js";
3
+ import "./charts-BvLb1eub.js";
4
4
  const p = /* @__PURE__ */ new Map(), l = {
5
- bar: () => import("./charts--hFH-bsu.js").then((t) => t.al),
6
- line: () => import("./charts--hFH-bsu.js").then((t) => t.am),
7
- area: () => import("./charts--hFH-bsu.js").then((t) => t.an),
8
- pie: () => import("./charts--hFH-bsu.js").then((t) => t.ao),
9
- scatter: () => import("./charts--hFH-bsu.js").then((t) => t.ap),
10
- radar: () => import("./charts--hFH-bsu.js").then((t) => t.aq),
11
- radialBar: () => import("./charts--hFH-bsu.js").then((t) => t.ar),
12
- treemap: () => import("./charts--hFH-bsu.js").then((t) => t.as),
13
- bubble: () => import("./charts--hFH-bsu.js").then((t) => t.at),
14
- table: () => import("./charts--hFH-bsu.js").then((t) => t.au),
15
- activityGrid: () => import("./charts--hFH-bsu.js").then((t) => t.av),
16
- kpiNumber: () => import("./charts--hFH-bsu.js").then((t) => t.aw),
17
- kpiDelta: () => import("./charts--hFH-bsu.js").then((t) => t.ax),
18
- kpiText: () => import("./charts--hFH-bsu.js").then((t) => t.ay),
19
- markdown: () => import("./charts--hFH-bsu.js").then((t) => t.az)
5
+ bar: () => import("./charts-BvLb1eub.js").then((t) => t.al),
6
+ line: () => import("./charts-BvLb1eub.js").then((t) => t.am),
7
+ area: () => import("./charts-BvLb1eub.js").then((t) => t.an),
8
+ pie: () => import("./charts-BvLb1eub.js").then((t) => t.ao),
9
+ scatter: () => import("./charts-BvLb1eub.js").then((t) => t.ap),
10
+ radar: () => import("./charts-BvLb1eub.js").then((t) => t.aq),
11
+ radialBar: () => import("./charts-BvLb1eub.js").then((t) => t.ar),
12
+ treemap: () => import("./charts-BvLb1eub.js").then((t) => t.as),
13
+ bubble: () => import("./charts-BvLb1eub.js").then((t) => t.at),
14
+ table: () => import("./charts-BvLb1eub.js").then((t) => t.au),
15
+ activityGrid: () => import("./charts-BvLb1eub.js").then((t) => t.av),
16
+ kpiNumber: () => import("./charts-BvLb1eub.js").then((t) => t.aw),
17
+ kpiDelta: () => import("./charts-BvLb1eub.js").then((t) => t.ax),
18
+ kpiText: () => import("./charts-BvLb1eub.js").then((t) => t.ay),
19
+ markdown: () => import("./charts-BvLb1eub.js").then((t) => t.az)
20
20
  };
21
21
  function b(t) {
22
22
  if (!p.has(t)) {
@@ -92,21 +92,21 @@ function G(t, e) {
92
92
  return e[t] || f;
93
93
  }
94
94
  const d = {
95
- bar: () => import("./charts--hFH-bsu.js").then((t) => t.a6),
96
- line: () => import("./charts--hFH-bsu.js").then((t) => t.a7),
97
- area: () => import("./charts--hFH-bsu.js").then((t) => t.a8),
98
- pie: () => import("./charts--hFH-bsu.js").then((t) => t.a9),
99
- scatter: () => import("./charts--hFH-bsu.js").then((t) => t.aa),
100
- radar: () => import("./charts--hFH-bsu.js").then((t) => t.ac),
101
- radialBar: () => import("./charts--hFH-bsu.js").then((t) => t.ad),
102
- treemap: () => import("./charts--hFH-bsu.js").then((t) => t.ae),
103
- bubble: () => import("./charts--hFH-bsu.js").then((t) => t.ab),
104
- table: () => import("./charts--hFH-bsu.js").then((t) => t.af),
105
- activityGrid: () => import("./charts--hFH-bsu.js").then((t) => t.ag),
106
- kpiNumber: () => import("./charts--hFH-bsu.js").then((t) => t.ah),
107
- kpiDelta: () => import("./charts--hFH-bsu.js").then((t) => t.ai),
108
- kpiText: () => import("./charts--hFH-bsu.js").then((t) => t.aj),
109
- markdown: () => import("./charts--hFH-bsu.js").then((t) => t.ak)
95
+ bar: () => import("./charts-BvLb1eub.js").then((t) => t.a6),
96
+ line: () => import("./charts-BvLb1eub.js").then((t) => t.a7),
97
+ area: () => import("./charts-BvLb1eub.js").then((t) => t.a8),
98
+ pie: () => import("./charts-BvLb1eub.js").then((t) => t.a9),
99
+ scatter: () => import("./charts-BvLb1eub.js").then((t) => t.aa),
100
+ radar: () => import("./charts-BvLb1eub.js").then((t) => t.ac),
101
+ radialBar: () => import("./charts-BvLb1eub.js").then((t) => t.ad),
102
+ treemap: () => import("./charts-BvLb1eub.js").then((t) => t.ae),
103
+ bubble: () => import("./charts-BvLb1eub.js").then((t) => t.ab),
104
+ table: () => import("./charts-BvLb1eub.js").then((t) => t.af),
105
+ activityGrid: () => import("./charts-BvLb1eub.js").then((t) => t.ag),
106
+ kpiNumber: () => import("./charts-BvLb1eub.js").then((t) => t.ah),
107
+ kpiDelta: () => import("./charts-BvLb1eub.js").then((t) => t.ai),
108
+ kpiText: () => import("./charts-BvLb1eub.js").then((t) => t.aj),
109
+ markdown: () => import("./charts-BvLb1eub.js").then((t) => t.ak)
110
110
  }, k = {
111
111
  bar: "barChartConfig",
112
112
  line: "lineChartConfig",
@@ -274,4 +274,4 @@ export {
274
274
  q as u,
275
275
  Y as v
276
276
  };
277
- //# sourceMappingURL=charts-DboFPJFN.js.map
277
+ //# sourceMappingURL=charts-BsXrHSCm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"charts-DboFPJFN.js","sources":["../../../src/client/charts/ChartLoader.tsx","../../../src/client/charts/chartConfigs.ts","../../../src/client/charts/lazyChartConfigRegistry.ts","../../../src/client/utils/index.ts"],"sourcesContent":["/**\n * Lazy Chart Loader\n *\n * Provides React.lazy-based dynamic loading for chart components.\n * This enables code splitting - each chart type loads only when needed.\n */\n\nimport { lazy, Suspense, ComponentType, ReactNode, LazyExoticComponent } from 'react'\nimport type { ChartType, ChartProps } from '../types'\n\n// Type for lazy-loaded chart components\ntype LazyChartComponent = ComponentType<ChartProps>\n\n// Chart loader cache to prevent re-creating lazy components\nconst chartLoaderCache = new Map<ChartType, LazyExoticComponent<LazyChartComponent>>()\n\n// Dynamic import functions for each chart type\nconst chartImportMap: Record<ChartType, () => Promise<{ default: LazyChartComponent }>> = {\n bar: () => import('../components/charts/BarChart'),\n line: () => import('../components/charts/LineChart'),\n area: () => import('../components/charts/AreaChart'),\n pie: () => import('../components/charts/PieChart'),\n scatter: () => import('../components/charts/ScatterChart'),\n radar: () => import('../components/charts/RadarChart'),\n radialBar: () => import('../components/charts/RadialBarChart'),\n treemap: () => import('../components/charts/TreeMapChart'),\n bubble: () => import('../components/charts/BubbleChart'),\n table: () => import('../components/charts/DataTable'),\n activityGrid: () => import('../components/charts/ActivityGridChart'),\n kpiNumber: () => import('../components/charts/KpiNumber'),\n kpiDelta: () => import('../components/charts/KpiDelta'),\n kpiText: () => import('../components/charts/KpiText'),\n markdown: () => import('../components/charts/MarkdownChart'),\n}\n\n/**\n * Get or create a lazy component for a chart type\n */\nfunction getLazyChart(chartType: ChartType): LazyExoticComponent<LazyChartComponent> {\n if (!chartLoaderCache.has(chartType)) {\n const importFn = chartImportMap[chartType]\n if (!importFn) {\n throw new Error(`Unknown chart type: ${chartType}`)\n }\n chartLoaderCache.set(chartType, lazy(importFn))\n }\n return chartLoaderCache.get(chartType)!\n}\n\n/**\n * Check if a chart type is supported\n */\nexport function isValidChartType(chartType: string): chartType is ChartType {\n return chartType in chartImportMap\n}\n\n// Props for the LazyChart wrapper\nexport interface LazyChartProps extends ChartProps {\n chartType: ChartType\n fallback?: ReactNode\n}\n\n/**\n * Default loading placeholder for charts\n */\nfunction DefaultChartFallback({ height }: { height?: string | number }) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height: typeof height === 'number' ? `${height}px` : height || '200px' }}\n >\n <div className=\"animate-pulse bg-dc-surface-secondary rounded w-full h-full min-h-[100px]\" />\n </div>\n )\n}\n\n/**\n * Lazy Chart Component\n *\n * Renders a chart component with React.lazy dynamic loading.\n * The chart type determines which chart component is loaded.\n *\n * @example\n * ```tsx\n * <LazyChart\n * chartType=\"bar\"\n * data={chartData}\n * chartConfig={{ yAxis: ['value'] }}\n * height={300}\n * />\n * ```\n */\nexport function LazyChart({\n chartType,\n fallback,\n height,\n ...chartProps\n}: LazyChartProps) {\n const ChartComponent = getLazyChart(chartType)\n\n return (\n <Suspense fallback={fallback ?? <DefaultChartFallback height={height} />}>\n <ChartComponent height={height} {...chartProps} />\n </Suspense>\n )\n}\n\n/**\n * Preload a chart type\n *\n * Triggers the dynamic import without rendering.\n * Useful for prefetching charts that will likely be needed.\n *\n * @example\n * ```tsx\n * // Preload bar chart on hover\n * onMouseEnter={() => preloadChart('bar')}\n * ```\n */\nexport function preloadChart(chartType: ChartType): void {\n const importFn = chartImportMap[chartType]\n if (importFn) {\n importFn()\n }\n}\n\n/**\n * Preload multiple chart types\n *\n * @example\n * ```tsx\n * // Preload common charts on app init\n * useEffect(() => {\n * preloadCharts(['bar', 'line', 'pie'])\n * }, [])\n * ```\n */\nexport function preloadCharts(chartTypes: ChartType[]): void {\n chartTypes.forEach(preloadChart)\n}\n\n/**\n * Get all available chart types\n */\nexport function getAvailableChartTypes(): ChartType[] {\n return Object.keys(chartImportMap) as ChartType[]\n}\n","import { ComponentType } from 'react'\n\n/**\n * Configuration for a single axis drop zone in the chart configuration UI\n */\nexport interface AxisDropZoneConfig {\n /** The key to store this field in chartConfig (e.g., 'xAxis', 'yAxis', 'sizeField') */\n key: string\n \n /** Display label for the drop zone */\n label: string\n \n /** Optional description/help text shown below the label */\n description?: string\n \n /** Whether at least one field is required in this drop zone */\n mandatory?: boolean\n \n /** Maximum number of items allowed in this drop zone */\n maxItems?: number\n \n /** Which field types this drop zone accepts */\n acceptTypes?: ('dimension' | 'timeDimension' | 'measure')[]\n \n /** Optional icon component to display */\n icon?: ComponentType<{ className?: string }>\n\n /** Placeholder text when drop zone is empty */\n emptyText?: string\n\n /** Enable L/R axis toggle for items in this drop zone (for dual Y-axis support) */\n enableDualAxis?: boolean\n}\n\n/**\n * Configuration for a single display option\n */\nexport interface DisplayOptionConfig {\n /** The key to store this field in displayConfig */\n key: string\n \n /** Display label for the option */\n label: string\n \n /** Type of input control to render */\n type: 'boolean' | 'string' | 'number' | 'select' | 'color' | 'paletteColor' | 'axisFormat'\n \n /** Default value for the option */\n defaultValue?: any\n \n /** Placeholder text for string/number inputs */\n placeholder?: string\n \n /** Options for select type */\n options?: Array<{ value: any; label: string }>\n \n /** Help text shown below the input */\n description?: string\n \n /** Minimum value for number inputs */\n min?: number\n \n /** Maximum value for number inputs */\n max?: number\n \n /** Step value for number inputs */\n step?: number\n}\n\n/**\n * Complete configuration for a chart type\n */\nexport interface ChartTypeConfig {\n /** Configuration for each drop zone */\n dropZones: AxisDropZoneConfig[]\n \n /** Simple display options (backward compatibility) - rendered as boolean checkboxes */\n displayOptions?: string[]\n \n /** Structured display options with metadata for different input types */\n displayOptionsConfig?: DisplayOptionConfig[]\n \n /** Optional custom validation function */\n validate?: (config: any) => { isValid: boolean; message?: string }\n \n /** Icon component for the chart type */\n icon?: ComponentType<{ className?: string }>\n \n /** Brief description of the chart */\n description?: string\n \n /** When to use this chart type */\n useCase?: string\n \n /** Whether this chart type skips query requirements (for content-based charts like markdown) */\n skipQuery?: boolean\n}\n\n/**\n * Registry of all chart type configurations\n */\nexport interface ChartConfigRegistry {\n [chartType: string]: ChartTypeConfig\n}\n\n/**\n * Default configuration for charts without specific requirements\n */\nexport const defaultChartConfig: ChartTypeConfig = {\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for values or dimensions for series',\n mandatory: false,\n acceptTypes: ['measure', 'dimension'],\n emptyText: 'Drop measures or dimensions here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}\n\n/**\n * Helper function to get configuration for a chart type\n */\nexport function getChartConfig(chartType: string, registry: ChartConfigRegistry): ChartTypeConfig {\n return registry[chartType] || defaultChartConfig\n}","/**\n * Lazy Chart Config Registry\n *\n * Provides async loading for chart configurations.\n * This enables code splitting - each chart config loads only when needed.\n */\n\nimport { useState, useEffect } from 'react'\nimport type { ChartType } from '../types'\nimport type { ChartTypeConfig, ChartConfigRegistry } from './chartConfigs'\nimport { defaultChartConfig } from './chartConfigs'\n\n// Config import map - lazy imports for each chart config\nconst configImportMap: Record<ChartType, () => Promise<{ [key: string]: ChartTypeConfig }>> = {\n bar: () => import('../components/charts/BarChart.config'),\n line: () => import('../components/charts/LineChart.config'),\n area: () => import('../components/charts/AreaChart.config'),\n pie: () => import('../components/charts/PieChart.config'),\n scatter: () => import('../components/charts/ScatterChart.config'),\n radar: () => import('../components/charts/RadarChart.config'),\n radialBar: () => import('../components/charts/RadialBarChart.config'),\n treemap: () => import('../components/charts/TreeMapChart.config'),\n bubble: () => import('../components/charts/BubbleChart.config'),\n table: () => import('../components/charts/DataTable.config'),\n activityGrid: () => import('../components/charts/ActivityGridChart.config'),\n kpiNumber: () => import('../components/charts/KpiNumber.config'),\n kpiDelta: () => import('../components/charts/KpiDelta.config'),\n kpiText: () => import('../components/charts/KpiText.config'),\n markdown: () => import('../components/charts/MarkdownChart.config'),\n}\n\n// Map from chart type to expected export name\nconst configExportNames: Record<ChartType, string> = {\n bar: 'barChartConfig',\n line: 'lineChartConfig',\n area: 'areaChartConfig',\n pie: 'pieChartConfig',\n scatter: 'scatterChartConfig',\n radar: 'radarChartConfig',\n radialBar: 'radialBarChartConfig',\n treemap: 'treemapChartConfig',\n bubble: 'bubbleChartConfig',\n table: 'dataTableConfig',\n activityGrid: 'activityGridChartConfig',\n kpiNumber: 'kpiNumberConfig',\n kpiDelta: 'kpiDeltaConfig',\n kpiText: 'kpiTextConfig',\n markdown: 'markdownConfig',\n}\n\n// Cache for loaded configs\nconst configCache = new Map<ChartType, ChartTypeConfig>()\n\n/**\n * Get a chart config asynchronously\n *\n * @param chartType The chart type to load config for\n * @returns The chart type config, or null if not found\n *\n * @example\n * ```typescript\n * const config = await getChartConfigAsync('bar')\n * console.log(config?.dropZones)\n * ```\n */\nexport async function getChartConfigAsync(chartType: ChartType): Promise<ChartTypeConfig | null> {\n // Check cache first\n if (configCache.has(chartType)) {\n return configCache.get(chartType)!\n }\n\n const importFn = configImportMap[chartType]\n if (!importFn) {\n return null\n }\n\n try {\n const module = await importFn()\n const exportName = configExportNames[chartType]\n const config = module[exportName]\n\n if (config) {\n configCache.set(chartType, config)\n return config\n }\n return null\n } catch (error) {\n console.error(`Failed to load config for chart type: ${chartType}`, error)\n return null\n }\n}\n\n/**\n * Get a chart config synchronously from cache\n *\n * Returns the cached config if available, otherwise returns the default config.\n * Use this when you need sync access and have already preloaded the config.\n *\n * @param chartType The chart type to get config for\n * @returns The chart type config (from cache or default)\n */\nexport function getChartConfigSync(chartType: ChartType): ChartTypeConfig {\n return configCache.get(chartType) || defaultChartConfig\n}\n\n/**\n * Check if a chart config is already loaded\n */\nexport function isChartConfigLoaded(chartType: ChartType): boolean {\n return configCache.has(chartType)\n}\n\n/**\n * React hook for using chart config\n *\n * Loads the chart config asynchronously and caches it.\n * Returns the default config while loading.\n *\n * @param chartType The chart type to load config for\n * @returns Object with config, loading state, and loaded flag\n *\n * @example\n * ```tsx\n * function ChartSetup({ chartType }) {\n * const { config, loading } = useChartConfig(chartType)\n *\n * if (loading) return <Spinner />\n * return <ConfigForm config={config} />\n * }\n * ```\n */\nexport function useChartConfig(chartType: ChartType | undefined): {\n config: ChartTypeConfig\n loading: boolean\n loaded: boolean\n} {\n const [config, setConfig] = useState<ChartTypeConfig>(\n chartType ? getChartConfigSync(chartType) : defaultChartConfig\n )\n const [loading, setLoading] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n if (!chartType) {\n setConfig(defaultChartConfig)\n setLoaded(false)\n return\n }\n\n // Check cache synchronously first\n if (configCache.has(chartType)) {\n setConfig(configCache.get(chartType)!)\n setLoaded(true)\n return\n }\n\n // Load async\n setLoading(true)\n getChartConfigAsync(chartType)\n .then((loadedConfig) => {\n if (loadedConfig) {\n setConfig(loadedConfig)\n setLoaded(true)\n } else {\n setConfig(defaultChartConfig)\n setLoaded(true)\n }\n })\n .finally(() => setLoading(false))\n }, [chartType])\n\n return { config, loading, loaded }\n}\n\n/**\n * Preload a chart config\n *\n * Triggers the async import without needing to use the config immediately.\n * Useful for prefetching configs that will likely be needed.\n *\n * @param chartType The chart type to preload config for\n */\nexport async function preloadChartConfig(chartType: ChartType): Promise<void> {\n if (!configCache.has(chartType)) {\n await getChartConfigAsync(chartType)\n }\n}\n\n/**\n * Preload multiple chart configs\n *\n * @param chartTypes Array of chart types to preload\n */\nexport async function preloadChartConfigs(chartTypes: ChartType[]): Promise<void> {\n await Promise.all(chartTypes.map(preloadChartConfig))\n}\n\n/**\n * Load all chart configs and return as a registry\n *\n * Useful for SSR or when you need all configs upfront.\n * After calling this, all configs are cached and available synchronously.\n *\n * @returns Complete chart config registry\n *\n * @example\n * ```typescript\n * // On server or during initialization\n * const registry = await loadAllChartConfigs()\n * // Now all configs are cached and getChartConfigSync works for all types\n * ```\n */\nexport async function loadAllChartConfigs(): Promise<ChartConfigRegistry> {\n const chartTypes = Object.keys(configImportMap) as ChartType[]\n await Promise.all(chartTypes.map(getChartConfigAsync))\n\n const registry: ChartConfigRegistry = {}\n for (const chartType of chartTypes) {\n const config = configCache.get(chartType)\n if (config) {\n registry[chartType] = config\n }\n }\n return registry\n}\n\n/**\n * Clear the config cache\n *\n * Useful for testing or when configs need to be reloaded.\n */\nexport function clearChartConfigCache(): void {\n configCache.clear()\n}\n","/**\n * Utility functions for drizzle-cube client\n */\n\nimport type { PortletConfig, DashboardConfig } from '../types'\n\n// Re-export chart utilities\nexport * from './chartUtils'\nexport * from './chartConstants'\nexport * from './measureIcons'\nexport * from './periodUtils'\nexport * from './pivotUtils'\nexport * from './syntaxHighlighting'\nexport * from './comparisonUtils'\n\n/**\n * Create a dashboard layout from portlet configurations\n */\nexport function createDashboardLayout(portlets: PortletConfig[]): DashboardConfig {\n const layouts = generateResponsiveLayouts(portlets)\n \n return {\n portlets,\n layouts\n }\n}\n\n/**\n * Generate responsive layouts for different breakpoints\n */\nexport function generateResponsiveLayouts(portlets: PortletConfig[]) {\n const gridLayout = portlets.map(portlet => ({\n i: portlet.id,\n x: portlet.x,\n y: portlet.y,\n w: portlet.w,\n h: portlet.h,\n minW: 3,\n minH: 3\n }))\n\n return {\n lg: gridLayout,\n md: gridLayout.map(item => ({ ...item, w: Math.min(item.w, 8) })),\n sm: gridLayout.map(item => ({ ...item, w: Math.min(item.w, 6) })),\n xs: gridLayout.map(item => ({ ...item, w: Math.min(item.w, 4) })),\n xxs: gridLayout.map(item => ({ ...item, w: 2 }))\n }\n}\n\n/**\n * Format chart data for display\n */\nexport function formatChartData(data: any[], options: {\n formatNumbers?: boolean\n precision?: number\n} = {}): any[] {\n const { formatNumbers = true, precision = 2 } = options\n\n if (!formatNumbers) return data\n\n return data.map(row => {\n const formattedRow: any = {}\n \n for (const [key, value] of Object.entries(row)) {\n if (typeof value === 'number') {\n formattedRow[key] = Number(value.toFixed(precision))\n } else {\n formattedRow[key] = value\n }\n }\n \n return formattedRow\n })\n}\n\n/**\n * Generate a unique ID for new portlets\n */\nexport function generatePortletId(): string {\n return `portlet-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Find the next available position in a grid\n */\nexport function findNextPosition(existingPortlets: PortletConfig[], _w: number = 6, _h: number = 4): { x: number; y: number } {\n if (existingPortlets.length === 0) {\n return { x: 0, y: 0 }\n }\n\n // Find the maximum Y position and height\n const maxY = Math.max(...existingPortlets.map(p => p.y + p.h))\n \n return { x: 0, y: maxY }\n}\n\n/**\n * Validate a cube query JSON string\n */\nexport function validateCubeQuery(queryString: string): { valid: boolean; error?: string; query?: any } {\n try {\n const query = JSON.parse(queryString)\n \n // Basic validation\n if (typeof query !== 'object' || query === null) {\n return { valid: false, error: 'Query must be a JSON object' }\n }\n\n // Check for required fields\n if (!query.measures && !query.dimensions) {\n return { valid: false, error: 'Query must have at least measures or dimensions' }\n }\n\n return { valid: true, query }\n } catch {\n return { valid: false, error: 'Invalid JSON format' }\n }\n}\n\n/**\n * Create a sample portlet configuration\n */\nexport function createSamplePortlet(): Omit<PortletConfig, 'id'> {\n return {\n title: 'Sample Chart',\n query: JSON.stringify({\n measures: ['count'],\n dimensions: ['category']\n }, null, 2),\n chartType: 'bar',\n chartConfig: {\n x: 'category',\n y: ['count']\n },\n displayConfig: {\n showLegend: true,\n showGrid: true,\n showTooltip: true\n },\n w: 6,\n h: 4,\n x: 0,\n y: 0\n }\n}"],"names":["chartLoaderCache","chartImportMap","n","getLazyChart","chartType","importFn","lazy","isValidChartType","DefaultChartFallback","height","jsx","LazyChart","fallback","chartProps","ChartComponent","Suspense","preloadChart","preloadCharts","chartTypes","getAvailableChartTypes","defaultChartConfig","getChartConfig","registry","configImportMap","configExportNames","configCache","getChartConfigAsync","module","exportName","config","error","getChartConfigSync","isChartConfigLoaded","useChartConfig","setConfig","useState","loading","setLoading","loaded","setLoaded","useEffect","loadedConfig","preloadChartConfig","preloadChartConfigs","loadAllChartConfigs","clearChartConfigCache","createDashboardLayout","portlets","layouts","generateResponsiveLayouts","gridLayout","portlet","item","formatChartData","data","options","formatNumbers","precision","row","formattedRow","key","value","generatePortletId","findNextPosition","existingPortlets","_w","_h","p","validateCubeQuery","queryString","query","createSamplePortlet"],"mappings":"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"}
1
+ {"version":3,"file":"charts-BsXrHSCm.js","sources":["../../../src/client/charts/ChartLoader.tsx","../../../src/client/charts/chartConfigs.ts","../../../src/client/charts/lazyChartConfigRegistry.ts","../../../src/client/utils/index.ts"],"sourcesContent":["/**\n * Lazy Chart Loader\n *\n * Provides React.lazy-based dynamic loading for chart components.\n * This enables code splitting - each chart type loads only when needed.\n */\n\nimport { lazy, Suspense, ComponentType, ReactNode, LazyExoticComponent } from 'react'\nimport type { ChartType, ChartProps } from '../types'\n\n// Type for lazy-loaded chart components\ntype LazyChartComponent = ComponentType<ChartProps>\n\n// Chart loader cache to prevent re-creating lazy components\nconst chartLoaderCache = new Map<ChartType, LazyExoticComponent<LazyChartComponent>>()\n\n// Dynamic import functions for each chart type\nconst chartImportMap: Record<ChartType, () => Promise<{ default: LazyChartComponent }>> = {\n bar: () => import('../components/charts/BarChart'),\n line: () => import('../components/charts/LineChart'),\n area: () => import('../components/charts/AreaChart'),\n pie: () => import('../components/charts/PieChart'),\n scatter: () => import('../components/charts/ScatterChart'),\n radar: () => import('../components/charts/RadarChart'),\n radialBar: () => import('../components/charts/RadialBarChart'),\n treemap: () => import('../components/charts/TreeMapChart'),\n bubble: () => import('../components/charts/BubbleChart'),\n table: () => import('../components/charts/DataTable'),\n activityGrid: () => import('../components/charts/ActivityGridChart'),\n kpiNumber: () => import('../components/charts/KpiNumber'),\n kpiDelta: () => import('../components/charts/KpiDelta'),\n kpiText: () => import('../components/charts/KpiText'),\n markdown: () => import('../components/charts/MarkdownChart'),\n}\n\n/**\n * Get or create a lazy component for a chart type\n */\nfunction getLazyChart(chartType: ChartType): LazyExoticComponent<LazyChartComponent> {\n if (!chartLoaderCache.has(chartType)) {\n const importFn = chartImportMap[chartType]\n if (!importFn) {\n throw new Error(`Unknown chart type: ${chartType}`)\n }\n chartLoaderCache.set(chartType, lazy(importFn))\n }\n return chartLoaderCache.get(chartType)!\n}\n\n/**\n * Check if a chart type is supported\n */\nexport function isValidChartType(chartType: string): chartType is ChartType {\n return chartType in chartImportMap\n}\n\n// Props for the LazyChart wrapper\nexport interface LazyChartProps extends ChartProps {\n chartType: ChartType\n fallback?: ReactNode\n}\n\n/**\n * Default loading placeholder for charts\n */\nfunction DefaultChartFallback({ height }: { height?: string | number }) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height: typeof height === 'number' ? `${height}px` : height || '200px' }}\n >\n <div className=\"animate-pulse bg-dc-surface-secondary rounded w-full h-full min-h-[100px]\" />\n </div>\n )\n}\n\n/**\n * Lazy Chart Component\n *\n * Renders a chart component with React.lazy dynamic loading.\n * The chart type determines which chart component is loaded.\n *\n * @example\n * ```tsx\n * <LazyChart\n * chartType=\"bar\"\n * data={chartData}\n * chartConfig={{ yAxis: ['value'] }}\n * height={300}\n * />\n * ```\n */\nexport function LazyChart({\n chartType,\n fallback,\n height,\n ...chartProps\n}: LazyChartProps) {\n const ChartComponent = getLazyChart(chartType)\n\n return (\n <Suspense fallback={fallback ?? <DefaultChartFallback height={height} />}>\n <ChartComponent height={height} {...chartProps} />\n </Suspense>\n )\n}\n\n/**\n * Preload a chart type\n *\n * Triggers the dynamic import without rendering.\n * Useful for prefetching charts that will likely be needed.\n *\n * @example\n * ```tsx\n * // Preload bar chart on hover\n * onMouseEnter={() => preloadChart('bar')}\n * ```\n */\nexport function preloadChart(chartType: ChartType): void {\n const importFn = chartImportMap[chartType]\n if (importFn) {\n importFn()\n }\n}\n\n/**\n * Preload multiple chart types\n *\n * @example\n * ```tsx\n * // Preload common charts on app init\n * useEffect(() => {\n * preloadCharts(['bar', 'line', 'pie'])\n * }, [])\n * ```\n */\nexport function preloadCharts(chartTypes: ChartType[]): void {\n chartTypes.forEach(preloadChart)\n}\n\n/**\n * Get all available chart types\n */\nexport function getAvailableChartTypes(): ChartType[] {\n return Object.keys(chartImportMap) as ChartType[]\n}\n","import { ComponentType } from 'react'\n\n/**\n * Configuration for a single axis drop zone in the chart configuration UI\n */\nexport interface AxisDropZoneConfig {\n /** The key to store this field in chartConfig (e.g., 'xAxis', 'yAxis', 'sizeField') */\n key: string\n \n /** Display label for the drop zone */\n label: string\n \n /** Optional description/help text shown below the label */\n description?: string\n \n /** Whether at least one field is required in this drop zone */\n mandatory?: boolean\n \n /** Maximum number of items allowed in this drop zone */\n maxItems?: number\n \n /** Which field types this drop zone accepts */\n acceptTypes?: ('dimension' | 'timeDimension' | 'measure')[]\n \n /** Optional icon component to display */\n icon?: ComponentType<{ className?: string }>\n\n /** Placeholder text when drop zone is empty */\n emptyText?: string\n\n /** Enable L/R axis toggle for items in this drop zone (for dual Y-axis support) */\n enableDualAxis?: boolean\n}\n\n/**\n * Configuration for a single display option\n */\nexport interface DisplayOptionConfig {\n /** The key to store this field in displayConfig */\n key: string\n \n /** Display label for the option */\n label: string\n \n /** Type of input control to render */\n type: 'boolean' | 'string' | 'number' | 'select' | 'color' | 'paletteColor' | 'axisFormat'\n \n /** Default value for the option */\n defaultValue?: any\n \n /** Placeholder text for string/number inputs */\n placeholder?: string\n \n /** Options for select type */\n options?: Array<{ value: any; label: string }>\n \n /** Help text shown below the input */\n description?: string\n \n /** Minimum value for number inputs */\n min?: number\n \n /** Maximum value for number inputs */\n max?: number\n \n /** Step value for number inputs */\n step?: number\n}\n\n/**\n * Complete configuration for a chart type\n */\nexport interface ChartTypeConfig {\n /** Configuration for each drop zone */\n dropZones: AxisDropZoneConfig[]\n \n /** Simple display options (backward compatibility) - rendered as boolean checkboxes */\n displayOptions?: string[]\n \n /** Structured display options with metadata for different input types */\n displayOptionsConfig?: DisplayOptionConfig[]\n \n /** Optional custom validation function */\n validate?: (config: any) => { isValid: boolean; message?: string }\n \n /** Icon component for the chart type */\n icon?: ComponentType<{ className?: string }>\n \n /** Brief description of the chart */\n description?: string\n \n /** When to use this chart type */\n useCase?: string\n \n /** Whether this chart type skips query requirements (for content-based charts like markdown) */\n skipQuery?: boolean\n}\n\n/**\n * Registry of all chart type configurations\n */\nexport interface ChartConfigRegistry {\n [chartType: string]: ChartTypeConfig\n}\n\n/**\n * Default configuration for charts without specific requirements\n */\nexport const defaultChartConfig: ChartTypeConfig = {\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for values or dimensions for series',\n mandatory: false,\n acceptTypes: ['measure', 'dimension'],\n emptyText: 'Drop measures or dimensions here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}\n\n/**\n * Helper function to get configuration for a chart type\n */\nexport function getChartConfig(chartType: string, registry: ChartConfigRegistry): ChartTypeConfig {\n return registry[chartType] || defaultChartConfig\n}","/**\n * Lazy Chart Config Registry\n *\n * Provides async loading for chart configurations.\n * This enables code splitting - each chart config loads only when needed.\n */\n\nimport { useState, useEffect } from 'react'\nimport type { ChartType } from '../types'\nimport type { ChartTypeConfig, ChartConfigRegistry } from './chartConfigs'\nimport { defaultChartConfig } from './chartConfigs'\n\n// Config import map - lazy imports for each chart config\nconst configImportMap: Record<ChartType, () => Promise<{ [key: string]: ChartTypeConfig }>> = {\n bar: () => import('../components/charts/BarChart.config'),\n line: () => import('../components/charts/LineChart.config'),\n area: () => import('../components/charts/AreaChart.config'),\n pie: () => import('../components/charts/PieChart.config'),\n scatter: () => import('../components/charts/ScatterChart.config'),\n radar: () => import('../components/charts/RadarChart.config'),\n radialBar: () => import('../components/charts/RadialBarChart.config'),\n treemap: () => import('../components/charts/TreeMapChart.config'),\n bubble: () => import('../components/charts/BubbleChart.config'),\n table: () => import('../components/charts/DataTable.config'),\n activityGrid: () => import('../components/charts/ActivityGridChart.config'),\n kpiNumber: () => import('../components/charts/KpiNumber.config'),\n kpiDelta: () => import('../components/charts/KpiDelta.config'),\n kpiText: () => import('../components/charts/KpiText.config'),\n markdown: () => import('../components/charts/MarkdownChart.config'),\n}\n\n// Map from chart type to expected export name\nconst configExportNames: Record<ChartType, string> = {\n bar: 'barChartConfig',\n line: 'lineChartConfig',\n area: 'areaChartConfig',\n pie: 'pieChartConfig',\n scatter: 'scatterChartConfig',\n radar: 'radarChartConfig',\n radialBar: 'radialBarChartConfig',\n treemap: 'treemapChartConfig',\n bubble: 'bubbleChartConfig',\n table: 'dataTableConfig',\n activityGrid: 'activityGridChartConfig',\n kpiNumber: 'kpiNumberConfig',\n kpiDelta: 'kpiDeltaConfig',\n kpiText: 'kpiTextConfig',\n markdown: 'markdownConfig',\n}\n\n// Cache for loaded configs\nconst configCache = new Map<ChartType, ChartTypeConfig>()\n\n/**\n * Get a chart config asynchronously\n *\n * @param chartType The chart type to load config for\n * @returns The chart type config, or null if not found\n *\n * @example\n * ```typescript\n * const config = await getChartConfigAsync('bar')\n * console.log(config?.dropZones)\n * ```\n */\nexport async function getChartConfigAsync(chartType: ChartType): Promise<ChartTypeConfig | null> {\n // Check cache first\n if (configCache.has(chartType)) {\n return configCache.get(chartType)!\n }\n\n const importFn = configImportMap[chartType]\n if (!importFn) {\n return null\n }\n\n try {\n const module = await importFn()\n const exportName = configExportNames[chartType]\n const config = module[exportName]\n\n if (config) {\n configCache.set(chartType, config)\n return config\n }\n return null\n } catch (error) {\n console.error(`Failed to load config for chart type: ${chartType}`, error)\n return null\n }\n}\n\n/**\n * Get a chart config synchronously from cache\n *\n * Returns the cached config if available, otherwise returns the default config.\n * Use this when you need sync access and have already preloaded the config.\n *\n * @param chartType The chart type to get config for\n * @returns The chart type config (from cache or default)\n */\nexport function getChartConfigSync(chartType: ChartType): ChartTypeConfig {\n return configCache.get(chartType) || defaultChartConfig\n}\n\n/**\n * Check if a chart config is already loaded\n */\nexport function isChartConfigLoaded(chartType: ChartType): boolean {\n return configCache.has(chartType)\n}\n\n/**\n * React hook for using chart config\n *\n * Loads the chart config asynchronously and caches it.\n * Returns the default config while loading.\n *\n * @param chartType The chart type to load config for\n * @returns Object with config, loading state, and loaded flag\n *\n * @example\n * ```tsx\n * function ChartSetup({ chartType }) {\n * const { config, loading } = useChartConfig(chartType)\n *\n * if (loading) return <Spinner />\n * return <ConfigForm config={config} />\n * }\n * ```\n */\nexport function useChartConfig(chartType: ChartType | undefined): {\n config: ChartTypeConfig\n loading: boolean\n loaded: boolean\n} {\n const [config, setConfig] = useState<ChartTypeConfig>(\n chartType ? getChartConfigSync(chartType) : defaultChartConfig\n )\n const [loading, setLoading] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n if (!chartType) {\n setConfig(defaultChartConfig)\n setLoaded(false)\n return\n }\n\n // Check cache synchronously first\n if (configCache.has(chartType)) {\n setConfig(configCache.get(chartType)!)\n setLoaded(true)\n return\n }\n\n // Load async\n setLoading(true)\n getChartConfigAsync(chartType)\n .then((loadedConfig) => {\n if (loadedConfig) {\n setConfig(loadedConfig)\n setLoaded(true)\n } else {\n setConfig(defaultChartConfig)\n setLoaded(true)\n }\n })\n .finally(() => setLoading(false))\n }, [chartType])\n\n return { config, loading, loaded }\n}\n\n/**\n * Preload a chart config\n *\n * Triggers the async import without needing to use the config immediately.\n * Useful for prefetching configs that will likely be needed.\n *\n * @param chartType The chart type to preload config for\n */\nexport async function preloadChartConfig(chartType: ChartType): Promise<void> {\n if (!configCache.has(chartType)) {\n await getChartConfigAsync(chartType)\n }\n}\n\n/**\n * Preload multiple chart configs\n *\n * @param chartTypes Array of chart types to preload\n */\nexport async function preloadChartConfigs(chartTypes: ChartType[]): Promise<void> {\n await Promise.all(chartTypes.map(preloadChartConfig))\n}\n\n/**\n * Load all chart configs and return as a registry\n *\n * Useful for SSR or when you need all configs upfront.\n * After calling this, all configs are cached and available synchronously.\n *\n * @returns Complete chart config registry\n *\n * @example\n * ```typescript\n * // On server or during initialization\n * const registry = await loadAllChartConfigs()\n * // Now all configs are cached and getChartConfigSync works for all types\n * ```\n */\nexport async function loadAllChartConfigs(): Promise<ChartConfigRegistry> {\n const chartTypes = Object.keys(configImportMap) as ChartType[]\n await Promise.all(chartTypes.map(getChartConfigAsync))\n\n const registry: ChartConfigRegistry = {}\n for (const chartType of chartTypes) {\n const config = configCache.get(chartType)\n if (config) {\n registry[chartType] = config\n }\n }\n return registry\n}\n\n/**\n * Clear the config cache\n *\n * Useful for testing or when configs need to be reloaded.\n */\nexport function clearChartConfigCache(): void {\n configCache.clear()\n}\n","/**\n * Utility functions for drizzle-cube client\n */\n\nimport type { PortletConfig, DashboardConfig } from '../types'\n\n// Re-export chart utilities\nexport * from './chartUtils'\nexport * from './chartConstants'\nexport * from './measureIcons'\nexport * from './periodUtils'\nexport * from './pivotUtils'\nexport * from './syntaxHighlighting'\nexport * from './comparisonUtils'\n\n/**\n * Create a dashboard layout from portlet configurations\n */\nexport function createDashboardLayout(portlets: PortletConfig[]): DashboardConfig {\n const layouts = generateResponsiveLayouts(portlets)\n \n return {\n portlets,\n layouts\n }\n}\n\n/**\n * Generate responsive layouts for different breakpoints\n */\nexport function generateResponsiveLayouts(portlets: PortletConfig[]) {\n const gridLayout = portlets.map(portlet => ({\n i: portlet.id,\n x: portlet.x,\n y: portlet.y,\n w: portlet.w,\n h: portlet.h,\n minW: 3,\n minH: 3\n }))\n\n return {\n lg: gridLayout,\n md: gridLayout.map(item => ({ ...item, w: Math.min(item.w, 8) })),\n sm: gridLayout.map(item => ({ ...item, w: Math.min(item.w, 6) })),\n xs: gridLayout.map(item => ({ ...item, w: Math.min(item.w, 4) })),\n xxs: gridLayout.map(item => ({ ...item, w: 2 }))\n }\n}\n\n/**\n * Format chart data for display\n */\nexport function formatChartData(data: any[], options: {\n formatNumbers?: boolean\n precision?: number\n} = {}): any[] {\n const { formatNumbers = true, precision = 2 } = options\n\n if (!formatNumbers) return data\n\n return data.map(row => {\n const formattedRow: any = {}\n \n for (const [key, value] of Object.entries(row)) {\n if (typeof value === 'number') {\n formattedRow[key] = Number(value.toFixed(precision))\n } else {\n formattedRow[key] = value\n }\n }\n \n return formattedRow\n })\n}\n\n/**\n * Generate a unique ID for new portlets\n */\nexport function generatePortletId(): string {\n return `portlet-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Find the next available position in a grid\n */\nexport function findNextPosition(existingPortlets: PortletConfig[], _w: number = 6, _h: number = 4): { x: number; y: number } {\n if (existingPortlets.length === 0) {\n return { x: 0, y: 0 }\n }\n\n // Find the maximum Y position and height\n const maxY = Math.max(...existingPortlets.map(p => p.y + p.h))\n \n return { x: 0, y: maxY }\n}\n\n/**\n * Validate a cube query JSON string\n */\nexport function validateCubeQuery(queryString: string): { valid: boolean; error?: string; query?: any } {\n try {\n const query = JSON.parse(queryString)\n \n // Basic validation\n if (typeof query !== 'object' || query === null) {\n return { valid: false, error: 'Query must be a JSON object' }\n }\n\n // Check for required fields\n if (!query.measures && !query.dimensions) {\n return { valid: false, error: 'Query must have at least measures or dimensions' }\n }\n\n return { valid: true, query }\n } catch {\n return { valid: false, error: 'Invalid JSON format' }\n }\n}\n\n/**\n * Create a sample portlet configuration\n */\nexport function createSamplePortlet(): Omit<PortletConfig, 'id'> {\n return {\n title: 'Sample Chart',\n query: JSON.stringify({\n measures: ['count'],\n dimensions: ['category']\n }, null, 2),\n chartType: 'bar',\n chartConfig: {\n x: 'category',\n y: ['count']\n },\n displayConfig: {\n showLegend: true,\n showGrid: true,\n showTooltip: true\n },\n w: 6,\n h: 4,\n x: 0,\n y: 0\n }\n}"],"names":["chartLoaderCache","chartImportMap","n","getLazyChart","chartType","importFn","lazy","isValidChartType","DefaultChartFallback","height","jsx","LazyChart","fallback","chartProps","ChartComponent","Suspense","preloadChart","preloadCharts","chartTypes","getAvailableChartTypes","defaultChartConfig","getChartConfig","registry","configImportMap","configExportNames","configCache","getChartConfigAsync","module","exportName","config","error","getChartConfigSync","isChartConfigLoaded","useChartConfig","setConfig","useState","loading","setLoading","loaded","setLoaded","useEffect","loadedConfig","preloadChartConfig","preloadChartConfigs","loadAllChartConfigs","clearChartConfigCache","createDashboardLayout","portlets","layouts","generateResponsiveLayouts","gridLayout","portlet","item","formatChartData","data","options","formatNumbers","precision","row","formattedRow","key","value","generatePortletId","findNextPosition","existingPortlets","_w","_h","p","validateCubeQuery","queryString","query","createSamplePortlet"],"mappings":"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"}