@d-dash/core 0.1.0
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.
- package/README.md +46 -0
- package/dist/adapters.d.ts +125 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +2 -0
- package/dist/adapters.js.map +1 -0
- package/dist/dashboard-runtime.d.ts +96 -0
- package/dist/dashboard-runtime.d.ts.map +1 -0
- package/dist/dashboard-runtime.js +238 -0
- package/dist/dashboard-runtime.js.map +1 -0
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/execution.d.ts +37 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +210 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +11 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +2 -0
- package/dist/json.js.map +1 -0
- package/dist/migrations.d.ts +21 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +26 -0
- package/dist/migrations.js.map +1 -0
- package/dist/registry.d.ts +30 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +78 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime.d.ts +68 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +102 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema.d.ts +75 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/validation.d.ts +33 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +203 -0
- package/dist/validation.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { resolveWidgetTimeRange, } from "./runtime.js";
|
|
2
|
+
/** Executes datasource query for a resolved widget request. */
|
|
3
|
+
export async function executeWidgetQuery(registry, request) {
|
|
4
|
+
const adapter = registry.requireDatasource(request.datasourceId);
|
|
5
|
+
if (request.query.filters &&
|
|
6
|
+
adapter.capabilities?.supportsAdHocFilters === false) {
|
|
7
|
+
throw new CapabilityMismatchException("Datasource adapter does not support ad-hoc filters.", {
|
|
8
|
+
datasourceId: request.datasourceId,
|
|
9
|
+
widgetId: request.widgetId,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
const queryRequest = {
|
|
13
|
+
metric: request.query.metric,
|
|
14
|
+
timeRange: request.resolvedTimeRange,
|
|
15
|
+
filters: request.query.filters,
|
|
16
|
+
};
|
|
17
|
+
const result = await adapter.query(queryRequest, request.context);
|
|
18
|
+
assertDatasourceQueryResult(result, request.datasourceId, request.widgetId);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
/** Executes visualization render for a resolved widget request and frames. */
|
|
22
|
+
export async function executeWidgetRender(registry, input) {
|
|
23
|
+
const adapter = registry.requireVisualization(input.request.visualization.type);
|
|
24
|
+
assertVisualizationCapability(input.request.visualization.type, adapter.capabilities);
|
|
25
|
+
const renderRequest = {
|
|
26
|
+
kind: input.request.visualization.type,
|
|
27
|
+
frames: input.frames,
|
|
28
|
+
options: input.request.options,
|
|
29
|
+
context: input.request.context,
|
|
30
|
+
};
|
|
31
|
+
await adapter.render(renderRequest, input.target);
|
|
32
|
+
}
|
|
33
|
+
/** Executes full widget flow: build request, query datasource, and render when data exists. */
|
|
34
|
+
export async function executeWidget(input) {
|
|
35
|
+
const request = buildWidgetExecutionRequest({
|
|
36
|
+
dashboardId: input.dashboardId,
|
|
37
|
+
widget: input.widget,
|
|
38
|
+
dashboardTimeRange: input.dashboardTimeRange,
|
|
39
|
+
context: input.context,
|
|
40
|
+
now: input.now,
|
|
41
|
+
});
|
|
42
|
+
const result = await executeWidgetQuery(input.registry, request);
|
|
43
|
+
if (result.status === "error") {
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
await executeWidgetRender(input.registry, {
|
|
47
|
+
request,
|
|
48
|
+
frames: result.frames,
|
|
49
|
+
target: input.target,
|
|
50
|
+
});
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/** Builds a resolved widget execution request from persisted widget and runtime context. */
|
|
54
|
+
export function buildWidgetExecutionRequest(input) {
|
|
55
|
+
const resolvedTimeRange = resolveWidgetTimeRange(input.widget.timeRange, input.dashboardTimeRange, { now: input.now });
|
|
56
|
+
return {
|
|
57
|
+
dashboardId: input.dashboardId,
|
|
58
|
+
widgetId: input.widget.id,
|
|
59
|
+
datasourceId: input.widget.datasource,
|
|
60
|
+
query: input.widget.query,
|
|
61
|
+
visualization: input.widget.visualization,
|
|
62
|
+
resolvedTimeRange,
|
|
63
|
+
options: input.widget.options,
|
|
64
|
+
context: input.context,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
class DatasourceQueryException extends Error {
|
|
68
|
+
code = "DATASOURCE_QUERY_FAILED";
|
|
69
|
+
details;
|
|
70
|
+
retriable = true;
|
|
71
|
+
constructor(message, details) {
|
|
72
|
+
super(message);
|
|
73
|
+
this.name = "DatasourceQueryException";
|
|
74
|
+
this.details = details;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function assertDatasourceQueryResult(result, datasourceId, widgetId) {
|
|
78
|
+
if (result.status !== "success" &&
|
|
79
|
+
result.status !== "partial" &&
|
|
80
|
+
result.status !== "error") {
|
|
81
|
+
throw new DatasourceQueryException("Datasource returned an invalid status.", {
|
|
82
|
+
datasourceId,
|
|
83
|
+
widgetId,
|
|
84
|
+
status: String(result.status),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (!Array.isArray(result.frames)) {
|
|
88
|
+
throw new DatasourceQueryException("Datasource result frames must be an array.", {
|
|
89
|
+
datasourceId,
|
|
90
|
+
widgetId,
|
|
91
|
+
status: result.status,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Validate frame payload at runtime to guard adapters crossing package boundaries.
|
|
95
|
+
for (let i = 0; i < result.frames.length; i += 1) {
|
|
96
|
+
const frame = result.frames[i];
|
|
97
|
+
if (!Array.isArray(frame.fields)) {
|
|
98
|
+
throw new DatasourceQueryException("DataFrame.fields must be an array.", {
|
|
99
|
+
datasourceId,
|
|
100
|
+
widgetId,
|
|
101
|
+
frameIndex: i,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
for (let j = 0; j < frame.fields.length; j += 1) {
|
|
105
|
+
const field = frame.fields[j];
|
|
106
|
+
if (typeof field.name !== "string" || field.name.trim().length === 0) {
|
|
107
|
+
throw new DatasourceQueryException("DataField.name must be a non-empty string.", {
|
|
108
|
+
datasourceId,
|
|
109
|
+
widgetId,
|
|
110
|
+
frameIndex: i,
|
|
111
|
+
fieldIndex: j,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (field.type !== "time" &&
|
|
115
|
+
field.type !== "number" &&
|
|
116
|
+
field.type !== "string" &&
|
|
117
|
+
field.type !== "boolean") {
|
|
118
|
+
throw new DatasourceQueryException("DataField.type is invalid.", {
|
|
119
|
+
datasourceId,
|
|
120
|
+
widgetId,
|
|
121
|
+
frameIndex: i,
|
|
122
|
+
fieldIndex: j,
|
|
123
|
+
type: String(field.type),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (!Array.isArray(field.values)) {
|
|
127
|
+
throw new DatasourceQueryException("DataField.values must be an array.", {
|
|
128
|
+
datasourceId,
|
|
129
|
+
widgetId,
|
|
130
|
+
frameIndex: i,
|
|
131
|
+
fieldIndex: j,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
for (let k = 0; k < field.values.length; k += 1) {
|
|
135
|
+
if (!isValidScalarForType(field.values[k], field.type)) {
|
|
136
|
+
throw new DatasourceQueryException("DataField.values contains invalid scalar value.", {
|
|
137
|
+
datasourceId,
|
|
138
|
+
widgetId,
|
|
139
|
+
frameIndex: i,
|
|
140
|
+
fieldIndex: j,
|
|
141
|
+
valueIndex: k,
|
|
142
|
+
expectedType: field.type,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if ((result.status === "partial" || result.status === "error") &&
|
|
149
|
+
!isDDashError(result.error)) {
|
|
150
|
+
throw new DatasourceQueryException("Datasource partial/error result must include a structured error.", {
|
|
151
|
+
datasourceId,
|
|
152
|
+
widgetId,
|
|
153
|
+
status: result.status,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function isValidScalarForType(value, type) {
|
|
158
|
+
if (value === null) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
if (type === "string") {
|
|
162
|
+
return typeof value === "string";
|
|
163
|
+
}
|
|
164
|
+
if (type === "boolean") {
|
|
165
|
+
return typeof value === "boolean";
|
|
166
|
+
}
|
|
167
|
+
if (type === "number" || type === "time") {
|
|
168
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
function isDDashError(value) {
|
|
173
|
+
if (typeof value !== "object" || value === null) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
const maybeError = value;
|
|
177
|
+
return (typeof maybeError.code === "string" &&
|
|
178
|
+
typeof maybeError.message === "string");
|
|
179
|
+
}
|
|
180
|
+
class CapabilityMismatchException extends Error {
|
|
181
|
+
code = "CAPABILITY_MISMATCH";
|
|
182
|
+
details;
|
|
183
|
+
retriable = false;
|
|
184
|
+
constructor(message, details) {
|
|
185
|
+
super(message);
|
|
186
|
+
this.name = "CapabilityMismatchException";
|
|
187
|
+
this.details = details;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function assertVisualizationCapability(kind, capabilities) {
|
|
191
|
+
if (!capabilities) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (kind === "timeseries" && capabilities.supportsTimeSeries === false) {
|
|
195
|
+
throw new CapabilityMismatchException("Visualization adapter does not support timeseries widgets.", { kind });
|
|
196
|
+
}
|
|
197
|
+
if (kind === "stat" && capabilities.supportsStat === false) {
|
|
198
|
+
throw new CapabilityMismatchException("Visualization adapter does not support stat widgets.", { kind });
|
|
199
|
+
}
|
|
200
|
+
if (kind === "table" && capabilities.supportsTable === false) {
|
|
201
|
+
throw new CapabilityMismatchException("Visualization adapter does not support table widgets.", { kind });
|
|
202
|
+
}
|
|
203
|
+
if (kind === "text" && capabilities.supportsTextWidget === false) {
|
|
204
|
+
throw new CapabilityMismatchException("Visualization adapter does not support text widgets.", { kind });
|
|
205
|
+
}
|
|
206
|
+
if (kind === "html" && capabilities.supportsHtmlWidget === false) {
|
|
207
|
+
throw new CapabilityMismatchException("Visualization adapter does not support html widgets.", { kind });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type { JsonArray, JsonObject, JsonPrimitive, JsonValue } from "./json";
|
|
2
|
+
export type { DDashError, DDashErrorCode } from "./errors";
|
|
3
|
+
export type { DashboardMeta, LayoutItem, MetricDefinition, PersistedDashboard, PersistedTimeRange, PersistedWidget, SchemaVersion, VisualizationKind, WidgetDisplay, WidgetQuery, WidgetVisualization, } from "./schema";
|
|
4
|
+
export type { MigrationResult, VersionedPersistedDashboard, } from "./migrations";
|
|
5
|
+
export { LATEST_SCHEMA_VERSION, migratePersistedDashboard, } from "./migrations.js";
|
|
6
|
+
export type { ResolvedTimeRange, ResolvedWidgetExecutionRequest, RuntimeContext, RuntimeWidget, TimeRangeResolveError, TimeResolveOptions, } from "./runtime";
|
|
7
|
+
export { resolveDashboardTimeRange, resolveWidgetTimeRange, } from "./runtime.js";
|
|
8
|
+
export type { BuildWidgetExecutionRequestInput, ExecuteWidgetInput, ExecuteWidgetRenderInput, } from "./execution";
|
|
9
|
+
export { buildWidgetExecutionRequest, executeWidget, executeWidgetQuery, executeWidgetRender, } from "./execution.js";
|
|
10
|
+
export type { DataField, DataFieldType, DataFrame, DatasourceAdapter, DatasourceCapabilities, DatasourceQueryError, DatasourceQueryPartial, DatasourceQueryRequest, DatasourceQueryResult, DatasourceQuerySuccess, GridAdapter, GridCapabilities, GridLayoutChange, GridLayoutChangeHandler, ScalarValue, VisualizationAdapter, VisualizationCapabilities, VisualizationRenderRequest, } from "./adapters";
|
|
11
|
+
export type { AdapterRegistry, RegistryDuplicatePolicy, RegistryError, RegistryOptions, } from "./registry";
|
|
12
|
+
export { createAdapterRegistry } from "./registry.js";
|
|
13
|
+
export type { DashboardValidationOptions, ValidationIssue, ValidationIssueCode, ValidationResult, } from "./validation";
|
|
14
|
+
export { toSchemaValidationError, validatePersistedDashboard, } from "./validation.js";
|
|
15
|
+
export type { ApplyDashboardLayoutInput, BindLayoutResizeInput, DashboardPreflightResult, DashboardRuntimeError, DashboardRuntime, DashboardRuntimeOptions, DashboardSession, ExecuteAllWidgetsInput, ExecuteSessionWidgetInput, ExecuteWidgetResult, RuntimeEvent, RuntimeEventHandler, } from "./dashboard-runtime";
|
|
16
|
+
export { createDashboardRuntime } from "./dashboard-runtime.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE9E,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE3D,YAAY,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,eAAe,EACf,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,iBAAiB,EACjB,8BAA8B,EAC9B,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,gCAAgC,EAChC,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,YAAY,EACV,0BAA0B,EAC1B,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { LATEST_SCHEMA_VERSION, migratePersistedDashboard, } from "./migrations.js";
|
|
2
|
+
export { resolveDashboardTimeRange, resolveWidgetTimeRange, } from "./runtime.js";
|
|
3
|
+
export { buildWidgetExecutionRequest, executeWidget, executeWidgetQuery, executeWidgetRender, } from "./execution.js";
|
|
4
|
+
export { createAdapterRegistry } from "./registry.js";
|
|
5
|
+
export { toSchemaValidationError, validatePersistedDashboard, } from "./validation.js";
|
|
6
|
+
export { createDashboardRuntime } from "./dashboard-runtime.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAWzB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAQtB,OAAO,EACL,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AA8BxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAStD,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAiBzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/json.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Primitive JSON scalar values. */
|
|
2
|
+
export type JsonPrimitive = string | number | boolean | null;
|
|
3
|
+
/** Any JSON value supported by persisted contracts. */
|
|
4
|
+
export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
5
|
+
/** JSON object with recursively typed JSON values. */
|
|
6
|
+
export type JsonObject = {
|
|
7
|
+
[key: string]: JsonValue;
|
|
8
|
+
};
|
|
9
|
+
/** JSON array with recursively typed JSON values. */
|
|
10
|
+
export type JsonArray = JsonValue[];
|
|
11
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,uDAAuD;AACvD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAAG;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC"}
|
package/dist/json.js
ADDED
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PersistedDashboard, SchemaVersion } from "./schema";
|
|
2
|
+
/** Generic persisted dashboard shape that allows unsupported schema versions. */
|
|
3
|
+
export type VersionedPersistedDashboard = Omit<PersistedDashboard, "schemaVersion"> & {
|
|
4
|
+
schemaVersion: number;
|
|
5
|
+
};
|
|
6
|
+
/** Result returned by schema migration utilities. */
|
|
7
|
+
export type MigrationResult = {
|
|
8
|
+
dashboard: PersistedDashboard;
|
|
9
|
+
fromVersion: number;
|
|
10
|
+
toVersion: SchemaVersion;
|
|
11
|
+
migrated: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** Current latest supported schema version for persisted dashboards. */
|
|
14
|
+
export declare const LATEST_SCHEMA_VERSION: SchemaVersion;
|
|
15
|
+
/**
|
|
16
|
+
* Migrates a versioned persisted dashboard to the latest schema version.
|
|
17
|
+
*
|
|
18
|
+
* Currently only schemaVersion=1 is supported and is treated as a no-op.
|
|
19
|
+
*/
|
|
20
|
+
export declare function migratePersistedDashboard(dashboard: VersionedPersistedDashboard): MigrationResult;
|
|
21
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAElE,iFAAiF;AACjF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,kBAAkB,EAClB,eAAe,CAChB,GAAG;IACF,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,aAAiB,CAAC;AAatD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,2BAA2B,GACrC,eAAe,CAWjB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Current latest supported schema version for persisted dashboards. */
|
|
2
|
+
export const LATEST_SCHEMA_VERSION = 1;
|
|
3
|
+
class SchemaMigrationException extends Error {
|
|
4
|
+
code = "SCHEMA_UNSUPPORTED_VERSION";
|
|
5
|
+
constructor(version) {
|
|
6
|
+
super(`Unsupported schema version '${version}'. Supported versions: [${LATEST_SCHEMA_VERSION}].`);
|
|
7
|
+
this.name = "SchemaMigrationException";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Migrates a versioned persisted dashboard to the latest schema version.
|
|
12
|
+
*
|
|
13
|
+
* Currently only schemaVersion=1 is supported and is treated as a no-op.
|
|
14
|
+
*/
|
|
15
|
+
export function migratePersistedDashboard(dashboard) {
|
|
16
|
+
if (dashboard.schemaVersion !== LATEST_SCHEMA_VERSION) {
|
|
17
|
+
throw new SchemaMigrationException(dashboard.schemaVersion);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
dashboard: dashboard,
|
|
21
|
+
fromVersion: dashboard.schemaVersion,
|
|
22
|
+
toVersion: LATEST_SCHEMA_VERSION,
|
|
23
|
+
migrated: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAkBA,wEAAwE;AACxE,MAAM,CAAC,MAAM,qBAAqB,GAAkB,CAAC,CAAC;AAEtD,MAAM,wBAAyB,SAAQ,KAAK;IACjC,IAAI,GAAG,4BAAqC,CAAC;IAEtD,YAAY,OAAe;QACzB,KAAK,CACH,+BAA+B,OAAO,2BAA2B,qBAAqB,IAAI,CAC3F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAsC;IAEtC,IAAI,SAAS,CAAC,aAAa,KAAK,qBAAqB,EAAE,CAAC;QACtD,MAAM,IAAI,wBAAwB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,SAAS,EAAE,SAA+B;QAC1C,WAAW,EAAE,SAAS,CAAC,aAAa;QACpC,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DatasourceAdapter, GridAdapter, VisualizationAdapter } from "./adapters";
|
|
2
|
+
import type { DDashError } from "./errors";
|
|
3
|
+
import type { VisualizationKind } from "./schema";
|
|
4
|
+
/** Registry behavior for handling duplicate adapter identifiers. */
|
|
5
|
+
export type RegistryDuplicatePolicy = "reject" | "replace";
|
|
6
|
+
/** Configuration options for creating an adapter registry. */
|
|
7
|
+
export type RegistryOptions = {
|
|
8
|
+
duplicatePolicy?: RegistryDuplicatePolicy;
|
|
9
|
+
};
|
|
10
|
+
/** Runtime registry contract for datasource, visualization, and grid adapters. */
|
|
11
|
+
export interface AdapterRegistry {
|
|
12
|
+
registerDatasource(adapter: DatasourceAdapter): void;
|
|
13
|
+
registerVisualization(adapter: VisualizationAdapter): void;
|
|
14
|
+
registerGrid(adapter: GridAdapter): void;
|
|
15
|
+
listDatasourceIds(): string[];
|
|
16
|
+
listVisualizationKinds(): VisualizationKind[];
|
|
17
|
+
listGridIds(): string[];
|
|
18
|
+
getDatasource(id: string): DatasourceAdapter | undefined;
|
|
19
|
+
getVisualization(kind: VisualizationKind): VisualizationAdapter | undefined;
|
|
20
|
+
getGrid(id: string): GridAdapter | undefined;
|
|
21
|
+
requireDatasource(id: string): DatasourceAdapter;
|
|
22
|
+
requireVisualization(kind: VisualizationKind): VisualizationAdapter;
|
|
23
|
+
requireGrid(id: string): GridAdapter;
|
|
24
|
+
}
|
|
25
|
+
/** Registry-level structured error envelope. */
|
|
26
|
+
export type RegistryError = DDashError & {
|
|
27
|
+
code: "REGISTRY_DUPLICATE_ADAPTER" | "REGISTRY_ADAPTER_NOT_FOUND";
|
|
28
|
+
};
|
|
29
|
+
export declare function createAdapterRegistry(options?: RegistryOptions): AdapterRegistry;
|
|
30
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,oEAAoE;AACpE,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE3D,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,CAAC,EAAE,uBAAuB,CAAC;CAC3C,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrD,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3D,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAEzC,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAC9B,sBAAsB,IAAI,iBAAiB,EAAE,CAAC;IAC9C,WAAW,IAAI,MAAM,EAAE,CAAC;IAExB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACzD,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,oBAAoB,GAAG,SAAS,CAAC;IAC5E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAE7C,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACjD,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,oBAAoB,CAAC;IACpE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAAC;CACtC;AAED,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG;IACvC,IAAI,EAAE,4BAA4B,GAAG,4BAA4B,CAAC;CACnE,CAAC;AAoBF,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,eAAoB,GAC5B,eAAe,CAmFjB"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
class RegistryException extends Error {
|
|
2
|
+
code;
|
|
3
|
+
details;
|
|
4
|
+
retriable;
|
|
5
|
+
constructor(code, message, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "RegistryException";
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.details = details;
|
|
10
|
+
this.retriable = false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function createAdapterRegistry(options = {}) {
|
|
14
|
+
const duplicatePolicy = options.duplicatePolicy ?? "reject";
|
|
15
|
+
const datasources = new Map();
|
|
16
|
+
const visualizations = new Map();
|
|
17
|
+
const grids = new Map();
|
|
18
|
+
return {
|
|
19
|
+
registerDatasource(adapter) {
|
|
20
|
+
registerWithPolicy(datasources, adapter.id, adapter, duplicatePolicy, "datasource");
|
|
21
|
+
},
|
|
22
|
+
registerVisualization(adapter) {
|
|
23
|
+
registerWithPolicy(visualizations, adapter.type, adapter, duplicatePolicy, "visualization");
|
|
24
|
+
},
|
|
25
|
+
registerGrid(adapter) {
|
|
26
|
+
registerWithPolicy(grids, adapter.id, adapter, duplicatePolicy, "grid");
|
|
27
|
+
},
|
|
28
|
+
listDatasourceIds() {
|
|
29
|
+
return Array.from(datasources.keys());
|
|
30
|
+
},
|
|
31
|
+
listVisualizationKinds() {
|
|
32
|
+
return Array.from(visualizations.keys());
|
|
33
|
+
},
|
|
34
|
+
listGridIds() {
|
|
35
|
+
return Array.from(grids.keys());
|
|
36
|
+
},
|
|
37
|
+
getDatasource(id) {
|
|
38
|
+
return datasources.get(id);
|
|
39
|
+
},
|
|
40
|
+
getVisualization(kind) {
|
|
41
|
+
return visualizations.get(kind);
|
|
42
|
+
},
|
|
43
|
+
getGrid(id) {
|
|
44
|
+
return grids.get(id);
|
|
45
|
+
},
|
|
46
|
+
requireDatasource(id) {
|
|
47
|
+
const adapter = datasources.get(id);
|
|
48
|
+
if (!adapter) {
|
|
49
|
+
throw notFoundError("datasource", id);
|
|
50
|
+
}
|
|
51
|
+
return adapter;
|
|
52
|
+
},
|
|
53
|
+
requireVisualization(kind) {
|
|
54
|
+
const adapter = visualizations.get(kind);
|
|
55
|
+
if (!adapter) {
|
|
56
|
+
throw notFoundError("visualization", kind);
|
|
57
|
+
}
|
|
58
|
+
return adapter;
|
|
59
|
+
},
|
|
60
|
+
requireGrid(id) {
|
|
61
|
+
const adapter = grids.get(id);
|
|
62
|
+
if (!adapter) {
|
|
63
|
+
throw notFoundError("grid", id);
|
|
64
|
+
}
|
|
65
|
+
return adapter;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function registerWithPolicy(map, key, value, policy, type) {
|
|
70
|
+
if (map.has(key) && policy === "reject") {
|
|
71
|
+
throw new RegistryException("REGISTRY_DUPLICATE_ADAPTER", `Duplicate ${type} adapter registration for '${key}'.`, { type, id: key });
|
|
72
|
+
}
|
|
73
|
+
map.set(key, value);
|
|
74
|
+
}
|
|
75
|
+
function notFoundError(type, id) {
|
|
76
|
+
return new RegistryException("REGISTRY_ADAPTER_NOT_FOUND", `No registered ${type} adapter found for '${id}'.`, { type, id });
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { JsonObject } from "./json";
|
|
2
|
+
import type { PersistedWidget, WidgetQuery, WidgetVisualization } from "./schema";
|
|
3
|
+
/** Fully resolved absolute time range used for execution. */
|
|
4
|
+
export type ResolvedTimeRange = {
|
|
5
|
+
from: number;
|
|
6
|
+
to: number;
|
|
7
|
+
source: "dashboard" | "widget";
|
|
8
|
+
};
|
|
9
|
+
/** Runtime context forwarded through query and render paths. */
|
|
10
|
+
export type RuntimeContext = {
|
|
11
|
+
traceId: string;
|
|
12
|
+
featureFlags?: Record<string, boolean>;
|
|
13
|
+
cancellation?: {
|
|
14
|
+
isCancelled: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
/** Execution-ready widget request built from persisted and resolved contracts. */
|
|
18
|
+
export type ResolvedWidgetExecutionRequest = {
|
|
19
|
+
dashboardId: string;
|
|
20
|
+
widgetId: string;
|
|
21
|
+
datasourceId: string;
|
|
22
|
+
query: WidgetQuery;
|
|
23
|
+
visualization: WidgetVisualization;
|
|
24
|
+
resolvedTimeRange: ResolvedTimeRange;
|
|
25
|
+
options?: JsonObject;
|
|
26
|
+
context: RuntimeContext;
|
|
27
|
+
};
|
|
28
|
+
/** Runtime widget view model with effective time range. */
|
|
29
|
+
export type RuntimeWidget = PersistedWidget & {
|
|
30
|
+
effectiveTimeRange: ResolvedTimeRange;
|
|
31
|
+
};
|
|
32
|
+
/** Time-range resolution error contract. */
|
|
33
|
+
export type TimeRangeResolveError = {
|
|
34
|
+
code: "TIME_RANGE_RESOLVE_FAILED";
|
|
35
|
+
message: string;
|
|
36
|
+
details?: JsonObject;
|
|
37
|
+
retriable?: boolean;
|
|
38
|
+
};
|
|
39
|
+
/** Optional controls for time-range resolution. */
|
|
40
|
+
export type TimeResolveOptions = {
|
|
41
|
+
now?: number;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Resolves dashboard-level time range input into absolute epoch millisecond bounds.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveDashboardTimeRange(input: {
|
|
47
|
+
type: "relative";
|
|
48
|
+
value: string;
|
|
49
|
+
} | {
|
|
50
|
+
type: "absolute";
|
|
51
|
+
from: number;
|
|
52
|
+
to: number;
|
|
53
|
+
}, options?: TimeResolveOptions): ResolvedTimeRange;
|
|
54
|
+
/**
|
|
55
|
+
* Resolves widget-level time range by honoring inherit/relative/absolute modes.
|
|
56
|
+
* When `inherit` (or undefined), the dashboard-resolved range is returned.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveWidgetTimeRange(widgetTimeRange: {
|
|
59
|
+
type: "inherit";
|
|
60
|
+
} | {
|
|
61
|
+
type: "relative";
|
|
62
|
+
value: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: "absolute";
|
|
65
|
+
from: number;
|
|
66
|
+
to: number;
|
|
67
|
+
} | undefined, dashboardResolvedTimeRange: ResolvedTimeRange, options?: TimeResolveOptions): ResolvedTimeRange;
|
|
68
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAElB,6DAA6D;AAC7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;CAChC,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE;QACb,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,mBAAmB,CAAC;IACnC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG;IAC5C,kBAAkB,EAAE,iBAAiB,CAAC;CACvC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,2BAA2B,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAcF;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAClD,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CA8BnB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EACX;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9C,SAAS,EACb,0BAA0B,EAAE,iBAAiB,EAC7C,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAkCnB"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
class TimeRangeResolveException extends Error {
|
|
2
|
+
code = "TIME_RANGE_RESOLVE_FAILED";
|
|
3
|
+
details;
|
|
4
|
+
retriable = false;
|
|
5
|
+
constructor(message, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "TimeRangeResolveException";
|
|
8
|
+
this.details = details;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolves dashboard-level time range input into absolute epoch millisecond bounds.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveDashboardTimeRange(input, options = {}) {
|
|
15
|
+
const now = Number.isFinite(options.now) ? Number(options.now) : Date.now();
|
|
16
|
+
if (input.type === "absolute") {
|
|
17
|
+
if (!Number.isFinite(input.from) ||
|
|
18
|
+
!Number.isFinite(input.to) ||
|
|
19
|
+
input.from > input.to) {
|
|
20
|
+
throw new TimeRangeResolveException("Invalid absolute dashboard time range.", {
|
|
21
|
+
type: input.type,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
from: input.from,
|
|
26
|
+
to: input.to,
|
|
27
|
+
source: "dashboard",
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const parsed = parseRelativeRange(input.value, now);
|
|
31
|
+
return {
|
|
32
|
+
from: parsed.from,
|
|
33
|
+
to: parsed.to,
|
|
34
|
+
source: "dashboard",
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolves widget-level time range by honoring inherit/relative/absolute modes.
|
|
39
|
+
* When `inherit` (or undefined), the dashboard-resolved range is returned.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveWidgetTimeRange(widgetTimeRange, dashboardResolvedTimeRange, options = {}) {
|
|
42
|
+
if (!widgetTimeRange || widgetTimeRange.type === "inherit") {
|
|
43
|
+
return dashboardResolvedTimeRange;
|
|
44
|
+
}
|
|
45
|
+
const now = Number.isFinite(options.now) ? Number(options.now) : Date.now();
|
|
46
|
+
if (widgetTimeRange.type === "absolute") {
|
|
47
|
+
if (!Number.isFinite(widgetTimeRange.from) ||
|
|
48
|
+
!Number.isFinite(widgetTimeRange.to) ||
|
|
49
|
+
widgetTimeRange.from > widgetTimeRange.to) {
|
|
50
|
+
throw new TimeRangeResolveException("Invalid absolute widget time range.", {
|
|
51
|
+
type: widgetTimeRange.type,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
from: widgetTimeRange.from,
|
|
56
|
+
to: widgetTimeRange.to,
|
|
57
|
+
source: "widget",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const parsed = parseRelativeRange(widgetTimeRange.value, now);
|
|
61
|
+
return {
|
|
62
|
+
from: parsed.from,
|
|
63
|
+
to: parsed.to,
|
|
64
|
+
source: "widget",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function parseRelativeRange(expression, now) {
|
|
68
|
+
const trimmed = expression.trim();
|
|
69
|
+
const match = /^now-(\d+)([smhdw])$/i.exec(trimmed);
|
|
70
|
+
if (!match) {
|
|
71
|
+
throw new TimeRangeResolveException("Invalid relative time range expression. Expected format: now-<value><unit>.", { expression: trimmed });
|
|
72
|
+
}
|
|
73
|
+
const amount = Number(match[1]);
|
|
74
|
+
const unit = match[2].toLowerCase();
|
|
75
|
+
if (!Number.isInteger(amount) || amount <= 0) {
|
|
76
|
+
throw new TimeRangeResolveException("Relative time range amount must be a positive integer.", {
|
|
77
|
+
expression: trimmed,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const unitMs = unitToMs(unit);
|
|
81
|
+
const from = now - amount * unitMs;
|
|
82
|
+
return { from, to: now };
|
|
83
|
+
}
|
|
84
|
+
function unitToMs(unit) {
|
|
85
|
+
switch (unit) {
|
|
86
|
+
case "s":
|
|
87
|
+
return 1000;
|
|
88
|
+
case "m":
|
|
89
|
+
return 60 * 1000;
|
|
90
|
+
case "h":
|
|
91
|
+
return 60 * 60 * 1000;
|
|
92
|
+
case "d":
|
|
93
|
+
return 24 * 60 * 60 * 1000;
|
|
94
|
+
case "w":
|
|
95
|
+
return 7 * 24 * 60 * 60 * 1000;
|
|
96
|
+
default:
|
|
97
|
+
throw new TimeRangeResolveException("Unsupported relative time range unit.", {
|
|
98
|
+
unit,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|