@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
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { JsonObject, JsonValue } from "./json";
|
|
2
|
+
/** Current persisted dashboard schema version. */
|
|
3
|
+
export type SchemaVersion = 1;
|
|
4
|
+
/** Persisted dashboard or widget time-range authoring model. */
|
|
5
|
+
export type PersistedTimeRange = {
|
|
6
|
+
type: "inherit";
|
|
7
|
+
} | {
|
|
8
|
+
type: "relative";
|
|
9
|
+
value: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: "absolute";
|
|
12
|
+
from: number;
|
|
13
|
+
to: number;
|
|
14
|
+
};
|
|
15
|
+
/** Persisted dashboard metadata fields. */
|
|
16
|
+
export type DashboardMeta = {
|
|
17
|
+
title: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
tags?: string[];
|
|
20
|
+
folder?: string;
|
|
21
|
+
};
|
|
22
|
+
/** Persisted layout entry for a dashboard widget tile. */
|
|
23
|
+
export type LayoutItem = {
|
|
24
|
+
id: string;
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
w: number;
|
|
28
|
+
h: number;
|
|
29
|
+
};
|
|
30
|
+
/** Optional presentation metadata for a widget. */
|
|
31
|
+
export type WidgetDisplay = {
|
|
32
|
+
title?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
};
|
|
35
|
+
/** Widget query payload persisted in dashboard JSON. */
|
|
36
|
+
export type WidgetQuery = {
|
|
37
|
+
metric: string;
|
|
38
|
+
filters?: JsonObject;
|
|
39
|
+
};
|
|
40
|
+
/** Visualization kind identifier used by adapter registry and widgets. */
|
|
41
|
+
export type VisualizationKind = "timeseries" | "stat" | "table" | "text" | "html" | (string & {});
|
|
42
|
+
/** Persisted visualization configuration for a widget. */
|
|
43
|
+
export type WidgetVisualization = {
|
|
44
|
+
type: VisualizationKind;
|
|
45
|
+
};
|
|
46
|
+
/** Persisted widget contract authored and stored by host applications. */
|
|
47
|
+
export type PersistedWidget = {
|
|
48
|
+
id: string;
|
|
49
|
+
layoutId: string;
|
|
50
|
+
datasource: string;
|
|
51
|
+
query: WidgetQuery;
|
|
52
|
+
visualization: WidgetVisualization;
|
|
53
|
+
display?: WidgetDisplay;
|
|
54
|
+
timeRange?: PersistedTimeRange;
|
|
55
|
+
options?: JsonObject;
|
|
56
|
+
};
|
|
57
|
+
/** Top-level persisted dashboard contract. */
|
|
58
|
+
export type PersistedDashboard = {
|
|
59
|
+
schemaVersion: SchemaVersion;
|
|
60
|
+
dashboardId: string;
|
|
61
|
+
meta: DashboardMeta;
|
|
62
|
+
timeRange: PersistedTimeRange;
|
|
63
|
+
layout: LayoutItem[];
|
|
64
|
+
widgets: PersistedWidget[];
|
|
65
|
+
extensions?: Record<string, JsonValue>;
|
|
66
|
+
};
|
|
67
|
+
/** Metric metadata contract used for validation and discovery. */
|
|
68
|
+
export type MetricDefinition = {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
unit: string;
|
|
72
|
+
datasource: string;
|
|
73
|
+
supportedVisualizations: VisualizationKind[];
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEpD,kDAAkD;AAClD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC;AAE9B,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,GAC1B;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,CAAC;AAEnD,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,0DAA0D;AAC1D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACxC,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;CAC9C,CAAC"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DDashError } from "./errors";
|
|
2
|
+
import type { MetricDefinition, PersistedDashboard } from "./schema";
|
|
3
|
+
/** Stable validation issue codes produced by dashboard schema validation. */
|
|
4
|
+
export type ValidationIssueCode = "SCHEMA_UNSUPPORTED_VERSION" | "REQUIRED_FIELD_MISSING" | "INVALID_TIME_RANGE" | "DUPLICATE_LAYOUT_ID" | "DUPLICATE_WIDGET_ID" | "LAYOUT_REF_NOT_FOUND" | "DATASOURCE_NOT_FOUND" | "VISUALIZATION_NOT_FOUND" | "METRIC_NOT_FOUND" | "METRIC_VISUALIZATION_MISMATCH";
|
|
5
|
+
/** Single dashboard validation issue entry. */
|
|
6
|
+
export type ValidationIssue = {
|
|
7
|
+
code: ValidationIssueCode;
|
|
8
|
+
path: string;
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
/** Aggregated result returned by dashboard validation. */
|
|
12
|
+
export type ValidationResult = {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
issues: ValidationIssue[];
|
|
15
|
+
};
|
|
16
|
+
/** Optional registry and policy inputs for dashboard validation. */
|
|
17
|
+
export type DashboardValidationOptions = {
|
|
18
|
+
knownDatasources?: readonly string[];
|
|
19
|
+
knownVisualizations?: readonly string[];
|
|
20
|
+
knownMetrics?: readonly MetricDefinition[];
|
|
21
|
+
allowUnknownMetrics?: boolean;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Validates persisted dashboard contracts and optional runtime-registered references.
|
|
25
|
+
* Returns a deterministic list of issues without throwing.
|
|
26
|
+
*/
|
|
27
|
+
export declare function validatePersistedDashboard(dashboard: PersistedDashboard, options?: DashboardValidationOptions): ValidationResult;
|
|
28
|
+
/**
|
|
29
|
+
* Converts validation issues into a standardized `SCHEMA_INVALID` structured error.
|
|
30
|
+
* Returns `undefined` when validation passed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function toSchemaValidationError(result: ValidationResult): DDashError | undefined;
|
|
33
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAElB,6EAA6E;AAC7E,MAAM,MAAM,mBAAmB,GAC3B,4BAA4B,GAC5B,wBAAwB,GACxB,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,sBAAsB,GACtB,sBAAsB,GACtB,yBAAyB,GACzB,kBAAkB,GAClB,+BAA+B,CAAC;AAEpC,+CAA+C;AAC/C,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,0BAA0B,GAAG;IACvC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC3C,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE,0BAA+B,GACvC,gBAAgB,CAiKlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,GACvB,UAAU,GAAG,SAAS,CAkBxB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates persisted dashboard contracts and optional runtime-registered references.
|
|
3
|
+
* Returns a deterministic list of issues without throwing.
|
|
4
|
+
*/
|
|
5
|
+
export function validatePersistedDashboard(dashboard, options = {}) {
|
|
6
|
+
const issues = [];
|
|
7
|
+
if (dashboard.schemaVersion !== 1) {
|
|
8
|
+
issues.push({
|
|
9
|
+
code: "SCHEMA_UNSUPPORTED_VERSION",
|
|
10
|
+
path: "schemaVersion",
|
|
11
|
+
message: "Unsupported schema version. Supported versions: [1].",
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
if (!isNonEmptyString(dashboard.dashboardId)) {
|
|
15
|
+
issues.push({
|
|
16
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
17
|
+
path: "dashboardId",
|
|
18
|
+
message: "dashboardId must be a non-empty string.",
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (!isNonEmptyString(dashboard.meta?.title)) {
|
|
22
|
+
issues.push({
|
|
23
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
24
|
+
path: "meta.title",
|
|
25
|
+
message: "meta.title is required.",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
validateTimeRange(dashboard.timeRange, "timeRange", issues);
|
|
29
|
+
const layoutIds = new Set();
|
|
30
|
+
for (let i = 0; i < dashboard.layout.length; i += 1) {
|
|
31
|
+
const layout = dashboard.layout[i];
|
|
32
|
+
if (!isNonEmptyString(layout.id)) {
|
|
33
|
+
issues.push({
|
|
34
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
35
|
+
path: `layout[${i}].id`,
|
|
36
|
+
message: "layout item id is required.",
|
|
37
|
+
});
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (layoutIds.has(layout.id)) {
|
|
41
|
+
issues.push({
|
|
42
|
+
code: "DUPLICATE_LAYOUT_ID",
|
|
43
|
+
path: `layout[${i}].id`,
|
|
44
|
+
message: `Duplicate layout id '${layout.id}'.`,
|
|
45
|
+
});
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
layoutIds.add(layout.id);
|
|
49
|
+
}
|
|
50
|
+
const knownDatasourceSet = new Set(options.knownDatasources ?? []);
|
|
51
|
+
const knownVisualizationSet = new Set(options.knownVisualizations ?? []);
|
|
52
|
+
const knownMetricMap = new Map((options.knownMetrics ?? []).map((metric) => [metric.id, metric]));
|
|
53
|
+
const widgetIds = new Set();
|
|
54
|
+
for (let i = 0; i < dashboard.widgets.length; i += 1) {
|
|
55
|
+
const widget = dashboard.widgets[i];
|
|
56
|
+
const pathPrefix = `widgets[${i}]`;
|
|
57
|
+
if (!isNonEmptyString(widget.id)) {
|
|
58
|
+
issues.push({
|
|
59
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
60
|
+
path: `${pathPrefix}.id`,
|
|
61
|
+
message: "widget id is required.",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (widgetIds.has(widget.id)) {
|
|
65
|
+
issues.push({
|
|
66
|
+
code: "DUPLICATE_WIDGET_ID",
|
|
67
|
+
path: `${pathPrefix}.id`,
|
|
68
|
+
message: `Duplicate widget id '${widget.id}'.`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
widgetIds.add(widget.id);
|
|
73
|
+
}
|
|
74
|
+
if (!layoutIds.has(widget.layoutId)) {
|
|
75
|
+
issues.push({
|
|
76
|
+
code: "LAYOUT_REF_NOT_FOUND",
|
|
77
|
+
path: `${pathPrefix}.layoutId`,
|
|
78
|
+
message: `layoutId '${widget.layoutId}' was not found in layout.`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (!isNonEmptyString(widget.datasource)) {
|
|
82
|
+
issues.push({
|
|
83
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
84
|
+
path: `${pathPrefix}.datasource`,
|
|
85
|
+
message: "widget datasource is required.",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else if (knownDatasourceSet.size > 0 &&
|
|
89
|
+
!knownDatasourceSet.has(widget.datasource)) {
|
|
90
|
+
issues.push({
|
|
91
|
+
code: "DATASOURCE_NOT_FOUND",
|
|
92
|
+
path: `${pathPrefix}.datasource`,
|
|
93
|
+
message: `datasource '${widget.datasource}' is not registered.`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (!isNonEmptyString(widget.visualization?.type)) {
|
|
97
|
+
issues.push({
|
|
98
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
99
|
+
path: `${pathPrefix}.visualization.type`,
|
|
100
|
+
message: "widget visualization.type is required.",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else if (knownVisualizationSet.size > 0 &&
|
|
104
|
+
!knownVisualizationSet.has(widget.visualization.type)) {
|
|
105
|
+
issues.push({
|
|
106
|
+
code: "VISUALIZATION_NOT_FOUND",
|
|
107
|
+
path: `${pathPrefix}.visualization.type`,
|
|
108
|
+
message: `visualization '${widget.visualization.type}' is not registered.`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (!isNonEmptyString(widget.query?.metric)) {
|
|
112
|
+
issues.push({
|
|
113
|
+
code: "REQUIRED_FIELD_MISSING",
|
|
114
|
+
path: `${pathPrefix}.query.metric`,
|
|
115
|
+
message: "widget query.metric is required.",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const metric = knownMetricMap.get(widget.query.metric);
|
|
120
|
+
if (!metric && !options.allowUnknownMetrics && knownMetricMap.size > 0) {
|
|
121
|
+
issues.push({
|
|
122
|
+
code: "METRIC_NOT_FOUND",
|
|
123
|
+
path: `${pathPrefix}.query.metric`,
|
|
124
|
+
message: `metric '${widget.query.metric}' is not defined.`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (metric &&
|
|
128
|
+
isNonEmptyString(widget.visualization?.type) &&
|
|
129
|
+
!metric.supportedVisualizations.includes(widget.visualization.type)) {
|
|
130
|
+
issues.push({
|
|
131
|
+
code: "METRIC_VISUALIZATION_MISMATCH",
|
|
132
|
+
path: `${pathPrefix}.visualization.type`,
|
|
133
|
+
message: `visualization '${widget.visualization.type}' is not supported for metric '${metric.id}'.`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (widget.timeRange) {
|
|
138
|
+
validateTimeRange(widget.timeRange, `${pathPrefix}.timeRange`, issues);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
ok: issues.length === 0,
|
|
143
|
+
issues,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Converts validation issues into a standardized `SCHEMA_INVALID` structured error.
|
|
148
|
+
* Returns `undefined` when validation passed.
|
|
149
|
+
*/
|
|
150
|
+
export function toSchemaValidationError(result) {
|
|
151
|
+
if (result.ok) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
code: "SCHEMA_INVALID",
|
|
156
|
+
message: "Persisted dashboard schema validation failed.",
|
|
157
|
+
retriable: false,
|
|
158
|
+
details: {
|
|
159
|
+
issueCount: result.issues.length,
|
|
160
|
+
issues: result.issues.map((issue) => ({
|
|
161
|
+
code: issue.code,
|
|
162
|
+
path: issue.path,
|
|
163
|
+
message: issue.message,
|
|
164
|
+
})),
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function validateTimeRange(timeRange, path, issues) {
|
|
169
|
+
if (timeRange.type === "inherit") {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (timeRange.type === "relative") {
|
|
173
|
+
if (!isNonEmptyString(timeRange.value)) {
|
|
174
|
+
issues.push({
|
|
175
|
+
code: "INVALID_TIME_RANGE",
|
|
176
|
+
path: `${path}.value`,
|
|
177
|
+
message: "relative time range requires a non-empty value.",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (timeRange.type === "absolute") {
|
|
183
|
+
if (!Number.isFinite(timeRange.from) || !Number.isFinite(timeRange.to)) {
|
|
184
|
+
issues.push({
|
|
185
|
+
code: "INVALID_TIME_RANGE",
|
|
186
|
+
path,
|
|
187
|
+
message: "absolute time range requires finite from/to timestamps.",
|
|
188
|
+
});
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (timeRange.from > timeRange.to) {
|
|
192
|
+
issues.push({
|
|
193
|
+
code: "INVALID_TIME_RANGE",
|
|
194
|
+
path,
|
|
195
|
+
message: "absolute time range requires from <= to.",
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function isNonEmptyString(value) {
|
|
201
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAA6B,EAC7B,UAAsC,EAAE;IAExC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,SAAS,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,sDAAsD;SAChE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,yCAAyC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,yBAAyB;SACnC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,UAAU,CAAC,MAAM;gBACvB,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,UAAU,CAAC,MAAM;gBACvB,OAAO,EAAE,wBAAwB,MAAM,CAAC,EAAE,IAAI;aAC/C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAClE,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;QAEnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,GAAG,UAAU,KAAK;gBACxB,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,GAAG,UAAU,KAAK;gBACxB,OAAO,EAAE,wBAAwB,MAAM,CAAC,EAAE,IAAI;aAC/C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,IAAI,EAAE,GAAG,UAAU,WAAW;gBAC9B,OAAO,EAAE,aAAa,MAAM,CAAC,QAAQ,4BAA4B;aAClE,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,GAAG,UAAU,aAAa;gBAChC,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC;aAAM,IACL,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAC3B,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAC1C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,IAAI,EAAE,GAAG,UAAU,aAAa;gBAChC,OAAO,EAAE,eAAe,MAAM,CAAC,UAAU,sBAAsB;aAChE,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,GAAG,UAAU,qBAAqB;gBACxC,OAAO,EAAE,wCAAwC;aAClD,CAAC,CAAC;QACL,CAAC;aAAM,IACL,qBAAqB,CAAC,IAAI,GAAG,CAAC;YAC9B,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EACrD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,yBAAyB;gBAC/B,IAAI,EAAE,GAAG,UAAU,qBAAqB;gBACxC,OAAO,EAAE,kBAAkB,MAAM,CAAC,aAAa,CAAC,IAAI,sBAAsB;aAC3E,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,GAAG,UAAU,eAAe;gBAClC,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,GAAG,UAAU,eAAe;oBAClC,OAAO,EAAE,WAAW,MAAM,CAAC,KAAK,CAAC,MAAM,mBAAmB;iBAC3D,CAAC,CAAC;YACL,CAAC;YAED,IACE,MAAM;gBACN,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC;gBAC5C,CAAC,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EACnE,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,+BAA+B;oBACrC,IAAI,EAAE,GAAG,UAAU,qBAAqB;oBACxC,OAAO,EAAE,kBAAkB,MAAM,CAAC,aAAa,CAAC,IAAI,kCAAkC,MAAM,CAAC,EAAE,IAAI;iBACpG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,UAAU,YAAY,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAwB;IAExB,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,+CAA+C;QACxD,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE;YACP,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;SACJ;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,SAA6B,EAC7B,IAAY,EACZ,MAAyB;IAEzB,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,oBAAoB;gBAC1B,IAAI,EAAE,GAAG,IAAI,QAAQ;gBACrB,OAAO,EAAE,iDAAiD;aAC3D,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,oBAAoB;gBAC1B,IAAI;gBACJ,OAAO,EAAE,yDAAyD;aACnE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,oBAAoB;gBAC1B,IAAI;gBACJ,OAAO,EAAE,0CAA0C;aACpD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@d-dash/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Headless core runtime and contracts for d-dash",
|
|
5
|
+
"license": "LGPL-3.0-or-later",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/thienvu18/d-dash.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/thienvu18/d-dash/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/thienvu18/d-dash/tree/main/packages/core#readme",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.json",
|
|
26
|
+
"test": "npm run build && node --test $(find tests -name '*.spec.js')"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"dashboard",
|
|
30
|
+
"runtime",
|
|
31
|
+
"contracts",
|
|
32
|
+
"d-dash"
|
|
33
|
+
],
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md"
|
|
37
|
+
],
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
}
|
|
44
|
+
}
|