@bravostudioai/react 0.1.2 → 0.1.3

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.
@@ -1,377 +1,375 @@
1
- import { sanitizePropName as m, getComponentPropType as G, getComponentPropName as W } from "./parser.js";
2
- function K(M, S, g, x, c, s, $, C, N, j = !1) {
3
- const w = [], d = [], y = [], P = [], f = [], U = [];
4
- c.forEach((o) => {
5
- w.push(` ${o.propName}?: ${o.propType};`);
6
- }), s.forEach((o) => {
7
- const n = m(o.groupName);
8
- y.push(` ${n}?: string;`), y.push(
1
+ import { sanitizePropName as l, getComponentPropType as G, getComponentPropName as W } from "./parser.js";
2
+ function K(U, I, y, b, m, c, g, P, h, d = !1) {
3
+ const E = [], N = [], a = [], r = [], u = [], k = [];
4
+ m.forEach((o) => {
5
+ E.push(` ${o.propName}?: ${o.propType};`);
6
+ }), c.forEach((o) => {
7
+ const n = l(o.groupName);
8
+ a.push(` ${n}?: string;`), a.push(
9
9
  ` on${n[0].toUpperCase()}${n.slice(
10
10
  1
11
11
  )}Change?: (value: string) => void;`
12
12
  );
13
13
  });
14
- const k = [];
15
- $.forEach((o) => {
16
- const n = m(o.formName), a = `${n[0].toUpperCase()}${n.slice(
14
+ const A = [];
15
+ g.forEach((o) => {
16
+ const n = l(o.formName), p = `${n[0].toUpperCase()}${n.slice(
17
17
  1
18
- )}FormData`, p = [];
19
- o.inputs.forEach((i) => {
20
- const D = i.propName, u = G(i.type, i.name);
21
- p.push(` ${D}: ${u};`);
22
- }), k.push(`export interface ${a} {
23
- ${p.join(`
18
+ )}FormData`, s = [];
19
+ o.inputs.forEach(($) => {
20
+ const S = $.propName, v = G($.type, $.name);
21
+ s.push(` ${S}: ${v};`);
22
+ }), A.push(`export interface ${p} {
23
+ ${s.join(`
24
24
  `)}
25
- }`), P.push(
25
+ }`), r.push(
26
26
  ` on${n[0].toUpperCase()}${n.slice(
27
27
  1
28
- )}Submit?: (formData: ${a}) => void;`
28
+ )}Submit?: (formData: ${p}) => void;`
29
29
  );
30
- }), C.forEach((o) => {
31
- const n = o.propName, a = n[0].toUpperCase() + n.slice(1);
32
- f.push(` ${n}?: string;`), f.push(
30
+ }), P.forEach((o) => {
31
+ const n = o.propName, p = n[0].toUpperCase() + n.slice(1);
32
+ u.push(` ${n}?: string;`), u.push(
33
33
  ` ${n}Options?: Array<string | { value: string; label: string }>;`
34
- ), f.push(
35
- ` on${a}Change?: (value: string) => void;`
34
+ ), u.push(
35
+ ` on${p}Change?: (value: string) => void;`
36
36
  );
37
- }), N.forEach((o) => {
38
- const n = o.propName, a = n[0].toUpperCase() + n.slice(1);
39
- U.push(` on${a}Click?: () => void;`);
40
- }), x.forEach((o) => {
37
+ }), h.forEach((o) => {
38
+ const n = o.propName, p = n[0].toUpperCase() + n.slice(1);
39
+ k.push(` on${p}Click?: () => void;`);
40
+ }), b.forEach((o) => {
41
41
  if (o.arrayContainer && o.arrayContainer.components.length > 0) {
42
- const a = o.arrayContainer, p = `${a.propName[0].toUpperCase()}${a.propName.slice(
42
+ const p = o.arrayContainer, s = `${p.propName[0].toUpperCase()}${p.propName.slice(
43
43
  1
44
44
  )}Item`;
45
- w.push(` ${a.propName}: ${p}[];`);
45
+ E.push(` ${p.propName}: ${s}[];`);
46
46
  }
47
- const n = m(o.name || "container");
48
- d.push(` ${n}CurrentIndex?: number;`), d.push(
47
+ const n = l(o.name || "container");
48
+ N.push(` ${n}CurrentIndex?: number;`), N.push(
49
49
  ` on${n[0].toUpperCase()}${n.slice(
50
50
  1
51
51
  )}IndexChange?: (index: number) => void;`
52
52
  );
53
53
  });
54
- const v = [
55
- ...w,
56
- ...d,
57
- ...y,
58
- ...P,
59
- ...f,
60
- ...U
61
- ], A = v.length > 0, b = A ? `export interface ${g}Props {
62
- ${v.join(`
54
+ const x = [
55
+ ...E,
56
+ ...N,
57
+ ...a,
58
+ ...r,
59
+ ...u,
60
+ ...k
61
+ ], z = x.length > 0, D = z ? `export interface ${y}Props {
62
+ ${x.join(`
63
63
  `)}
64
- }` : "", z = x.filter((o) => o.arrayContainer && o.arrayContainer.components.length > 0).map((o) => {
65
- const n = o.arrayContainer, a = `${n.propName[0].toUpperCase()}${n.propName.slice(
64
+ }` : "", O = b.filter((o) => o.arrayContainer && o.arrayContainer.components.length > 0).map((o) => {
65
+ const n = o.arrayContainer, p = `${n.propName[0].toUpperCase()}${n.propName.slice(
66
66
  1
67
- )}Item`, p = n.components.map((i) => ` ${i.propName}: ${i.propType};`).join(`
67
+ )}Item`, s = n.components.map(($) => ` ${$.propName}: ${$.propType};`).join(`
68
68
  `);
69
- return `export interface ${a} {
70
- ${p}
69
+ return `export interface ${p} {
70
+ ${s}
71
71
  }`;
72
72
  }).join(`
73
73
 
74
- `), O = k.join(`
74
+ `), M = A.join(`
75
75
 
76
- `), I = [], T = [];
77
- c.forEach((o) => {
76
+ `), j = [], T = [];
77
+ m.forEach((o) => {
78
78
  const n = W(o.type);
79
- I.push(` // ${o.name}
79
+ j.push(` // ${o.name}
80
80
  ...(props.${o.propName} !== undefined && { "${o.id}": { ${n}: props.${o.propName} } as any }),`);
81
- }), C.forEach((o) => {
82
- I.push(` // ${o.name}
81
+ }), P.forEach((o) => {
82
+ j.push(` // ${o.name}
83
83
  ...((props.${o.propName} !== undefined || props.${o.propName}Options !== undefined) && {
84
84
  "${o.id}": {
85
85
  ...(props.${o.propName} !== undefined && { value: props.${o.propName} }),
86
86
  ...(props.${o.propName}Options !== undefined && { options: props.${o.propName}Options }),
87
87
  } as any
88
88
  }),`);
89
- }), x.forEach((o) => {
89
+ }), b.forEach((o) => {
90
90
  if (o.arrayContainer && o.arrayContainer.components.length > 0) {
91
- const i = o.arrayContainer, D = i.components.map((u) => {
92
- const B = W(u.type);
93
- return ` // ${u.name}
94
- "${u.id}": {
95
- ${B}: item.${u.propName},
91
+ const $ = o.arrayContainer, S = $.components.map((v) => {
92
+ const B = W(v.type);
93
+ return ` // ${v.name}
94
+ "${v.id}": {
95
+ ${B}: item.${v.propName},
96
96
  }`;
97
97
  }).join(`,
98
98
  `);
99
- I.push(` // ${i.name}
100
- "${i.id}": props.${i.propName}.map((item) => ({
101
- ${D}
99
+ j.push(` // ${$.name}
100
+ "${$.id}": props.${$.propName}.map((item) => ({
101
+ ${S}
102
102
  })),`);
103
103
  }
104
- const n = m(o.name || "container"), a = `${n[0].toUpperCase()}${n.slice(
104
+ const n = l(o.name || "container"), p = `${n[0].toUpperCase()}${n.slice(
105
105
  1
106
- )}IndexChange`, p = [];
107
- o.id && (p.push(` // ${o.name}`), p.push(` "${o.id}": {`), p.push(
106
+ )}IndexChange`, s = [];
107
+ o.id && (s.push(` // ${o.name}`), s.push(` "${o.id}": {`), s.push(
108
108
  ` currentIndex: props.${n}CurrentIndex,`
109
- ), p.push(` onIndexChange: props.on${a},`), p.push(" }")), p.length > 0 && T.push(p.join(`
109
+ ), s.push(` onIndexChange: props.on${p},`), s.push(" }")), s.length > 0 && T.push(s.join(`
110
110
  `));
111
111
  });
112
112
  const F = T.length > 0 ? `
113
113
  repeatingContainerControls={{
114
114
  ${T.join(`,
115
115
  `)}
116
- }}` : "", E = [], e = [];
117
- (s.length > 0 || $.length > 0 || C.length > 0 || N.length > 0) && (e.push(" const handleAction = (payload: any) => {"), e.push(" const { action } = payload?.bravo || {};"), e.push(""), C.length > 0 && (e.push(" // Handle select input changes"), e.push(
116
+ }}` : "", w = [], e = [];
117
+ (c.length > 0 || g.length > 0 || P.length > 0 || h.length > 0) && (e.push(" const handleAction = (payload: any) => {"), e.push(" const { action } = payload?.bravo || {};"), e.push(""), P.length > 0 && (e.push(" // Handle select input changes"), e.push(
118
118
  ' if (action?.action === "input-change" || action?.action === "select-change") {'
119
- ), e.push(" const nodeId = action?.nodeId;"), e.push(" const value = action?.params?.value;"), e.push(""), C.forEach((o) => {
120
- const n = o.propName, p = `on${n[0].toUpperCase() + n.slice(1)}Change`;
119
+ ), e.push(" const nodeId = action?.nodeId;"), e.push(" const value = action?.params?.value;"), e.push(""), P.forEach((o) => {
120
+ const n = o.propName, s = `on${n[0].toUpperCase() + n.slice(1)}Change`;
121
121
  e.push(` // ${o.name}`), e.push(
122
- ` if (nodeId === "${o.id}" && props.${p}) {`
123
- ), e.push(` props.${p}(value);`), e.push(" return;"), e.push(" }");
124
- }), e.push(" }"), e.push("")), N.length > 0 && (e.push(" // Handle button clicks"), e.push(
122
+ ` if (nodeId === "${o.id}" && props.${s}) {`
123
+ ), e.push(` props.${s}(value);`), e.push(" return;"), e.push(" }");
124
+ }), e.push(" }"), e.push("")), h.length > 0 && (e.push(" // Handle button clicks"), e.push(
125
125
  ' if (action?.action === "remote" || action?.action === "tap" || action?.action === "link") {'
126
- ), e.push(" const nodeId = action?.nodeId;"), e.push(""), N.forEach((o) => {
127
- const n = o.propName, p = `on${n[0].toUpperCase() + n.slice(1)}Click`;
126
+ ), e.push(" const nodeId = action?.nodeId;"), e.push(""), h.forEach((o) => {
127
+ const n = o.propName, s = `on${n[0].toUpperCase() + n.slice(1)}Click`;
128
128
  e.push(` // ${o.name}`), e.push(
129
- ` if (nodeId === "${o.id}" && props.${p}) {`
130
- ), e.push(` props.${p}();`), e.push(" return;"), e.push(" }");
131
- }), e.push(" }"), e.push("")), s.length > 0 && (e.push(
129
+ ` if (nodeId === "${o.id}" && props.${s}) {`
130
+ ), e.push(` props.${s}();`), e.push(" return;"), e.push(" }");
131
+ }), e.push(" }"), e.push("")), c.length > 0 && (e.push(
132
132
  ' if (action?.action === "input-group-change") {'
133
133
  ), e.push(
134
134
  " const { groupName, value } = action.params;"
135
- ), s.forEach((o) => {
136
- const n = m(o.groupName), a = `on${n[0].toUpperCase()}${n.slice(
135
+ ), c.forEach((o) => {
136
+ const n = l(o.groupName), p = `on${n[0].toUpperCase()}${n.slice(
137
137
  1
138
138
  )}Change`;
139
139
  e.push(
140
- ` if (groupName === "${o.groupName}" && props.${a}) {`
141
- ), e.push(` props.${a}(value);`), e.push(" return;"), e.push(" }");
142
- }), e.push(" }"), e.push("")), $.length > 0 && (e.push(' if (action?.action === "submit") {'), e.push(" // Get form inputs from Encore state"), e.push(
143
- ` const formInputs = useEncoreState.getState().formInputs["${S}"] || {};`
144
- ), e.push(" const submitNodeId = action?.nodeId;"), e.push(""), $.forEach((o, n) => {
145
- const a = m(o.formName), p = `on${a[0].toUpperCase()}${a.slice(
140
+ ` if (groupName === "${o.groupName}" && props.${p}) {`
141
+ ), e.push(` props.${p}(value);`), e.push(" return;"), e.push(" }");
142
+ }), e.push(" }"), e.push("")), g.length > 0 && (e.push(' if (action?.action === "submit") {'), e.push(" // Get form inputs from Encore state"), e.push(
143
+ ` const formInputs = useEncoreState.getState().formInputs["${I}"] || {};`
144
+ ), e.push(" const submitNodeId = action?.nodeId;"), e.push(""), g.forEach((o, n) => {
145
+ const p = l(o.formName), s = `on${p[0].toUpperCase()}${p.slice(
146
146
  1
147
147
  )}Submit`;
148
148
  n > 0 && e.push(""), e.push(
149
149
  ` // Form: ${o.formName} (${o.formId})`
150
150
  ), o.submitButtonId ? e.push(
151
- ` if (submitNodeId === "${o.submitButtonId}" && props.${p}) {`
152
- ) : $.length === 1 ? e.push(` if (props.${p}) {`) : e.push(` if (props.${p}) {`), e.push(" // Extract form inputs for this form");
153
- const i = `${a[0].toUpperCase()}${a.slice(
151
+ ` if (submitNodeId === "${o.submitButtonId}" && props.${s}) {`
152
+ ) : g.length === 1 ? e.push(` if (props.${s}) {`) : e.push(` if (props.${s}) {`), e.push(" // Extract form inputs for this form");
153
+ const $ = `${p[0].toUpperCase()}${p.slice(
154
154
  1
155
155
  )}FormData`;
156
156
  e.push(
157
- ` const formData: ${i} = {`
157
+ ` const formData: ${$} = {`
158
158
  );
159
- const D = [];
160
- o.inputs.forEach((u) => {
161
- const B = u.propName;
162
- D.push(
163
- ` ${B}: formInputs["${u.id}"]`
159
+ const S = [];
160
+ o.inputs.forEach((v) => {
161
+ const B = v.propName;
162
+ S.push(
163
+ ` ${B}: formInputs["${v.id}"]`
164
164
  );
165
- }), e.push(D.join(`,
166
- `)), e.push(" };"), e.push(` props.${p}(formData);`), e.push(
165
+ }), e.push(S.join(`,
166
+ `)), e.push(" };"), e.push(` props.${s}(formData);`), e.push(
167
167
  " // Note: Default form submission will still proceed after callback"
168
168
  ), e.push(" }");
169
- }), e.push(" }")), e.push(" };")), s.forEach((o) => {
170
- const n = m(o.groupName);
171
- E.push(
169
+ }), e.push(" }")), e.push(" };")), c.forEach((o) => {
170
+ const n = l(o.groupName);
171
+ w.push(
172
172
  ` ...(props.${n} !== undefined && { ${n}: props.${n} }),`
173
173
  );
174
174
  });
175
- const t = E.length > 0 ? `
175
+ const t = w.length > 0 ? `
176
176
  inputGroups={{
177
- ${E.join(`
177
+ ${w.join(`
178
178
  `)}
179
- }}` : "", l = e.length > 0 ? `
180
- onAction={handleAction}` : "", r = A ? `props: ${g}Props` : "", h = b ? `${b}
179
+ }}` : "", f = e.length > 0 ? `
180
+ onAction={handleAction}` : "", i = z ? `props: ${y}Props` : "", C = D ? `${D}
181
181
 
182
182
  ` : "";
183
183
  return `/**
184
- * ${g}
184
+ * ${y}
185
185
  *
186
186
  * Wrapper component for Encore Studio app.
187
187
  * See README.md for detailed documentation.
188
188
  */
189
189
 
190
- import { EncoreApp${$.length > 0 ? ", useEncoreState" : ""} } from "@bravostudioai/react";
191
- ${j ? 'import productionData from "./data.json";' : ""}
190
+ import { EncoreApp${g.length > 0 ? ", useEncoreState" : ""} } from "@bravostudioai/react";
191
+ ${d ? 'import productionData from "./data.json";' : ""}
192
192
 
193
- ${z ? `${z}
193
+ ${O ? `${O}
194
194
 
195
- ` : ""}${O ? `${O}
195
+ ` : ""}${M ? `${M}
196
196
 
197
- ` : ""}${h}export function ${g}(${r}) {
197
+ ` : ""}${C}export function ${y}(${i}) {
198
198
  ${e.length > 0 ? e.join(`
199
199
  `) : ""}
200
200
  return (
201
201
  <EncoreApp
202
- appId="${M}"
203
- pageId="${S}"
204
- ${j ? `appDefinition={productionData.app}
202
+ appId="${U}"
203
+ pageId="${I}"
204
+ ${d ? `appDefinition={productionData.app}
205
205
  pageDefinition={productionData.page}
206
206
  componentCode={productionData.componentCode}` : ""}
207
207
  data={{
208
- ${I.join(`
208
+ ${j.join(`
209
209
  `)}
210
- }}${F}${t}${l}
210
+ }}${F}${t}${f}
211
211
  />
212
212
  );
213
213
  }
214
214
 
215
- export default ${g};
215
+ export default ${y};
216
216
  `;
217
217
  }
218
- function L(M, S, g, x, c, s, $, C, N, j, w) {
219
- const d = [], y = [], P = [], f = [];
220
- $.forEach((e) => {
221
- d.push(`### \`${e.propName}\` (${e.propType}, optional)
218
+ function L(U, I, y, b, m, c, g, P, h, d, E) {
219
+ const N = [], a = [], r = [], u = [];
220
+ g.forEach((e) => {
221
+ N.push(`### \`${e.propName}\` (${e.propType}, optional)
222
222
 
223
223
  ${e.name} (${e.type}) - Component ID: ${e.id}`);
224
- }), s.forEach((e) => {
224
+ }), c.forEach((e) => {
225
225
  if (e.arrayContainer && e.arrayContainer.components.length > 0) {
226
- const r = e.arrayContainer, h = r.components.map((o) => `- \`${o.propName}\` (${o.propType}): ${o.name} (${o.type}) - Component ID: ${o.id}`).join(`
226
+ const i = e.arrayContainer, C = i.components.map((o) => `- \`${o.propName}\` (${o.propType}): ${o.name} (${o.type}) - Component ID: ${o.id}`).join(`
227
227
  `);
228
- d.push(`### \`${r.propName}\` (${r.propName[0].toUpperCase()}${r.propName.slice(
228
+ N.push(`### \`${i.propName}\` (${i.propName[0].toUpperCase()}${i.propName.slice(
229
229
  1
230
230
  )}Item[])
231
231
 
232
- Array of items for "${r.name}" container (ID: ${r.id})
232
+ Array of items for "${i.name}" container (ID: ${i.id})
233
233
 
234
234
  **Properties:**
235
235
 
236
- ${h}`);
236
+ ${C}`);
237
237
  }
238
- const t = m(e.name || "container"), l = `${t[0].toUpperCase()}${t.slice(
238
+ const t = l(e.name || "container"), f = `${t[0].toUpperCase()}${t.slice(
239
239
  1
240
240
  )}IndexChange`;
241
- y.push(`### \`${t}CurrentIndex\` (number, optional)
241
+ a.push(`### \`${t}CurrentIndex\` (number, optional)
242
242
 
243
243
  Controls the currently visible slide/index for the "${e.name}" container (ID: ${e.id}).
244
244
 
245
245
  When provided, the slider operates in controlled mode - the parent component controls which slide is displayed. When not provided, the slider manages its own state.
246
246
 
247
- ### \`on${l}\` ((index: number) => void, optional)
247
+ ### \`on${f}\` ((index: number) => void, optional)
248
248
 
249
249
  Callback fired when the user navigates to a different slide. Called with the new slide index (0-based).
250
250
 
251
251
  This event fires whenever the slide changes, whether by user interaction, automatic advancement, or programmatic control.`);
252
252
  });
253
- const U = d.length > 0 ? d.join(`
253
+ const k = N.length > 0 ? N.join(`
254
254
 
255
- `) : "This component currently has no data-bound props.", k = y.length > 0 ? `## Control Props
255
+ `) : "This component currently has no data-bound props.", A = a.length > 0 ? `## Control Props
256
256
 
257
257
  These props allow you to imperatively control repeating containers (sliders, lists, etc.) and receive notifications when the current index changes.
258
258
 
259
- ${y.join(`
259
+ ${a.join(`
260
260
 
261
- `)}` : "", v = [];
262
- C.forEach((e) => {
263
- const t = m(e.groupName), l = `on${t[0].toUpperCase()}${t.slice(
261
+ `)}` : "", x = [];
262
+ P.forEach((e) => {
263
+ const t = l(e.groupName), f = `on${t[0].toUpperCase()}${t.slice(
264
264
  1
265
- )}Change`, r = e.elements.map((h) => `- "${h.name}"`).join(`
265
+ )}Change`, i = e.elements.map((C) => `- "${C.name}"`).join(`
266
266
  `);
267
- v.push(`### \`${t}\` (string, optional)
267
+ x.push(`### \`${t}\` (string, optional)
268
268
 
269
269
  Sets which element is active in the "${e.groupName}" input group (type: ${e.groupType}).
270
270
 
271
271
  **Available elements:**
272
- ${r}
272
+ ${i}
273
273
 
274
- ### \`${l}\` ((value: string) => void, optional)
274
+ ### \`${f}\` ((value: string) => void, optional)
275
275
 
276
276
  Callback fired when the user selects a different element in the "${e.groupName}" input group. Called with the name of the selected element.`);
277
277
  });
278
- const A = v.length > 0 ? `## Input Group Props
278
+ const z = x.length > 0 ? `## Input Group Props
279
279
 
280
280
  These props allow you to control input groups (radio button-like behavior) and receive notifications when the selection changes.
281
281
 
282
- ${v.join(`
282
+ ${x.join(`
283
283
 
284
- `)}` : "", b = [];
285
- N.forEach((e) => {
286
- const t = m(e.formName), l = `on${t[0].toUpperCase()}${t.slice(
284
+ `)}` : "", D = [];
285
+ h.forEach((e) => {
286
+ const t = l(e.formName), f = `on${t[0].toUpperCase()}${t.slice(
287
287
  1
288
- )}Submit`, r = `${t[0].toUpperCase()}${t.slice(
288
+ )}Submit`, i = `${t[0].toUpperCase()}${t.slice(
289
289
  1
290
- )}FormData`, h = e.inputs.map((o) => {
291
- const n = o.propName, a = G(o.type, o.name);
292
- return `- \`${n}\` (${a}) - ${o.name}`;
290
+ )}FormData`, C = e.inputs.map((o) => {
291
+ const n = o.propName, p = G(o.type, o.name);
292
+ return `- \`${n}\` (${p}) - ${o.name}`;
293
293
  }).join(`
294
294
  `);
295
- b.push(`### \`${l}\` ((formData: ${r}) => void, optional)
295
+ D.push(`### \`${f}\` ((formData: ${i}) => void, optional)
296
296
 
297
297
  Callback fired when the "${e.formName}" form is submitted. Called with a typed object containing all form input values with human-readable property names.
298
298
 
299
299
  **Form data shape:**
300
300
  \`\`\`typescript
301
- interface ${r} {
301
+ interface ${i} {
302
302
  ${e.inputs.map((o) => {
303
- const n = o.propName, a = G(o.type, o.name);
304
- return ` ${n}: ${a};`;
303
+ const n = o.propName, p = G(o.type, o.name);
304
+ return ` ${n}: ${p};`;
305
305
  }).join(`
306
306
  `)}
307
307
  }
308
308
  \`\`\`
309
309
 
310
310
  **Form inputs:**
311
- ${h}`);
311
+ ${C}`);
312
312
  });
313
- const z = b.length > 0 ? `## Form Submission Props
313
+ const O = D.length > 0 ? `## Form Submission Props
314
314
 
315
315
  These props allow you to handle form submissions and access form input values.
316
316
 
317
- ${b.join(`
317
+ ${D.join(`
318
318
 
319
319
  `)}` : "";
320
- j.forEach((e) => {
321
- const t = e.propName, r = `on${t[0].toUpperCase() + t.slice(1)}Change`, h = `${t}Options`;
322
- P.push(`### \`${t}\` (string, optional)
320
+ d.forEach((e) => {
321
+ const t = e.propName, i = `on${t[0].toUpperCase() + t.slice(1)}Change`, C = `${t}Options`;
322
+ r.push(`### \`${t}\` (string, optional)
323
323
 
324
324
  Controls the selected value of the "${e.name}" dropdown (Component ID: ${e.id}).
325
325
 
326
326
  When provided, the select input operates in controlled mode - the parent component controls the current value.
327
327
 
328
- ### \`${h}\` (Array<string | { value: string; label: string }>, optional)
328
+ ### \`${C}\` (Array<string | { value: string; label: string }>, optional)
329
329
 
330
330
  Sets the available options for the "${e.name}" dropdown. Can be an array of strings (used as both value and label) or an array of objects with \`value\` and \`label\` properties.
331
331
 
332
332
  **Example:**
333
333
  \`\`\`tsx
334
334
  // Simple string array
335
- ${h}={["Option 1", "Option 2", "Option 3"]}
335
+ ${C}={["Option 1", "Option 2", "Option 3"]}
336
336
 
337
337
  // Object array with separate values and labels
338
- ${h}={[
338
+ ${C}={[
339
339
  { value: "opt1", label: "Option 1" },
340
340
  { value: "opt2", label: "Option 2" },
341
341
  ]}
342
342
  \`\`\`
343
343
 
344
- ### \`${r}\` ((value: string) => void, optional)
344
+ ### \`${i}\` ((value: string) => void, optional)
345
345
 
346
346
  Callback fired when the user selects a different option in the "${e.name}" dropdown. Called with the selected value.`);
347
347
  });
348
- const O = P.length > 0 ? `## Select Input Props
348
+ const M = r.length > 0 ? `## Select Input Props
349
349
 
350
350
  These props allow you to control select/dropdown inputs and respond to value changes.
351
351
 
352
- ${P.join(`
352
+ ${r.join(`
353
353
 
354
354
  `)}` : "";
355
- w.forEach((e) => {
356
- const t = e.propName, r = `on${t[0].toUpperCase() + t.slice(1)}Click`;
357
- f.push(`### \`${r}\` (() => void, optional)
355
+ E.forEach((e) => {
356
+ const t = e.propName, i = `on${t[0].toUpperCase() + t.slice(1)}Click`;
357
+ u.push(`### \`${i}\` (() => void, optional)
358
358
 
359
359
  Callback fired when the "${e.name}" button is clicked (Component ID: ${e.id}).
360
360
 
361
361
  Action type: \`${e.actionType}\``);
362
362
  });
363
- const I = f.length > 0 ? `## Action Button Props
363
+ const j = u.length > 0 ? `## Action Button Props
364
364
 
365
365
  These props allow you to respond to button clicks and other user interactions.
366
366
 
367
- ${f.join(`
367
+ ${u.join(`
368
368
 
369
369
  `)}` : "", T = `## Props
370
370
 
371
371
  ### Data Props
372
372
 
373
- ${U}
374
-
375
373
  ${k}
376
374
 
377
375
  ${A}
@@ -380,8 +378,10 @@ ${z}
380
378
 
381
379
  ${O}
382
380
 
383
- ${I}`, F = s.length > 0 && s[0].arrayContainer ? `<${c}
384
- ${s.map(
381
+ ${M}
382
+
383
+ ${j}`, F = c.length > 0 && c[0].arrayContainer ? `<${m}
384
+ ${c.map(
385
385
  (e) => e.arrayContainer ? `${e.arrayContainer.propName}={[
386
386
  {
387
387
  ${e.arrayContainer?.components.map(
@@ -392,19 +392,19 @@ ${I}`, F = s.length > 0 && s[0].arrayContainer ? `<${c}
392
392
  ]}` : ""
393
393
  ).filter(Boolean).join(`
394
394
  `)}
395
- />` : `<${c} />`;
396
- let E = "";
397
- if (s.length > 0 && s[0]) {
398
- const e = s[0], t = m(e.name || "container"), l = `${t[0].toUpperCase()}${t.slice(
395
+ />` : `<${m} />`;
396
+ let w = "";
397
+ if (c.length > 0 && c[0]) {
398
+ const e = c[0], t = l(e.name || "container"), f = `${t[0].toUpperCase()}${t.slice(
399
399
  1
400
400
  )}IndexChange`;
401
- E = `## Controlling Slides
401
+ w = `## Controlling Slides
402
402
 
403
403
  You can imperatively control which slide is displayed and listen for slide changes:
404
404
 
405
405
  \`\`\`tsx
406
406
  import { useState } from "react";
407
- import { ${c} } from "./${c}";
407
+ import { ${m} } from "./${m}";
408
408
 
409
409
  function MyComponent() {
410
410
  const [currentSlide, setCurrentSlide] = useState(0);
@@ -417,24 +417,24 @@ function MyComponent() {
417
417
  <button onClick={() => setCurrentSlide((prev) => prev + 1)}>
418
418
  Next
419
419
  </button>
420
- <${c}
421
- ${s.map(
422
- (r) => r.arrayContainer ? `${r.arrayContainer.propName}={[/* array of items */]}` : ""
420
+ <${m}
421
+ ${c.map(
422
+ (i) => i.arrayContainer ? `${i.arrayContainer.propName}={[/* array of items */]}` : ""
423
423
  ).filter(Boolean).join(`
424
424
  `)}
425
425
  ${t}CurrentIndex={currentSlide}
426
- on${l}={(index) => setCurrentSlide(index)}
426
+ on${f}={(index) => setCurrentSlide(index)}
427
427
  />
428
428
  </>
429
429
  );
430
430
  }
431
431
  \`\`\``;
432
432
  }
433
- return `# ${c}
433
+ return `# ${m}
434
434
 
435
435
  Encore App Wrapper Component
436
436
 
437
- This component wraps the Encore Studio app **"${g}"** (App ID: \`${M}\`) for the page **"${x}"** (Page ID: \`${S}\`).
437
+ This component wraps the Encore Studio app **"${y}"** (App ID: \`${U}\`) for the page **"${b}"** (Page ID: \`${I}\`).
438
438
 
439
439
  The component automatically maps props to data-bound components within the app. Components marked with \`encore:data\` tags are exposed as props, allowing you to dynamically populate content.
440
440
 
@@ -443,12 +443,12 @@ ${T}
443
443
  ## Usage
444
444
 
445
445
  \`\`\`tsx
446
- import { ${c} } from "./${c}";
446
+ import { ${m} } from "./${m}";
447
447
 
448
448
  function MyComponent() {
449
449
  return (
450
- <${c}
451
- ${s.map(
450
+ <${m}
451
+ ${c.map(
452
452
  (e) => e.arrayContainer ? `${e.arrayContainer.propName}={[/* array of items */]}` : ""
453
453
  ).filter(Boolean).join(`
454
454
  `)}
@@ -463,11 +463,49 @@ function MyComponent() {
463
463
  ${F}
464
464
  \`\`\`
465
465
 
466
- ${E}
466
+ ${w}
467
467
  `;
468
468
  }
469
+ function R(U, I, y, b, m, c, g, P) {
470
+ const h = [], d = [], E = l(I);
471
+ b.forEach((a) => {
472
+ h.push(a.propName);
473
+ }), m.forEach((a) => {
474
+ const r = l(a.groupName);
475
+ h.push(r), d.push(`on${r[0].toUpperCase()}${r.slice(1)}Change`);
476
+ }), c.forEach((a) => {
477
+ const r = l(a.formName);
478
+ d.push(
479
+ `on${r[0].toUpperCase()}${r.slice(1)}Submit`
480
+ );
481
+ }), g.forEach((a) => {
482
+ const r = a.propName, u = r[0].toUpperCase() + r.slice(1);
483
+ h.push(r), h.push(`${r}Options`), d.push(`on${u}Change`);
484
+ }), P.forEach((a) => {
485
+ const r = a.propName, u = r[0].toUpperCase() + r.slice(1);
486
+ d.push(`on${u}Click`);
487
+ }), y.forEach((a) => {
488
+ a.arrayContainer && a.arrayContainer.components.length > 0 && h.push(a.arrayContainer.propName);
489
+ const r = l(a.name || "container"), u = `${r[0].toUpperCase()}${r.slice(
490
+ 1
491
+ )}IndexChange`;
492
+ h.push(`${r}CurrentIndex`), d.push(`on${u}`);
493
+ });
494
+ const N = `<${E}
495
+ ${h.map((a) => `${a}={${a}}`).join(`
496
+ `)}
497
+ ${d.map((a) => `${a}={${a}}`).join(`
498
+ `)}
499
+ />`;
500
+ return {
501
+ props: h,
502
+ events: d,
503
+ jsx: N
504
+ };
505
+ }
469
506
  export {
470
507
  K as generateComponentCode,
508
+ R as generateComponentMetadata,
471
509
  L as generateReadme
472
510
  };
473
511
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../src/codegen/generator.ts"],"sourcesContent":["import {\n ComponentInfo,\n SliderInfo,\n InputGroupInfo,\n FormInfo,\n SelectInputInfo,\n ActionButtonInfo,\n} from \"./types\";\nimport {\n getComponentPropType,\n getComponentPropName,\n sanitizePropName,\n} from \"./parser\";\n\nexport interface ComponentMetadata {\n props: string[];\n events: string[];\n jsx: string;\n}\n\nexport function generateComponentCode(\n appId: string,\n pageId: string,\n componentName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[],\n isProduction: boolean = false\n): string {\n // Generate prop types\n const propTypes: string[] = [];\n const controlPropTypes: string[] = [];\n const inputGroupPropTypes: string[] = [];\n const formPropTypes: string[] = [];\n const selectInputPropTypes: string[] = [];\n const actionButtonPropTypes: string[] = [];\n\n // Add standalone component props\n standaloneComponents.forEach((comp) => {\n propTypes.push(` ${comp.propName}?: ${comp.propType};`);\n });\n\n // Add input group props\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n inputGroupPropTypes.push(` ${propName}?: string;`);\n inputGroupPropTypes.push(\n ` on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change?: (value: string) => void;`\n );\n });\n\n // Generate form data interfaces and props\n const formDataInterfaces: string[] = [];\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n\n // Generate interface for form data with human-readable property names\n const formDataProps: string[] = [];\n form.inputs.forEach((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n formDataProps.push(` ${inputPropName}: ${inputType};`);\n });\n\n formDataInterfaces.push(`export interface ${formDataTypeName} {\n${formDataProps.join(\"\\n\")}\n}`);\n\n // Add the callback prop with proper typing\n formPropTypes.push(\n ` on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit?: (formData: ${formDataTypeName}) => void;`\n );\n });\n\n // Add standalone select input props (controlled value + onChange + options)\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n selectInputPropTypes.push(` ${propName}?: string;`);\n selectInputPropTypes.push(\n ` ${propName}Options?: Array<string | { value: string; label: string }>;`\n );\n selectInputPropTypes.push(\n ` on${capitalizedPropName}Change?: (value: string) => void;`\n );\n });\n\n // Add action button props (onClick)\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n actionButtonPropTypes.push(` on${capitalizedPropName}Click?: () => void;`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n const itemTypeName = `${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item`;\n propTypes.push(` ${container.propName}: ${itemTypeName}[];`);\n }\n\n // Add control props for each slider/repeating container\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n controlPropTypes.push(` ${sliderPropName}CurrentIndex?: number;`);\n controlPropTypes.push(\n ` on${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange?: (index: number) => void;`\n );\n });\n\n const allPropTypes = [\n ...propTypes,\n ...controlPropTypes,\n ...inputGroupPropTypes,\n ...formPropTypes,\n ...selectInputPropTypes,\n ...actionButtonPropTypes,\n ];\n const hasProps = allPropTypes.length > 0;\n const propsInterface = hasProps\n ? `export interface ${componentName}Props {\n${allPropTypes.join(\"\\n\")}\n}`\n : \"\";\n\n const itemTypes = sliders\n .filter((s) => s.arrayContainer && s.arrayContainer.components.length > 0)\n .map((slider) => {\n const container = slider.arrayContainer!;\n const itemTypeName = `${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item`;\n const itemProps = container.components\n .map((comp) => {\n return ` ${comp.propName}: ${comp.propType};`;\n })\n .join(\"\\n\");\n return `export interface ${itemTypeName} {\n${itemProps}\n}`;\n })\n .join(\"\\n\\n\");\n\n const formDataTypes = formDataInterfaces.join(\"\\n\\n\");\n\n // Generate data mapping\n const dataMapping: string[] = [];\n const controlMapping: string[] = [];\n\n // Add standalone component mappings\n standaloneComponents.forEach((comp) => {\n const propKey = getComponentPropName(comp.type);\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { ${propKey}: props.${comp.propName} } as any }),`);\n });\n\n // Add select input mappings (for controlled values and options)\n selectInputs.forEach((input) => {\n dataMapping.push(` // ${input.name}\n ...((props.${input.propName} !== undefined || props.${input.propName}Options !== undefined) && { \n \"${input.id}\": { \n ...(props.${input.propName} !== undefined && { value: props.${input.propName} }),\n ...(props.${input.propName}Options !== undefined && { options: props.${input.propName}Options }),\n } as any \n }),`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n const itemMapping = container.components\n .map((comp) => {\n const propKey = getComponentPropName(comp.type);\n return ` // ${comp.name}\n \"${comp.id}\": {\n ${propKey}: item.${comp.propName},\n }`;\n })\n .join(\",\\n\");\n\n dataMapping.push(` // ${container.name}\n \"${container.id}\": props.${container.propName}.map((item) => ({\n${itemMapping}\n })),`);\n }\n\n // Generate control mapping for each slider\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n const controlEntry: string[] = [];\n if (slider.id) {\n controlEntry.push(` // ${slider.name}`);\n controlEntry.push(` \"${slider.id}\": {`);\n controlEntry.push(\n ` currentIndex: props.${sliderPropName}CurrentIndex,`\n );\n controlEntry.push(` onIndexChange: props.on${controlPropName},`);\n controlEntry.push(` }`);\n }\n if (controlEntry.length > 0) {\n controlMapping.push(controlEntry.join(\"\\n\"));\n }\n });\n\n const repeatingContainerControlsCode =\n controlMapping.length > 0\n ? `\\n repeatingContainerControls={{\n${controlMapping.join(\",\\n\")}\n }}`\n : \"\";\n\n // Generate input group mappings\n const inputGroupMapping: string[] = [];\n const inputGroupHandlers: string[] = [];\n\n // Start action handler if we have input groups, forms, select inputs, or action buttons\n if (\n inputGroups.length > 0 ||\n forms.length > 0 ||\n selectInputs.length > 0 ||\n actionButtons.length > 0\n ) {\n inputGroupHandlers.push(` const handleAction = (payload: any) => {`);\n inputGroupHandlers.push(` const { action } = payload?.bravo || {};`);\n inputGroupHandlers.push(``);\n\n // Add select input handling\n if (selectInputs.length > 0) {\n inputGroupHandlers.push(` // Handle select input changes`);\n inputGroupHandlers.push(\n ` if (action?.action === \"input-change\" || action?.action === \"select-change\") {`\n );\n inputGroupHandlers.push(` const nodeId = action?.nodeId;`);\n inputGroupHandlers.push(` const value = action?.params?.value;`);\n inputGroupHandlers.push(``);\n\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName =\n propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Change`;\n inputGroupHandlers.push(` // ${input.name}`);\n inputGroupHandlers.push(\n ` if (nodeId === \"${input.id}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}(value);`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add action button handling\n if (actionButtons.length > 0) {\n inputGroupHandlers.push(` // Handle button clicks`);\n inputGroupHandlers.push(\n ` if (action?.action === \"remote\" || action?.action === \"tap\" || action?.action === \"link\") {`\n );\n inputGroupHandlers.push(` const nodeId = action?.nodeId;`);\n inputGroupHandlers.push(``);\n\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName =\n propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Click`;\n inputGroupHandlers.push(` // ${button.name}`);\n inputGroupHandlers.push(\n ` if (nodeId === \"${button.id}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}();`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add input group handling\n if (inputGroups.length > 0) {\n inputGroupHandlers.push(\n ` if (action?.action === \"input-group-change\") {`\n );\n inputGroupHandlers.push(\n ` const { groupName, value } = action.params;`\n );\n\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n const handlerPropName = `on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change`;\n inputGroupHandlers.push(\n ` if (groupName === \"${group.groupName}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}(value);`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add form submission handling\n if (forms.length > 0) {\n inputGroupHandlers.push(` if (action?.action === \"submit\") {`);\n inputGroupHandlers.push(` // Get form inputs from Encore state`);\n inputGroupHandlers.push(\n ` const formInputs = useEncoreState.getState().formInputs[\"${pageId}\"] || {};`\n );\n inputGroupHandlers.push(` const submitNodeId = action?.nodeId;`);\n inputGroupHandlers.push(``);\n\n forms.forEach((form, index) => {\n const formPropName = sanitizePropName(form.formName);\n const handlerPropName = `on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit`;\n\n if (index > 0) {\n inputGroupHandlers.push(``);\n }\n inputGroupHandlers.push(\n ` // Form: ${form.formName} (${form.formId})`\n );\n // Check if this form's submit button was clicked (if submitButtonId is available)\n if (form.submitButtonId) {\n inputGroupHandlers.push(\n ` if (submitNodeId === \"${form.submitButtonId}\" && props.${handlerPropName}) {`\n );\n } else if (forms.length === 1) {\n // If only one form, don't check submit button ID\n inputGroupHandlers.push(` if (props.${handlerPropName}) {`);\n } else {\n // Multiple forms but no submit button ID - check all\n inputGroupHandlers.push(` if (props.${handlerPropName}) {`);\n }\n inputGroupHandlers.push(` // Extract form inputs for this form`);\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n inputGroupHandlers.push(\n ` const formData: ${formDataTypeName} = {`\n );\n const formDataEntries: string[] = [];\n form.inputs.forEach((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n formDataEntries.push(\n ` ${inputPropName}: formInputs[\"${input.id}\"]`\n );\n });\n inputGroupHandlers.push(formDataEntries.join(\",\\n\"));\n inputGroupHandlers.push(` };`);\n inputGroupHandlers.push(` props.${handlerPropName}(formData);`);\n inputGroupHandlers.push(\n ` // Note: Default form submission will still proceed after callback`\n );\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n }\n\n inputGroupHandlers.push(` };`);\n }\n\n // Generate input groups code\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n inputGroupMapping.push(\n ` ...(props.${propName} !== undefined && { ${propName}: props.${propName} }),`\n );\n });\n\n const inputGroupsCode =\n inputGroupMapping.length > 0\n ? `\\n inputGroups={{\n${inputGroupMapping.join(\"\\n\")}\n }}`\n : \"\";\n\n const onActionCode =\n inputGroupHandlers.length > 0 ? `\\n onAction={handleAction}` : \"\";\n\n const propsParameter = hasProps ? `props: ${componentName}Props` : \"\";\n const propsInterfaceSection = propsInterface ? `${propsInterface}\\n\\n` : \"\";\n\n return `/**\n * ${componentName}\n * \n * Wrapper component for Encore Studio app.\n * See README.md for detailed documentation.\n */\n\nimport { EncoreApp${\n forms.length > 0 ? \", useEncoreState\" : \"\"\n } } from \"@bravostudioai/react\";\n${isProduction ? `import productionData from \"./data.json\";` : \"\"}\n\n${itemTypes ? `${itemTypes}\\n\\n` : \"\"}${\n formDataTypes ? `${formDataTypes}\\n\\n` : \"\"\n }${propsInterfaceSection}export function ${componentName}(${propsParameter}) {\n${inputGroupHandlers.length > 0 ? inputGroupHandlers.join(\"\\n\") : \"\"}\n return (\n <EncoreApp\n appId=\"${appId}\"\n pageId=\"${pageId}\"\n ${\n isProduction\n ? `appDefinition={productionData.app}\n pageDefinition={productionData.page}\n componentCode={productionData.componentCode}`\n : \"\"\n }\n data={{\n${dataMapping.join(\"\\n\")}\n }}${repeatingContainerControlsCode}${inputGroupsCode}${onActionCode}\n />\n );\n}\n\nexport default ${componentName};\n`;\n}\n\nexport function generateReadme(\n appId: string,\n pageId: string,\n appName: string,\n pageName: string,\n componentName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[]\n): string {\n const componentDocs: string[] = [];\n const controlDocs: string[] = [];\n const selectInputDocs: string[] = [];\n const actionButtonDocs: string[] = [];\n\n // Add standalone component documentation\n standaloneComponents.forEach((comp) => {\n componentDocs.push(`### \\`${comp.propName}\\` (${comp.propType}, optional)\n\n${comp.name} (${comp.type}) - Component ID: ${comp.id}`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n\n // Generate component documentation\n const compDocs = container.components\n .map((comp) => {\n return `- \\`${comp.propName}\\` (${comp.propType}): ${comp.name} (${comp.type}) - Component ID: ${comp.id}`;\n })\n .join(\"\\n\");\n\n componentDocs.push(`### \\`${\n container.propName\n }\\` (${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item[])\n\nArray of items for \"${container.name}\" container (ID: ${container.id})\n\n**Properties:**\n\n${compDocs}`);\n }\n\n // Generate control documentation for each slider/repeating container\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n controlDocs.push(`### \\`${sliderPropName}CurrentIndex\\` (number, optional)\n\nControls the currently visible slide/index for the \"${slider.name}\" container (ID: ${slider.id}).\n\nWhen provided, the slider operates in controlled mode - the parent component controls which slide is displayed. When not provided, the slider manages its own state.\n\n### \\`on${controlPropName}\\` ((index: number) => void, optional)\n\nCallback fired when the user navigates to a different slide. Called with the new slide index (0-based).\n\nThis event fires whenever the slide changes, whether by user interaction, automatic advancement, or programmatic control.`);\n });\n\n const dataPropsSection =\n componentDocs.length > 0\n ? componentDocs.join(\"\\n\\n\")\n : \"This component currently has no data-bound props.\";\n\n const controlPropsSection =\n controlDocs.length > 0\n ? `## Control Props\n\nThese props allow you to imperatively control repeating containers (sliders, lists, etc.) and receive notifications when the current index changes.\n\n${controlDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate input group documentation\n const inputGroupDocs: string[] = [];\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n const handlerPropName = `on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change`;\n const elementsList = group.elements\n .map((el) => `- \"${el.name}\"`)\n .join(\"\\n\");\n\n inputGroupDocs.push(`### \\`${propName}\\` (string, optional)\n\nSets which element is active in the \"${group.groupName}\" input group (type: ${group.groupType}).\n\n**Available elements:**\n${elementsList}\n\n### \\`${handlerPropName}\\` ((value: string) => void, optional)\n\nCallback fired when the user selects a different element in the \"${group.groupName}\" input group. Called with the name of the selected element.`);\n });\n\n const inputGroupPropsSection =\n inputGroupDocs.length > 0\n ? `## Input Group Props\n\nThese props allow you to control input groups (radio button-like behavior) and receive notifications when the selection changes.\n\n${inputGroupDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate form documentation\n const formDocs: string[] = [];\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n const handlerPropName = `on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit`;\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n const inputsList = form.inputs\n .map((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n return `- \\`${inputPropName}\\` (${inputType}) - ${input.name}`;\n })\n .join(\"\\n\");\n\n formDocs.push(`### \\`${handlerPropName}\\` ((formData: ${formDataTypeName}) => void, optional)\n\nCallback fired when the \"${\n form.formName\n }\" form is submitted. Called with a typed object containing all form input values with human-readable property names.\n\n**Form data shape:**\n\\`\\`\\`typescript\ninterface ${formDataTypeName} {\n${form.inputs\n .map((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n return ` ${inputPropName}: ${inputType};`;\n })\n .join(\"\\n\")}\n}\n\\`\\`\\`\n\n**Form inputs:**\n${inputsList}`);\n });\n\n const formPropsSection =\n formDocs.length > 0\n ? `## Form Submission Props\n\nThese props allow you to handle form submissions and access form input values.\n\n${formDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate select input documentation\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Change`;\n const optionsPropName = `${propName}Options`;\n\n selectInputDocs.push(`### \\`${propName}\\` (string, optional)\n\nControls the selected value of the \"${input.name}\" dropdown (Component ID: ${input.id}).\n\nWhen provided, the select input operates in controlled mode - the parent component controls the current value.\n\n### \\`${optionsPropName}\\` (Array<string | { value: string; label: string }>, optional)\n\nSets the available options for the \"${input.name}\" dropdown. Can be an array of strings (used as both value and label) or an array of objects with \\`value\\` and \\`label\\` properties.\n\n**Example:**\n\\`\\`\\`tsx\n// Simple string array\n${optionsPropName}={[\"Option 1\", \"Option 2\", \"Option 3\"]}\n\n// Object array with separate values and labels\n${optionsPropName}={[\n { value: \"opt1\", label: \"Option 1\" },\n { value: \"opt2\", label: \"Option 2\" },\n]}\n\\`\\`\\`\n\n### \\`${handlerPropName}\\` ((value: string) => void, optional)\n\nCallback fired when the user selects a different option in the \"${input.name}\" dropdown. Called with the selected value.`);\n });\n\n const selectInputPropsSection =\n selectInputDocs.length > 0\n ? `## Select Input Props\n\nThese props allow you to control select/dropdown inputs and respond to value changes.\n\n${selectInputDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate action button documentation\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Click`;\n\n actionButtonDocs.push(`### \\`${handlerPropName}\\` (() => void, optional)\n\nCallback fired when the \"${button.name}\" button is clicked (Component ID: ${button.id}).\n\nAction type: \\`${button.actionType}\\``);\n });\n\n const actionButtonPropsSection =\n actionButtonDocs.length > 0\n ? `## Action Button Props\n\nThese props allow you to respond to button clicks and other user interactions.\n\n${actionButtonDocs.join(\"\\n\\n\")}`\n : \"\";\n\n const propsSection = `## Props\n\n### Data Props\n\n${dataPropsSection}\n\n${controlPropsSection}\n\n${inputGroupPropsSection}\n\n${formPropsSection}\n\n${selectInputPropsSection}\n\n${actionButtonPropsSection}`;\n\n const usageExample =\n sliders.length > 0 && sliders[0].arrayContainer\n ? `<${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[\n {\n ${s.arrayContainer?.components\n .map(\n (c) =>\n `${c.propName}: \"${\n c.type === \"component:image\"\n ? \"https://example.com/image.jpg\"\n : \"Example value\"\n }\"`\n )\n .join(\",\\n \")}\n }\n ]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n/>`\n : `<${componentName} />`;\n\n // Generate control example\n let controlExample = \"\";\n if (sliders.length > 0 && sliders[0]) {\n const firstSlider = sliders[0];\n const sliderPropName = sanitizePropName(firstSlider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n\n controlExample = `## Controlling Slides\n\nYou can imperatively control which slide is displayed and listen for slide changes:\n\n\\`\\`\\`tsx\nimport { useState } from \"react\";\nimport { ${componentName} } from \"./${componentName}\";\n\nfunction MyComponent() {\n const [currentSlide, setCurrentSlide] = useState(0);\n\n return (\n <>\n <button onClick={() => setCurrentSlide((prev) => Math.max(0, prev - 1))}>\n Previous\n </button>\n <button onClick={() => setCurrentSlide((prev) => prev + 1)}>\n Next\n </button>\n <${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[/* array of items */]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n ${sliderPropName}CurrentIndex={currentSlide}\n on${controlPropName}={(index) => setCurrentSlide(index)}\n />\n </>\n );\n}\n\\`\\`\\``;\n }\n\n return `# ${componentName}\n\nEncore App Wrapper Component\n\nThis component wraps the Encore Studio app **\"${appName}\"** (App ID: \\`${appId}\\`) for the page **\"${pageName}\"** (Page ID: \\`${pageId}\\`).\n\nThe component automatically maps props to data-bound components within the app. Components marked with \\`encore:data\\` tags are exposed as props, allowing you to dynamically populate content.\n\n${propsSection}\n\n## Usage\n\n\\`\\`\\`tsx\nimport { ${componentName} } from \"./${componentName}\";\n\nfunction MyComponent() {\n return (\n <${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[/* array of items */]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n />\n );\n}\n\\`\\`\\`\n\n## Example\n\n\\`\\`\\`tsx\n${usageExample}\n\\`\\`\\`\n\n${controlExample}\n`;\n}\n\nexport function generateComponentMetadata(\n _appName: string,\n pageName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[]\n): ComponentMetadata {\n const props: string[] = [];\n const events: string[] = [];\n const componentName = sanitizePropName(pageName);\n\n // Add standalone component props\n standaloneComponents.forEach((comp) => {\n props.push(comp.propName);\n });\n\n // Add input group props\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n props.push(propName);\n events.push(`on${propName[0].toUpperCase()}${propName.slice(1)}Change`);\n });\n\n // Add form props\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n events.push(\n `on${formPropName[0].toUpperCase()}${formPropName.slice(1)}Submit`\n );\n });\n\n // Add select input props\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n props.push(propName);\n props.push(`${propName}Options`);\n events.push(`on${capitalizedPropName}Change`);\n });\n\n // Add action button events\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n events.push(`on${capitalizedPropName}Click`);\n });\n\n // Add slider props/events\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n props.push(slider.arrayContainer.propName);\n }\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n props.push(`${sliderPropName}CurrentIndex`);\n events.push(`on${controlPropName}`);\n });\n\n // Generate generic JSX usage\n const jsxUsage = `<${componentName}\n ${props.map((p) => `${p}={${p}}`).join(\"\\n \")}\n ${events.map((e) => `${e}={${e}}`).join(\"\\n \")}\n/>`;\n\n return {\n props,\n events,\n jsx: jsxUsage,\n };\n}\n"],"names":["generateComponentCode","appId","pageId","componentName","sliders","standaloneComponents","inputGroups","forms","selectInputs","actionButtons","isProduction","propTypes","controlPropTypes","inputGroupPropTypes","formPropTypes","selectInputPropTypes","actionButtonPropTypes","comp","group","propName","sanitizePropName","formDataInterfaces","form","formPropName","formDataTypeName","formDataProps","input","inputPropName","inputType","getComponentPropType","capitalizedPropName","button","slider","container","itemTypeName","sliderPropName","allPropTypes","hasProps","propsInterface","itemTypes","s","itemProps","formDataTypes","dataMapping","controlMapping","propKey","getComponentPropName","itemMapping","controlPropName","controlEntry","repeatingContainerControlsCode","inputGroupMapping","inputGroupHandlers","handlerPropName","index","formDataEntries","inputGroupsCode","onActionCode","propsParameter","propsInterfaceSection","generateReadme","appName","pageName","componentDocs","controlDocs","selectInputDocs","actionButtonDocs","compDocs","dataPropsSection","controlPropsSection","inputGroupDocs","elementsList","el","inputGroupPropsSection","formDocs","inputsList","formPropsSection","optionsPropName","selectInputPropsSection","actionButtonPropsSection","propsSection","usageExample","c","controlExample","firstSlider"],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../src/codegen/generator.ts"],"sourcesContent":["import {\n ComponentInfo,\n SliderInfo,\n InputGroupInfo,\n FormInfo,\n SelectInputInfo,\n ActionButtonInfo,\n} from \"./types\";\nimport {\n getComponentPropType,\n getComponentPropName,\n sanitizePropName,\n} from \"./parser\";\n\nexport interface ComponentMetadata {\n props: string[];\n events: string[];\n jsx: string;\n}\n\nexport function generateComponentCode(\n appId: string,\n pageId: string,\n componentName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[],\n isProduction: boolean = false\n): string {\n // Generate prop types\n const propTypes: string[] = [];\n const controlPropTypes: string[] = [];\n const inputGroupPropTypes: string[] = [];\n const formPropTypes: string[] = [];\n const selectInputPropTypes: string[] = [];\n const actionButtonPropTypes: string[] = [];\n\n // Add standalone component props\n standaloneComponents.forEach((comp) => {\n propTypes.push(` ${comp.propName}?: ${comp.propType};`);\n });\n\n // Add input group props\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n inputGroupPropTypes.push(` ${propName}?: string;`);\n inputGroupPropTypes.push(\n ` on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change?: (value: string) => void;`\n );\n });\n\n // Generate form data interfaces and props\n const formDataInterfaces: string[] = [];\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n\n // Generate interface for form data with human-readable property names\n const formDataProps: string[] = [];\n form.inputs.forEach((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n formDataProps.push(` ${inputPropName}: ${inputType};`);\n });\n\n formDataInterfaces.push(`export interface ${formDataTypeName} {\n${formDataProps.join(\"\\n\")}\n}`);\n\n // Add the callback prop with proper typing\n formPropTypes.push(\n ` on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit?: (formData: ${formDataTypeName}) => void;`\n );\n });\n\n // Add standalone select input props (controlled value + onChange + options)\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n selectInputPropTypes.push(` ${propName}?: string;`);\n selectInputPropTypes.push(\n ` ${propName}Options?: Array<string | { value: string; label: string }>;`\n );\n selectInputPropTypes.push(\n ` on${capitalizedPropName}Change?: (value: string) => void;`\n );\n });\n\n // Add action button props (onClick)\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n actionButtonPropTypes.push(` on${capitalizedPropName}Click?: () => void;`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n const itemTypeName = `${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item`;\n propTypes.push(` ${container.propName}: ${itemTypeName}[];`);\n }\n\n // Add control props for each slider/repeating container\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n controlPropTypes.push(` ${sliderPropName}CurrentIndex?: number;`);\n controlPropTypes.push(\n ` on${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange?: (index: number) => void;`\n );\n });\n\n const allPropTypes = [\n ...propTypes,\n ...controlPropTypes,\n ...inputGroupPropTypes,\n ...formPropTypes,\n ...selectInputPropTypes,\n ...actionButtonPropTypes,\n ];\n const hasProps = allPropTypes.length > 0;\n const propsInterface = hasProps\n ? `export interface ${componentName}Props {\n${allPropTypes.join(\"\\n\")}\n}`\n : \"\";\n\n const itemTypes = sliders\n .filter((s) => s.arrayContainer && s.arrayContainer.components.length > 0)\n .map((slider) => {\n const container = slider.arrayContainer!;\n const itemTypeName = `${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item`;\n const itemProps = container.components\n .map((comp) => {\n return ` ${comp.propName}: ${comp.propType};`;\n })\n .join(\"\\n\");\n return `export interface ${itemTypeName} {\n${itemProps}\n}`;\n })\n .join(\"\\n\\n\");\n\n const formDataTypes = formDataInterfaces.join(\"\\n\\n\");\n\n // Generate data mapping\n const dataMapping: string[] = [];\n const controlMapping: string[] = [];\n\n // Add standalone component mappings\n standaloneComponents.forEach((comp) => {\n const propKey = getComponentPropName(comp.type);\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { ${propKey}: props.${comp.propName} } as any }),`);\n });\n\n // Add select input mappings (for controlled values and options)\n selectInputs.forEach((input) => {\n dataMapping.push(` // ${input.name}\n ...((props.${input.propName} !== undefined || props.${input.propName}Options !== undefined) && { \n \"${input.id}\": { \n ...(props.${input.propName} !== undefined && { value: props.${input.propName} }),\n ...(props.${input.propName}Options !== undefined && { options: props.${input.propName}Options }),\n } as any \n }),`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n const itemMapping = container.components\n .map((comp) => {\n const propKey = getComponentPropName(comp.type);\n return ` // ${comp.name}\n \"${comp.id}\": {\n ${propKey}: item.${comp.propName},\n }`;\n })\n .join(\",\\n\");\n\n dataMapping.push(` // ${container.name}\n \"${container.id}\": props.${container.propName}.map((item) => ({\n${itemMapping}\n })),`);\n }\n\n // Generate control mapping for each slider\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n const controlEntry: string[] = [];\n if (slider.id) {\n controlEntry.push(` // ${slider.name}`);\n controlEntry.push(` \"${slider.id}\": {`);\n controlEntry.push(\n ` currentIndex: props.${sliderPropName}CurrentIndex,`\n );\n controlEntry.push(` onIndexChange: props.on${controlPropName},`);\n controlEntry.push(` }`);\n }\n if (controlEntry.length > 0) {\n controlMapping.push(controlEntry.join(\"\\n\"));\n }\n });\n\n const repeatingContainerControlsCode =\n controlMapping.length > 0\n ? `\\n repeatingContainerControls={{\n${controlMapping.join(\",\\n\")}\n }}`\n : \"\";\n\n // Generate input group mappings\n const inputGroupMapping: string[] = [];\n const inputGroupHandlers: string[] = [];\n\n // Start action handler if we have input groups, forms, select inputs, or action buttons\n if (\n inputGroups.length > 0 ||\n forms.length > 0 ||\n selectInputs.length > 0 ||\n actionButtons.length > 0\n ) {\n inputGroupHandlers.push(` const handleAction = (payload: any) => {`);\n inputGroupHandlers.push(` const { action } = payload?.bravo || {};`);\n inputGroupHandlers.push(``);\n\n // Add select input handling\n if (selectInputs.length > 0) {\n inputGroupHandlers.push(` // Handle select input changes`);\n inputGroupHandlers.push(\n ` if (action?.action === \"input-change\" || action?.action === \"select-change\") {`\n );\n inputGroupHandlers.push(` const nodeId = action?.nodeId;`);\n inputGroupHandlers.push(` const value = action?.params?.value;`);\n inputGroupHandlers.push(``);\n\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName =\n propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Change`;\n inputGroupHandlers.push(` // ${input.name}`);\n inputGroupHandlers.push(\n ` if (nodeId === \"${input.id}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}(value);`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add action button handling\n if (actionButtons.length > 0) {\n inputGroupHandlers.push(` // Handle button clicks`);\n inputGroupHandlers.push(\n ` if (action?.action === \"remote\" || action?.action === \"tap\" || action?.action === \"link\") {`\n );\n inputGroupHandlers.push(` const nodeId = action?.nodeId;`);\n inputGroupHandlers.push(``);\n\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName =\n propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Click`;\n inputGroupHandlers.push(` // ${button.name}`);\n inputGroupHandlers.push(\n ` if (nodeId === \"${button.id}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}();`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add input group handling\n if (inputGroups.length > 0) {\n inputGroupHandlers.push(\n ` if (action?.action === \"input-group-change\") {`\n );\n inputGroupHandlers.push(\n ` const { groupName, value } = action.params;`\n );\n\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n const handlerPropName = `on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change`;\n inputGroupHandlers.push(\n ` if (groupName === \"${group.groupName}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}(value);`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add form submission handling\n if (forms.length > 0) {\n inputGroupHandlers.push(` if (action?.action === \"submit\") {`);\n inputGroupHandlers.push(` // Get form inputs from Encore state`);\n inputGroupHandlers.push(\n ` const formInputs = useEncoreState.getState().formInputs[\"${pageId}\"] || {};`\n );\n inputGroupHandlers.push(` const submitNodeId = action?.nodeId;`);\n inputGroupHandlers.push(``);\n\n forms.forEach((form, index) => {\n const formPropName = sanitizePropName(form.formName);\n const handlerPropName = `on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit`;\n\n if (index > 0) {\n inputGroupHandlers.push(``);\n }\n inputGroupHandlers.push(\n ` // Form: ${form.formName} (${form.formId})`\n );\n // Check if this form's submit button was clicked (if submitButtonId is available)\n if (form.submitButtonId) {\n inputGroupHandlers.push(\n ` if (submitNodeId === \"${form.submitButtonId}\" && props.${handlerPropName}) {`\n );\n } else if (forms.length === 1) {\n // If only one form, don't check submit button ID\n inputGroupHandlers.push(` if (props.${handlerPropName}) {`);\n } else {\n // Multiple forms but no submit button ID - check all\n inputGroupHandlers.push(` if (props.${handlerPropName}) {`);\n }\n inputGroupHandlers.push(` // Extract form inputs for this form`);\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n inputGroupHandlers.push(\n ` const formData: ${formDataTypeName} = {`\n );\n const formDataEntries: string[] = [];\n form.inputs.forEach((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n formDataEntries.push(\n ` ${inputPropName}: formInputs[\"${input.id}\"]`\n );\n });\n inputGroupHandlers.push(formDataEntries.join(\",\\n\"));\n inputGroupHandlers.push(` };`);\n inputGroupHandlers.push(` props.${handlerPropName}(formData);`);\n inputGroupHandlers.push(\n ` // Note: Default form submission will still proceed after callback`\n );\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n }\n\n inputGroupHandlers.push(` };`);\n }\n\n // Generate input groups code\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n inputGroupMapping.push(\n ` ...(props.${propName} !== undefined && { ${propName}: props.${propName} }),`\n );\n });\n\n const inputGroupsCode =\n inputGroupMapping.length > 0\n ? `\\n inputGroups={{\n${inputGroupMapping.join(\"\\n\")}\n }}`\n : \"\";\n\n const onActionCode =\n inputGroupHandlers.length > 0 ? `\\n onAction={handleAction}` : \"\";\n\n const propsParameter = hasProps ? `props: ${componentName}Props` : \"\";\n const propsInterfaceSection = propsInterface ? `${propsInterface}\\n\\n` : \"\";\n\n return `/**\n * ${componentName}\n * \n * Wrapper component for Encore Studio app.\n * See README.md for detailed documentation.\n */\n\nimport { EncoreApp${\n forms.length > 0 ? \", useEncoreState\" : \"\"\n } } from \"@bravostudioai/react\";\n${isProduction ? `import productionData from \"./data.json\";` : \"\"}\n\n${itemTypes ? `${itemTypes}\\n\\n` : \"\"}${\n formDataTypes ? `${formDataTypes}\\n\\n` : \"\"\n }${propsInterfaceSection}export function ${componentName}(${propsParameter}) {\n${inputGroupHandlers.length > 0 ? inputGroupHandlers.join(\"\\n\") : \"\"}\n return (\n <EncoreApp\n appId=\"${appId}\"\n pageId=\"${pageId}\"\n ${\n isProduction\n ? `appDefinition={productionData.app}\n pageDefinition={productionData.page}\n componentCode={productionData.componentCode}`\n : \"\"\n }\n data={{\n${dataMapping.join(\"\\n\")}\n }}${repeatingContainerControlsCode}${inputGroupsCode}${onActionCode}\n />\n );\n}\n\nexport default ${componentName};\n`;\n}\n\nexport function generateReadme(\n appId: string,\n pageId: string,\n appName: string,\n pageName: string,\n componentName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[]\n): string {\n const componentDocs: string[] = [];\n const controlDocs: string[] = [];\n const selectInputDocs: string[] = [];\n const actionButtonDocs: string[] = [];\n\n // Add standalone component documentation\n standaloneComponents.forEach((comp) => {\n componentDocs.push(`### \\`${comp.propName}\\` (${comp.propType}, optional)\n\n${comp.name} (${comp.type}) - Component ID: ${comp.id}`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n\n // Generate component documentation\n const compDocs = container.components\n .map((comp) => {\n return `- \\`${comp.propName}\\` (${comp.propType}): ${comp.name} (${comp.type}) - Component ID: ${comp.id}`;\n })\n .join(\"\\n\");\n\n componentDocs.push(`### \\`${\n container.propName\n }\\` (${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item[])\n\nArray of items for \"${container.name}\" container (ID: ${container.id})\n\n**Properties:**\n\n${compDocs}`);\n }\n\n // Generate control documentation for each slider/repeating container\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n controlDocs.push(`### \\`${sliderPropName}CurrentIndex\\` (number, optional)\n\nControls the currently visible slide/index for the \"${slider.name}\" container (ID: ${slider.id}).\n\nWhen provided, the slider operates in controlled mode - the parent component controls which slide is displayed. When not provided, the slider manages its own state.\n\n### \\`on${controlPropName}\\` ((index: number) => void, optional)\n\nCallback fired when the user navigates to a different slide. Called with the new slide index (0-based).\n\nThis event fires whenever the slide changes, whether by user interaction, automatic advancement, or programmatic control.`);\n });\n\n const dataPropsSection =\n componentDocs.length > 0\n ? componentDocs.join(\"\\n\\n\")\n : \"This component currently has no data-bound props.\";\n\n const controlPropsSection =\n controlDocs.length > 0\n ? `## Control Props\n\nThese props allow you to imperatively control repeating containers (sliders, lists, etc.) and receive notifications when the current index changes.\n\n${controlDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate input group documentation\n const inputGroupDocs: string[] = [];\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n const handlerPropName = `on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change`;\n const elementsList = group.elements\n .map((el) => `- \"${el.name}\"`)\n .join(\"\\n\");\n\n inputGroupDocs.push(`### \\`${propName}\\` (string, optional)\n\nSets which element is active in the \"${group.groupName}\" input group (type: ${group.groupType}).\n\n**Available elements:**\n${elementsList}\n\n### \\`${handlerPropName}\\` ((value: string) => void, optional)\n\nCallback fired when the user selects a different element in the \"${group.groupName}\" input group. Called with the name of the selected element.`);\n });\n\n const inputGroupPropsSection =\n inputGroupDocs.length > 0\n ? `## Input Group Props\n\nThese props allow you to control input groups (radio button-like behavior) and receive notifications when the selection changes.\n\n${inputGroupDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate form documentation\n const formDocs: string[] = [];\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n const handlerPropName = `on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit`;\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n const inputsList = form.inputs\n .map((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n return `- \\`${inputPropName}\\` (${inputType}) - ${input.name}`;\n })\n .join(\"\\n\");\n\n formDocs.push(`### \\`${handlerPropName}\\` ((formData: ${formDataTypeName}) => void, optional)\n\nCallback fired when the \"${\n form.formName\n }\" form is submitted. Called with a typed object containing all form input values with human-readable property names.\n\n**Form data shape:**\n\\`\\`\\`typescript\ninterface ${formDataTypeName} {\n${form.inputs\n .map((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n return ` ${inputPropName}: ${inputType};`;\n })\n .join(\"\\n\")}\n}\n\\`\\`\\`\n\n**Form inputs:**\n${inputsList}`);\n });\n\n const formPropsSection =\n formDocs.length > 0\n ? `## Form Submission Props\n\nThese props allow you to handle form submissions and access form input values.\n\n${formDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate select input documentation\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Change`;\n const optionsPropName = `${propName}Options`;\n\n selectInputDocs.push(`### \\`${propName}\\` (string, optional)\n\nControls the selected value of the \"${input.name}\" dropdown (Component ID: ${input.id}).\n\nWhen provided, the select input operates in controlled mode - the parent component controls the current value.\n\n### \\`${optionsPropName}\\` (Array<string | { value: string; label: string }>, optional)\n\nSets the available options for the \"${input.name}\" dropdown. Can be an array of strings (used as both value and label) or an array of objects with \\`value\\` and \\`label\\` properties.\n\n**Example:**\n\\`\\`\\`tsx\n// Simple string array\n${optionsPropName}={[\"Option 1\", \"Option 2\", \"Option 3\"]}\n\n// Object array with separate values and labels\n${optionsPropName}={[\n { value: \"opt1\", label: \"Option 1\" },\n { value: \"opt2\", label: \"Option 2\" },\n]}\n\\`\\`\\`\n\n### \\`${handlerPropName}\\` ((value: string) => void, optional)\n\nCallback fired when the user selects a different option in the \"${input.name}\" dropdown. Called with the selected value.`);\n });\n\n const selectInputPropsSection =\n selectInputDocs.length > 0\n ? `## Select Input Props\n\nThese props allow you to control select/dropdown inputs and respond to value changes.\n\n${selectInputDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate action button documentation\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Click`;\n\n actionButtonDocs.push(`### \\`${handlerPropName}\\` (() => void, optional)\n\nCallback fired when the \"${button.name}\" button is clicked (Component ID: ${button.id}).\n\nAction type: \\`${button.actionType}\\``);\n });\n\n const actionButtonPropsSection =\n actionButtonDocs.length > 0\n ? `## Action Button Props\n\nThese props allow you to respond to button clicks and other user interactions.\n\n${actionButtonDocs.join(\"\\n\\n\")}`\n : \"\";\n\n const propsSection = `## Props\n\n### Data Props\n\n${dataPropsSection}\n\n${controlPropsSection}\n\n${inputGroupPropsSection}\n\n${formPropsSection}\n\n${selectInputPropsSection}\n\n${actionButtonPropsSection}`;\n\n const usageExample =\n sliders.length > 0 && sliders[0].arrayContainer\n ? `<${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[\n {\n ${s.arrayContainer?.components\n .map(\n (c) =>\n `${c.propName}: \"${\n c.type === \"component:image\"\n ? \"https://example.com/image.jpg\"\n : \"Example value\"\n }\"`\n )\n .join(\",\\n \")}\n }\n ]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n/>`\n : `<${componentName} />`;\n\n // Generate control example\n let controlExample = \"\";\n if (sliders.length > 0 && sliders[0]) {\n const firstSlider = sliders[0];\n const sliderPropName = sanitizePropName(firstSlider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n\n controlExample = `## Controlling Slides\n\nYou can imperatively control which slide is displayed and listen for slide changes:\n\n\\`\\`\\`tsx\nimport { useState } from \"react\";\nimport { ${componentName} } from \"./${componentName}\";\n\nfunction MyComponent() {\n const [currentSlide, setCurrentSlide] = useState(0);\n\n return (\n <>\n <button onClick={() => setCurrentSlide((prev) => Math.max(0, prev - 1))}>\n Previous\n </button>\n <button onClick={() => setCurrentSlide((prev) => prev + 1)}>\n Next\n </button>\n <${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[/* array of items */]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n ${sliderPropName}CurrentIndex={currentSlide}\n on${controlPropName}={(index) => setCurrentSlide(index)}\n />\n </>\n );\n}\n\\`\\`\\``;\n }\n\n return `# ${componentName}\n\nEncore App Wrapper Component\n\nThis component wraps the Encore Studio app **\"${appName}\"** (App ID: \\`${appId}\\`) for the page **\"${pageName}\"** (Page ID: \\`${pageId}\\`).\n\nThe component automatically maps props to data-bound components within the app. Components marked with \\`encore:data\\` tags are exposed as props, allowing you to dynamically populate content.\n\n${propsSection}\n\n## Usage\n\n\\`\\`\\`tsx\nimport { ${componentName} } from \"./${componentName}\";\n\nfunction MyComponent() {\n return (\n <${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[/* array of items */]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n />\n );\n}\n\\`\\`\\`\n\n## Example\n\n\\`\\`\\`tsx\n${usageExample}\n\\`\\`\\`\n\n${controlExample}\n`;\n}\n\nexport function generateComponentMetadata(\n _appName: string,\n pageName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[]\n): ComponentMetadata {\n const props: string[] = [];\n const events: string[] = [];\n const componentName = sanitizePropName(pageName);\n\n // Add standalone component props\n standaloneComponents.forEach((comp) => {\n props.push(comp.propName);\n });\n\n // Add input group props\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n props.push(propName);\n events.push(`on${propName[0].toUpperCase()}${propName.slice(1)}Change`);\n });\n\n // Add form props\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n events.push(\n `on${formPropName[0].toUpperCase()}${formPropName.slice(1)}Submit`\n );\n });\n\n // Add select input props\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n props.push(propName);\n props.push(`${propName}Options`);\n events.push(`on${capitalizedPropName}Change`);\n });\n\n // Add action button events\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n events.push(`on${capitalizedPropName}Click`);\n });\n\n // Add slider props/events\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n props.push(slider.arrayContainer.propName);\n }\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n props.push(`${sliderPropName}CurrentIndex`);\n events.push(`on${controlPropName}`);\n });\n\n // Generate generic JSX usage\n const jsxUsage = `<${componentName}\n ${props.map((p) => `${p}={${p}}`).join(\"\\n \")}\n ${events.map((e) => `${e}={${e}}`).join(\"\\n \")}\n/>`;\n\n return {\n props,\n events,\n jsx: jsxUsage,\n };\n}\n"],"names":["generateComponentCode","appId","pageId","componentName","sliders","standaloneComponents","inputGroups","forms","selectInputs","actionButtons","isProduction","propTypes","controlPropTypes","inputGroupPropTypes","formPropTypes","selectInputPropTypes","actionButtonPropTypes","comp","group","propName","sanitizePropName","formDataInterfaces","form","formPropName","formDataTypeName","formDataProps","input","inputPropName","inputType","getComponentPropType","capitalizedPropName","button","slider","container","itemTypeName","sliderPropName","allPropTypes","hasProps","propsInterface","itemTypes","s","itemProps","formDataTypes","dataMapping","controlMapping","propKey","getComponentPropName","itemMapping","controlPropName","controlEntry","repeatingContainerControlsCode","inputGroupMapping","inputGroupHandlers","handlerPropName","index","formDataEntries","inputGroupsCode","onActionCode","propsParameter","propsInterfaceSection","generateReadme","appName","pageName","componentDocs","controlDocs","selectInputDocs","actionButtonDocs","compDocs","dataPropsSection","controlPropsSection","inputGroupDocs","elementsList","el","inputGroupPropsSection","formDocs","inputsList","formPropsSection","optionsPropName","selectInputPropsSection","actionButtonPropsSection","propsSection","usageExample","c","controlExample","firstSlider","generateComponentMetadata","_appName","props","events","jsxUsage","p","e"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,16 +1,34 @@
1
- import { default as r } from "./components/EncoreApp.js";
2
- import { default as t } from "./components/EncoreErrorBoundary.js";
3
- import { default as f } from "./components/EncoreLoadingFallback.js";
4
- import { default as l } from "./contexts/EncoreAppContext.js";
5
- import { default as c } from "./contexts/EncoreBindingContext.js";
6
- import { default as u } from "./stores/useEncoreState.js";
1
+ import { default as n } from "./components/EncoreApp.js";
2
+ import { default as a } from "./components/EncoreErrorBoundary.js";
3
+ import { default as d } from "./components/EncoreLoadingFallback.js";
4
+ import { default as p } from "./contexts/EncoreAppContext.js";
5
+ import { default as m } from "./contexts/EncoreBindingContext.js";
6
+ import { default as l } from "./stores/useEncoreState.js";
7
+ import { arraysEqual as g, findActionButtons as c, findForms as x, findInputGroups as E, findMinimalDistinguishingPath as C, findSlidersAndDataBindings as P, findStandaloneComponents as S, findStandaloneSelectInputs as y, generateQualifiedPropName as A, getComponentPropName as B, getComponentPropType as F, qualifyFormInputs as I, sanitizePropName as L } from "./codegen/parser.js";
8
+ import { generateComponentCode as b, generateComponentMetadata as h, generateReadme as q } from "./codegen/generator.js";
7
9
  console.log("Encore Lib Loaded");
8
10
  export {
9
- r as EncoreApp,
10
- l as EncoreAppContext,
11
- c as EncoreBindingContext,
12
- t as EncoreErrorBoundary,
13
- f as EncoreLoadingFallback,
14
- u as useEncoreState
11
+ n as EncoreApp,
12
+ p as EncoreAppContext,
13
+ m as EncoreBindingContext,
14
+ a as EncoreErrorBoundary,
15
+ d as EncoreLoadingFallback,
16
+ g as arraysEqual,
17
+ c as findActionButtons,
18
+ x as findForms,
19
+ E as findInputGroups,
20
+ C as findMinimalDistinguishingPath,
21
+ P as findSlidersAndDataBindings,
22
+ S as findStandaloneComponents,
23
+ y as findStandaloneSelectInputs,
24
+ b as generateComponentCode,
25
+ h as generateComponentMetadata,
26
+ A as generateQualifiedPropName,
27
+ q as generateReadme,
28
+ B as getComponentPropName,
29
+ F as getComponentPropType,
30
+ I as qualifyFormInputs,
31
+ L as sanitizePropName,
32
+ l as useEncoreState
15
33
  };
16
34
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["console.log('Encore Lib Loaded');\nimport EncoreApp from \"./components/EncoreApp\";\nimport EncoreErrorBoundary from \"./components/EncoreErrorBoundary\";\nimport EncoreLoadingFallback from \"./components/EncoreLoadingFallback\";\nimport EncoreAppContext from \"./contexts/EncoreAppContext\";\nimport EncoreBindingContext from \"./contexts/EncoreBindingContext\";\nimport useEncoreState from \"./stores/useEncoreState\";\n\nexport {\n EncoreApp,\n EncoreErrorBoundary,\n EncoreLoadingFallback,\n EncoreAppContext,\n EncoreBindingContext,\n useEncoreState,\n};\n"],"names":[],"mappings":";;;;;;AAAA,QAAQ,IAAI,mBAAmB;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["console.log(\"Encore Lib Loaded\");\nimport EncoreApp from \"./components/EncoreApp\";\nimport EncoreErrorBoundary from \"./components/EncoreErrorBoundary\";\nimport EncoreLoadingFallback from \"./components/EncoreLoadingFallback\";\nimport EncoreAppContext from \"./contexts/EncoreAppContext\";\nimport EncoreBindingContext from \"./contexts/EncoreBindingContext\";\nimport useEncoreState from \"./stores/useEncoreState\";\n\nexport {\n EncoreApp,\n EncoreErrorBoundary,\n EncoreLoadingFallback,\n EncoreAppContext,\n EncoreBindingContext,\n useEncoreState,\n};\n\nexport * from \"./codegen\";\n"],"names":[],"mappings":";;;;;;;;AAAA,QAAQ,IAAI,mBAAmB;"}
@@ -5,4 +5,5 @@ import EncoreAppContext from "./contexts/EncoreAppContext";
5
5
  import EncoreBindingContext from "./contexts/EncoreBindingContext";
6
6
  import useEncoreState from "./stores/useEncoreState";
7
7
  export { EncoreApp, EncoreErrorBoundary, EncoreLoadingFallback, EncoreAppContext, EncoreBindingContext, useEncoreState, };
8
+ export * from "./codegen";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,mBAAmB,MAAM,kCAAkC,CAAC;AACnE,OAAO,qBAAqB,MAAM,oCAAoC,CAAC;AACvE,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAC3D,OAAO,oBAAoB,MAAM,iCAAiC,CAAC;AACnE,OAAO,cAAc,MAAM,yBAAyB,CAAC;AAErD,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,mBAAmB,MAAM,kCAAkC,CAAC;AACnE,OAAO,qBAAqB,MAAM,oCAAoC,CAAC;AACvE,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAC3D,OAAO,oBAAoB,MAAM,iCAAiC,CAAC;AACnE,OAAO,cAAc,MAAM,yBAAyB,CAAC;AAErD,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,CAAC;AAEF,cAAc,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useEncoreState.d.ts","sourceRoot":"","sources":["../../../src/stores/useEncoreState.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE3E,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;IAClE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,QAAA,MAAM,cAAc,0EAsFjB,CAAC;AAEJ,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"useEncoreState.d.ts","sourceRoot":"","sources":["../../../src/stores/useEncoreState.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE3E,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;IAClE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,QAAA,MAAM,cAAc,0EA0FjB,CAAC;AAEJ,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useEncoreState.js","sources":["../../src/stores/useEncoreState.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { CONST_APPS_SERVICE_URL } from \"../../constants\";\n\ntype EncoreState = {\n app: any;\n baseURL: string;\n accessToken?: {\n expireAt: number;\n token: string;\n refreshToken: string;\n params: string;\n };\n appId?: string;\n formInputs: Record<string, Record<string, any>>;\n pageId?: string;\n statefulSetVariants: Record<string, string>;\n inputGroups: Record<string, string>; // Maps group name to active element name\n assetsById: Record<string, any>;\n fontsById: Record<string, string>;\n fontsByIdFull: Record<string, { family: string; postScriptName?: string }>;\n\n resetFormInputs: () => void;\n setAccessToken: (accessToken: EncoreState[\"accessToken\"]) => void;\n setApp: (app: any) => void;\n setAppId: (appId: string) => void;\n setFormInputValue: (nodeId: string, value: any) => void;\n setPageId: (pageId: string) => void;\n setStatefulSetVariant: (statefulSetId: string, variant: string) => void;\n setInputGroupValue: (groupName: string, elementName: string) => void;\n setBaseURL: (baseURL: string) => void;\n};\n\nconst useEncoreState = create<EncoreState>((set) => ({\n app: undefined,\n baseURL:\n import.meta.env.VITE_APPS_SERVICE_URL || CONST_APPS_SERVICE_URL || \n \"https://apps-service-dev.bravostudio.app\",\n accessToken: undefined,\n appId: undefined,\n formInputs: {},\n pageId: undefined,\n statefulSetVariants: {},\n inputGroups: {},\n assetsById: {},\n fontsById: {},\n fontsByIdFull: {},\n\n resetFormInputs: () => set((state) => ({ ...state, formInputs: {} })),\n\n setAccessToken: (accessToken) => set((state) => ({ ...state, accessToken })),\n\n setApp: (app: any) =>\n set((state) => ({\n ...state,\n app,\n assetsById:\n app.app?.assets?.reduce?.(\n (acc: Record<string, any>, asset: any) => ({\n ...acc,\n [asset.id]: asset,\n }),\n {}\n ) ?? {},\n fontsById:\n app.app?.fonts?.reduce?.(\n (acc: Record<string, string>, font: any) => ({\n ...acc,\n [font.id]: font.fontName?.family || \"sans-serif\",\n }),\n {}\n ) ?? {},\n fontsByIdFull:\n app.app?.fonts?.reduce?.(\n (\n acc: Record<string, { family: string; postScriptName?: string }>,\n font: any\n ) => ({\n ...acc,\n [font.id]: {\n family: font.fontName?.family || \"sans-serif\",\n postScriptName: font.fontName?.postScriptName,\n },\n }),\n {}\n ) ?? {},\n })),\n\n setAppId: (appId) => set((state) => ({ ...state, appId })),\n\n setFormInputValue: (nodeId, value) =>\n set((state) => {\n const oldPageInputs = state.formInputs[state.pageId!] || {};\n const newPageInputs = { ...oldPageInputs, [nodeId]: value };\n const newInputs = { ...state.formInputs, [state.pageId!]: newPageInputs };\n return { ...state, formInputs: newInputs };\n }),\n\n setPageId: (pageId) => set((state) => ({ ...state, pageId })),\n\n setStatefulSetVariant: (statefulSetId, variant) =>\n set((state) => ({\n ...state,\n statefulSetVariants: {\n ...state.statefulSetVariants,\n [statefulSetId]: variant,\n },\n })),\n\n setInputGroupValue: (groupName, elementName) =>\n set((state) => ({\n ...state,\n inputGroups: {\n ...state.inputGroups,\n [groupName]: elementName,\n },\n })),\n\n setBaseURL: (baseURL) => set((state) => ({ ...state, baseURL })),\n}));\n\nexport default useEncoreState;\n"],"names":["useEncoreState","create","set","CONST_APPS_SERVICE_URL","state","accessToken","app","acc","asset","font","appId","nodeId","value","newPageInputs","newInputs","pageId","statefulSetId","variant","groupName","elementName","baseURL"],"mappings":";;AAgCA,MAAMA,IAAiBC,EAAoB,CAACC,OAAS;AAAA,EACnD,KAAK;AAAA,EACL,SAC2CC;AAAA,EAE3C,aAAa;AAAA,EACb,OAAO;AAAA,EACP,YAAY,CAAA;AAAA,EACZ,QAAQ;AAAA,EACR,qBAAqB,CAAA;AAAA,EACrB,aAAa,CAAA;AAAA,EACb,YAAY,CAAA;AAAA,EACZ,WAAW,CAAA;AAAA,EACX,eAAe,CAAA;AAAA,EAEf,iBAAiB,MAAMD,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,YAAY,CAAA,EAAC,EAAI;AAAA,EAEpE,gBAAgB,CAACC,MAAgBH,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,aAAAC,EAAA,EAAc;AAAA,EAE3E,QAAQ,CAACC,MACPJ,EAAI,CAACE,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,KAAAE;AAAA,IACA,YACEA,EAAI,KAAK,QAAQ;AAAA,MACf,CAACC,GAA0BC,OAAgB;AAAA,QACzC,GAAGD;AAAA,QACH,CAACC,EAAM,EAAE,GAAGA;AAAA,MAAA;AAAA,MAEd,CAAA;AAAA,IAAC,KACE,CAAA;AAAA,IACP,WACEF,EAAI,KAAK,OAAO;AAAA,MACd,CAACC,GAA6BE,OAAe;AAAA,QAC3C,GAAGF;AAAA,QACH,CAACE,EAAK,EAAE,GAAGA,EAAK,UAAU,UAAU;AAAA,MAAA;AAAA,MAEtC,CAAA;AAAA,IAAC,KACE,CAAA;AAAA,IACP,eACEH,EAAI,KAAK,OAAO;AAAA,MACd,CACEC,GACAE,OACI;AAAA,QACJ,GAAGF;AAAA,QACH,CAACE,EAAK,EAAE,GAAG;AAAA,UACT,QAAQA,EAAK,UAAU,UAAU;AAAA,UACjC,gBAAgBA,EAAK,UAAU;AAAA,QAAA;AAAA,MACjC;AAAA,MAEF,CAAA;AAAA,IAAC,KACE,CAAA;AAAA,EAAC,EACR;AAAA,EAEJ,UAAU,CAACC,MAAUR,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,OAAAM,EAAA,EAAQ;AAAA,EAEzD,mBAAmB,CAACC,GAAQC,MAC1BV,EAAI,CAACE,MAAU;AAEb,UAAMS,IAAgB,EAAE,GADFT,EAAM,WAAWA,EAAM,MAAO,KAAK,CAAA,GACf,CAACO,CAAM,GAAGC,EAAA,GAC9CE,IAAY,EAAE,GAAGV,EAAM,YAAY,CAACA,EAAM,MAAO,GAAGS,EAAA;AAC1D,WAAO,EAAE,GAAGT,GAAO,YAAYU,EAAA;AAAA,EACjC,CAAC;AAAA,EAEH,WAAW,CAACC,MAAWb,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,QAAAW,EAAA,EAAS;AAAA,EAE5D,uBAAuB,CAACC,GAAeC,MACrCf,EAAI,CAACE,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,qBAAqB;AAAA,MACnB,GAAGA,EAAM;AAAA,MACT,CAACY,CAAa,GAAGC;AAAA,IAAA;AAAA,EACnB,EACA;AAAA,EAEJ,oBAAoB,CAACC,GAAWC,MAC9BjB,EAAI,CAACE,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,aAAa;AAAA,MACX,GAAGA,EAAM;AAAA,MACT,CAACc,CAAS,GAAGC;AAAA,IAAA;AAAA,EACf,EACA;AAAA,EAEJ,YAAY,CAACC,MAAYlB,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,SAAAgB,IAAU;AACjE,EAAE;"}
1
+ {"version":3,"file":"useEncoreState.js","sources":["../../src/stores/useEncoreState.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { CONST_APPS_SERVICE_URL } from \"../../constants\";\n\ntype EncoreState = {\n app: any;\n baseURL: string;\n accessToken?: {\n expireAt: number;\n token: string;\n refreshToken: string;\n params: string;\n };\n appId?: string;\n formInputs: Record<string, Record<string, any>>;\n pageId?: string;\n statefulSetVariants: Record<string, string>;\n inputGroups: Record<string, string>; // Maps group name to active element name\n assetsById: Record<string, any>;\n fontsById: Record<string, string>;\n fontsByIdFull: Record<string, { family: string; postScriptName?: string }>;\n\n resetFormInputs: () => void;\n setAccessToken: (accessToken: EncoreState[\"accessToken\"]) => void;\n setApp: (app: any) => void;\n setAppId: (appId: string) => void;\n setFormInputValue: (nodeId: string, value: any) => void;\n setPageId: (pageId: string) => void;\n setStatefulSetVariant: (statefulSetId: string, variant: string) => void;\n setInputGroupValue: (groupName: string, elementName: string) => void;\n setBaseURL: (baseURL: string) => void;\n};\n\nconst useEncoreState = create<EncoreState>((set) => ({\n app: undefined,\n baseURL:\n (typeof import.meta !== \"undefined\" &&\n import.meta.env &&\n import.meta.env.VITE_APPS_SERVICE_URL) ||\n CONST_APPS_SERVICE_URL ||\n \"https://apps-service-dev.bravostudio.app\",\n\n accessToken: undefined,\n appId: undefined,\n formInputs: {},\n pageId: undefined,\n statefulSetVariants: {},\n inputGroups: {},\n assetsById: {},\n fontsById: {},\n fontsByIdFull: {},\n\n resetFormInputs: () => set((state) => ({ ...state, formInputs: {} })),\n\n setAccessToken: (accessToken) => set((state) => ({ ...state, accessToken })),\n\n setApp: (app: any) =>\n set((state) => ({\n ...state,\n app,\n assetsById:\n app.app?.assets?.reduce?.(\n (acc: Record<string, any>, asset: any) => ({\n ...acc,\n [asset.id]: asset,\n }),\n {}\n ) ?? {},\n fontsById:\n app.app?.fonts?.reduce?.(\n (acc: Record<string, string>, font: any) => ({\n ...acc,\n [font.id]: font.fontName?.family || \"sans-serif\",\n }),\n {}\n ) ?? {},\n fontsByIdFull:\n app.app?.fonts?.reduce?.(\n (\n acc: Record<string, { family: string; postScriptName?: string }>,\n font: any\n ) => ({\n ...acc,\n [font.id]: {\n family: font.fontName?.family || \"sans-serif\",\n postScriptName: font.fontName?.postScriptName,\n },\n }),\n {}\n ) ?? {},\n })),\n\n setAppId: (appId) => set((state) => ({ ...state, appId })),\n\n setFormInputValue: (nodeId, value) =>\n set((state) => {\n const oldPageInputs = state.formInputs[state.pageId!] || {};\n const newPageInputs = { ...oldPageInputs, [nodeId]: value };\n const newInputs = { ...state.formInputs, [state.pageId!]: newPageInputs };\n return { ...state, formInputs: newInputs };\n }),\n\n setPageId: (pageId) => set((state) => ({ ...state, pageId })),\n\n setStatefulSetVariant: (statefulSetId, variant) =>\n set((state) => ({\n ...state,\n statefulSetVariants: {\n ...state.statefulSetVariants,\n [statefulSetId]: variant,\n },\n })),\n\n setInputGroupValue: (groupName, elementName) =>\n set((state) => ({\n ...state,\n inputGroups: {\n ...state.inputGroups,\n [groupName]: elementName,\n },\n })),\n\n setBaseURL: (baseURL) => set((state) => ({ ...state, baseURL })),\n}));\n\nexport default useEncoreState;\n"],"names":["useEncoreState","create","set","CONST_APPS_SERVICE_URL","state","accessToken","app","acc","asset","font","appId","nodeId","value","newPageInputs","newInputs","pageId","statefulSetId","variant","groupName","elementName","baseURL"],"mappings":";;AAgCA,MAAMA,IAAiBC,EAAoB,CAACC,OAAS;AAAA,EACnD,KAAK;AAAA,EACL,SAIEC;AAAA,EAGF,aAAa;AAAA,EACb,OAAO;AAAA,EACP,YAAY,CAAA;AAAA,EACZ,QAAQ;AAAA,EACR,qBAAqB,CAAA;AAAA,EACrB,aAAa,CAAA;AAAA,EACb,YAAY,CAAA;AAAA,EACZ,WAAW,CAAA;AAAA,EACX,eAAe,CAAA;AAAA,EAEf,iBAAiB,MAAMD,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,YAAY,CAAA,EAAC,EAAI;AAAA,EAEpE,gBAAgB,CAACC,MAAgBH,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,aAAAC,EAAA,EAAc;AAAA,EAE3E,QAAQ,CAACC,MACPJ,EAAI,CAACE,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,KAAAE;AAAA,IACA,YACEA,EAAI,KAAK,QAAQ;AAAA,MACf,CAACC,GAA0BC,OAAgB;AAAA,QACzC,GAAGD;AAAA,QACH,CAACC,EAAM,EAAE,GAAGA;AAAA,MAAA;AAAA,MAEd,CAAA;AAAA,IAAC,KACE,CAAA;AAAA,IACP,WACEF,EAAI,KAAK,OAAO;AAAA,MACd,CAACC,GAA6BE,OAAe;AAAA,QAC3C,GAAGF;AAAA,QACH,CAACE,EAAK,EAAE,GAAGA,EAAK,UAAU,UAAU;AAAA,MAAA;AAAA,MAEtC,CAAA;AAAA,IAAC,KACE,CAAA;AAAA,IACP,eACEH,EAAI,KAAK,OAAO;AAAA,MACd,CACEC,GACAE,OACI;AAAA,QACJ,GAAGF;AAAA,QACH,CAACE,EAAK,EAAE,GAAG;AAAA,UACT,QAAQA,EAAK,UAAU,UAAU;AAAA,UACjC,gBAAgBA,EAAK,UAAU;AAAA,QAAA;AAAA,MACjC;AAAA,MAEF,CAAA;AAAA,IAAC,KACE,CAAA;AAAA,EAAC,EACR;AAAA,EAEJ,UAAU,CAACC,MAAUR,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,OAAAM,EAAA,EAAQ;AAAA,EAEzD,mBAAmB,CAACC,GAAQC,MAC1BV,EAAI,CAACE,MAAU;AAEb,UAAMS,IAAgB,EAAE,GADFT,EAAM,WAAWA,EAAM,MAAO,KAAK,CAAA,GACf,CAACO,CAAM,GAAGC,EAAA,GAC9CE,IAAY,EAAE,GAAGV,EAAM,YAAY,CAACA,EAAM,MAAO,GAAGS,EAAA;AAC1D,WAAO,EAAE,GAAGT,GAAO,YAAYU,EAAA;AAAA,EACjC,CAAC;AAAA,EAEH,WAAW,CAACC,MAAWb,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,QAAAW,EAAA,EAAS;AAAA,EAE5D,uBAAuB,CAACC,GAAeC,MACrCf,EAAI,CAACE,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,qBAAqB;AAAA,MACnB,GAAGA,EAAM;AAAA,MACT,CAACY,CAAa,GAAGC;AAAA,IAAA;AAAA,EACnB,EACA;AAAA,EAEJ,oBAAoB,CAACC,GAAWC,MAC9BjB,EAAI,CAACE,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,aAAa;AAAA,MACX,GAAGA,EAAM;AAAA,MACT,CAACc,CAAS,GAAGC;AAAA,IAAA;AAAA,EACf,EACA;AAAA,EAEJ,YAAY,CAACC,MAAYlB,EAAI,CAACE,OAAW,EAAE,GAAGA,GAAO,SAAAgB,IAAU;AACjE,EAAE;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bravostudioai/react",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/src/index.d.ts",
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- console.log('Encore Lib Loaded');
1
+ console.log("Encore Lib Loaded");
2
2
  import EncoreApp from "./components/EncoreApp";
3
3
  import EncoreErrorBoundary from "./components/EncoreErrorBoundary";
4
4
  import EncoreLoadingFallback from "./components/EncoreLoadingFallback";
@@ -14,3 +14,5 @@ export {
14
14
  EncoreBindingContext,
15
15
  useEncoreState,
16
16
  };
17
+
18
+ export * from "./codegen";
@@ -33,8 +33,12 @@ type EncoreState = {
33
33
  const useEncoreState = create<EncoreState>((set) => ({
34
34
  app: undefined,
35
35
  baseURL:
36
- import.meta.env.VITE_APPS_SERVICE_URL || CONST_APPS_SERVICE_URL ||
36
+ (typeof import.meta !== "undefined" &&
37
+ import.meta.env &&
38
+ import.meta.env.VITE_APPS_SERVICE_URL) ||
39
+ CONST_APPS_SERVICE_URL ||
37
40
  "https://apps-service-dev.bravostudio.app",
41
+
38
42
  accessToken: undefined,
39
43
  appId: undefined,
40
44
  formInputs: {},