drizzle-cube 0.1.21 → 0.1.23

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 (28) hide show
  1. package/dist/adapters/{compiler-CPsEzFP2.js → compiler-CSr2Ti96.js} +553 -505
  2. package/dist/adapters/express/index.js +1 -1
  3. package/dist/adapters/fastify/index.js +1 -1
  4. package/dist/adapters/hono/index.js +1 -1
  5. package/dist/adapters/nextjs/index.js +50 -50
  6. package/dist/client/charts.js +1 -1
  7. package/dist/client/chunks/{charts-BadAUMmd.js → charts-8KmxUVvG.js} +2 -2
  8. package/dist/client/chunks/{charts-BadAUMmd.js.map → charts-8KmxUVvG.js.map} +1 -1
  9. package/dist/client/chunks/{icons-B5RVM-7b.js → icons-QczkAx61.js} +46 -41
  10. package/dist/client/chunks/{icons-B5RVM-7b.js.map → icons-QczkAx61.js.map} +1 -1
  11. package/dist/client/chunks/{providers-DI5zeeEU.js → providers-B7MVnAAt.js} +50 -50
  12. package/dist/client/chunks/providers-B7MVnAAt.js.map +1 -0
  13. package/dist/client/components/charts/ActivityGridChart.config.d.ts +5 -0
  14. package/dist/client/components/charts/ActivityGridChart.d.ts +2 -0
  15. package/dist/client/components/charts/index.d.ts +1 -0
  16. package/dist/client/components.js +2875 -2351
  17. package/dist/client/components.js.map +1 -1
  18. package/dist/client/hooks/useCubeMeta.d.ts +1 -0
  19. package/dist/client/hooks.js +62 -60
  20. package/dist/client/hooks.js.map +1 -1
  21. package/dist/client/index.js +2 -2
  22. package/dist/client/providers.js +1 -1
  23. package/dist/client/types.d.ts +6 -2
  24. package/dist/client-bundle-stats.html +1 -1
  25. package/dist/server/index.d.ts +3 -8
  26. package/dist/server/index.js +748 -700
  27. package/package.json +22 -1
  28. package/dist/client/chunks/providers-DI5zeeEU.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-cube",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "description": "Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.",
5
5
  "main": "./dist/server/index.js",
6
6
  "types": "./dist/server/index.d.ts",
@@ -71,6 +71,21 @@
71
71
  "build:adapters": "vite build --config vite.config.adapters.ts",
72
72
  "test": "vitest run",
73
73
  "test:watch": "vitest --watch",
74
+ "test:coverage": "vitest run --coverage",
75
+ "test:coverage:watch": "vitest --watch --coverage",
76
+ "test:coverage:ui": "vitest --ui --coverage",
77
+ "test:coverage:postgres": "COVERAGE_DIR=./coverage/postgres vitest run --coverage",
78
+ "test:coverage:mysql": "TEST_DB_TYPE=mysql COVERAGE_DIR=./coverage/mysql vitest run --coverage",
79
+ "test:coverage:sqlite": "TEST_DB_TYPE=sqlite COVERAGE_DIR=./coverage/sqlite vitest run --coverage",
80
+ "test:coverage:all": "npm run test:coverage:postgres && npm run test:coverage:mysql && npm run test:coverage:sqlite && npm run coverage:index",
81
+ "test:coverage:complete": "npm run test:coverage:all && npm run test:client:coverage && npm run coverage:index",
82
+ "test:client": "vitest run --config vitest.config.client.ts",
83
+ "test:client:watch": "vitest --watch --config vitest.config.client.ts",
84
+ "test:client:coverage": "vitest run --coverage --config vitest.config.client.ts",
85
+ "test:client:ui": "vitest --ui --config vitest.config.client.ts",
86
+ "coverage:index": "node scripts/merge-coverage.js",
87
+ "coverage:open": "open coverage/index.html",
88
+ "coverage:client:open": "open coverage/client/index.html",
74
89
  "test:postgres": "vitest run",
75
90
  "test:mysql": "TEST_DB_TYPE=mysql vitest run",
76
91
  "test:sqlite": "TEST_DB_TYPE=sqlite vitest run",
@@ -165,6 +180,9 @@
165
180
  "@hono/node-server": "^1.19.0",
166
181
  "@iconify-icons/tabler": "^1.2.95",
167
182
  "@iconify/react": "^6.0.0",
183
+ "@testing-library/jest-dom": "^6.8.0",
184
+ "@testing-library/react": "^16.3.0",
185
+ "@testing-library/user-event": "^14.6.1",
168
186
  "@types/better-sqlite3": "^7.6.0",
169
187
  "@types/cors": "^2.8.17",
170
188
  "@types/d3": "^7.4.3",
@@ -177,6 +195,8 @@
177
195
  "@typescript-eslint/eslint-plugin": "^7.18.0",
178
196
  "@typescript-eslint/parser": "^7.18.0",
179
197
  "@vitejs/plugin-react": "^4.0.0",
198
+ "@vitest/coverage-v8": "^2.1.9",
199
+ "@vitest/ui": "^2.1.9",
180
200
  "autoprefixer": "^10.4.21",
181
201
  "better-sqlite3": "^11.10.0",
182
202
  "concurrently": "^8.0.0",
@@ -187,6 +207,7 @@
187
207
  "express": "^5.1.0",
188
208
  "fastify": "^5.5.0",
189
209
  "hono": "^4.0.0",
210
+ "jsdom": "^26.1.0",
190
211
  "mysql2": "^3.14.3",
191
212
  "next": "^15.0.0",
192
213
  "postcss": "^8.5.6",
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers-DI5zeeEU.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/hooks/useCubeMeta.ts","../../../src/client/providers/CubeProvider.tsx"],"sourcesContent":["/**\n * Minimal Cube client implementation\n * Replaces @cubejs-client/core with lighter implementation\n */\n\nimport type { CubeQuery, CubeApiOptions, CubeResultSet } from '../types'\n\nexport class CubeClient {\n private apiUrl: string\n private headers: Record<string, string>\n\n constructor(token?: string, options: CubeApiOptions = {}) {\n this.apiUrl = options.apiUrl || '/cubejs-api/v1'\n this.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n \n if (token) {\n this.headers['Authorization'] = token\n }\n }\n\n async load(query: CubeQuery): Promise<CubeResultSet> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/load?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: 'include' // Include cookies for session auth\n })\n\n if (!response.ok) {\n let errorMessage = `Cube query failed: ${response.status}`\n try {\n const errorText = await response.text()\n // Try to parse as JSON first to get structured error\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If not JSON, use the raw text\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return new ResultSet(result)\n }\n\n async meta(): Promise<any> {\n const url = `${this.apiUrl}/meta`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.headers,\n credentials: 'include'\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch meta: ${response.status}`)\n }\n\n return response.json()\n }\n\n async sql(query: CubeQuery): Promise<any> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/sql?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: 'include'\n })\n\n if (!response.ok) {\n throw new Error(`SQL generation failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async dryRun(query: CubeQuery): Promise<any> {\n const url = `${this.apiUrl}/dry-run`\n \n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: 'include',\n body: JSON.stringify({ query })\n })\n\n if (!response.ok) {\n let errorMessage = `Dry run failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n}\n\n/**\n * Simple ResultSet implementation\n */\nclass ResultSet implements CubeResultSet {\n public loadResponse: any\n\n constructor(loadResponse: any) {\n this.loadResponse = loadResponse\n }\n\n rawData(): any[] {\n // Handle new nested structure: loadResponse.results[0].data\n // Keep backward compatibility with old structure: loadResponse.data\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].data || []\n }\n return this.loadResponse.data || []\n }\n\n tablePivot(): any[] {\n // For pie charts and tables, return the raw data\n return this.rawData()\n }\n\n series(): any[] {\n // Simple series implementation\n return this.rawData()\n }\n\n annotation(): any {\n // Handle new nested structure: loadResponse.results[0].annotation\n // Keep backward compatibility with old structure: loadResponse.annotation\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].annotation || {}\n }\n return this.loadResponse.annotation || {}\n }\n}\n\n/**\n * Factory function to create a cube client\n */\nexport function createCubeClient(token?: string, options: CubeApiOptions = {}): CubeClient {\n return new CubeClient(token, options)\n}\n\n// Legacy compatibility export\nexport function cube(token?: string, options: CubeApiOptions = {}): CubeClient {\n return createCubeClient(token, options)\n}","import { useState, useEffect, useCallback } from 'react'\nimport type { CubeClient } from '../client/CubeClient'\n\nexport interface CubeMetaField {\n name: string\n title: string\n shortTitle: string\n type: string\n}\n\nexport interface CubeMetaCube {\n name: string\n title: string\n description?: string\n measures: CubeMetaField[]\n dimensions: CubeMetaField[]\n segments: CubeMetaField[]\n}\n\nexport interface CubeMeta {\n cubes: CubeMetaCube[]\n}\n\nexport type FieldLabelMap = Record<string, string>\n\ninterface CachedMeta {\n data: CubeMeta\n labelMap: FieldLabelMap\n timestamp: number\n}\n\ninterface UseCubeMetaResult {\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n loading: boolean\n error: string | null\n refetch: () => void\n getFieldLabel: (fieldName: string) => string\n}\n\n// Cache duration: 15 minutes\nconst CACHE_DURATION = 15 * 60 * 1000\n\n// In-memory cache\nlet cachedMeta: CachedMeta | null = null\n\nfunction buildLabelMap(meta: CubeMeta): FieldLabelMap {\n const labelMap: FieldLabelMap = {}\n \n meta.cubes.forEach(cube => {\n // Add measures\n cube.measures.forEach(measure => {\n labelMap[measure.name] = measure.title || measure.shortTitle || measure.name\n })\n \n // Add dimensions\n cube.dimensions.forEach(dimension => {\n labelMap[dimension.name] = dimension.title || dimension.shortTitle || dimension.name\n })\n \n // Add segments\n cube.segments.forEach(segment => {\n labelMap[segment.name] = segment.title || segment.shortTitle || segment.name\n })\n })\n \n return labelMap\n}\n\nfunction isCacheValid(): boolean {\n if (!cachedMeta) return false\n const now = Date.now()\n return (now - cachedMeta.timestamp) < CACHE_DURATION\n}\n\nexport function useCubeMeta(cubeApi: CubeClient): UseCubeMetaResult {\n const [meta, setMeta] = useState<CubeMeta | null>(null)\n const [labelMap, setLabelMap] = useState<FieldLabelMap>({})\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchMeta = useCallback(async () => {\n // Check cache first\n if (isCacheValid() && cachedMeta) {\n setMeta(cachedMeta.data)\n setLabelMap(cachedMeta.labelMap)\n setLoading(false)\n setError(null)\n return\n }\n\n try {\n setLoading(true)\n setError(null)\n \n const metaData: CubeMeta = await cubeApi.meta()\n const newLabelMap = buildLabelMap(metaData)\n \n // Cache the result\n cachedMeta = {\n data: metaData,\n labelMap: newLabelMap,\n timestamp: Date.now()\n }\n \n setMeta(metaData)\n setLabelMap(newLabelMap)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch metadata'\n setError(errorMessage)\n console.error('Failed to fetch cube metadata:', err)\n } finally {\n setLoading(false)\n }\n }, [cubeApi])\n\n useEffect(() => {\n fetchMeta()\n }, [fetchMeta])\n\n const getFieldLabel = useCallback((fieldName: string): string => {\n return labelMap[fieldName] || fieldName\n }, [labelMap])\n\n const refetch = useCallback(() => {\n // Clear cache and refetch\n cachedMeta = null\n fetchMeta()\n }, [fetchMeta])\n\n return {\n meta,\n labelMap,\n loading,\n error,\n refetch,\n getFieldLabel\n }\n}","/**\n * Lightweight CubeProvider implementation\n * Replaces @cubejs-client/react provider\n */\n\nimport React, { createContext, useContext, useMemo, useState } from 'react'\nimport { createCubeClient, type CubeClient } from '../client/CubeClient'\nimport type { CubeQueryOptions, CubeApiOptions, FeaturesConfig } from '../types'\nimport { useCubeMeta, type CubeMeta, type FieldLabelMap } from '../hooks/useCubeMeta'\n\ninterface CubeContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n features: FeaturesConfig\n}\n\nconst CubeContext = createContext<CubeContextValue | null>(null)\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n features?: FeaturesConfig\n children: React.ReactNode\n}\n\nexport function CubeProvider({ \n cubeApi: initialCubeApi, \n apiOptions: initialApiOptions,\n token: initialToken,\n options = {},\n features = { enableAI: true, aiEndpoint: '/api/ai/generate' }, // Default to AI enabled for backward compatibility\n children \n}: CubeProviderProps) {\n // State for dynamic API configuration\n const [apiConfig, setApiConfig] = useState<{ apiOptions: CubeApiOptions; token?: string }>({\n apiOptions: initialApiOptions || { apiUrl: '/cubejs-api/v1' },\n token: initialToken\n })\n\n // Create or use the provided CubeClient, recreating when config changes\n const cubeApi = useMemo(() => {\n if (initialCubeApi && !initialApiOptions && !initialToken) {\n // Use provided client if no initial config specified\n return initialCubeApi\n }\n \n // Create client with current config\n return createCubeClient(apiConfig.token, apiConfig.apiOptions)\n }, [initialCubeApi, initialApiOptions, initialToken, apiConfig.apiOptions, apiConfig.token])\n\n const { meta, labelMap, loading: metaLoading, error: metaError, getFieldLabel, refetch: refetchMeta } = useCubeMeta(cubeApi)\n \n const updateApiConfig = (newApiOptions: CubeApiOptions, newToken?: string) => {\n setApiConfig({\n apiOptions: newApiOptions,\n token: newToken\n })\n }\n \n const contextValue = { \n cubeApi, \n options, \n meta, \n labelMap, \n metaLoading, \n metaError, \n getFieldLabel, \n refetchMeta,\n updateApiConfig,\n features\n }\n \n return (\n <CubeContext.Provider value={contextValue}>\n {children}\n </CubeContext.Provider>\n )\n}\n\nexport function useCubeContext() {\n const context = useContext(CubeContext)\n \n if (!context) {\n throw new Error('useCubeContext must be used within a CubeProvider')\n }\n return context\n}"],"names":["CubeClient","token","options","__publicField","query","queryParam","url","response","key","errorMessage","errorText","errorData","result","ResultSet","loadResponse","createCubeClient","CACHE_DURATION","cachedMeta","buildLabelMap","meta","labelMap","cube","measure","dimension","segment","isCacheValid","useCubeMeta","cubeApi","setMeta","useState","setLabelMap","loading","setLoading","error","setError","fetchMeta","useCallback","metaData","newLabelMap","err","useEffect","getFieldLabel","fieldName","refetch","CubeContext","createContext","CubeProvider","initialCubeApi","initialApiOptions","initialToken","features","children","apiConfig","setApiConfig","useMemo","metaLoading","metaError","refetchMeta","contextValue","newApiOptions","newToken","useCubeContext","context","useContext"],"mappings":";;;;;AAOO,MAAMA,EAAW;AAAA,EAItB,YAAYC,GAAgBC,IAA0B,IAAI;AAHlD,IAAAC,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,SAASD,EAAQ,UAAU,kBAChC,KAAK,UAAU;AAAA,MACb,gBAAgB;AAAA,MAChB,GAAGA,EAAQ;AAAA,IAAA,GAGTD,MACF,KAAK,QAAQ,gBAAmBA;AAAA,EAEpC;AAAA,EAEA,MAAM,KAAKG,GAA0C;AAEnD,UAAMC,IAAa,mBAAmB,KAAK,UAAUD,CAAK,CAAC,GACrDE,IAAM,GAAG,KAAK,MAAM,eAAeD,CAAU,IAE7CE,IAAW,MAAM,MAAMD,GAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA;AAAA,QAEP,GAAG,OAAO;AAAA,UACR,OAAO,QAAQ,KAAK,OAAO,EAAE,OAAO,CAAC,CAACE,CAAG,MAAMA,MAAQ,cAAc;AAAA,QAAA;AAAA,MACvE;AAAA,MAEF,aAAa;AAAA;AAAA,IAAA,CACd;AAED,QAAI,CAACD,EAAS,IAAI;AAChB,UAAIE,IAAe,sBAAsBF,EAAS,MAAM;AACxD,UAAI;AACF,cAAMG,IAAY,MAAMH,EAAS,KAAA;AAEjC,YAAI;AACF,gBAAMI,IAAY,KAAK,MAAMD,CAAS;AACtC,UAAIC,EAAU,QACZF,IAAeE,EAAU,QAEzBF,KAAgB,IAAIC,CAAS;AAAA,QAEjC,QAAQ;AAEN,UAAAD,KAAgB,IAAIC,CAAS;AAAA,QAC/B;AAAA,MACF,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,MAAMD,CAAY;AAAA,IAC9B;AAEA,UAAMG,IAAS,MAAML,EAAS,KAAA;AAC9B,WAAO,IAAIM,EAAUD,CAAM;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAqB;AACzB,UAAMN,IAAM,GAAG,KAAK,MAAM,SAEpBC,IAAW,MAAM,MAAMD,GAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,aAAa;AAAA,IAAA,CACd;AAED,QAAI,CAACC,EAAS;AACZ,YAAM,IAAI,MAAM,yBAAyBA,EAAS,MAAM,EAAE;AAG5D,WAAOA,EAAS,KAAA;AAAA,EAClB;AAAA,EAEA,MAAM,IAAIH,GAAgC;AAExC,UAAMC,IAAa,mBAAmB,KAAK,UAAUD,CAAK,CAAC,GACrDE,IAAM,GAAG,KAAK,MAAM,cAAcD,CAAU,IAE5CE,IAAW,MAAM,MAAMD,GAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA;AAAA,QAEP,GAAG,OAAO;AAAA,UACR,OAAO,QAAQ,KAAK,OAAO,EAAE,OAAO,CAAC,CAACE,CAAG,MAAMA,MAAQ,cAAc;AAAA,QAAA;AAAA,MACvE;AAAA,MAEF,aAAa;AAAA,IAAA,CACd;AAED,QAAI,CAACD,EAAS;AACZ,YAAM,IAAI,MAAM,0BAA0BA,EAAS,MAAM,EAAE;AAG7D,WAAOA,EAAS,KAAA;AAAA,EAClB;AAAA,EAEA,MAAM,OAAOH,GAAgC;AAC3C,UAAME,IAAM,GAAG,KAAK,MAAM,YAEpBC,IAAW,MAAM,MAAMD,GAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,EAAE,OAAAF,GAAO;AAAA,IAAA,CAC/B;AAED,QAAI,CAACG,EAAS,IAAI;AAChB,UAAIE,IAAe,mBAAmBF,EAAS,MAAM;AACrD,UAAI;AACF,cAAMG,IAAY,MAAMH,EAAS,KAAA;AACjC,YAAI;AACF,gBAAMI,IAAY,KAAK,MAAMD,CAAS;AACtC,UAAIC,EAAU,QACZF,IAAeE,EAAU,QAEzBF,KAAgB,IAAIC,CAAS;AAAA,QAEjC,QAAQ;AACN,UAAAD,KAAgB,IAAIC,CAAS;AAAA,QAC/B;AAAA,MACF,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,MAAMD,CAAY;AAAA,IAC9B;AAEA,WAAOF,EAAS,KAAA;AAAA,EAClB;AACF;AAKA,MAAMM,EAAmC;AAAA,EAGvC,YAAYC,GAAmB;AAFxB,IAAAX,EAAA;AAGL,SAAK,eAAeW;AAAA,EACtB;AAAA,EAEA,UAAiB;AAGf,WAAI,KAAK,aAAa,WAAW,KAAK,aAAa,QAAQ,CAAC,IACnD,KAAK,aAAa,QAAQ,CAAC,EAAE,QAAQ,CAAA,IAEvC,KAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,aAAoB;AAElB,WAAO,KAAK,QAAA;AAAA,EACd;AAAA,EAEA,SAAgB;AAEd,WAAO,KAAK,QAAA;AAAA,EACd;AAAA,EAEA,aAAkB;AAGhB,WAAI,KAAK,aAAa,WAAW,KAAK,aAAa,QAAQ,CAAC,IACnD,KAAK,aAAa,QAAQ,CAAC,EAAE,cAAc,CAAA,IAE7C,KAAK,aAAa,cAAc,CAAA;AAAA,EACzC;AACF;AAKO,SAASC,EAAiBd,GAAgBC,IAA0B,IAAgB;AACzF,SAAO,IAAIF,EAAWC,GAAOC,CAAO;AACtC;AC7IA,MAAMc,IAAiB,KAAK,KAAK;AAGjC,IAAIC,IAAgC;AAEpC,SAASC,EAAcC,GAA+B;AACpD,QAAMC,IAA0B,CAAA;AAEhC,SAAAD,EAAK,MAAM,QAAQ,CAAAE,MAAQ;AAEzB,IAAAA,EAAK,SAAS,QAAQ,CAAAC,MAAW;AAC/B,MAAAF,EAASE,EAAQ,IAAI,IAAIA,EAAQ,SAASA,EAAQ,cAAcA,EAAQ;AAAA,IAC1E,CAAC,GAGDD,EAAK,WAAW,QAAQ,CAAAE,MAAa;AACnC,MAAAH,EAASG,EAAU,IAAI,IAAIA,EAAU,SAASA,EAAU,cAAcA,EAAU;AAAA,IAClF,CAAC,GAGDF,EAAK,SAAS,QAAQ,CAAAG,MAAW;AAC/B,MAAAJ,EAASI,EAAQ,IAAI,IAAIA,EAAQ,SAASA,EAAQ,cAAcA,EAAQ;AAAA,IAC1E,CAAC;AAAA,EACH,CAAC,GAEMJ;AACT;AAEA,SAASK,IAAwB;AAC/B,SAAKR,IACO,KAAK,IAAA,IACHA,EAAW,YAAaD,IAFd;AAG1B;AAEO,SAASU,EAAYC,GAAwC;AAClE,QAAM,CAACR,GAAMS,CAAO,IAAIC,EAA0B,IAAI,GAChD,CAACT,GAAUU,CAAW,IAAID,EAAwB,CAAA,CAAE,GACpD,CAACE,GAASC,CAAU,IAAIH,EAAS,EAAI,GACrC,CAACI,GAAOC,CAAQ,IAAIL,EAAwB,IAAI,GAEhDM,IAAYC,EAAY,YAAY;AAExC,QAAIX,EAAA,KAAkBR,GAAY;AAChC,MAAAW,EAAQX,EAAW,IAAI,GACvBa,EAAYb,EAAW,QAAQ,GAC/Be,EAAW,EAAK,GAChBE,EAAS,IAAI;AACb;AAAA,IACF;AAEA,QAAI;AACF,MAAAF,EAAW,EAAI,GACfE,EAAS,IAAI;AAEb,YAAMG,IAAqB,MAAMV,EAAQ,KAAA,GACnCW,IAAcpB,EAAcmB,CAAQ;AAG1C,MAAApB,IAAa;AAAA,QACX,MAAMoB;AAAA,QACN,UAAUC;AAAA,QACV,WAAW,KAAK,IAAA;AAAA,MAAI,GAGtBV,EAAQS,CAAQ,GAChBP,EAAYQ,CAAW;AAAA,IACzB,SAASC,GAAK;AACZ,YAAM9B,IAAe8B,aAAe,QAAQA,EAAI,UAAU;AAC1D,MAAAL,EAASzB,CAAY,GACrB,QAAQ,MAAM,kCAAkC8B,CAAG;AAAA,IACrD,UAAA;AACE,MAAAP,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACL,CAAO,CAAC;AAEZ,EAAAa,EAAU,MAAM;AACd,IAAAL,EAAA;AAAA,EACF,GAAG,CAACA,CAAS,CAAC;AAEd,QAAMM,IAAgBL,EAAY,CAACM,MAC1BtB,EAASsB,CAAS,KAAKA,GAC7B,CAACtB,CAAQ,CAAC,GAEPuB,IAAUP,EAAY,MAAM;AAEhC,IAAAnB,IAAa,MACbkB,EAAA;AAAA,EACF,GAAG,CAACA,CAAS,CAAC;AAEd,SAAO;AAAA,IACL,MAAAhB;AAAA,IACA,UAAAC;AAAA,IACA,SAAAW;AAAA,IACA,OAAAE;AAAA,IACA,SAAAU;AAAA,IACA,eAAAF;AAAA,EAAA;AAEJ;ACnHA,MAAMG,IAAcC,EAAuC,IAAI;AAWxD,SAASC,EAAa;AAAA,EAC3B,SAASC;AAAA,EACT,YAAYC;AAAA,EACZ,OAAOC;AAAA,EACP,SAAA/C,IAAU,CAAA;AAAA,EACV,UAAAgD,IAAW,EAAE,UAAU,IAAM,YAAY,mBAAA;AAAA;AAAA,EACzC,UAAAC;AACF,GAAsB;AAEpB,QAAM,CAACC,GAAWC,CAAY,IAAIxB,EAAyD;AAAA,IACzF,YAAYmB,KAAqB,EAAE,QAAQ,iBAAA;AAAA,IAC3C,OAAOC;AAAA,EAAA,CACR,GAGKtB,IAAU2B,EAAQ,MAClBP,KAAkB,CAACC,KAAqB,CAACC,IAEpCF,IAIFhC,EAAiBqC,EAAU,OAAOA,EAAU,UAAU,GAC5D,CAACL,GAAgBC,GAAmBC,GAAcG,EAAU,YAAYA,EAAU,KAAK,CAAC,GAErF,EAAE,MAAAjC,GAAM,UAAAC,GAAU,SAASmC,GAAa,OAAOC,GAAW,eAAAf,GAAe,SAASgB,MAAgB/B,EAAYC,CAAO,GASrH+B,IAAe;AAAA,IACnB,SAAA/B;AAAA,IACA,SAAAzB;AAAA,IACA,MAAAiB;AAAA,IACA,UAAAC;AAAA,IACA,aAAAmC;AAAA,IACA,WAAAC;AAAA,IACA,eAAAf;AAAA,IACA,aAAAgB;AAAA,IACA,iBAhBsB,CAACE,GAA+BC,MAAsB;AAC5E,MAAAP,EAAa;AAAA,QACX,YAAYM;AAAA,QACZ,OAAOC;AAAA,MAAA,CACR;AAAA,IACH;AAAA,IAYE,UAAAV;AAAA,EAAA;AAGF,2BACGN,EAAY,UAAZ,EAAqB,OAAOc,GAC1B,UAAAP,GACH;AAEJ;AAEO,SAASU,IAAiB;AAC/B,QAAMC,IAAUC,EAAWnB,CAAW;AAEtC,MAAI,CAACkB;AACH,UAAM,IAAI,MAAM,mDAAmD;AAErE,SAAOA;AACT;"}