@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.
Files changed (105) hide show
  1. package/dist/__tests__/data-binding.test.d.ts +2 -0
  2. package/dist/__tests__/data-binding.test.d.ts.map +1 -0
  3. package/dist/__tests__/data-binding.test.js +86 -0
  4. package/dist/__tests__/data-binding.test.js.map +1 -0
  5. package/dist/__tests__/event-bus.test.d.ts +2 -0
  6. package/dist/__tests__/event-bus.test.d.ts.map +1 -0
  7. package/dist/__tests__/event-bus.test.js +70 -0
  8. package/dist/__tests__/event-bus.test.js.map +1 -0
  9. package/dist/__tests__/expression.test.d.ts +2 -0
  10. package/dist/__tests__/expression.test.d.ts.map +1 -0
  11. package/dist/__tests__/expression.test.js +173 -0
  12. package/dist/__tests__/expression.test.js.map +1 -0
  13. package/dist/__tests__/schema.test.d.ts +2 -0
  14. package/dist/__tests__/schema.test.d.ts.map +1 -0
  15. package/dist/__tests__/schema.test.js +91 -0
  16. package/dist/__tests__/schema.test.js.map +1 -0
  17. package/dist/__tests__/validation.test.d.ts +2 -0
  18. package/dist/__tests__/validation.test.d.ts.map +1 -0
  19. package/dist/__tests__/validation.test.js +70 -0
  20. package/dist/__tests__/validation.test.js.map +1 -0
  21. package/dist/app-types.d.ts +184 -0
  22. package/dist/app-types.d.ts.map +1 -0
  23. package/dist/app-types.js +4 -0
  24. package/dist/app-types.js.map +1 -0
  25. package/dist/data/data-source.d.ts +16 -0
  26. package/dist/data/data-source.d.ts.map +1 -0
  27. package/dist/data/data-source.js +139 -0
  28. package/dist/data/data-source.js.map +1 -0
  29. package/dist/data/data-transformer.d.ts +15 -0
  30. package/dist/data/data-transformer.d.ts.map +1 -0
  31. package/dist/data/data-transformer.js +58 -0
  32. package/dist/data/data-transformer.js.map +1 -0
  33. package/dist/engine/action-engine.d.ts +18 -0
  34. package/dist/engine/action-engine.d.ts.map +1 -0
  35. package/dist/engine/action-engine.js +97 -0
  36. package/dist/engine/action-engine.js.map +1 -0
  37. package/dist/engine/data-binding.d.ts +46 -0
  38. package/dist/engine/data-binding.d.ts.map +1 -0
  39. package/dist/engine/data-binding.js +198 -0
  40. package/dist/engine/data-binding.js.map +1 -0
  41. package/dist/engine/expression.d.ts +39 -0
  42. package/dist/engine/expression.d.ts.map +1 -0
  43. package/dist/engine/expression.js +630 -0
  44. package/dist/engine/expression.js.map +1 -0
  45. package/dist/engine/rule-engine.d.ts +23 -0
  46. package/dist/engine/rule-engine.d.ts.map +1 -0
  47. package/dist/engine/rule-engine.js +91 -0
  48. package/dist/engine/rule-engine.js.map +1 -0
  49. package/dist/engine/validation.d.ts +16 -0
  50. package/dist/engine/validation.d.ts.map +1 -0
  51. package/dist/engine/validation.js +116 -0
  52. package/dist/engine/validation.js.map +1 -0
  53. package/dist/events/event-bus.d.ts +16 -0
  54. package/dist/events/event-bus.d.ts.map +1 -0
  55. package/dist/events/event-bus.js +51 -0
  56. package/dist/events/event-bus.js.map +1 -0
  57. package/dist/i18n/en.d.ts +29 -0
  58. package/dist/i18n/en.d.ts.map +1 -0
  59. package/dist/i18n/en.js +29 -0
  60. package/dist/i18n/en.js.map +1 -0
  61. package/dist/i18n/es.d.ts +29 -0
  62. package/dist/i18n/es.d.ts.map +1 -0
  63. package/dist/i18n/es.js +29 -0
  64. package/dist/i18n/es.js.map +1 -0
  65. package/dist/i18n/i18n.d.ts +14 -0
  66. package/dist/i18n/i18n.d.ts.map +1 -0
  67. package/dist/i18n/i18n.js +32 -0
  68. package/dist/i18n/i18n.js.map +1 -0
  69. package/dist/i18n/pt.d.ts +29 -0
  70. package/dist/i18n/pt.d.ts.map +1 -0
  71. package/dist/i18n/pt.js +29 -0
  72. package/dist/i18n/pt.js.map +1 -0
  73. package/dist/index.d.ts +24 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +31 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/layout/grid-solver.d.ts +18 -0
  78. package/dist/layout/grid-solver.d.ts.map +1 -0
  79. package/dist/layout/grid-solver.js +72 -0
  80. package/dist/layout/grid-solver.js.map +1 -0
  81. package/dist/persistence/flavor-manager.d.ts +17 -0
  82. package/dist/persistence/flavor-manager.d.ts.map +1 -0
  83. package/dist/persistence/flavor-manager.js +63 -0
  84. package/dist/persistence/flavor-manager.js.map +1 -0
  85. package/dist/persistence/schema-store.d.ts +35 -0
  86. package/dist/persistence/schema-store.d.ts.map +1 -0
  87. package/dist/persistence/schema-store.js +142 -0
  88. package/dist/persistence/schema-store.js.map +1 -0
  89. package/dist/registry/field-registry.d.ts +12 -0
  90. package/dist/registry/field-registry.d.ts.map +1 -0
  91. package/dist/registry/field-registry.js +91 -0
  92. package/dist/registry/field-registry.js.map +1 -0
  93. package/dist/schema/studio-schema.d.ts +1196 -0
  94. package/dist/schema/studio-schema.d.ts.map +1 -0
  95. package/dist/schema/studio-schema.js +191 -0
  96. package/dist/schema/studio-schema.js.map +1 -0
  97. package/dist/templates/app-templates.d.ts +35 -0
  98. package/dist/templates/app-templates.d.ts.map +1 -0
  99. package/dist/templates/app-templates.js +306 -0
  100. package/dist/templates/app-templates.js.map +1 -0
  101. package/dist/types.d.ts +270 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +4 -0
  104. package/dist/types.js.map +1 -0
  105. package/package.json +44 -0
@@ -0,0 +1,198 @@
1
+ // @zentto/studio-core — Two-way data binding engine
2
+ // Uses Proxy for change detection, emits events on mutations
3
+ /**
4
+ * Resolve a deep path in an object using dot notation.
5
+ * Supports array notation: "items[0].name"
6
+ */
7
+ export function getDeepValue(obj, path) {
8
+ const parts = path.split('.');
9
+ let current = obj;
10
+ for (const part of parts) {
11
+ if (current == null || typeof current !== 'object')
12
+ return undefined;
13
+ const arrMatch = part.match(/^(\w+)\[(\d+)\]$/);
14
+ if (arrMatch) {
15
+ const arr = current[arrMatch[1]];
16
+ if (!Array.isArray(arr))
17
+ return undefined;
18
+ current = arr[parseInt(arrMatch[2], 10)];
19
+ }
20
+ else {
21
+ current = current[part];
22
+ }
23
+ }
24
+ return current;
25
+ }
26
+ /**
27
+ * Set a deep value in an object using dot notation.
28
+ * Creates intermediate objects/arrays as needed.
29
+ */
30
+ export function setDeepValue(obj, path, value) {
31
+ const parts = path.split('.');
32
+ let current = obj;
33
+ for (let i = 0; i < parts.length - 1; i++) {
34
+ const part = parts[i];
35
+ const arrMatch = part.match(/^(\w+)\[(\d+)\]$/);
36
+ if (arrMatch) {
37
+ const key = arrMatch[1];
38
+ const idx = parseInt(arrMatch[2], 10);
39
+ if (!Array.isArray(current[key]))
40
+ current[key] = [];
41
+ const arr = current[key];
42
+ while (arr.length <= idx)
43
+ arr.push({});
44
+ current = arr[idx];
45
+ }
46
+ else {
47
+ if (current[part] == null || typeof current[part] !== 'object') {
48
+ // Peek ahead to determine if next part needs array or object
49
+ const next = parts[i + 1];
50
+ current[part] = next && /^\d+$/.test(next) ? [] : {};
51
+ }
52
+ current = current[part];
53
+ }
54
+ }
55
+ const lastPart = parts[parts.length - 1];
56
+ const lastArrMatch = lastPart.match(/^(\w+)\[(\d+)\]$/);
57
+ if (lastArrMatch) {
58
+ const key = lastArrMatch[1];
59
+ const idx = parseInt(lastArrMatch[2], 10);
60
+ if (!Array.isArray(current[key]))
61
+ current[key] = [];
62
+ current[key][idx] = value;
63
+ }
64
+ else {
65
+ current[lastPart] = value;
66
+ }
67
+ }
68
+ // ─── Data Model ────────────────────────────────────────────────────
69
+ export class DataModel {
70
+ data;
71
+ fieldStates;
72
+ eventBus;
73
+ initialData;
74
+ constructor(initialData, eventBus) {
75
+ this.initialData = structuredClone(initialData);
76
+ this.data = structuredClone(initialData);
77
+ this.fieldStates = new Map();
78
+ this.eventBus = eventBus;
79
+ }
80
+ /** Get form data (shallow copy) */
81
+ getData() {
82
+ return { ...this.data };
83
+ }
84
+ /** Get the raw data reference (for expression context) */
85
+ getRawData() {
86
+ return this.data;
87
+ }
88
+ /** Get a single field value */
89
+ getValue(path) {
90
+ return getDeepValue(this.data, path);
91
+ }
92
+ /** Set a field value and emit change event */
93
+ setValue(fieldId, path, value) {
94
+ const previousValue = getDeepValue(this.data, path);
95
+ if (previousValue === value)
96
+ return; // no-op
97
+ setDeepValue(this.data, path, value);
98
+ // Update field state
99
+ const state = this.getFieldState(fieldId);
100
+ state.value = value;
101
+ state.dirty = true;
102
+ state.touched = true;
103
+ this.fieldStates.set(fieldId, state);
104
+ this.eventBus.emit('field:change', { fieldId, field: path, value, previousValue });
105
+ }
106
+ /** Initialize field states from schema */
107
+ initializeFromSchema(schema) {
108
+ for (const section of schema.sections) {
109
+ for (const field of section.fields) {
110
+ const value = getDeepValue(this.data, field.field);
111
+ const defaultVal = value !== undefined ? value : field.defaultValue;
112
+ if (defaultVal !== undefined && value === undefined) {
113
+ setDeepValue(this.data, field.field, defaultVal);
114
+ }
115
+ this.fieldStates.set(field.id, {
116
+ value: defaultVal ?? null,
117
+ errors: [],
118
+ touched: false,
119
+ dirty: false,
120
+ visible: !field.hidden,
121
+ enabled: !field.disabled,
122
+ required: field.required ?? false,
123
+ readOnly: field.readOnly ?? false,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ /** Get field state (creates default if not exists) */
129
+ getFieldState(fieldId) {
130
+ if (!this.fieldStates.has(fieldId)) {
131
+ this.fieldStates.set(fieldId, {
132
+ value: null, errors: [], touched: false, dirty: false,
133
+ visible: true, enabled: true, required: false, readOnly: false,
134
+ });
135
+ }
136
+ return { ...this.fieldStates.get(fieldId) };
137
+ }
138
+ /** Update field state properties */
139
+ updateFieldState(fieldId, updates) {
140
+ const current = this.getFieldState(fieldId);
141
+ this.fieldStates.set(fieldId, { ...current, ...updates });
142
+ }
143
+ /** Set validation errors for a field */
144
+ setFieldErrors(fieldId, errors) {
145
+ this.updateFieldState(fieldId, { errors });
146
+ this.eventBus.emit('field:validate', { fieldId, errors });
147
+ }
148
+ /** Check if form is dirty */
149
+ isDirty() {
150
+ for (const [, state] of this.fieldStates) {
151
+ if (state.dirty)
152
+ return true;
153
+ }
154
+ return false;
155
+ }
156
+ /** Check if form is valid (no errors on any field) */
157
+ isValid() {
158
+ for (const [, state] of this.fieldStates) {
159
+ if (state.errors.length > 0)
160
+ return true;
161
+ }
162
+ return false;
163
+ }
164
+ /** Reset form to initial data */
165
+ reset() {
166
+ this.data = structuredClone(this.initialData);
167
+ for (const [id] of this.fieldStates) {
168
+ const value = getDeepValue(this.data, id);
169
+ this.fieldStates.set(id, {
170
+ value: value ?? null, errors: [], touched: false, dirty: false,
171
+ visible: true, enabled: true, required: false, readOnly: false,
172
+ });
173
+ }
174
+ this.eventBus.emit('form:reset', {});
175
+ }
176
+ /** Get form state summary */
177
+ getFormState() {
178
+ return {
179
+ data: this.getData(),
180
+ fields: new Map(this.fieldStates),
181
+ isValid: this.isValid(),
182
+ isDirty: this.isDirty(),
183
+ isSubmitting: false,
184
+ activeSection: 0,
185
+ };
186
+ }
187
+ /** Bulk update data (e.g., from API response) */
188
+ setData(data) {
189
+ this.data = structuredClone(data);
190
+ for (const [id, state] of this.fieldStates) {
191
+ const value = getDeepValue(this.data, id);
192
+ if (value !== undefined) {
193
+ state.value = value;
194
+ }
195
+ }
196
+ }
197
+ }
198
+ //# sourceMappingURL=data-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-binding.js","sourceRoot":"","sources":["../../src/engine/data-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { StudioBindingContext } from '../types.js';
2
+ export declare class ExprError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ type FnImpl = (args: unknown[], ctx: StudioBindingContext) => unknown;
6
+ /**
7
+ * Evaluate an expression string against a StudioBindingContext.
8
+ * Returns the computed value. Throws ExprError on syntax errors.
9
+ *
10
+ * @example
11
+ * evaluateExpression('{precio} * {cantidad}', { formData: { precio: 10, cantidad: 5 } })
12
+ * // → 50
13
+ *
14
+ * evaluateExpression('{role} == "admin" AND {total} > 1000', {
15
+ * formData: { role: 'admin', total: 1500 }
16
+ * })
17
+ * // → true
18
+ */
19
+ export declare function evaluateExpression(expression: string, context?: StudioBindingContext): unknown;
20
+ /**
21
+ * Safe evaluation — returns { ok, value } or { ok, error }.
22
+ * Never throws.
23
+ */
24
+ export declare function safeEvaluateExpression(expression: string, context?: StudioBindingContext): {
25
+ ok: true;
26
+ value: unknown;
27
+ } | {
28
+ ok: false;
29
+ error: string;
30
+ };
31
+ /**
32
+ * Evaluate an expression and coerce to boolean.
33
+ * Useful for visibility rules and conditions.
34
+ */
35
+ export declare function evaluateCondition(expression: string, context: StudioBindingContext): boolean;
36
+ /** Register a custom function for use in expressions */
37
+ export declare function registerFunction(name: string, fn: FnImpl): void;
38
+ export {};
39
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/engine/expression.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAsSxD,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAwDD,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC;AA0KtE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,oBAAwD,GAChE,OAAO,CAOT;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,oBAAwD,GAChE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAO7D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAI5F;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE/D"}