@wibi-global/sdk 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.
Files changed (38) hide show
  1. package/README.md +18 -0
  2. package/dist/builder.d.ts +19 -0
  3. package/dist/builder.d.ts.map +1 -0
  4. package/dist/builder.js +34 -0
  5. package/dist/builder.js.map +1 -0
  6. package/dist/context.d.ts +12 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +11 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/dashboard-context.d.ts +46 -0
  11. package/dist/dashboard-context.d.ts.map +1 -0
  12. package/dist/dashboard-context.js +140 -0
  13. package/dist/dashboard-context.js.map +1 -0
  14. package/dist/dashboard-spec.d.ts +22 -0
  15. package/dist/dashboard-spec.d.ts.map +1 -0
  16. package/dist/dashboard-spec.js +754 -0
  17. package/dist/dashboard-spec.js.map +1 -0
  18. package/dist/data/index.d.ts +7 -0
  19. package/dist/data/index.d.ts.map +1 -0
  20. package/dist/data/index.js +12 -0
  21. package/dist/data/index.js.map +1 -0
  22. package/dist/data/serialization/dashboard-serialization.types.d.ts +357 -0
  23. package/dist/data/serialization/dashboard-serialization.types.d.ts.map +1 -0
  24. package/dist/data/serialization/dashboard-serialization.types.js +2 -0
  25. package/dist/data/serialization/dashboard-serialization.types.js.map +1 -0
  26. package/dist/data/serialization/index.d.ts +2 -0
  27. package/dist/data/serialization/index.d.ts.map +1 -0
  28. package/dist/data/serialization/index.js +2 -0
  29. package/dist/data/serialization/index.js.map +1 -0
  30. package/dist/data.d.ts +26 -0
  31. package/dist/data.d.ts.map +1 -0
  32. package/dist/data.js +106 -0
  33. package/dist/data.js.map +1 -0
  34. package/dist/index.d.ts +7 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +7 -0
  37. package/dist/index.js.map +1 -0
  38. package/package.json +34 -0
package/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # @wibi/sdk
2
+
3
+ Authoring SDK for WiBi dashboards.
4
+
5
+ This package publishes:
6
+
7
+ - authoring helpers for `WibiDashboardArtifact`
8
+ - shared runtime/query helpers
9
+ - curated SDK data assets under `@wibi/sdk/data`
10
+ - Claude Code prompt assets under `@wibi/sdk/prompts`
11
+ - dashboard authoring templates under `@wibi/sdk/templates`
12
+ - agent instruction templates under `@wibi/sdk/instructions`
13
+
14
+ Typical workflow:
15
+
16
+ 1. Use `@wibi/cli` to scaffold or build artifacts.
17
+ 2. Use `@wibi/sdk` data assets as context for code generation and serialization.
18
+ 3. Deploy the generated artifact JSON to the WiBi platform.
@@ -0,0 +1,19 @@
1
+ import { type WibiBinding, type WibiComponentNode, type WibiDashboardArtifact, type WibiDataSource, type WibiInteraction, type WibiLayoutNode, type WibiTheme } from '@wibi-global/artifact-schema';
2
+ export type DefineDashboardInput = {
3
+ dashboard: WibiDashboardArtifact['dashboard'];
4
+ theme?: WibiTheme;
5
+ layoutRoot: WibiLayoutNode;
6
+ breakpoints?: Record<string, number>;
7
+ components?: WibiComponentNode[];
8
+ dataSources?: WibiDataSource[];
9
+ bindings?: WibiBinding[];
10
+ interactions?: WibiInteraction[];
11
+ accessPolicy?: WibiDashboardArtifact['accessPolicy'];
12
+ author?: string;
13
+ generatedBy?: string;
14
+ };
15
+ export declare const defineDataSource: (value: WibiDataSource) => WibiDataSource;
16
+ export declare const defineWidget: (value: WibiComponentNode) => WibiComponentNode;
17
+ export declare const defineDashboard: (input: DefineDashboardInput) => WibiDashboardArtifact;
18
+ export declare const serializeArtifact: (artifact: WibiDashboardArtifact) => string;
19
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,8BAA8B,CAAA;AAErC,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;IAC7C,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,UAAU,EAAE,cAAc,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAChC,WAAW,CAAC,EAAE,cAAc,EAAE,CAAA;IAC9B,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAA;IAChC,YAAY,CAAC,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAA;IACpD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,cAAc,KAAG,cAAuB,CAAA;AAEhF,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,KAAG,iBAA0B,CAAA;AAElF,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,KAAG,qBA6B7D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,UAAU,qBAAqB,KAAG,MAEnE,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { WIBI_ARTIFACT_VERSION, assertValidWibiArtifact, canonicalJSONStringify, computeArtifactHash, } from '@wibi-global/artifact-schema';
2
+ export const defineDataSource = (value) => value;
3
+ export const defineWidget = (value) => value;
4
+ export const defineDashboard = (input) => {
5
+ const now = new Date().toISOString();
6
+ const artifact = {
7
+ artifactVersion: WIBI_ARTIFACT_VERSION,
8
+ dashboard: input.dashboard,
9
+ theme: input.theme,
10
+ layout: {
11
+ root: input.layoutRoot,
12
+ breakpoints: input.breakpoints,
13
+ },
14
+ components: input.components ?? [],
15
+ dataSources: input.dataSources ?? [],
16
+ bindings: input.bindings ?? [],
17
+ interactions: input.interactions ?? [],
18
+ accessPolicy: input.accessPolicy,
19
+ meta: {
20
+ author: input.author,
21
+ generatedBy: input.generatedBy ?? '@wibi-global/sdk',
22
+ createdAt: now,
23
+ updatedAt: now,
24
+ },
25
+ };
26
+ const hash = computeArtifactHash(artifact);
27
+ artifact.meta.artifactHash = hash;
28
+ artifact.meta.checksum = hash;
29
+ return assertValidWibiArtifact(artifact);
30
+ };
31
+ export const serializeArtifact = (artifact) => {
32
+ return canonicalJSONStringify(assertValidWibiArtifact(artifact));
33
+ };
34
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GAQpB,MAAM,8BAA8B,CAAA;AAgBrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAqB,EAAkB,EAAE,CAAC,KAAK,CAAA;AAEhF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAwB,EAAqB,EAAE,CAAC,KAAK,CAAA;AAElF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAA2B,EAAyB,EAAE;IACpF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAEpC,MAAM,QAAQ,GAA0B;QACtC,eAAe,EAAE,qBAAqB;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE;YACN,IAAI,EAAE,KAAK,CAAC,UAAU;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B;QACD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;QACtC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,IAAI,EAAE;YACJ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,kBAAkB;YACpD,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf;KACF,CAAA;IAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IAE7B,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAA+B,EAAU,EAAE;IAC3E,OAAO,sBAAsB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAA;AAClE,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ export type WibiContext = {
2
+ tenantId: string;
3
+ userId: string;
4
+ roles: string[];
5
+ scopes: string[];
6
+ locale?: string;
7
+ timezone?: string;
8
+ featureFlags?: string[];
9
+ };
10
+ export declare const setWibiContext: (context: WibiContext) => void;
11
+ export declare const useWibiContext: () => WibiContext;
12
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB,CAAA;AAID,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,SAElD,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,WAMjC,CAAA"}
@@ -0,0 +1,11 @@
1
+ let currentContext = null;
2
+ export const setWibiContext = (context) => {
3
+ currentContext = context;
4
+ };
5
+ export const useWibiContext = () => {
6
+ if (!currentContext) {
7
+ throw new Error('Wibi context is not initialized. Call setWibiContext(...) first.');
8
+ }
9
+ return currentContext;
10
+ };
11
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAUA,IAAI,cAAc,GAAuB,IAAI,CAAA;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAoB,EAAE,EAAE;IACrD,cAAc,GAAG,OAAO,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,GAAgB,EAAE;IAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;IACrF,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC,CAAA"}
@@ -0,0 +1,46 @@
1
+ export type DashboardContextTemplate = 'dashboard' | 'empty' | 'filters';
2
+ export type DashboardContextProjectState = 'draft' | 'validated' | 'serialized' | 'deployed';
3
+ export type DashboardContextDefaultFilter = 'date' | 'companies';
4
+ export type DashboardContextEntry = {
5
+ id: string;
6
+ notes: string;
7
+ };
8
+ export type DashboardContext = {
9
+ version: '1.0.0';
10
+ project: {
11
+ name: string;
12
+ slug: string;
13
+ category: string;
14
+ description: string;
15
+ template: DashboardContextTemplate;
16
+ };
17
+ requirements: {
18
+ businessContext: string;
19
+ kpis: string[];
20
+ charts: string[];
21
+ grids: string[];
22
+ filters: string[];
23
+ sqlSources: string[];
24
+ };
25
+ defaults: {
26
+ connectionId: number | null;
27
+ filters: DashboardContextDefaultFilter[];
28
+ };
29
+ queries: Array<DashboardContextEntry & {
30
+ repoId: string;
31
+ }>;
32
+ widgets: Array<DashboardContextEntry & {
33
+ type: string;
34
+ }>;
35
+ projectState: DashboardContextProjectState;
36
+ };
37
+ export type CreateDashboardContextOptions = {
38
+ name: string;
39
+ slug: string;
40
+ category: string;
41
+ description: string;
42
+ template: DashboardContextTemplate;
43
+ };
44
+ export declare const createDashboardContext: (options: CreateDashboardContextOptions) => DashboardContext;
45
+ export declare const validateDashboardContext: (value: unknown) => string[];
46
+ //# sourceMappingURL=dashboard-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-context.d.ts","sourceRoot":"","sources":["../src/dashboard-context.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AACxE,MAAM,MAAM,4BAA4B,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAA;AAC5F,MAAM,MAAM,6BAA6B,GAAG,MAAM,GAAG,WAAW,CAAA;AAEhE,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,EAAE,wBAAwB,CAAA;KACnC,CAAA;IACD,YAAY,EAAE;QACZ,eAAe,EAAE,MAAM,CAAA;QACvB,IAAI,EAAE,MAAM,EAAE,CAAA;QACd,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,UAAU,EAAE,MAAM,EAAE,CAAA;KACrB,CAAA;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,OAAO,EAAE,6BAA6B,EAAE,CAAA;KACzC,CAAA;IACD,OAAO,EAAE,KAAK,CAAC,qBAAqB,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,OAAO,EAAE,KAAK,CAAC,qBAAqB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,YAAY,EAAE,4BAA4B,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,wBAAwB,CAAA;CACnC,CAAA;AAoBD,eAAO,MAAM,sBAAsB,GACjC,SAAS,6BAA6B,KACrC,gBAwBD,CAAA;AAEF,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,KAAG,MAAM,EAiH/D,CAAA"}
@@ -0,0 +1,140 @@
1
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
2
+ const isStringArray = (value) => Array.isArray(value) && value.every((entry) => typeof entry === 'string');
3
+ const isTemplate = (value) => value === 'dashboard' || value === 'empty' || value === 'filters';
4
+ const isProjectState = (value) => value === 'draft' || value === 'validated' || value === 'serialized' || value === 'deployed';
5
+ const isDefaultFilter = (value) => value === 'date' || value === 'companies';
6
+ const hasOnlyKeys = (value, keys) => Object.keys(value).every((key) => keys.includes(key));
7
+ export const createDashboardContext = (options) => ({
8
+ version: '1.0.0',
9
+ project: {
10
+ name: options.name,
11
+ slug: options.slug,
12
+ category: options.category,
13
+ description: options.description,
14
+ template: options.template,
15
+ },
16
+ requirements: {
17
+ businessContext: '',
18
+ kpis: [],
19
+ charts: [],
20
+ grids: [],
21
+ filters: [],
22
+ sqlSources: [],
23
+ },
24
+ defaults: {
25
+ connectionId: null,
26
+ filters: options.template === 'filters' ? ['date', 'companies'] : [],
27
+ },
28
+ queries: [],
29
+ widgets: [],
30
+ projectState: 'draft',
31
+ });
32
+ export const validateDashboardContext = (value) => {
33
+ const errors = [];
34
+ if (!isRecord(value)) {
35
+ return ['dashboard.context.json must be an object'];
36
+ }
37
+ if (value.version !== '1.0.0') {
38
+ errors.push('version must be "1.0.0"');
39
+ }
40
+ if (!isRecord(value.project) || !hasOnlyKeys(value.project, ['name', 'slug', 'category', 'description', 'template'])) {
41
+ errors.push('project must contain only name, slug, category, description and template');
42
+ }
43
+ else {
44
+ if (typeof value.project.name !== 'string' || value.project.name.trim().length === 0) {
45
+ errors.push('project.name must be a non-empty string');
46
+ }
47
+ if (typeof value.project.slug !== 'string' || value.project.slug.trim().length === 0) {
48
+ errors.push('project.slug must be a non-empty string');
49
+ }
50
+ if (typeof value.project.category !== 'string' || value.project.category.trim().length === 0) {
51
+ errors.push('project.category must be a non-empty string');
52
+ }
53
+ if (typeof value.project.description !== 'string') {
54
+ errors.push('project.description must be a string');
55
+ }
56
+ if (!isTemplate(value.project.template)) {
57
+ errors.push('project.template must be one of "dashboard", "empty" or "filters"');
58
+ }
59
+ }
60
+ if (!isRecord(value.requirements) ||
61
+ !hasOnlyKeys(value.requirements, ['businessContext', 'kpis', 'charts', 'grids', 'filters', 'sqlSources'])) {
62
+ errors.push('requirements must contain only businessContext, kpis, charts, grids, filters and sqlSources');
63
+ }
64
+ else {
65
+ if (typeof value.requirements.businessContext !== 'string') {
66
+ errors.push('requirements.businessContext must be a string');
67
+ }
68
+ if (!isStringArray(value.requirements.kpis))
69
+ errors.push('requirements.kpis must be a string array');
70
+ if (!isStringArray(value.requirements.charts))
71
+ errors.push('requirements.charts must be a string array');
72
+ if (!isStringArray(value.requirements.grids))
73
+ errors.push('requirements.grids must be a string array');
74
+ if (!isStringArray(value.requirements.filters))
75
+ errors.push('requirements.filters must be a string array');
76
+ if (!isStringArray(value.requirements.sqlSources)) {
77
+ errors.push('requirements.sqlSources must be a string array');
78
+ }
79
+ }
80
+ if (!isRecord(value.defaults) || !hasOnlyKeys(value.defaults, ['connectionId', 'filters'])) {
81
+ errors.push('defaults must contain only connectionId and filters');
82
+ }
83
+ else {
84
+ const connectionId = value.defaults.connectionId;
85
+ if (connectionId !== null && connectionId !== undefined) {
86
+ if (typeof connectionId !== 'number' || !Number.isInteger(connectionId) || connectionId <= 0) {
87
+ errors.push('defaults.connectionId must be null or a positive integer');
88
+ }
89
+ }
90
+ if (!Array.isArray(value.defaults.filters) ||
91
+ !value.defaults.filters.every((filter) => isDefaultFilter(filter))) {
92
+ errors.push('defaults.filters must contain only "date" and "companies"');
93
+ }
94
+ }
95
+ if (!Array.isArray(value.queries)) {
96
+ errors.push('queries must be an array');
97
+ }
98
+ else {
99
+ value.queries.forEach((entry, index) => {
100
+ if (!isRecord(entry) || !hasOnlyKeys(entry, ['id', 'repoId', 'notes'])) {
101
+ errors.push(`queries[${index}] must contain only id, repoId and notes`);
102
+ return;
103
+ }
104
+ if (typeof entry.id !== 'string' || entry.id.trim().length === 0) {
105
+ errors.push(`queries[${index}].id must be a non-empty string`);
106
+ }
107
+ if (typeof entry.repoId !== 'string' || entry.repoId.trim().length === 0) {
108
+ errors.push(`queries[${index}].repoId must be a non-empty string`);
109
+ }
110
+ if (typeof entry.notes !== 'string') {
111
+ errors.push(`queries[${index}].notes must be a string`);
112
+ }
113
+ });
114
+ }
115
+ if (!Array.isArray(value.widgets)) {
116
+ errors.push('widgets must be an array');
117
+ }
118
+ else {
119
+ value.widgets.forEach((entry, index) => {
120
+ if (!isRecord(entry) || !hasOnlyKeys(entry, ['id', 'type', 'notes'])) {
121
+ errors.push(`widgets[${index}] must contain only id, type and notes`);
122
+ return;
123
+ }
124
+ if (typeof entry.id !== 'string' || entry.id.trim().length === 0) {
125
+ errors.push(`widgets[${index}].id must be a non-empty string`);
126
+ }
127
+ if (typeof entry.type !== 'string' || entry.type.trim().length === 0) {
128
+ errors.push(`widgets[${index}].type must be a non-empty string`);
129
+ }
130
+ if (typeof entry.notes !== 'string') {
131
+ errors.push(`widgets[${index}].notes must be a string`);
132
+ }
133
+ });
134
+ }
135
+ if (!isProjectState(value.projectState)) {
136
+ errors.push('projectState must be one of "draft", "validated", "serialized" or "deployed"');
137
+ }
138
+ return errors;
139
+ };
140
+ //# sourceMappingURL=dashboard-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-context.js","sourceRoot":"","sources":["../src/dashboard-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SerializedDashboard } from './data/serialization/dashboard-serialization.types.js';
2
+ export type DashboardSpec = SerializedDashboard;
3
+ export type DashboardSpecValidationIssue = {
4
+ path: string;
5
+ message: string;
6
+ };
7
+ export type DashboardSpecValidationResult = {
8
+ ok: true;
9
+ issues: [];
10
+ } | {
11
+ ok: false;
12
+ issues: DashboardSpecValidationIssue[];
13
+ };
14
+ export declare const WIBI_DASHBOARD_SPEC_VERSION: "1.0.0";
15
+ export declare const WIBI_DASHBOARD_SPEC_EXPORT_NAME: "dashboardSpec";
16
+ export declare const WIBI_DASHBOARD_TEMPLATE_ALLOWED_IMPORTS: readonly ["@wibi-global/sdk"];
17
+ export declare const WIBI_DASHBOARD_OPTIONAL_DEFAULT_EXPORT: true;
18
+ export declare const WIBI_DASHBOARD_REQUIRED_INITIAL_FIELDS: readonly ["metadata.name", "metadata.description", "metadata.schema_version", "metadata.generated_at", "metadata.category", "metadata.is_public", "filters", "layout.mode", "layout.sections", "widgets", "queries"];
19
+ export declare const validateDashboardSpec: (spec: DashboardSpec) => DashboardSpecValidationResult;
20
+ export declare const assertValidDashboardSpec: (spec: DashboardSpec) => DashboardSpec;
21
+ export declare const defineDashboardSpec: (spec: DashboardSpec) => DashboardSpec;
22
+ //# sourceMappingURL=dashboard-spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-spec.d.ts","sourceRoot":"","sources":["../src/dashboard-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,mBAAmB,EAepB,MAAM,uDAAuD,CAAA;AAE9D,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAE/C,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,6BAA6B,GACrC;IACE,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,EAAE,CAAA;CACX,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EAAE,4BAA4B,EAAE,CAAA;CACvC,CAAA;AAEL,eAAO,MAAM,2BAA2B,EAAG,OAAgB,CAAA;AAC3D,eAAO,MAAM,+BAA+B,EAAG,eAAwB,CAAA;AACvE,eAAO,MAAM,uCAAuC,+BAAgC,CAAA;AACpF,eAAO,MAAM,sCAAsC,EAAG,IAAa,CAAA;AACnE,eAAO,MAAM,sCAAsC,sNAYzC,CAAA;AAqkCV,eAAO,MAAM,qBAAqB,GAAI,MAAM,aAAa,KAAG,6BAmD3D,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,MAAM,aAAa,KAAG,aAS9D,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,MAAM,aAAa,KAAG,aAEzD,CAAA"}