@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.
- package/dist/codegen/generator.js +225 -187
- package/dist/codegen/generator.js.map +1 -1
- package/dist/index.js +30 -12
- package/dist/index.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/stores/useEncoreState.d.ts.map +1 -1
- package/dist/stores/useEncoreState.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +3 -1
- package/src/stores/useEncoreState.ts +5 -1
|
@@ -1,377 +1,375 @@
|
|
|
1
|
-
import { sanitizePropName as
|
|
2
|
-
function K(
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}),
|
|
7
|
-
const n =
|
|
8
|
-
|
|
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
|
|
15
|
-
|
|
16
|
-
const n =
|
|
14
|
+
const A = [];
|
|
15
|
+
g.forEach((o) => {
|
|
16
|
+
const n = l(o.formName), p = `${n[0].toUpperCase()}${n.slice(
|
|
17
17
|
1
|
|
18
|
-
)}FormData`,
|
|
19
|
-
o.inputs.forEach((
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
}),
|
|
23
|
-
${
|
|
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
|
-
}`),
|
|
25
|
+
}`), r.push(
|
|
26
26
|
` on${n[0].toUpperCase()}${n.slice(
|
|
27
27
|
1
|
|
28
|
-
)}Submit?: (formData: ${
|
|
28
|
+
)}Submit?: (formData: ${p}) => void;`
|
|
29
29
|
);
|
|
30
|
-
}),
|
|
31
|
-
const n = o.propName,
|
|
32
|
-
|
|
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
|
-
),
|
|
35
|
-
` on${
|
|
34
|
+
), u.push(
|
|
35
|
+
` on${p}Change?: (value: string) => void;`
|
|
36
36
|
);
|
|
37
|
-
}),
|
|
38
|
-
const n = o.propName,
|
|
39
|
-
|
|
40
|
-
}),
|
|
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
|
|
42
|
+
const p = o.arrayContainer, s = `${p.propName[0].toUpperCase()}${p.propName.slice(
|
|
43
43
|
1
|
|
44
44
|
)}Item`;
|
|
45
|
-
|
|
45
|
+
E.push(` ${p.propName}: ${s}[];`);
|
|
46
46
|
}
|
|
47
|
-
const n =
|
|
48
|
-
|
|
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
|
|
55
|
-
...
|
|
56
|
-
...
|
|
57
|
-
...
|
|
58
|
-
...
|
|
59
|
-
...
|
|
60
|
-
...
|
|
61
|
-
],
|
|
62
|
-
${
|
|
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
|
-
}` : "",
|
|
65
|
-
const n = o.arrayContainer,
|
|
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`,
|
|
67
|
+
)}Item`, s = n.components.map(($) => ` ${$.propName}: ${$.propType};`).join(`
|
|
68
68
|
`);
|
|
69
|
-
return `export interface ${
|
|
70
|
-
${
|
|
69
|
+
return `export interface ${p} {
|
|
70
|
+
${s}
|
|
71
71
|
}`;
|
|
72
72
|
}).join(`
|
|
73
73
|
|
|
74
|
-
`),
|
|
74
|
+
`), M = A.join(`
|
|
75
75
|
|
|
76
|
-
`),
|
|
77
|
-
|
|
76
|
+
`), j = [], T = [];
|
|
77
|
+
m.forEach((o) => {
|
|
78
78
|
const n = W(o.type);
|
|
79
|
-
|
|
79
|
+
j.push(` // ${o.name}
|
|
80
80
|
...(props.${o.propName} !== undefined && { "${o.id}": { ${n}: props.${o.propName} } as any }),`);
|
|
81
|
-
}),
|
|
82
|
-
|
|
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
|
-
}),
|
|
89
|
+
}), b.forEach((o) => {
|
|
90
90
|
if (o.arrayContainer && o.arrayContainer.components.length > 0) {
|
|
91
|
-
const
|
|
92
|
-
const B = W(
|
|
93
|
-
return ` // ${
|
|
94
|
-
"${
|
|
95
|
-
${B}: item.${
|
|
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
|
-
|
|
100
|
-
"${
|
|
101
|
-
${
|
|
99
|
+
j.push(` // ${$.name}
|
|
100
|
+
"${$.id}": props.${$.propName}.map((item) => ({
|
|
101
|
+
${S}
|
|
102
102
|
})),`);
|
|
103
103
|
}
|
|
104
|
-
const n =
|
|
104
|
+
const n = l(o.name || "container"), p = `${n[0].toUpperCase()}${n.slice(
|
|
105
105
|
1
|
|
106
|
-
)}IndexChange`,
|
|
107
|
-
o.id && (
|
|
106
|
+
)}IndexChange`, s = [];
|
|
107
|
+
o.id && (s.push(` // ${o.name}`), s.push(` "${o.id}": {`), s.push(
|
|
108
108
|
` currentIndex: props.${n}CurrentIndex,`
|
|
109
|
-
),
|
|
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
|
-
}}` : "",
|
|
117
|
-
(
|
|
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(""),
|
|
120
|
-
const n = o.propName,
|
|
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.${
|
|
123
|
-
), e.push(` props.${
|
|
124
|
-
}), e.push(" }"), 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(""),
|
|
127
|
-
const n = o.propName,
|
|
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.${
|
|
130
|
-
), e.push(` props.${
|
|
131
|
-
}), e.push(" }"), 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
|
-
),
|
|
136
|
-
const n =
|
|
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.${
|
|
141
|
-
), e.push(` props.${
|
|
142
|
-
}), e.push(" }"), e.push("")),
|
|
143
|
-
` const formInputs = useEncoreState.getState().formInputs["${
|
|
144
|
-
), e.push(" const submitNodeId = action?.nodeId;"), e.push(""),
|
|
145
|
-
const
|
|
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.${
|
|
152
|
-
) :
|
|
153
|
-
const
|
|
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: ${
|
|
157
|
+
` const formData: ${$} = {`
|
|
158
158
|
);
|
|
159
|
-
const
|
|
160
|
-
o.inputs.forEach((
|
|
161
|
-
const B =
|
|
162
|
-
|
|
163
|
-
` ${B}: formInputs["${
|
|
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(
|
|
166
|
-
`)), e.push(" };"), e.push(` props.${
|
|
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(" };")),
|
|
170
|
-
const n =
|
|
171
|
-
|
|
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 =
|
|
175
|
+
const t = w.length > 0 ? `
|
|
176
176
|
inputGroups={{
|
|
177
|
-
${
|
|
177
|
+
${w.join(`
|
|
178
178
|
`)}
|
|
179
|
-
}}` : "",
|
|
180
|
-
onAction={handleAction}` : "",
|
|
179
|
+
}}` : "", f = e.length > 0 ? `
|
|
180
|
+
onAction={handleAction}` : "", i = z ? `props: ${y}Props` : "", C = D ? `${D}
|
|
181
181
|
|
|
182
182
|
` : "";
|
|
183
183
|
return `/**
|
|
184
|
-
* ${
|
|
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${
|
|
191
|
-
${
|
|
190
|
+
import { EncoreApp${g.length > 0 ? ", useEncoreState" : ""} } from "@bravostudioai/react";
|
|
191
|
+
${d ? 'import productionData from "./data.json";' : ""}
|
|
192
192
|
|
|
193
|
-
${
|
|
193
|
+
${O ? `${O}
|
|
194
194
|
|
|
195
|
-
` : ""}${
|
|
195
|
+
` : ""}${M ? `${M}
|
|
196
196
|
|
|
197
|
-
` : ""}${
|
|
197
|
+
` : ""}${C}export function ${y}(${i}) {
|
|
198
198
|
${e.length > 0 ? e.join(`
|
|
199
199
|
`) : ""}
|
|
200
200
|
return (
|
|
201
201
|
<EncoreApp
|
|
202
|
-
appId="${
|
|
203
|
-
pageId="${
|
|
204
|
-
${
|
|
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
|
-
${
|
|
208
|
+
${j.join(`
|
|
209
209
|
`)}
|
|
210
|
-
}}${F}${t}${
|
|
210
|
+
}}${F}${t}${f}
|
|
211
211
|
/>
|
|
212
212
|
);
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
export default ${
|
|
215
|
+
export default ${y};
|
|
216
216
|
`;
|
|
217
217
|
}
|
|
218
|
-
function L(
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
}),
|
|
224
|
+
}), c.forEach((e) => {
|
|
225
225
|
if (e.arrayContainer && e.arrayContainer.components.length > 0) {
|
|
226
|
-
const
|
|
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
|
-
|
|
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 "${
|
|
232
|
+
Array of items for "${i.name}" container (ID: ${i.id})
|
|
233
233
|
|
|
234
234
|
**Properties:**
|
|
235
235
|
|
|
236
|
-
${
|
|
236
|
+
${C}`);
|
|
237
237
|
}
|
|
238
|
-
const t =
|
|
238
|
+
const t = l(e.name || "container"), f = `${t[0].toUpperCase()}${t.slice(
|
|
239
239
|
1
|
|
240
240
|
)}IndexChange`;
|
|
241
|
-
|
|
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${
|
|
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
|
|
253
|
+
const k = N.length > 0 ? N.join(`
|
|
254
254
|
|
|
255
|
-
`) : "This component currently has no data-bound 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
|
-
${
|
|
259
|
+
${a.join(`
|
|
260
260
|
|
|
261
|
-
`)}` : "",
|
|
262
|
-
|
|
263
|
-
const t =
|
|
261
|
+
`)}` : "", x = [];
|
|
262
|
+
P.forEach((e) => {
|
|
263
|
+
const t = l(e.groupName), f = `on${t[0].toUpperCase()}${t.slice(
|
|
264
264
|
1
|
|
265
|
-
)}Change`,
|
|
265
|
+
)}Change`, i = e.elements.map((C) => `- "${C.name}"`).join(`
|
|
266
266
|
`);
|
|
267
|
-
|
|
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
|
-
${
|
|
272
|
+
${i}
|
|
273
273
|
|
|
274
|
-
### \`${
|
|
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
|
|
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
|
-
${
|
|
282
|
+
${x.join(`
|
|
283
283
|
|
|
284
|
-
`)}` : "",
|
|
285
|
-
|
|
286
|
-
const t =
|
|
284
|
+
`)}` : "", D = [];
|
|
285
|
+
h.forEach((e) => {
|
|
286
|
+
const t = l(e.formName), f = `on${t[0].toUpperCase()}${t.slice(
|
|
287
287
|
1
|
|
288
|
-
)}Submit`,
|
|
288
|
+
)}Submit`, i = `${t[0].toUpperCase()}${t.slice(
|
|
289
289
|
1
|
|
290
|
-
)}FormData`,
|
|
291
|
-
const n = o.propName,
|
|
292
|
-
return `- \`${n}\` (${
|
|
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
|
-
|
|
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 ${
|
|
301
|
+
interface ${i} {
|
|
302
302
|
${e.inputs.map((o) => {
|
|
303
|
-
const n = o.propName,
|
|
304
|
-
return ` ${n}: ${
|
|
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
|
-
${
|
|
311
|
+
${C}`);
|
|
312
312
|
});
|
|
313
|
-
const
|
|
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
|
-
${
|
|
317
|
+
${D.join(`
|
|
318
318
|
|
|
319
319
|
`)}` : "";
|
|
320
|
-
|
|
321
|
-
const t = e.propName,
|
|
322
|
-
|
|
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
|
-
### \`${
|
|
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
|
-
${
|
|
335
|
+
${C}={["Option 1", "Option 2", "Option 3"]}
|
|
336
336
|
|
|
337
337
|
// Object array with separate values and labels
|
|
338
|
-
${
|
|
338
|
+
${C}={[
|
|
339
339
|
{ value: "opt1", label: "Option 1" },
|
|
340
340
|
{ value: "opt2", label: "Option 2" },
|
|
341
341
|
]}
|
|
342
342
|
\`\`\`
|
|
343
343
|
|
|
344
|
-
### \`${
|
|
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
|
|
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
|
-
${
|
|
352
|
+
${r.join(`
|
|
353
353
|
|
|
354
354
|
`)}` : "";
|
|
355
|
-
|
|
356
|
-
const t = e.propName,
|
|
357
|
-
|
|
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
|
|
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
|
-
${
|
|
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
|
-
${
|
|
384
|
-
|
|
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
|
-
/>` : `<${
|
|
396
|
-
let
|
|
397
|
-
if (
|
|
398
|
-
const e =
|
|
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
|
-
|
|
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 { ${
|
|
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
|
-
<${
|
|
421
|
-
${
|
|
422
|
-
(
|
|
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${
|
|
426
|
+
on${f}={(index) => setCurrentSlide(index)}
|
|
427
427
|
/>
|
|
428
428
|
</>
|
|
429
429
|
);
|
|
430
430
|
}
|
|
431
431
|
\`\`\``;
|
|
432
432
|
}
|
|
433
|
-
return `# ${
|
|
433
|
+
return `# ${m}
|
|
434
434
|
|
|
435
435
|
Encore App Wrapper Component
|
|
436
436
|
|
|
437
|
-
This component wraps the Encore Studio app **"${
|
|
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 { ${
|
|
446
|
+
import { ${m} } from "./${m}";
|
|
447
447
|
|
|
448
448
|
function MyComponent() {
|
|
449
449
|
return (
|
|
450
|
-
<${
|
|
451
|
-
${
|
|
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
|
-
${
|
|
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
|
|
2
|
-
import { default as
|
|
3
|
-
import { default as
|
|
4
|
-
import { default as
|
|
5
|
-
import { default as
|
|
6
|
-
import { default as
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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(
|
|
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;"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
console.log(
|
|
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
|
|
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: {},
|