@zentto/studio-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/dist/__tests__/data-binding.test.d.ts +2 -0
- package/dist/__tests__/data-binding.test.d.ts.map +1 -0
- package/dist/__tests__/data-binding.test.js +86 -0
- package/dist/__tests__/data-binding.test.js.map +1 -0
- package/dist/__tests__/event-bus.test.d.ts +2 -0
- package/dist/__tests__/event-bus.test.d.ts.map +1 -0
- package/dist/__tests__/event-bus.test.js +70 -0
- package/dist/__tests__/event-bus.test.js.map +1 -0
- package/dist/__tests__/expression.test.d.ts +2 -0
- package/dist/__tests__/expression.test.d.ts.map +1 -0
- package/dist/__tests__/expression.test.js +173 -0
- package/dist/__tests__/expression.test.js.map +1 -0
- package/dist/__tests__/schema.test.d.ts +2 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.js +91 -0
- package/dist/__tests__/schema.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +2 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +70 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/app-types.d.ts +184 -0
- package/dist/app-types.d.ts.map +1 -0
- package/dist/app-types.js +4 -0
- package/dist/app-types.js.map +1 -0
- package/dist/data/data-source.d.ts +16 -0
- package/dist/data/data-source.d.ts.map +1 -0
- package/dist/data/data-source.js +139 -0
- package/dist/data/data-source.js.map +1 -0
- package/dist/data/data-transformer.d.ts +15 -0
- package/dist/data/data-transformer.d.ts.map +1 -0
- package/dist/data/data-transformer.js +58 -0
- package/dist/data/data-transformer.js.map +1 -0
- package/dist/engine/action-engine.d.ts +18 -0
- package/dist/engine/action-engine.d.ts.map +1 -0
- package/dist/engine/action-engine.js +97 -0
- package/dist/engine/action-engine.js.map +1 -0
- package/dist/engine/data-binding.d.ts +46 -0
- package/dist/engine/data-binding.d.ts.map +1 -0
- package/dist/engine/data-binding.js +198 -0
- package/dist/engine/data-binding.js.map +1 -0
- package/dist/engine/expression.d.ts +39 -0
- package/dist/engine/expression.d.ts.map +1 -0
- package/dist/engine/expression.js +630 -0
- package/dist/engine/expression.js.map +1 -0
- package/dist/engine/rule-engine.d.ts +23 -0
- package/dist/engine/rule-engine.d.ts.map +1 -0
- package/dist/engine/rule-engine.js +91 -0
- package/dist/engine/rule-engine.js.map +1 -0
- package/dist/engine/validation.d.ts +16 -0
- package/dist/engine/validation.d.ts.map +1 -0
- package/dist/engine/validation.js +116 -0
- package/dist/engine/validation.js.map +1 -0
- package/dist/events/event-bus.d.ts +16 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +51 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/i18n/en.d.ts +29 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +29 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/es.d.ts +29 -0
- package/dist/i18n/es.d.ts.map +1 -0
- package/dist/i18n/es.js +29 -0
- package/dist/i18n/es.js.map +1 -0
- package/dist/i18n/i18n.d.ts +14 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/i18n.js +32 -0
- package/dist/i18n/i18n.js.map +1 -0
- package/dist/i18n/pt.d.ts +29 -0
- package/dist/i18n/pt.d.ts.map +1 -0
- package/dist/i18n/pt.js +29 -0
- package/dist/i18n/pt.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/grid-solver.d.ts +18 -0
- package/dist/layout/grid-solver.d.ts.map +1 -0
- package/dist/layout/grid-solver.js +72 -0
- package/dist/layout/grid-solver.js.map +1 -0
- package/dist/persistence/flavor-manager.d.ts +17 -0
- package/dist/persistence/flavor-manager.d.ts.map +1 -0
- package/dist/persistence/flavor-manager.js +63 -0
- package/dist/persistence/flavor-manager.js.map +1 -0
- package/dist/persistence/schema-store.d.ts +35 -0
- package/dist/persistence/schema-store.d.ts.map +1 -0
- package/dist/persistence/schema-store.js +142 -0
- package/dist/persistence/schema-store.js.map +1 -0
- package/dist/registry/field-registry.d.ts +12 -0
- package/dist/registry/field-registry.d.ts.map +1 -0
- package/dist/registry/field-registry.js +91 -0
- package/dist/registry/field-registry.js.map +1 -0
- package/dist/schema/studio-schema.d.ts +1196 -0
- package/dist/schema/studio-schema.d.ts.map +1 -0
- package/dist/schema/studio-schema.js +191 -0
- package/dist/schema/studio-schema.js.map +1 -0
- package/dist/templates/app-templates.d.ts +35 -0
- package/dist/templates/app-templates.d.ts.map +1 -0
- package/dist/templates/app-templates.js +306 -0
- package/dist/templates/app-templates.js.map +1 -0
- package/dist/types.d.ts +270 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import type { StudioSchema, ThemeConfig, DataSourceConfig, ActionConfig } from './types.js';
|
|
2
|
+
export type NavItemKind = 'page' | 'header' | 'divider';
|
|
3
|
+
export interface NavItem {
|
|
4
|
+
kind?: NavItemKind;
|
|
5
|
+
segment?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
icon?: string;
|
|
8
|
+
badge?: string | number;
|
|
9
|
+
badgeColor?: string;
|
|
10
|
+
children?: NavItem[];
|
|
11
|
+
hidden?: boolean;
|
|
12
|
+
roles?: string[];
|
|
13
|
+
}
|
|
14
|
+
export type PageContentType = 'schema' | 'datagrid' | 'report' | 'chart' | 'html' | 'iframe' | 'custom' | 'cards' | 'tabs' | 'split' | 'empty';
|
|
15
|
+
export interface PageConfig {
|
|
16
|
+
id: string;
|
|
17
|
+
segment: string;
|
|
18
|
+
title: string;
|
|
19
|
+
subtitle?: string;
|
|
20
|
+
icon?: string;
|
|
21
|
+
breadcrumb?: boolean;
|
|
22
|
+
content: PageContentType;
|
|
23
|
+
dataSources?: DataSourceConfig[];
|
|
24
|
+
autoFetch?: boolean;
|
|
25
|
+
schema?: StudioSchema;
|
|
26
|
+
gridConfig?: GridPageConfig;
|
|
27
|
+
reportConfig?: ReportPageConfig;
|
|
28
|
+
cardsConfig?: CardsPageConfig;
|
|
29
|
+
tabsConfig?: TabsPageConfig;
|
|
30
|
+
splitConfig?: SplitPageConfig;
|
|
31
|
+
chartConfig?: ChartPageConfig;
|
|
32
|
+
htmlContent?: string;
|
|
33
|
+
iframeUrl?: string;
|
|
34
|
+
actions?: ActionConfig[];
|
|
35
|
+
roles?: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface GridPageConfig {
|
|
38
|
+
columns: GridColumnDef[];
|
|
39
|
+
dataSourceId: string;
|
|
40
|
+
rowKey?: string;
|
|
41
|
+
enableToolbar?: boolean;
|
|
42
|
+
enableFilters?: boolean;
|
|
43
|
+
enableSearch?: boolean;
|
|
44
|
+
enableExport?: boolean;
|
|
45
|
+
enablePagination?: boolean;
|
|
46
|
+
pageSize?: number;
|
|
47
|
+
height?: string;
|
|
48
|
+
onRowClick?: 'navigate' | 'select' | 'detail' | 'emit';
|
|
49
|
+
rowClickSegment?: string;
|
|
50
|
+
crud?: CrudConfig;
|
|
51
|
+
}
|
|
52
|
+
export interface GridColumnDef {
|
|
53
|
+
field: string;
|
|
54
|
+
header: string;
|
|
55
|
+
width?: number;
|
|
56
|
+
type?: 'text' | 'number' | 'date' | 'boolean' | 'currency' | 'status' | 'actions';
|
|
57
|
+
sortable?: boolean;
|
|
58
|
+
filterable?: boolean;
|
|
59
|
+
currency?: string;
|
|
60
|
+
statusColors?: Record<string, string>;
|
|
61
|
+
format?: string;
|
|
62
|
+
pin?: 'left' | 'right';
|
|
63
|
+
hidden?: boolean;
|
|
64
|
+
actions?: {
|
|
65
|
+
icon: string;
|
|
66
|
+
label: string;
|
|
67
|
+
action: string;
|
|
68
|
+
color?: string;
|
|
69
|
+
}[];
|
|
70
|
+
}
|
|
71
|
+
export interface CrudConfig {
|
|
72
|
+
create?: {
|
|
73
|
+
schema: StudioSchema;
|
|
74
|
+
url: string;
|
|
75
|
+
method?: string;
|
|
76
|
+
};
|
|
77
|
+
edit?: {
|
|
78
|
+
schema: StudioSchema;
|
|
79
|
+
url: string;
|
|
80
|
+
method?: string;
|
|
81
|
+
};
|
|
82
|
+
delete?: {
|
|
83
|
+
url: string;
|
|
84
|
+
confirmMessage?: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface ReportPageConfig {
|
|
88
|
+
templateId?: string;
|
|
89
|
+
layout?: unknown;
|
|
90
|
+
dataSourceId?: string;
|
|
91
|
+
showToolbar?: boolean;
|
|
92
|
+
}
|
|
93
|
+
export interface CardItem {
|
|
94
|
+
id: string;
|
|
95
|
+
title: string;
|
|
96
|
+
icon?: string;
|
|
97
|
+
iconBg?: string;
|
|
98
|
+
subtitle?: string;
|
|
99
|
+
segment?: string;
|
|
100
|
+
url?: string;
|
|
101
|
+
badge?: string | number;
|
|
102
|
+
roles?: string[];
|
|
103
|
+
value?: string | number;
|
|
104
|
+
trend?: 'up' | 'down' | 'flat';
|
|
105
|
+
trendValue?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface CardsPageConfig {
|
|
108
|
+
items: CardItem[];
|
|
109
|
+
columns?: number;
|
|
110
|
+
variant?: 'icon' | 'kpi' | 'stat' | 'link';
|
|
111
|
+
gap?: number;
|
|
112
|
+
}
|
|
113
|
+
export interface TabsPageConfig {
|
|
114
|
+
tabs: {
|
|
115
|
+
id: string;
|
|
116
|
+
title: string;
|
|
117
|
+
icon?: string;
|
|
118
|
+
pageId: string;
|
|
119
|
+
}[];
|
|
120
|
+
position?: 'top' | 'left';
|
|
121
|
+
}
|
|
122
|
+
export interface SplitPageConfig {
|
|
123
|
+
masterPageId: string;
|
|
124
|
+
detailPageId: string;
|
|
125
|
+
splitRatio?: number;
|
|
126
|
+
direction?: 'horizontal' | 'vertical';
|
|
127
|
+
}
|
|
128
|
+
export interface ChartPageConfig {
|
|
129
|
+
charts: {
|
|
130
|
+
id: string;
|
|
131
|
+
type: 'bar' | 'line' | 'pie' | 'donut' | 'area';
|
|
132
|
+
title: string;
|
|
133
|
+
dataSourceId: string;
|
|
134
|
+
labelField: string;
|
|
135
|
+
valueFields: string[];
|
|
136
|
+
colSpan?: number;
|
|
137
|
+
height?: number;
|
|
138
|
+
}[];
|
|
139
|
+
columns?: number;
|
|
140
|
+
}
|
|
141
|
+
export interface BrandingConfig {
|
|
142
|
+
logo?: string;
|
|
143
|
+
title?: string;
|
|
144
|
+
subtitle?: string;
|
|
145
|
+
homeSegment?: string;
|
|
146
|
+
favicon?: string;
|
|
147
|
+
primaryColor?: string;
|
|
148
|
+
sidebarStyle?: 'dark' | 'light' | 'branded';
|
|
149
|
+
headerStyle?: 'dark' | 'light' | 'branded';
|
|
150
|
+
}
|
|
151
|
+
export interface UserContext {
|
|
152
|
+
id?: string;
|
|
153
|
+
name?: string;
|
|
154
|
+
email?: string;
|
|
155
|
+
avatar?: string;
|
|
156
|
+
roles?: string[];
|
|
157
|
+
company?: string;
|
|
158
|
+
branch?: string;
|
|
159
|
+
locale?: string;
|
|
160
|
+
extra?: Record<string, unknown>;
|
|
161
|
+
}
|
|
162
|
+
export interface AppConfig {
|
|
163
|
+
id: string;
|
|
164
|
+
version?: string;
|
|
165
|
+
branding: BrandingConfig;
|
|
166
|
+
navigation: NavItem[];
|
|
167
|
+
pages: PageConfig[];
|
|
168
|
+
dataSources?: DataSourceConfig[];
|
|
169
|
+
headers?: Record<string, string>;
|
|
170
|
+
theme?: ThemeConfig;
|
|
171
|
+
user?: UserContext;
|
|
172
|
+
locale?: string;
|
|
173
|
+
notifications?: NotificationConfig[];
|
|
174
|
+
}
|
|
175
|
+
export interface NotificationConfig {
|
|
176
|
+
id: string;
|
|
177
|
+
title: string;
|
|
178
|
+
message?: string;
|
|
179
|
+
type?: 'info' | 'warning' | 'error' | 'success';
|
|
180
|
+
timestamp?: string;
|
|
181
|
+
read?: boolean;
|
|
182
|
+
action?: string;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=app-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-types.d.ts","sourceRoot":"","sources":["../src/app-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-types.js","sourceRoot":"","sources":["../src/app-types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,iFAAiF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DataSourceConfig, StudioBindingContext } from '../types.js';
|
|
2
|
+
import { EventBus } from '../events/event-bus.js';
|
|
3
|
+
export interface FetchedDataSources {
|
|
4
|
+
[sourceId: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Fetch all data sources in dependency order.
|
|
8
|
+
* Sources with dependsOn wait for their dependencies first.
|
|
9
|
+
*/
|
|
10
|
+
export declare function fetchAllDataSources(sources: DataSourceConfig[], context: StudioBindingContext, eventBus: EventBus, headers?: Record<string, string>): Promise<FetchedDataSources>;
|
|
11
|
+
/**
|
|
12
|
+
* Set up polling for data sources with refreshInterval.
|
|
13
|
+
* Returns a cleanup function to stop all intervals.
|
|
14
|
+
*/
|
|
15
|
+
export declare function setupPolling(sources: DataSourceConfig[], context: StudioBindingContext, eventBus: EventBus, onUpdate: (data: FetchedDataSources) => void): () => void;
|
|
16
|
+
//# sourceMappingURL=data-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/data/data-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAkE7B;AAwDD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,GAC3C,MAAM,IAAI,CAuBZ"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// @zentto/studio-core — Data source fetch engine
|
|
2
|
+
// Fetches data from REST/GraphQL/static sources with dependency resolution
|
|
3
|
+
/**
|
|
4
|
+
* Fetch all data sources in dependency order.
|
|
5
|
+
* Sources with dependsOn wait for their dependencies first.
|
|
6
|
+
*/
|
|
7
|
+
export async function fetchAllDataSources(sources, context, eventBus, headers) {
|
|
8
|
+
const result = {};
|
|
9
|
+
const resolved = new Set();
|
|
10
|
+
// Separate static from fetchable
|
|
11
|
+
for (const src of sources) {
|
|
12
|
+
if (src.type === 'static') {
|
|
13
|
+
result[src.id] = src.staticData ?? null;
|
|
14
|
+
resolved.add(src.id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Resolve in dependency order
|
|
18
|
+
const pending = sources.filter(s => s.type !== 'static' && s.autoFetch !== false);
|
|
19
|
+
let maxIterations = pending.length + 1;
|
|
20
|
+
while (pending.length > 0 && maxIterations > 0) {
|
|
21
|
+
maxIterations--;
|
|
22
|
+
const ready = pending.filter(s => {
|
|
23
|
+
if (!s.dependsOn || s.dependsOn.length === 0)
|
|
24
|
+
return true;
|
|
25
|
+
return s.dependsOn.every(dep => resolved.has(dep));
|
|
26
|
+
});
|
|
27
|
+
if (ready.length === 0 && pending.length > 0) {
|
|
28
|
+
// Circular dependency or unresolvable — fetch remaining anyway
|
|
29
|
+
ready.push(...pending);
|
|
30
|
+
}
|
|
31
|
+
const fetches = ready.map(async (src) => {
|
|
32
|
+
try {
|
|
33
|
+
eventBus.emit('datasource:loading', { sourceId: src.id });
|
|
34
|
+
const data = await fetchSingleSource(src, context, result, headers);
|
|
35
|
+
// Apply transform expression
|
|
36
|
+
if (src.transform && data != null) {
|
|
37
|
+
const { evaluateExpression } = await import('../engine/expression.js');
|
|
38
|
+
const transformCtx = {
|
|
39
|
+
...context,
|
|
40
|
+
dataSources: { ...result, __response: data },
|
|
41
|
+
};
|
|
42
|
+
const transformed = evaluateExpression(src.transform, transformCtx);
|
|
43
|
+
result[src.id] = transformed;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
result[src.id] = data;
|
|
47
|
+
}
|
|
48
|
+
resolved.add(src.id);
|
|
49
|
+
eventBus.emit('datasource:loaded', { sourceId: src.id, data: result[src.id] });
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
53
|
+
eventBus.emit('datasource:error', { sourceId: src.id, error });
|
|
54
|
+
result[src.id] = null;
|
|
55
|
+
resolved.add(src.id);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
await Promise.all(fetches);
|
|
59
|
+
// Remove resolved from pending
|
|
60
|
+
for (const s of ready) {
|
|
61
|
+
const idx = pending.indexOf(s);
|
|
62
|
+
if (idx >= 0)
|
|
63
|
+
pending.splice(idx, 1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
async function fetchSingleSource(src, context, existingData, extraHeaders) {
|
|
69
|
+
if (src.type === 'computed') {
|
|
70
|
+
if (!src.transform)
|
|
71
|
+
return null;
|
|
72
|
+
const { evaluateExpression } = await import('../engine/expression.js');
|
|
73
|
+
return evaluateExpression(src.transform, { ...context, dataSources: existingData });
|
|
74
|
+
}
|
|
75
|
+
if (!src.url)
|
|
76
|
+
return null;
|
|
77
|
+
// Resolve URL template parameters
|
|
78
|
+
let url = src.url;
|
|
79
|
+
url = url.replace(/\{(\w[\w.]*)\}/g, (_, path) => {
|
|
80
|
+
const parts = path.split('.');
|
|
81
|
+
let val = context.formData;
|
|
82
|
+
for (const p of parts) {
|
|
83
|
+
if (val == null || typeof val !== 'object')
|
|
84
|
+
return '';
|
|
85
|
+
val = val[p];
|
|
86
|
+
}
|
|
87
|
+
return encodeURIComponent(String(val ?? ''));
|
|
88
|
+
});
|
|
89
|
+
const method = src.method ?? 'GET';
|
|
90
|
+
const headers = {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
...extraHeaders,
|
|
93
|
+
...src.headers,
|
|
94
|
+
};
|
|
95
|
+
const options = { method, headers };
|
|
96
|
+
if (method !== 'GET' && src.body) {
|
|
97
|
+
options.body = JSON.stringify(src.body);
|
|
98
|
+
}
|
|
99
|
+
if (src.type === 'graphql' && src.body) {
|
|
100
|
+
options.method = 'POST';
|
|
101
|
+
options.body = JSON.stringify(src.body);
|
|
102
|
+
}
|
|
103
|
+
const response = await fetch(url, options);
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
106
|
+
}
|
|
107
|
+
const contentType = response.headers.get('content-type');
|
|
108
|
+
return contentType?.includes('application/json')
|
|
109
|
+
? response.json()
|
|
110
|
+
: response.text();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Set up polling for data sources with refreshInterval.
|
|
114
|
+
* Returns a cleanup function to stop all intervals.
|
|
115
|
+
*/
|
|
116
|
+
export function setupPolling(sources, context, eventBus, onUpdate) {
|
|
117
|
+
const intervals = [];
|
|
118
|
+
for (const src of sources) {
|
|
119
|
+
if (src.refreshInterval && src.refreshInterval > 0) {
|
|
120
|
+
const interval = setInterval(async () => {
|
|
121
|
+
try {
|
|
122
|
+
eventBus.emit('datasource:loading', { sourceId: src.id });
|
|
123
|
+
const data = await fetchSingleSource(src, context, {});
|
|
124
|
+
onUpdate({ [src.id]: data });
|
|
125
|
+
eventBus.emit('datasource:loaded', { sourceId: src.id, data });
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
eventBus.emit('datasource:error', {
|
|
129
|
+
sourceId: src.id,
|
|
130
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}, src.refreshInterval);
|
|
134
|
+
intervals.push(interval);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return () => intervals.forEach(clearInterval);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/data/data-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flatten a nested API response to a simple key-value object.
|
|
3
|
+
* Useful for mapping API responses to form fields.
|
|
4
|
+
*/
|
|
5
|
+
export declare function flattenObject(obj: Record<string, unknown>, prefix?: string, separator?: string): Record<string, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Unflatten a flat key-value object to nested structure.
|
|
8
|
+
*/
|
|
9
|
+
export declare function unflattenObject(obj: Record<string, unknown>, separator?: string): Record<string, unknown>;
|
|
10
|
+
/**
|
|
11
|
+
* Pick specific fields from a data object.
|
|
12
|
+
* Supports dot notation paths.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pickFields(data: Record<string, unknown>, fields: string[]): Record<string, unknown>;
|
|
15
|
+
//# sourceMappingURL=data-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-transformer.d.ts","sourceRoot":"","sources":["../../src/data/data-transformer.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,SAAK,EACX,SAAS,SAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,SAAS,SAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// @zentto/studio-core — Data response transformation utilities
|
|
2
|
+
/**
|
|
3
|
+
* Flatten a nested API response to a simple key-value object.
|
|
4
|
+
* Useful for mapping API responses to form fields.
|
|
5
|
+
*/
|
|
6
|
+
export function flattenObject(obj, prefix = '', separator = '.') {
|
|
7
|
+
const result = {};
|
|
8
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
9
|
+
const fullKey = prefix ? `${prefix}${separator}${key}` : key;
|
|
10
|
+
if (value != null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {
|
|
11
|
+
Object.assign(result, flattenObject(value, fullKey, separator));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
result[fullKey] = value;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Unflatten a flat key-value object to nested structure.
|
|
21
|
+
*/
|
|
22
|
+
export function unflattenObject(obj, separator = '.') {
|
|
23
|
+
const result = {};
|
|
24
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
25
|
+
const parts = key.split(separator);
|
|
26
|
+
let current = result;
|
|
27
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
28
|
+
if (!(parts[i] in current) || typeof current[parts[i]] !== 'object') {
|
|
29
|
+
current[parts[i]] = {};
|
|
30
|
+
}
|
|
31
|
+
current = current[parts[i]];
|
|
32
|
+
}
|
|
33
|
+
current[parts[parts.length - 1]] = value;
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Pick specific fields from a data object.
|
|
39
|
+
* Supports dot notation paths.
|
|
40
|
+
*/
|
|
41
|
+
export function pickFields(data, fields) {
|
|
42
|
+
const result = {};
|
|
43
|
+
for (const field of fields) {
|
|
44
|
+
const parts = field.split('.');
|
|
45
|
+
let value = data;
|
|
46
|
+
for (const part of parts) {
|
|
47
|
+
if (value == null || typeof value !== 'object') {
|
|
48
|
+
value = undefined;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
value = value[part];
|
|
52
|
+
}
|
|
53
|
+
if (value !== undefined)
|
|
54
|
+
result[field] = value;
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=data-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-transformer.js","sourceRoot":"","sources":["../../src/data/data-transformer.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,GAA4B,EAC5B,MAAM,GAAG,EAAE,EACX,SAAS,GAAG,GAAG;IAEf,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7D,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;YACpG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAgC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,GAA4B,EAC5B,SAAS,GAAG,GAAG;IAEf,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,OAAO,GAA4B,MAAM,CAAC;QAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACpE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;QACzD,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,IAA6B,EAC7B,MAAgB;IAEhB,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAY,IAAI,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAAC,KAAK,GAAG,SAAS,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC7E,KAAK,GAAI,KAAiC,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ActionConfig, StudioBindingContext } from '../types.js';
|
|
2
|
+
import { EventBus } from '../events/event-bus.js';
|
|
3
|
+
export interface ActionExecutionResult {
|
|
4
|
+
success: boolean;
|
|
5
|
+
data?: unknown;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Check if an action is enabled (evaluates disabledRule if present).
|
|
10
|
+
*/
|
|
11
|
+
export declare function isActionEnabled(action: ActionConfig, context: StudioBindingContext): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Execute an action.
|
|
14
|
+
* For 'submit' and 'apiCall', makes HTTP requests.
|
|
15
|
+
* For 'navigate' and 'custom', emits events for the host app.
|
|
16
|
+
*/
|
|
17
|
+
export declare function executeAction(action: ActionConfig, formData: Record<string, unknown>, context: StudioBindingContext, eventBus: EventBus): Promise<ActionExecutionResult>;
|
|
18
|
+
//# sourceMappingURL=action-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-engine.d.ts","sourceRoot":"","sources":["../../src/engine/action-engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAM5F;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAqDhC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// @zentto/studio-core — Action execution engine
|
|
2
|
+
// Handles form submissions, API calls, navigation, and custom events
|
|
3
|
+
import { evaluateCondition, evaluateExpression } from './expression.js';
|
|
4
|
+
/**
|
|
5
|
+
* Check if an action is enabled (evaluates disabledRule if present).
|
|
6
|
+
*/
|
|
7
|
+
export function isActionEnabled(action, context) {
|
|
8
|
+
if (action.disabled)
|
|
9
|
+
return false;
|
|
10
|
+
if (action.disabledRule) {
|
|
11
|
+
return !evaluateCondition(action.disabledRule, context);
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute an action.
|
|
17
|
+
* For 'submit' and 'apiCall', makes HTTP requests.
|
|
18
|
+
* For 'navigate' and 'custom', emits events for the host app.
|
|
19
|
+
*/
|
|
20
|
+
export async function executeAction(action, formData, context, eventBus) {
|
|
21
|
+
eventBus.emit('action:execute', {
|
|
22
|
+
actionId: action.id,
|
|
23
|
+
type: action.type,
|
|
24
|
+
data: formData,
|
|
25
|
+
});
|
|
26
|
+
try {
|
|
27
|
+
let result;
|
|
28
|
+
switch (action.type) {
|
|
29
|
+
case 'submit':
|
|
30
|
+
case 'apiCall':
|
|
31
|
+
result = await executeHttpAction(action, formData, context);
|
|
32
|
+
break;
|
|
33
|
+
case 'navigate':
|
|
34
|
+
result = { success: true, data: { navigateTo: action.navigateTo } };
|
|
35
|
+
break;
|
|
36
|
+
case 'reset':
|
|
37
|
+
result = { success: true };
|
|
38
|
+
eventBus.emit('form:reset', {});
|
|
39
|
+
break;
|
|
40
|
+
case 'print':
|
|
41
|
+
result = { success: true };
|
|
42
|
+
break;
|
|
43
|
+
case 'openModal':
|
|
44
|
+
result = { success: true, data: { schemaId: action.schemaId } };
|
|
45
|
+
break;
|
|
46
|
+
case 'custom':
|
|
47
|
+
result = { success: true, data: { eventName: action.eventName, formData } };
|
|
48
|
+
break;
|
|
49
|
+
default:
|
|
50
|
+
result = { success: false, error: `Tipo de accion desconocido: ${action.type}` };
|
|
51
|
+
}
|
|
52
|
+
if (result.success) {
|
|
53
|
+
eventBus.emit('action:success', { actionId: action.id, response: result.data });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
eventBus.emit('action:error', { actionId: action.id, error: new Error(result.error ?? 'Error desconocido') });
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
62
|
+
eventBus.emit('action:error', { actionId: action.id, error });
|
|
63
|
+
return { success: false, error: error.message };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function executeHttpAction(action, formData, context) {
|
|
67
|
+
if (!action.url) {
|
|
68
|
+
return { success: false, error: 'URL no especificada para la accion' };
|
|
69
|
+
}
|
|
70
|
+
// Resolve URL template: replace {field} references
|
|
71
|
+
let url = action.url;
|
|
72
|
+
const fieldRefRegex = /\{(\w[\w.]*)\}/g;
|
|
73
|
+
url = url.replace(fieldRefRegex, (_, path) => {
|
|
74
|
+
const val = evaluateExpression(`{${path}}`, context);
|
|
75
|
+
return encodeURIComponent(String(val ?? ''));
|
|
76
|
+
});
|
|
77
|
+
const method = (action.method ?? 'POST').toUpperCase();
|
|
78
|
+
const headers = {
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
...action.headers,
|
|
81
|
+
};
|
|
82
|
+
const fetchOptions = { method, headers };
|
|
83
|
+
if (method !== 'GET' && method !== 'HEAD') {
|
|
84
|
+
fetchOptions.body = JSON.stringify(formData);
|
|
85
|
+
}
|
|
86
|
+
const response = await fetch(url, fetchOptions);
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
const errorText = await response.text().catch(() => response.statusText);
|
|
89
|
+
return { success: false, error: `HTTP ${response.status}: ${errorText}` };
|
|
90
|
+
}
|
|
91
|
+
const contentType = response.headers.get('content-type');
|
|
92
|
+
const data = contentType?.includes('application/json')
|
|
93
|
+
? await response.json()
|
|
94
|
+
: await response.text();
|
|
95
|
+
return { success: true, data };
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=action-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-engine.js","sourceRoot":"","sources":["../../src/engine/action-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { FieldState, FormState, StudioSchema } from '../types.js';
|
|
2
|
+
import { EventBus } from '../events/event-bus.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a deep path in an object using dot notation.
|
|
5
|
+
* Supports array notation: "items[0].name"
|
|
6
|
+
*/
|
|
7
|
+
export declare function getDeepValue(obj: Record<string, unknown>, path: string): unknown;
|
|
8
|
+
/**
|
|
9
|
+
* Set a deep value in an object using dot notation.
|
|
10
|
+
* Creates intermediate objects/arrays as needed.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setDeepValue(obj: Record<string, unknown>, path: string, value: unknown): void;
|
|
13
|
+
export declare class DataModel {
|
|
14
|
+
private data;
|
|
15
|
+
private fieldStates;
|
|
16
|
+
private eventBus;
|
|
17
|
+
private initialData;
|
|
18
|
+
constructor(initialData: Record<string, unknown>, eventBus: EventBus);
|
|
19
|
+
/** Get form data (shallow copy) */
|
|
20
|
+
getData(): Record<string, unknown>;
|
|
21
|
+
/** Get the raw data reference (for expression context) */
|
|
22
|
+
getRawData(): Record<string, unknown>;
|
|
23
|
+
/** Get a single field value */
|
|
24
|
+
getValue(path: string): unknown;
|
|
25
|
+
/** Set a field value and emit change event */
|
|
26
|
+
setValue(fieldId: string, path: string, value: unknown): void;
|
|
27
|
+
/** Initialize field states from schema */
|
|
28
|
+
initializeFromSchema(schema: StudioSchema): void;
|
|
29
|
+
/** Get field state (creates default if not exists) */
|
|
30
|
+
getFieldState(fieldId: string): FieldState;
|
|
31
|
+
/** Update field state properties */
|
|
32
|
+
updateFieldState(fieldId: string, updates: Partial<FieldState>): void;
|
|
33
|
+
/** Set validation errors for a field */
|
|
34
|
+
setFieldErrors(fieldId: string, errors: string[]): void;
|
|
35
|
+
/** Check if form is dirty */
|
|
36
|
+
isDirty(): boolean;
|
|
37
|
+
/** Check if form is valid (no errors on any field) */
|
|
38
|
+
isValid(): boolean;
|
|
39
|
+
/** Reset form to initial data */
|
|
40
|
+
reset(): void;
|
|
41
|
+
/** Get form state summary */
|
|
42
|
+
getFormState(): FormState;
|
|
43
|
+
/** Bulk update data (e.g., from API response) */
|
|
44
|
+
setData(data: Record<string, unknown>): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-binding.d.ts","sourceRoot":"","sources":["../../src/engine/data-binding.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAehF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAmC7F;AAID,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAA0B;gBAEjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ;IAOpE,mCAAmC;IACnC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlC,0DAA0D;IAC1D,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIrC,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAgB7D,0CAA0C;IAC1C,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAwBhD,sDAAsD;IACtD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAU1C,oCAAoC;IACpC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAKrE,wCAAwC;IACxC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvD,6BAA6B;IAC7B,OAAO,IAAI,OAAO;IAOlB,sDAAsD;IACtD,OAAO,IAAI,OAAO;IAOlB,iCAAiC;IACjC,KAAK,IAAI,IAAI;IAYb,6BAA6B;IAC7B,YAAY,IAAI,SAAS;IAWzB,iDAAiD;IACjD,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAS7C"}
|