@lssm/example.analytics-dashboard 1.41.0 → 1.42.1

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/dashboard/dashboard.enum.d.ts +18 -0
  4. package/dist/dashboard/dashboard.enum.d.ts.map +1 -0
  5. package/dist/dashboard/dashboard.enum.js +2 -1
  6. package/dist/dashboard/dashboard.enum.js.map +1 -0
  7. package/dist/dashboard/dashboard.operation.d.ts +537 -0
  8. package/dist/dashboard/dashboard.operation.d.ts.map +1 -0
  9. package/dist/dashboard/{dashboard.contracts.js → dashboard.operation.js} +106 -12
  10. package/dist/dashboard/dashboard.operation.js.map +1 -0
  11. package/dist/dashboard/dashboard.presentation.d.ts +9 -0
  12. package/dist/dashboard/dashboard.presentation.d.ts.map +1 -0
  13. package/dist/dashboard/dashboard.presentation.js +21 -7
  14. package/dist/dashboard/dashboard.presentation.js.map +1 -0
  15. package/dist/dashboard/dashboard.schema.d.ts +333 -0
  16. package/dist/dashboard/dashboard.schema.d.ts.map +1 -0
  17. package/dist/dashboard/dashboard.schema.js +2 -1
  18. package/dist/dashboard/dashboard.schema.js.map +1 -0
  19. package/dist/dashboard/index.d.ts +4 -0
  20. package/dist/dashboard/index.js +1 -1
  21. package/dist/dashboard.feature.d.ts +8 -0
  22. package/dist/dashboard.feature.d.ts.map +1 -0
  23. package/dist/dashboard.feature.js +29 -27
  24. package/dist/dashboard.feature.js.map +1 -0
  25. package/dist/docs/analytics-dashboard.docblock.d.ts +1 -0
  26. package/dist/docs/analytics-dashboard.docblock.js +2 -1
  27. package/dist/docs/analytics-dashboard.docblock.js.map +1 -0
  28. package/dist/docs/index.d.ts +1 -0
  29. package/dist/events.d.ts +149 -0
  30. package/dist/events.d.ts.map +1 -0
  31. package/dist/events.js +26 -10
  32. package/dist/events.js.map +1 -0
  33. package/dist/example.d.ts +40 -0
  34. package/dist/example.d.ts.map +1 -0
  35. package/dist/example.js +2 -1
  36. package/dist/example.js.map +1 -0
  37. package/dist/index.d.ts +7 -0
  38. package/dist/index.js +1 -1
  39. package/dist/query/index.d.ts +4 -0
  40. package/dist/query/index.js +1 -1
  41. package/dist/query/query.enum.d.ts +10 -0
  42. package/dist/query/query.enum.d.ts.map +1 -0
  43. package/dist/query/query.enum.js +2 -1
  44. package/dist/query/query.enum.js.map +1 -0
  45. package/dist/query/query.operation.d.ts +181 -0
  46. package/dist/query/query.operation.d.ts.map +1 -0
  47. package/dist/query/query.operation.js +113 -0
  48. package/dist/query/query.operation.js.map +1 -0
  49. package/dist/query/query.presentation.d.ts +8 -0
  50. package/dist/query/query.presentation.d.ts.map +1 -0
  51. package/dist/query/query.presentation.js +15 -5
  52. package/dist/query/query.presentation.js.map +1 -0
  53. package/dist/query/query.schema.d.ts +143 -0
  54. package/dist/query/query.schema.d.ts.map +1 -0
  55. package/dist/query/query.schema.js +2 -1
  56. package/dist/query/query.schema.js.map +1 -0
  57. package/dist/query-engine/index.d.ts +106 -0
  58. package/dist/query-engine/index.d.ts.map +1 -0
  59. package/dist/query-engine/index.js +5 -1
  60. package/dist/query-engine/index.js.map +1 -0
  61. package/package.json +39 -31
  62. package/dist/query/query.contracts.js +0 -65
  63. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,181 @@
1
+ import * as _lssm_lib_schema247 from "@lssm/lib.schema";
2
+ import * as _lssm_lib_contracts9 from "@lssm/lib.contracts";
3
+
4
+ //#region src/query/query.operation.d.ts
5
+ /**
6
+ * Create a data query.
7
+ */
8
+ declare const CreateQueryContract: _lssm_lib_contracts9.OperationSpec<_lssm_lib_schema247.SchemaModel<{
9
+ name: {
10
+ type: _lssm_lib_schema247.FieldType<string, string>;
11
+ isOptional: false;
12
+ };
13
+ description: {
14
+ type: _lssm_lib_schema247.FieldType<string, string>;
15
+ isOptional: true;
16
+ };
17
+ type: {
18
+ type: _lssm_lib_schema247.EnumType<[string, string, string, string]>;
19
+ isOptional: false;
20
+ };
21
+ definition: {
22
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
23
+ isOptional: false;
24
+ };
25
+ sql: {
26
+ type: _lssm_lib_schema247.FieldType<string, string>;
27
+ isOptional: true;
28
+ };
29
+ metricIds: {
30
+ type: _lssm_lib_schema247.FieldType<string, string>;
31
+ isArray: true;
32
+ isOptional: true;
33
+ };
34
+ cacheTtlSeconds: {
35
+ type: _lssm_lib_schema247.FieldType<number, number>;
36
+ isOptional: true;
37
+ };
38
+ isShared: {
39
+ type: _lssm_lib_schema247.FieldType<boolean, boolean>;
40
+ isOptional: true;
41
+ };
42
+ }>, _lssm_lib_schema247.SchemaModel<{
43
+ id: {
44
+ type: _lssm_lib_schema247.FieldType<string, string>;
45
+ isOptional: false;
46
+ };
47
+ name: {
48
+ type: _lssm_lib_schema247.FieldType<string, string>;
49
+ isOptional: false;
50
+ };
51
+ description: {
52
+ type: _lssm_lib_schema247.FieldType<string, string>;
53
+ isOptional: true;
54
+ };
55
+ type: {
56
+ type: _lssm_lib_schema247.EnumType<[string, string, string, string]>;
57
+ isOptional: false;
58
+ };
59
+ definition: {
60
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
61
+ isOptional: false;
62
+ };
63
+ sql: {
64
+ type: _lssm_lib_schema247.FieldType<string, string>;
65
+ isOptional: true;
66
+ };
67
+ cacheTtlSeconds: {
68
+ type: _lssm_lib_schema247.FieldType<number, number>;
69
+ isOptional: false;
70
+ };
71
+ isShared: {
72
+ type: _lssm_lib_schema247.FieldType<boolean, boolean>;
73
+ isOptional: false;
74
+ };
75
+ createdAt: {
76
+ type: _lssm_lib_schema247.FieldType<Date, string>;
77
+ isOptional: false;
78
+ };
79
+ }>, {
80
+ key: string;
81
+ version: number;
82
+ stability: string;
83
+ owners: "@example.analytics-dashboard"[];
84
+ tags: string[];
85
+ when: string;
86
+ payload: _lssm_lib_schema247.SchemaModel<{
87
+ id: {
88
+ type: _lssm_lib_schema247.FieldType<string, string>;
89
+ isOptional: false;
90
+ };
91
+ name: {
92
+ type: _lssm_lib_schema247.FieldType<string, string>;
93
+ isOptional: false;
94
+ };
95
+ description: {
96
+ type: _lssm_lib_schema247.FieldType<string, string>;
97
+ isOptional: true;
98
+ };
99
+ type: {
100
+ type: _lssm_lib_schema247.EnumType<[string, string, string, string]>;
101
+ isOptional: false;
102
+ };
103
+ definition: {
104
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
105
+ isOptional: false;
106
+ };
107
+ sql: {
108
+ type: _lssm_lib_schema247.FieldType<string, string>;
109
+ isOptional: true;
110
+ };
111
+ cacheTtlSeconds: {
112
+ type: _lssm_lib_schema247.FieldType<number, number>;
113
+ isOptional: false;
114
+ };
115
+ isShared: {
116
+ type: _lssm_lib_schema247.FieldType<boolean, boolean>;
117
+ isOptional: false;
118
+ };
119
+ createdAt: {
120
+ type: _lssm_lib_schema247.FieldType<Date, string>;
121
+ isOptional: false;
122
+ };
123
+ }>;
124
+ }[]>;
125
+ /**
126
+ * Execute a data query.
127
+ */
128
+ declare const ExecuteQueryContract: _lssm_lib_contracts9.OperationSpec<_lssm_lib_schema247.SchemaModel<{
129
+ queryId: {
130
+ type: _lssm_lib_schema247.FieldType<string, string>;
131
+ isOptional: false;
132
+ };
133
+ parameters: {
134
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
135
+ isOptional: true;
136
+ };
137
+ dateRange: {
138
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
139
+ isOptional: true;
140
+ };
141
+ filters: {
142
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
143
+ isOptional: true;
144
+ };
145
+ forceRefresh: {
146
+ type: _lssm_lib_schema247.FieldType<boolean, boolean>;
147
+ isOptional: true;
148
+ };
149
+ }>, _lssm_lib_schema247.SchemaModel<{
150
+ queryId: {
151
+ type: _lssm_lib_schema247.FieldType<string, string>;
152
+ isOptional: false;
153
+ };
154
+ data: {
155
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
156
+ isOptional: false;
157
+ };
158
+ columns: {
159
+ type: _lssm_lib_schema247.FieldType<unknown, unknown>;
160
+ isOptional: false;
161
+ };
162
+ rowCount: {
163
+ type: _lssm_lib_schema247.FieldType<number, number>;
164
+ isOptional: false;
165
+ };
166
+ executionTimeMs: {
167
+ type: _lssm_lib_schema247.FieldType<number, number>;
168
+ isOptional: false;
169
+ };
170
+ cachedAt: {
171
+ type: _lssm_lib_schema247.FieldType<Date, string>;
172
+ isOptional: true;
173
+ };
174
+ error: {
175
+ type: _lssm_lib_schema247.FieldType<string, string>;
176
+ isOptional: true;
177
+ };
178
+ }>, undefined>;
179
+ //#endregion
180
+ export { CreateQueryContract, ExecuteQueryContract };
181
+ //# sourceMappingURL=query.operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.operation.d.ts","names":[],"sources":["../../src/query/query.operation.ts"],"sourcesContent":[],"mappings":";;;;;;;cAaa,0CAAmB,kCAAA;EAAnB,IAAA,EAAA;IA+CX,IAAA,EAAA,mBAAA,CAAA,SAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;;;;sCA/C8B,CAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA,CAAA;IAAA,UAAA,EAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;CAAA,CAAA,iCAAA,CAAA;EAoDnB,EAAA,EAAA;IA8BX,IAAA,EAlF8B,mBAAA,CAAA,SAkF9B,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;qBA9B+B;EAAA,CAAA;;;;;;;;;;IAAA,IAAA,+BAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAApB,2CAAoB,kCAAA;;UA8B/B,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;UA9B+B,mBAAA,CAAA"}
@@ -0,0 +1,113 @@
1
+ import { CreateQueryInputModel, ExecuteQueryInputModel, QueryModel, QueryResultModel } from "./query.schema.js";
2
+ import { defineCommand, defineQuery } from "@lssm/lib.contracts/operations";
3
+
4
+ //#region src/query/query.operation.ts
5
+ const OWNERS = ["@example.analytics-dashboard"];
6
+ /**
7
+ * Create a data query.
8
+ */
9
+ const CreateQueryContract = defineCommand({
10
+ meta: {
11
+ key: "analytics.query.create",
12
+ version: 1,
13
+ stability: "stable",
14
+ owners: [...OWNERS],
15
+ tags: [
16
+ "analytics",
17
+ "query",
18
+ "create"
19
+ ],
20
+ description: "Create a data query.",
21
+ goal: "Define reusable data queries.",
22
+ context: "Query builder."
23
+ },
24
+ io: {
25
+ input: CreateQueryInputModel,
26
+ output: QueryModel
27
+ },
28
+ policy: { auth: "user" },
29
+ sideEffects: {
30
+ emits: [{
31
+ key: "analytics.query.created",
32
+ version: 1,
33
+ stability: "stable",
34
+ owners: [...OWNERS],
35
+ tags: [
36
+ "analytics",
37
+ "query",
38
+ "created"
39
+ ],
40
+ when: "Query created",
41
+ payload: QueryModel
42
+ }],
43
+ audit: ["analytics.query.created"]
44
+ },
45
+ acceptance: {
46
+ scenarios: [{
47
+ key: "create-query-happy-path",
48
+ given: ["User is authenticated"],
49
+ when: ["User submits valid query definition"],
50
+ then: ["Query is created", "QueryCreated event is emitted"]
51
+ }],
52
+ examples: [{
53
+ key: "create-sql-query",
54
+ input: {
55
+ name: "Monthly Revenue",
56
+ sql: "SELECT SUM(amount) FROM orders WHERE date >= :startDate"
57
+ },
58
+ output: {
59
+ id: "query-123",
60
+ name: "Monthly Revenue",
61
+ type: "sql"
62
+ }
63
+ }]
64
+ }
65
+ });
66
+ /**
67
+ * Execute a data query.
68
+ */
69
+ const ExecuteQueryContract = defineQuery({
70
+ meta: {
71
+ key: "analytics.query.execute",
72
+ version: 1,
73
+ stability: "stable",
74
+ owners: [...OWNERS],
75
+ tags: [
76
+ "analytics",
77
+ "query",
78
+ "execute"
79
+ ],
80
+ description: "Execute a data query.",
81
+ goal: "Fetch data for visualizations.",
82
+ context: "Dashboard rendering."
83
+ },
84
+ io: {
85
+ input: ExecuteQueryInputModel,
86
+ output: QueryResultModel
87
+ },
88
+ policy: { auth: "user" },
89
+ acceptance: {
90
+ scenarios: [{
91
+ key: "execute-query-happy-path",
92
+ given: ["Query exists"],
93
+ when: ["User executes query with parameters"],
94
+ then: ["Query results are returned"]
95
+ }],
96
+ examples: [{
97
+ key: "execute-with-params",
98
+ input: {
99
+ queryId: "query-123",
100
+ params: { startDate: "2025-01-01" }
101
+ },
102
+ output: {
103
+ columns: ["total"],
104
+ rows: [{ total: 5e4 }],
105
+ rowCount: 1
106
+ }
107
+ }]
108
+ }
109
+ });
110
+
111
+ //#endregion
112
+ export { CreateQueryContract, ExecuteQueryContract };
113
+ //# sourceMappingURL=query.operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.operation.js","names":[],"sources":["../../src/query/query.operation.ts"],"sourcesContent":["import { defineCommand, defineQuery } from '@lssm/lib.contracts/operations';\nimport {\n QueryModel,\n QueryResultModel,\n CreateQueryInputModel,\n ExecuteQueryInputModel,\n} from './query.schema';\n\nconst OWNERS = ['@example.analytics-dashboard'] as const;\n\n/**\n * Create a data query.\n */\nexport const CreateQueryContract = defineCommand({\n meta: {\n key: 'analytics.query.create',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['analytics', 'query', 'create'],\n description: 'Create a data query.',\n goal: 'Define reusable data queries.',\n context: 'Query builder.',\n },\n io: { input: CreateQueryInputModel, output: QueryModel },\n policy: { auth: 'user' },\n sideEffects: {\n emits: [\n {\n key: 'analytics.query.created',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['analytics', 'query', 'created'],\n when: 'Query created',\n payload: QueryModel,\n },\n ],\n audit: ['analytics.query.created'],\n },\n acceptance: {\n scenarios: [\n {\n key: 'create-query-happy-path',\n given: ['User is authenticated'],\n when: ['User submits valid query definition'],\n then: ['Query is created', 'QueryCreated event is emitted'],\n },\n ],\n examples: [\n {\n key: 'create-sql-query',\n input: {\n name: 'Monthly Revenue',\n sql: 'SELECT SUM(amount) FROM orders WHERE date >= :startDate',\n },\n output: { id: 'query-123', name: 'Monthly Revenue', type: 'sql' },\n },\n ],\n },\n});\n\n/**\n * Execute a data query.\n */\nexport const ExecuteQueryContract = defineQuery({\n meta: {\n key: 'analytics.query.execute',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['analytics', 'query', 'execute'],\n description: 'Execute a data query.',\n goal: 'Fetch data for visualizations.',\n context: 'Dashboard rendering.',\n },\n io: { input: ExecuteQueryInputModel, output: QueryResultModel },\n policy: { auth: 'user' },\n acceptance: {\n scenarios: [\n {\n key: 'execute-query-happy-path',\n given: ['Query exists'],\n when: ['User executes query with parameters'],\n then: ['Query results are returned'],\n },\n ],\n examples: [\n {\n key: 'execute-with-params',\n input: { queryId: 'query-123', params: { startDate: '2025-01-01' } },\n output: { columns: ['total'], rows: [{ total: 50000 }], rowCount: 1 },\n },\n ],\n },\n});\n"],"mappings":";;;;AAQA,MAAM,SAAS,CAAC,+BAA+B;;;;AAK/C,MAAa,sBAAsB,cAAc;CAC/C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAa;GAAS;GAAS;EACtC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EAAE,OAAO;EAAuB,QAAQ;EAAY;CACxD,QAAQ,EAAE,MAAM,QAAQ;CACxB,aAAa;EACX,OAAO,CACL;GACE,KAAK;GACL,SAAS;GACT,WAAW;GACX,QAAQ,CAAC,GAAG,OAAO;GACnB,MAAM;IAAC;IAAa;IAAS;IAAU;GACvC,MAAM;GACN,SAAS;GACV,CACF;EACD,OAAO,CAAC,0BAA0B;EACnC;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,wBAAwB;GAChC,MAAM,CAAC,sCAAsC;GAC7C,MAAM,CAAC,oBAAoB,gCAAgC;GAC5D,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO;IACL,MAAM;IACN,KAAK;IACN;GACD,QAAQ;IAAE,IAAI;IAAa,MAAM;IAAmB,MAAM;IAAO;GAClE,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,uBAAuB,YAAY;CAC9C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAa;GAAS;GAAU;EACvC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EAAE,OAAO;EAAwB,QAAQ;EAAkB;CAC/D,QAAQ,EAAE,MAAM,QAAQ;CACxB,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,eAAe;GACvB,MAAM,CAAC,sCAAsC;GAC7C,MAAM,CAAC,6BAA6B;GACrC,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO;IAAE,SAAS;IAAa,QAAQ,EAAE,WAAW,cAAc;IAAE;GACpE,QAAQ;IAAE,SAAS,CAAC,QAAQ;IAAE,MAAM,CAAC,EAAE,OAAO,KAAO,CAAC;IAAE,UAAU;IAAG;GACtE,CACF;EACF;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { PresentationSpec } from "@lssm/lib.contracts";
2
+
3
+ //#region src/query/query.presentation.d.ts
4
+ declare const QueriesListPresentation: PresentationSpec;
5
+ declare const QueryBuilderPresentation: PresentationSpec;
6
+ //#endregion
7
+ export { QueriesListPresentation, QueryBuilderPresentation };
8
+ //# sourceMappingURL=query.presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.presentation.d.ts","names":[],"sources":["../../src/query/query.presentation.ts"],"sourcesContent":[],"mappings":";;;cAIa,yBAAyB;cAyBzB,0BAA0B"}
@@ -1,10 +1,12 @@
1
1
  import { QueryModel } from "./query.schema.js";
2
+ import { StabilityEnum } from "@lssm/lib.contracts";
2
3
 
3
4
  //#region src/query/query.presentation.ts
4
5
  const QueriesListPresentation = {
5
6
  meta: {
6
- name: "analytics.query.list",
7
+ key: "analytics.query.list",
7
8
  version: 1,
9
+ title: "Queries List",
8
10
  description: "List of saved queries",
9
11
  domain: "analytics",
10
12
  owners: ["@analytics-dashboard"],
@@ -12,7 +14,10 @@ const QueriesListPresentation = {
12
14
  "analytics",
13
15
  "queries",
14
16
  "list"
15
- ]
17
+ ],
18
+ stability: StabilityEnum.Experimental,
19
+ goal: "Browse and manage saved data queries.",
20
+ context: "The library of reusable data definitions."
16
21
  },
17
22
  source: {
18
23
  type: "component",
@@ -25,8 +30,9 @@ const QueriesListPresentation = {
25
30
  };
26
31
  const QueryBuilderPresentation = {
27
32
  meta: {
28
- name: "analytics.query.builder",
33
+ key: "analytics.query.builder",
29
34
  version: 1,
35
+ title: "Query Builder",
30
36
  description: "Visual query builder interface",
31
37
  domain: "analytics",
32
38
  owners: ["@analytics-dashboard"],
@@ -34,7 +40,10 @@ const QueryBuilderPresentation = {
34
40
  "analytics",
35
41
  "query",
36
42
  "builder"
37
- ]
43
+ ],
44
+ stability: StabilityEnum.Experimental,
45
+ goal: "Visually construct data queries and transformations.",
46
+ context: "Developer tool for data analysis."
38
47
  },
39
48
  source: {
40
49
  type: "component",
@@ -47,4 +56,5 @@ const QueryBuilderPresentation = {
47
56
  };
48
57
 
49
58
  //#endregion
50
- export { QueriesListPresentation, QueryBuilderPresentation };
59
+ export { QueriesListPresentation, QueryBuilderPresentation };
60
+ //# sourceMappingURL=query.presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.presentation.js","names":["QueriesListPresentation: PresentationSpec","QueryBuilderPresentation: PresentationSpec"],"sources":["../../src/query/query.presentation.ts"],"sourcesContent":["import type { PresentationSpec } from '@lssm/lib.contracts';\nimport { StabilityEnum } from '@lssm/lib.contracts';\nimport { QueryModel } from './query.schema';\n\nexport const QueriesListPresentation: PresentationSpec = {\n meta: {\n key: 'analytics.query.list',\n version: 1,\n title: 'Queries List',\n description: 'List of saved queries',\n domain: 'analytics',\n owners: ['@analytics-dashboard'],\n tags: ['analytics', 'queries', 'list'],\n stability: StabilityEnum.Experimental,\n goal: 'Browse and manage saved data queries.',\n context: 'The library of reusable data definitions.',\n },\n source: {\n type: 'component',\n framework: 'react',\n componentKey: 'QueriesList',\n props: QueryModel,\n },\n targets: ['react', 'markdown'],\n policy: {\n flags: ['analytics.queries.enabled'],\n },\n};\n\nexport const QueryBuilderPresentation: PresentationSpec = {\n meta: {\n key: 'analytics.query.builder',\n version: 1,\n title: 'Query Builder',\n description: 'Visual query builder interface',\n domain: 'analytics',\n owners: ['@analytics-dashboard'],\n tags: ['analytics', 'query', 'builder'],\n stability: StabilityEnum.Experimental,\n goal: 'Visually construct data queries and transformations.',\n context: 'Developer tool for data analysis.',\n },\n source: {\n type: 'component',\n framework: 'react',\n componentKey: 'QueryBuilder',\n props: QueryModel,\n },\n targets: ['react'],\n policy: {\n flags: ['analytics.queries.enabled'],\n },\n};\n"],"mappings":";;;;AAIA,MAAaA,0BAA4C;CACvD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aAAa;EACb,QAAQ;EACR,QAAQ,CAAC,uBAAuB;EAChC,MAAM;GAAC;GAAa;GAAW;GAAO;EACtC,WAAW,cAAc;EACzB,MAAM;EACN,SAAS;EACV;CACD,QAAQ;EACN,MAAM;EACN,WAAW;EACX,cAAc;EACd,OAAO;EACR;CACD,SAAS,CAAC,SAAS,WAAW;CAC9B,QAAQ,EACN,OAAO,CAAC,4BAA4B,EACrC;CACF;AAED,MAAaC,2BAA6C;CACxD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aAAa;EACb,QAAQ;EACR,QAAQ,CAAC,uBAAuB;EAChC,MAAM;GAAC;GAAa;GAAS;GAAU;EACvC,WAAW,cAAc;EACzB,MAAM;EACN,SAAS;EACV;CACD,QAAQ;EACN,MAAM;EACN,WAAW;EACX,cAAc;EACd,OAAO;EACR;CACD,SAAS,CAAC,QAAQ;CAClB,QAAQ,EACN,OAAO,CAAC,4BAA4B,EACrC;CACF"}
@@ -0,0 +1,143 @@
1
+ import * as _lssm_lib_schema291 from "@lssm/lib.schema";
2
+
3
+ //#region src/query/query.schema.d.ts
4
+ /**
5
+ * A data query.
6
+ */
7
+ declare const QueryModel: _lssm_lib_schema291.SchemaModel<{
8
+ id: {
9
+ type: _lssm_lib_schema291.FieldType<string, string>;
10
+ isOptional: false;
11
+ };
12
+ name: {
13
+ type: _lssm_lib_schema291.FieldType<string, string>;
14
+ isOptional: false;
15
+ };
16
+ description: {
17
+ type: _lssm_lib_schema291.FieldType<string, string>;
18
+ isOptional: true;
19
+ };
20
+ type: {
21
+ type: _lssm_lib_schema291.EnumType<[string, string, string, string]>;
22
+ isOptional: false;
23
+ };
24
+ definition: {
25
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
26
+ isOptional: false;
27
+ };
28
+ sql: {
29
+ type: _lssm_lib_schema291.FieldType<string, string>;
30
+ isOptional: true;
31
+ };
32
+ cacheTtlSeconds: {
33
+ type: _lssm_lib_schema291.FieldType<number, number>;
34
+ isOptional: false;
35
+ };
36
+ isShared: {
37
+ type: _lssm_lib_schema291.FieldType<boolean, boolean>;
38
+ isOptional: false;
39
+ };
40
+ createdAt: {
41
+ type: _lssm_lib_schema291.FieldType<Date, string>;
42
+ isOptional: false;
43
+ };
44
+ }>;
45
+ /**
46
+ * Query execution result.
47
+ */
48
+ declare const QueryResultModel: _lssm_lib_schema291.SchemaModel<{
49
+ queryId: {
50
+ type: _lssm_lib_schema291.FieldType<string, string>;
51
+ isOptional: false;
52
+ };
53
+ data: {
54
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
55
+ isOptional: false;
56
+ };
57
+ columns: {
58
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
59
+ isOptional: false;
60
+ };
61
+ rowCount: {
62
+ type: _lssm_lib_schema291.FieldType<number, number>;
63
+ isOptional: false;
64
+ };
65
+ executionTimeMs: {
66
+ type: _lssm_lib_schema291.FieldType<number, number>;
67
+ isOptional: false;
68
+ };
69
+ cachedAt: {
70
+ type: _lssm_lib_schema291.FieldType<Date, string>;
71
+ isOptional: true;
72
+ };
73
+ error: {
74
+ type: _lssm_lib_schema291.FieldType<string, string>;
75
+ isOptional: true;
76
+ };
77
+ }>;
78
+ /**
79
+ * Input for creating a query.
80
+ */
81
+ declare const CreateQueryInputModel: _lssm_lib_schema291.SchemaModel<{
82
+ name: {
83
+ type: _lssm_lib_schema291.FieldType<string, string>;
84
+ isOptional: false;
85
+ };
86
+ description: {
87
+ type: _lssm_lib_schema291.FieldType<string, string>;
88
+ isOptional: true;
89
+ };
90
+ type: {
91
+ type: _lssm_lib_schema291.EnumType<[string, string, string, string]>;
92
+ isOptional: false;
93
+ };
94
+ definition: {
95
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
96
+ isOptional: false;
97
+ };
98
+ sql: {
99
+ type: _lssm_lib_schema291.FieldType<string, string>;
100
+ isOptional: true;
101
+ };
102
+ metricIds: {
103
+ type: _lssm_lib_schema291.FieldType<string, string>;
104
+ isArray: true;
105
+ isOptional: true;
106
+ };
107
+ cacheTtlSeconds: {
108
+ type: _lssm_lib_schema291.FieldType<number, number>;
109
+ isOptional: true;
110
+ };
111
+ isShared: {
112
+ type: _lssm_lib_schema291.FieldType<boolean, boolean>;
113
+ isOptional: true;
114
+ };
115
+ }>;
116
+ /**
117
+ * Input for executing a query.
118
+ */
119
+ declare const ExecuteQueryInputModel: _lssm_lib_schema291.SchemaModel<{
120
+ queryId: {
121
+ type: _lssm_lib_schema291.FieldType<string, string>;
122
+ isOptional: false;
123
+ };
124
+ parameters: {
125
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
126
+ isOptional: true;
127
+ };
128
+ dateRange: {
129
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
130
+ isOptional: true;
131
+ };
132
+ filters: {
133
+ type: _lssm_lib_schema291.FieldType<unknown, unknown>;
134
+ isOptional: true;
135
+ };
136
+ forceRefresh: {
137
+ type: _lssm_lib_schema291.FieldType<boolean, boolean>;
138
+ isOptional: true;
139
+ };
140
+ }>;
141
+ //#endregion
142
+ export { CreateQueryInputModel, ExecuteQueryInputModel, QueryModel, QueryResultModel };
143
+ //# sourceMappingURL=query.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.schema.d.ts","names":[],"sources":["../../src/query/query.schema.ts"],"sourcesContent":[],"mappings":";;;;;;AAMa,cAAA,UAaX,sBAbqB,WAarB,CAAA;EAAA,EAAA,EAAA;UAAA,mBAAA,CAAA;;;;;;;;;oBAbqB;EAAA,CAAA;EAkBV,IAAA,EAAA;IAWX,IAAA,8BAAA,CAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA,CAAA;;;;;;;;uCAX2B,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,IAAA;EAgBhB,CAAA;EAgBX,eAAA,EAAA;;;;;;;;;IAhBgC,IAAA,+BAAA,KAAA,EAAA,MAAA,CAAA;IAqBrB,UAAA,EAAA,KAAA;EASX,CAAA;;;;;cA9CW,gBAqCsB,sBArCN,WAqCM,CAAA;EAAA,OAAA,EAAA;UA1BjC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKW,2CAAqB;;UAgBhC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKW,4CAAsB;;UASjC,mBAAA,CAAA"}
@@ -153,4 +153,5 @@ const ExecuteQueryInputModel = defineSchemaModel({
153
153
  });
154
154
 
155
155
  //#endregion
156
- export { CreateQueryInputModel, ExecuteQueryInputModel, QueryModel, QueryResultModel };
156
+ export { CreateQueryInputModel, ExecuteQueryInputModel, QueryModel, QueryResultModel };
157
+ //# sourceMappingURL=query.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.schema.js","names":[],"sources":["../../src/query/query.schema.ts"],"sourcesContent":["import { defineSchemaModel, ScalarTypeEnum } from '@lssm/lib.schema';\nimport { QueryTypeEnum } from './query.enum';\n\n/**\n * A data query.\n */\nexport const QueryModel = defineSchemaModel({\n name: 'QueryModel',\n fields: {\n id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n type: { type: QueryTypeEnum, isOptional: false },\n definition: { type: ScalarTypeEnum.JSON(), isOptional: false },\n sql: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n cacheTtlSeconds: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n isShared: { type: ScalarTypeEnum.Boolean(), isOptional: false },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Query execution result.\n */\nexport const QueryResultModel = defineSchemaModel({\n name: 'QueryResultModel',\n fields: {\n queryId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n data: { type: ScalarTypeEnum.JSON(), isOptional: false },\n columns: { type: ScalarTypeEnum.JSON(), isOptional: false },\n rowCount: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n executionTimeMs: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n cachedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n error: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n },\n});\n\n/**\n * Input for creating a query.\n */\nexport const CreateQueryInputModel = defineSchemaModel({\n name: 'CreateQueryInput',\n fields: {\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n type: { type: QueryTypeEnum, isOptional: false },\n definition: { type: ScalarTypeEnum.JSON(), isOptional: false },\n sql: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n metricIds: {\n type: ScalarTypeEnum.String_unsecure(),\n isArray: true,\n isOptional: true,\n },\n cacheTtlSeconds: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n isShared: { type: ScalarTypeEnum.Boolean(), isOptional: true },\n },\n});\n\n/**\n * Input for executing a query.\n */\nexport const ExecuteQueryInputModel = defineSchemaModel({\n name: 'ExecuteQueryInput',\n fields: {\n queryId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n parameters: { type: ScalarTypeEnum.JSON(), isOptional: true },\n dateRange: { type: ScalarTypeEnum.JSON(), isOptional: true },\n filters: { type: ScalarTypeEnum.JSON(), isOptional: true },\n forceRefresh: { type: ScalarTypeEnum.Boolean(), isOptional: true },\n },\n});\n"],"mappings":";;;;;;;AAMA,MAAa,aAAa,kBAAkB;CAC1C,MAAM;CACN,QAAQ;EACN,IAAI;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACjE,MAAM;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACnE,aAAa;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,MAAM;GAAE,MAAM;GAAe,YAAY;GAAO;EAChD,YAAY;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAO;EAC9D,KAAK;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EACjE,iBAAiB;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EAC3E,UAAU;GAAE,MAAM,eAAe,SAAS;GAAE,YAAY;GAAO;EAC/D,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAa,mBAAmB,kBAAkB;CAChD,MAAM;CACN,QAAQ;EACN,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,MAAM;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAO;EACxD,SAAS;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAO;EAC3D,UAAU;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACpE,iBAAiB;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EAC3E,UAAU;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAM;EAC/D,OAAO;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EACpE;CACF,CAAC;;;;AAKF,MAAa,wBAAwB,kBAAkB;CACrD,MAAM;CACN,QAAQ;EACN,MAAM;GAAE,MAAM,eAAe,gBAAgB;GAAE,YAAY;GAAO;EAClE,aAAa;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,MAAM;GAAE,MAAM;GAAe,YAAY;GAAO;EAChD,YAAY;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAO;EAC9D,KAAK;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EACjE,WAAW;GACT,MAAM,eAAe,iBAAiB;GACtC,SAAS;GACT,YAAY;GACb;EACD,iBAAiB;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAM;EAC1E,UAAU;GAAE,MAAM,eAAe,SAAS;GAAE,YAAY;GAAM;EAC/D;CACF,CAAC;;;;AAKF,MAAa,yBAAyB,kBAAkB;CACtD,MAAM;CACN,QAAQ;EACN,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,YAAY;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAM;EAC7D,WAAW;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAM;EAC5D,SAAS;GAAE,MAAM,eAAe,MAAM;GAAE,YAAY;GAAM;EAC1D,cAAc;GAAE,MAAM,eAAe,SAAS;GAAE,YAAY;GAAM;EACnE;CACF,CAAC"}
@@ -0,0 +1,106 @@
1
+ //#region src/query-engine/index.d.ts
2
+ /**
3
+ * Analytics Query Engine
4
+ *
5
+ * Provides query execution and caching for analytics dashboards.
6
+ */
7
+ interface QueryDefinition {
8
+ type: 'SQL' | 'METRIC' | 'AGGREGATION' | 'CUSTOM';
9
+ sql?: string;
10
+ metricIds?: string[];
11
+ aggregation?: AggregationDefinition;
12
+ custom?: CustomQueryDefinition;
13
+ }
14
+ interface AggregationDefinition {
15
+ source: string;
16
+ measures: MeasureDefinition[];
17
+ dimensions: DimensionDefinition[];
18
+ filters?: FilterDefinition[];
19
+ orderBy?: OrderByDefinition[];
20
+ limit?: number;
21
+ }
22
+ interface MeasureDefinition {
23
+ name: string;
24
+ field: string;
25
+ aggregation: 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX' | 'COUNT_DISTINCT';
26
+ format?: string;
27
+ }
28
+ interface DimensionDefinition {
29
+ name: string;
30
+ field: string;
31
+ type?: 'TIME' | 'STRING' | 'NUMBER';
32
+ granularity?: 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'YEAR';
33
+ }
34
+ interface FilterDefinition {
35
+ field: string;
36
+ operator: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'contains' | 'between';
37
+ value: unknown;
38
+ }
39
+ interface OrderByDefinition {
40
+ field: string;
41
+ direction: 'ASC' | 'DESC';
42
+ }
43
+ interface CustomQueryDefinition {
44
+ handler: string;
45
+ parameters: Record<string, unknown>;
46
+ }
47
+ interface QueryParameters {
48
+ dateRange?: {
49
+ start: Date;
50
+ end: Date;
51
+ granularity?: string;
52
+ };
53
+ filters?: FilterDefinition[];
54
+ parameters?: Record<string, unknown>;
55
+ }
56
+ interface QueryResult {
57
+ data: Record<string, unknown>[];
58
+ columns: ColumnDefinition[];
59
+ rowCount: number;
60
+ executionTimeMs: number;
61
+ cached: boolean;
62
+ cachedAt?: Date;
63
+ error?: string;
64
+ }
65
+ interface ColumnDefinition {
66
+ name: string;
67
+ type: 'STRING' | 'NUMBER' | 'DATE' | 'BOOLEAN';
68
+ label?: string;
69
+ format?: string;
70
+ }
71
+ interface IQueryEngine {
72
+ execute(definition: QueryDefinition, params: QueryParameters): Promise<QueryResult>;
73
+ validateQuery(definition: QueryDefinition): {
74
+ valid: boolean;
75
+ errors: string[];
76
+ };
77
+ }
78
+ interface IQueryCache {
79
+ get(key: string): Promise<QueryResult | null>;
80
+ set(key: string, result: QueryResult, ttlSeconds: number): Promise<void>;
81
+ invalidate(pattern: string): Promise<void>;
82
+ }
83
+ declare class InMemoryQueryCache implements IQueryCache {
84
+ private cache;
85
+ get(key: string): Promise<QueryResult | null>;
86
+ set(key: string, result: QueryResult, ttlSeconds: number): Promise<void>;
87
+ invalidate(pattern: string): Promise<void>;
88
+ }
89
+ declare class BasicQueryEngine implements IQueryEngine {
90
+ private cache;
91
+ constructor(cache?: IQueryCache);
92
+ execute(definition: QueryDefinition, params: QueryParameters): Promise<QueryResult>;
93
+ validateQuery(definition: QueryDefinition): {
94
+ valid: boolean;
95
+ errors: string[];
96
+ };
97
+ private buildCacheKey;
98
+ private executeAggregation;
99
+ private executeMetric;
100
+ private executeSql;
101
+ private generateMockData;
102
+ }
103
+ declare function createQueryEngine(cache?: IQueryCache): IQueryEngine;
104
+ //#endregion
105
+ export { AggregationDefinition, BasicQueryEngine, ColumnDefinition, CustomQueryDefinition, DimensionDefinition, FilterDefinition, IQueryCache, IQueryEngine, InMemoryQueryCache, MeasureDefinition, OrderByDefinition, QueryDefinition, QueryParameters, QueryResult, createQueryEngine };
106
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/query-engine/index.ts"],"sourcesContent":[],"mappings":";;AAQA;AAQA;;;AAIY,UAZK,eAAA,CAYL;EACA,IAAA,EAAA,KAAA,GAAA,QAAA,GAAA,aAAA,GAAA,QAAA;EAAiB,GAAA,CAAA,EAAA,MAAA;EAIZ,SAAA,CAAA,EAAA,MAAA,EAAiB;EAOjB,WAAA,CAAA,EApBD,qBAoBoB;EAOnB,MAAA,CAAA,EA1BN,qBA0BsB;AAgBjC;AAKiB,UA5CA,qBAAA,CA8CH;EAGG,MAAA,EAAA,MAAA;EAEN,QAAA,EAjDC,iBAiDD,EAAA;EACF,UAAA,EAjDK,mBAiDL,EAAA;EAGG,OAAA,CAAA,EAnDA,gBAmDA,EAAA;EACG,OAAA,CAAA,EAnDH,iBAmDG,EAAA;EAAM,KAAA,CAAA,EAAA,MAAA;AAGrB;AACQ,UAnDS,iBAAA,CAmDT;EACG,IAAA,EAAA,MAAA;EAIE,KAAA,EAAA,MAAA;EAAI,WAAA,EAAA,OAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,gBAAA;EAIA,MAAA,CAAA,EAAA,MAAA;AASjB;AAEgB,UAhEC,mBAAA,CAgED;EACJ,IAAA,EAAA,MAAA;EACC,KAAA,EAAA,MAAA;EAAR,IAAA,CAAA,EAAA,MAAA,GAAA,QAAA,GAAA,QAAA;EACuB,WAAA,CAAA,EAAA,MAAA,GAAA,KAAA,GAAA,MAAA,GAAA,OAAA,GAAA,MAAA;;AAQX,UApEA,gBAAA,CAoEW;EACA,KAAA,EAAA,MAAA;EAAR,QAAA,EAAA,IAAA,GAAA,KAAA,GAAA,IAAA,GAAA,KAAA,GAAA,IAAA,GAAA,KAAA,GAAA,IAAA,GAAA,KAAA,GAAA,UAAA,GAAA,SAAA;EACO,KAAA,EAAA,OAAA;;AACI,UAvDd,iBAAA,CAuDc;EAAO,KAAA,EAAA,MAAA;EAGzB,SAAA,EAAA,KAAA,GAAA,MAAmB;;AAGN,UAxDT,qBAAA,CAwDS;EAYd,OAAA,EAAA,MAAA;EAEP,UAAA,EApES,MAoET,CAAA,MAAA,EAAA,OAAA,CAAA;;AAjBsC,UAhD1B,eAAA,CAgD0B;EAAW,SAAA,CAAA,EAAA;IAkCzC,KAAA,EAhFF,IAgFE;IAGS,GAAA,EAlFb,IAkFa;IAKN,WAAA,CAAA,EAAA,MAAA;EACJ,CAAA;EACC,OAAA,CAAA,EAtFD,gBAsFC,EAAA;EAAR,UAAA,CAAA,EArFU,MAqFV,CAAA,MAAA,EAAA,OAAA,CAAA;;AAVoC,UAxExB,WAAA,CAwEwB;EAAY,IAAA,EAvE7C,MAuE6C,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA;EA6OrC,OAAA,EAnTL,gBAmTsB,EAAA;;;;aA/SpB;;;UAII,gBAAA;;;;;;UASA,YAAA;sBAED,yBACJ,kBACP,QAAQ;4BACe;;;;;UAQX,WAAA;oBACG,QAAQ;2BACD,kCAAkC;+BAC9B;;cAGlB,kBAAA,YAA8B;;oBAGjB,QAAQ;2BAYtB,kCAEP;+BAKgC;;cAYxB,gBAAA,YAA4B;;sBAGnB;sBAKN,yBACJ,kBACP,QAAQ;4BAgEe;;;;;;;;;;iBAmKZ,iBAAA,SAA0B,cAAc"}
@@ -48,12 +48,15 @@ var BasicQueryEngine = class {
48
48
  let result;
49
49
  switch (definition.type) {
50
50
  case "AGGREGATION":
51
+ if (!definition.aggregation) throw new Error("Aggregation definition is missing");
51
52
  result = await this.executeAggregation(definition.aggregation, params);
52
53
  break;
53
54
  case "METRIC":
55
+ if (!definition.metricIds) throw new Error("Metric IDs are missing");
54
56
  result = await this.executeMetric(definition.metricIds, params);
55
57
  break;
56
58
  case "SQL":
59
+ if (!definition.sql) throw new Error("SQL query is missing");
57
60
  result = await this.executeSql(definition.sql, params);
58
61
  break;
59
62
  default: result = {
@@ -182,4 +185,5 @@ function createQueryEngine(cache) {
182
185
  }
183
186
 
184
187
  //#endregion
185
- export { BasicQueryEngine, InMemoryQueryCache, createQueryEngine };
188
+ export { BasicQueryEngine, InMemoryQueryCache, createQueryEngine };
189
+ //# sourceMappingURL=index.js.map