@bravostudioai/react 0.1.36 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { sanitizePropName as u, getComponentPropType as H, getComponentPropName as L } from "./parser.js";
2
- function _(O, w, v, E, $, h, y, b, m, d = "dynamic", I) {
2
+ function _(O, x, v, E, $, h, y, b, m, f = "dynamic", w) {
3
3
  const P = [], p = [], r = [], N = [], D = [], M = [];
4
4
  $.forEach((e) => {
5
5
  P.push(` ${e.propName}?: ${e.propType};`);
@@ -16,9 +16,9 @@ function _(O, w, v, E, $, h, y, b, m, d = "dynamic", I) {
16
16
  const t = u(e.formName), i = `${t[0].toUpperCase()}${t.slice(
17
17
  1
18
18
  )}FormData`, s = [];
19
- e.inputs.forEach((f) => {
20
- const U = f.propName, C = H(f.type, f.name);
21
- s.push(` ${U}: ${C};`);
19
+ e.inputs.forEach((C) => {
20
+ const U = C.propName, d = H(C.type, C.name);
21
+ s.push(` ${U}: ${d};`);
22
22
  }), j.push(`export interface ${i} {
23
23
  ${s.join(`
24
24
  `)}
@@ -64,7 +64,7 @@ ${B.join(`
64
64
  }` : "", G = E.filter((e) => e.arrayContainer && e.arrayContainer.components.length > 0).map((e) => {
65
65
  const t = e.arrayContainer, i = `${t.propName[0].toUpperCase()}${t.propName.slice(
66
66
  1
67
- )}Item`, s = t.components.map((f) => ` ${f.propName}: ${f.propType};`).join(`
67
+ )}Item`, s = t.components.map((C) => ` ${C.propName}: ${C.propType};`).join(`
68
68
  `);
69
69
  return `export interface ${i} {
70
70
  ${s}
@@ -73,15 +73,15 @@ ${s}
73
73
 
74
74
  `), W = j.join(`
75
75
 
76
- `), x = [], k = [], T = [];
76
+ `), I = [], k = [], T = [];
77
77
  $.forEach((e) => {
78
78
  const t = L(e.type);
79
- e.type === "component:webview" ? x.push(` // ${e.name}
79
+ e.type === "component:webview" || e.type === "component:web-view" ? I.push(` // ${e.name}
80
80
  ...(props.${e.propName} !== undefined && { "${e.id}": { params: { url: props.${e.propName} } } as any }),`) : e.type === "component:embed" ? k.push(` // ${e.name}
81
- ...(props.${e.propName} !== undefined && { "${e.id}": props.${e.propName} }),`) : x.push(` // ${e.name}
81
+ ...(props.${e.propName} !== undefined && { "${e.id}": props.${e.propName} }),`) : I.push(` // ${e.name}
82
82
  ...(props.${e.propName} !== undefined && { "${e.id}": { ${t}: props.${e.propName} } as any }),`);
83
83
  }), b.forEach((e) => {
84
- x.push(` // ${e.name}
84
+ I.push(` // ${e.name}
85
85
  ...((props.${e.propName} !== undefined || props.${e.propName}Options !== undefined) && {
86
86
  "${e.id}": {
87
87
  ...(props.${e.propName} !== undefined && { value: props.${e.propName} }),
@@ -90,19 +90,19 @@ ${s}
90
90
  }),`);
91
91
  }), E.forEach((e) => {
92
92
  if (e.arrayContainer && e.arrayContainer.components.length > 0) {
93
- const f = e.arrayContainer, U = f.components.map((C) => {
94
- const R = L(C.type);
95
- return C.type === "component:webview" ? ` // ${C.name}
96
- "${C.id}": {
97
- params: { url: item.${C.propName} },
98
- }` : ` // ${C.name}
99
- "${C.id}": {
100
- ${R}: item.${C.propName},
93
+ const C = e.arrayContainer, U = C.components.map((d) => {
94
+ const R = L(d.type);
95
+ return d.type === "component:webview" || d.type === "component:web-view" ? ` // ${d.name}
96
+ "${d.id}": {
97
+ params: { url: item.${d.propName} },
98
+ }` : ` // ${d.name}
99
+ "${d.id}": {
100
+ ${R}: item.${d.propName},
101
101
  }`;
102
102
  }).join(`,
103
103
  `);
104
- x.push(` // ${f.name}
105
- "${f.id}": props.${f.propName}.map((item) => ({
104
+ I.push(` // ${C.name}
105
+ "${C.id}": props.${C.propName}.map((item) => ({
106
106
  ${U}
107
107
  })),`);
108
108
  }
@@ -145,7 +145,7 @@ ${T.join(`,
145
145
  ` if (groupName === "${e.groupName}" && props.${i}) {`
146
146
  ), o.push(` props.${i}(value);`), o.push(" return;"), o.push(" }");
147
147
  }), o.push(" }"), o.push("")), y.length > 0 && (o.push(' if (action?.action === "submit") {'), o.push(" // Get form inputs from Encore state"), o.push(
148
- ` const formInputs = useEncoreState.getState().formInputs["${w}"] || {};`
148
+ ` const formInputs = useEncoreState.getState().formInputs["${x}"] || {};`
149
149
  ), o.push(" const submitNodeId = action?.nodeId;"), o.push(""), y.forEach((e, t) => {
150
150
  const i = u(e.formName), s = `on${i[0].toUpperCase()}${i.slice(
151
151
  1
@@ -155,17 +155,17 @@ ${T.join(`,
155
155
  ), e.submitButtonId ? o.push(
156
156
  ` if (submitNodeId === "${e.submitButtonId}" && props.${s}) {`
157
157
  ) : y.length === 1 ? o.push(` if (props.${s}) {`) : o.push(` if (props.${s}) {`), o.push(" // Extract form inputs for this form");
158
- const f = `${i[0].toUpperCase()}${i.slice(
158
+ const C = `${i[0].toUpperCase()}${i.slice(
159
159
  1
160
160
  )}FormData`;
161
161
  o.push(
162
- ` const formData: ${f} = {`
162
+ ` const formData: ${C} = {`
163
163
  );
164
164
  const U = [];
165
- e.inputs.forEach((C) => {
166
- const R = C.propName;
165
+ e.inputs.forEach((d) => {
166
+ const R = d.propName;
167
167
  U.push(
168
- ` ${R}: formInputs["${C.id}"]`
168
+ ` ${R}: formInputs["${d.id}"]`
169
169
  );
170
170
  }), o.push(U.join(`,
171
171
  `)), o.push(" };"), o.push(` props.${s}(formData);`), o.push(
@@ -188,7 +188,7 @@ ${k.join(`
188
188
  `)}
189
189
  }}` : "", A = S ? `props: ${v}Props` : "", z = F ? `${F}
190
190
 
191
- ` : "", K = d === "production" || d === "optimistic";
191
+ ` : "", K = f === "production" || f === "optimistic";
192
192
  return `/**
193
193
  * ${v}
194
194
  *
@@ -209,13 +209,13 @@ ${o.length > 0 ? o.join(`
209
209
  return (
210
210
  <EncoreApp
211
211
  appId="${O}"
212
- pageId="${w}"
213
- mode="${d}"
212
+ pageId="${x}"
213
+ mode="${f}"
214
214
  ${K ? `appDefinition={productionData.app}
215
215
  pageDefinition={productionData.page}
216
216
  componentCode={productionData.componentCode}` : ""}
217
217
  data={{
218
- ${x.join(`
218
+ ${I.join(`
219
219
  `)}
220
220
  }}${n}${c}${g}${l}
221
221
  />
@@ -225,13 +225,13 @@ ${x.join(`
225
225
  export default ${v};
226
226
 
227
227
  export const PageMeta = {
228
- width: ${I?.width ?? "undefined"},
229
- height: ${I?.height ?? "undefined"},
230
- aspectRatio: ${I?.aspectRatio ?? "undefined"},
228
+ width: ${w?.width ?? "undefined"},
229
+ height: ${w?.height ?? "undefined"},
230
+ aspectRatio: ${w?.aspectRatio ?? "undefined"},
231
231
  };
232
232
  `;
233
233
  }
234
- function q(O, w, v, E, $, h, y, b, m, d, I) {
234
+ function q(O, x, v, E, $, h, y, b, m, f, w) {
235
235
  const P = [], p = [], r = [], N = [];
236
236
  y.forEach((n) => {
237
237
  P.push(`### \`${n.propName}\` (${n.propType}, optional)
@@ -333,7 +333,7 @@ These props allow you to handle form submissions and access form input values.
333
333
  ${S.join(`
334
334
 
335
335
  `)}` : "";
336
- d.forEach((n) => {
336
+ f.forEach((n) => {
337
337
  const a = n.propName, c = `on${a[0].toUpperCase() + a.slice(1)}Change`, g = `${a}Options`;
338
338
  r.push(`### \`${a}\` (string, optional)
339
339
 
@@ -368,7 +368,7 @@ These props allow you to control select/dropdown inputs and respond to value cha
368
368
  ${r.join(`
369
369
 
370
370
  `)}` : "";
371
- I.forEach((n) => {
371
+ w.forEach((n) => {
372
372
  const a = n.propName, c = `on${a[0].toUpperCase() + a.slice(1)}Click`;
373
373
  N.push(`### \`${c}\` (() => void, optional)
374
374
 
@@ -382,7 +382,7 @@ These props allow you to respond to button clicks and other user interactions.
382
382
 
383
383
  ${N.join(`
384
384
 
385
- `)}` : "", x = `## Props
385
+ `)}` : "", I = `## Props
386
386
 
387
387
  ### Data Props
388
388
 
@@ -450,11 +450,11 @@ function MyComponent() {
450
450
 
451
451
  Encore App Wrapper Component
452
452
 
453
- This component wraps the Encore Studio app **"${v}"** (App ID: \`${O}\`) for the page **"${E}"** (Page ID: \`${w}\`).
453
+ This component wraps the Encore Studio app **"${v}"** (App ID: \`${O}\`) for the page **"${E}"** (Page ID: \`${x}\`).
454
454
 
455
455
  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.
456
456
 
457
- ${x}
457
+ ${I}
458
458
 
459
459
  ## Usage
460
460
 
@@ -482,40 +482,40 @@ ${k}
482
482
  ${T}
483
483
  `;
484
484
  }
485
- function J(O, w, v, E, $, h, y, b) {
486
- const m = [], d = [], I = u(w);
485
+ function J(O, x, v, E, $, h, y, b) {
486
+ const m = [], f = [], w = u(x);
487
487
  E.forEach((p) => {
488
488
  m.push(p.propName);
489
489
  }), $.forEach((p) => {
490
490
  const r = u(p.groupName);
491
- m.push(r), d.push(`on${r[0].toUpperCase()}${r.slice(1)}Change`);
491
+ m.push(r), f.push(`on${r[0].toUpperCase()}${r.slice(1)}Change`);
492
492
  }), h.forEach((p) => {
493
493
  const r = u(p.formName);
494
- d.push(
494
+ f.push(
495
495
  `on${r[0].toUpperCase()}${r.slice(1)}Submit`
496
496
  );
497
497
  }), y.forEach((p) => {
498
498
  const r = p.propName, N = r[0].toUpperCase() + r.slice(1);
499
- m.push(r), m.push(`${r}Options`), d.push(`on${N}Change`);
499
+ m.push(r), m.push(`${r}Options`), f.push(`on${N}Change`);
500
500
  }), b.forEach((p) => {
501
501
  const r = p.propName, N = r[0].toUpperCase() + r.slice(1);
502
- d.push(`on${N}Click`);
502
+ f.push(`on${N}Click`);
503
503
  }), v.forEach((p) => {
504
504
  p.arrayContainer && p.arrayContainer.components.length > 0 && m.push(p.arrayContainer.propName);
505
505
  const r = u(p.name || "container"), N = `${r[0].toUpperCase()}${r.slice(
506
506
  1
507
507
  )}IndexChange`;
508
- m.push(`${r}CurrentIndex`), d.push(`on${N}`);
508
+ m.push(`${r}CurrentIndex`), f.push(`on${N}`);
509
509
  });
510
- const P = `<${I}
510
+ const P = `<${w}
511
511
  ${m.map((p) => `${p}={${p}}`).join(`
512
512
  `)}
513
- ${d.map((p) => `${p}={${p}}`).join(`
513
+ ${f.map((p) => `${p}={${p}}`).join(`
514
514
  `)}
515
515
  />`;
516
516
  return {
517
517
  props: m,
518
- events: d,
518
+ events: f,
519
519
  jsx: P
520
520
  };
521
521
  }
@@ -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\n/**\n * Metadata extracted from generated component\n */\nexport interface ComponentMetadata {\n /** List of prop names */\n props: string[];\n /** List of event handler names */\n events: string[];\n /** Example JSX usage string */\n jsx: string;\n}\n\n/**\n * Generates React component wrapper code for an Encore page\n *\n * Creates a TypeScript React component that wraps EncoreApp with typed props\n * for all data-bound components, sliders, forms, and interactive elements.\n *\n * @param appId - Encore app ID\n * @param pageId - Encore page ID\n * @param componentName - Name for the generated component\n * @param sliders - Slider/list metadata from parser\n * @param standaloneComponents - Standalone component metadata\n * @param inputGroups - Input group metadata\n * @param forms - Form metadata\n * @param selectInputs - Select input metadata\n * @param actionButtons - Action button metadata\n * @param isProduction - Whether to include bundled data for production\n * @param pageMeta - Optional page dimensions and aspect ratio\n * @returns TypeScript component source code\n *\n * @example\n * const code = generateComponentCode(\n * \"01ABC123\",\n * \"01DEF456\",\n * \"MyPage\",\n * sliders,\n * components,\n * inputGroups,\n * forms,\n * selectInputs,\n * actionButtons\n * );\n * fs.writeFileSync(\"MyPage.tsx\", code);\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 mode: string = \"dynamic\",\n pageMeta?: {\n width?: number;\n height?: number;\n aspectRatio?: number;\n }\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 embedsMapping: string[] = [];\n const controlMapping: string[] = [];\n\n // Add standalone component mappings\n standaloneComponents.forEach((comp) => {\n const propKey = getComponentPropName(comp.type);\n if (comp.type === \"component:webview\") {\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { params: { url: props.${comp.propName} } } as any }),`);\n } else if (comp.type === \"component:embed\") {\n embedsMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": props.${comp.propName} }),`);\n } else {\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { ${propKey}: props.${comp.propName} } as any }),`);\n }\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 if (comp.type === \"component:webview\") {\n return ` // ${comp.name}\n \"${comp.id}\": {\n params: { url: item.${comp.propName} },\n }`;\n }\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 embedsCode =\n embedsMapping.length > 0\n ? `\\n embeds={{\n${embedsMapping.join(\"\\n\")}\n }}`\n : \"\";\n\n const propsParameter = hasProps ? `props: ${componentName}Props` : \"\";\n const propsInterfaceSection = propsInterface ? `${propsInterface}\\n\\n` : \"\";\n\n const shouldBundleData = mode === \"production\" || mode === \"optimistic\";\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${shouldBundleData ? `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 mode=\"${mode}\"\n ${\n shouldBundleData\n ? `appDefinition={productionData.app}\n pageDefinition={productionData.page}\n componentCode={productionData.componentCode}`\n : \"\"\n }\n data={{\n${dataMapping.join(\"\\n\")}\n }}${repeatingContainerControlsCode}${inputGroupsCode}${onActionCode}${embedsCode}\n />\n );\n}\n\nexport default ${componentName};\n\nexport const PageMeta = {\n width: ${pageMeta?.width ?? \"undefined\"},\n height: ${pageMeta?.height ?? \"undefined\"},\n aspectRatio: ${pageMeta?.aspectRatio ?? \"undefined\"},\n};\n`;\n}\n\n/**\n * Generates README documentation for a generated component\n *\n * Creates comprehensive Markdown documentation explaining all props,\n * events, and usage examples for the generated wrapper component.\n *\n * @param appId - Encore app ID\n * @param pageId - Encore page ID\n * @param appName - Human-readable app name\n * @param pageName - Human-readable page name\n * @param componentName - Generated component name\n * @param sliders - Slider/list metadata\n * @param standaloneComponents - Component metadata\n * @param inputGroups - Input group metadata\n * @param forms - Form metadata\n * @param selectInputs - Select input metadata\n * @param actionButtons - Action button metadata\n * @returns Markdown documentation string\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\n/**\n * Extracts component metadata for programmatic use\n *\n * Generates a simplified metadata object listing all props and events\n * without the full code generation.\n *\n * @param _appName - App name (currently unused)\n * @param pageName - Page name for component naming\n * @param sliders - Slider metadata\n * @param standaloneComponents - Component metadata\n * @param inputGroups - Input group metadata\n * @param forms - Form metadata\n * @param selectInputs - Select input metadata\n * @param actionButtons - Action button metadata\n * @returns Component metadata object\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","mode","pageMeta","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","embedsMapping","controlMapping","propKey","getComponentPropName","itemMapping","controlPropName","controlEntry","repeatingContainerControlsCode","inputGroupMapping","inputGroupHandlers","handlerPropName","index","formDataEntries","inputGroupsCode","onActionCode","embedsCode","propsParameter","propsInterfaceSection","shouldBundleData","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","e"],"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\n/**\n * Metadata extracted from generated component\n */\nexport interface ComponentMetadata {\n /** List of prop names */\n props: string[];\n /** List of event handler names */\n events: string[];\n /** Example JSX usage string */\n jsx: string;\n}\n\n/**\n * Generates React component wrapper code for an Encore page\n *\n * Creates a TypeScript React component that wraps EncoreApp with typed props\n * for all data-bound components, sliders, forms, and interactive elements.\n *\n * @param appId - Encore app ID\n * @param pageId - Encore page ID\n * @param componentName - Name for the generated component\n * @param sliders - Slider/list metadata from parser\n * @param standaloneComponents - Standalone component metadata\n * @param inputGroups - Input group metadata\n * @param forms - Form metadata\n * @param selectInputs - Select input metadata\n * @param actionButtons - Action button metadata\n * @param isProduction - Whether to include bundled data for production\n * @param pageMeta - Optional page dimensions and aspect ratio\n * @returns TypeScript component source code\n *\n * @example\n * const code = generateComponentCode(\n * \"01ABC123\",\n * \"01DEF456\",\n * \"MyPage\",\n * sliders,\n * components,\n * inputGroups,\n * forms,\n * selectInputs,\n * actionButtons\n * );\n * fs.writeFileSync(\"MyPage.tsx\", code);\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 mode: string = \"dynamic\",\n pageMeta?: {\n width?: number;\n height?: number;\n aspectRatio?: number;\n }\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 embedsMapping: string[] = [];\n const controlMapping: string[] = [];\n\n // Add standalone component mappings\n standaloneComponents.forEach((comp) => {\n const propKey = getComponentPropName(comp.type);\n if (\n comp.type === \"component:webview\" ||\n comp.type === \"component:web-view\"\n ) {\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { params: { url: props.${comp.propName} } } as any }),`);\n } else if (comp.type === \"component:embed\") {\n embedsMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": props.${comp.propName} }),`);\n } else {\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { ${propKey}: props.${comp.propName} } as any }),`);\n }\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 if (\n comp.type === \"component:webview\" ||\n comp.type === \"component:web-view\"\n ) {\n return ` // ${comp.name}\n \"${comp.id}\": {\n params: { url: item.${comp.propName} },\n }`;\n }\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 embedsCode =\n embedsMapping.length > 0\n ? `\\n embeds={{\n${embedsMapping.join(\"\\n\")}\n }}`\n : \"\";\n\n const propsParameter = hasProps ? `props: ${componentName}Props` : \"\";\n const propsInterfaceSection = propsInterface ? `${propsInterface}\\n\\n` : \"\";\n\n const shouldBundleData = mode === \"production\" || mode === \"optimistic\";\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${shouldBundleData ? `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 mode=\"${mode}\"\n ${\n shouldBundleData\n ? `appDefinition={productionData.app}\n pageDefinition={productionData.page}\n componentCode={productionData.componentCode}`\n : \"\"\n }\n data={{\n${dataMapping.join(\"\\n\")}\n }}${repeatingContainerControlsCode}${inputGroupsCode}${onActionCode}${embedsCode}\n />\n );\n}\n\nexport default ${componentName};\n\nexport const PageMeta = {\n width: ${pageMeta?.width ?? \"undefined\"},\n height: ${pageMeta?.height ?? \"undefined\"},\n aspectRatio: ${pageMeta?.aspectRatio ?? \"undefined\"},\n};\n`;\n}\n\n/**\n * Generates README documentation for a generated component\n *\n * Creates comprehensive Markdown documentation explaining all props,\n * events, and usage examples for the generated wrapper component.\n *\n * @param appId - Encore app ID\n * @param pageId - Encore page ID\n * @param appName - Human-readable app name\n * @param pageName - Human-readable page name\n * @param componentName - Generated component name\n * @param sliders - Slider/list metadata\n * @param standaloneComponents - Component metadata\n * @param inputGroups - Input group metadata\n * @param forms - Form metadata\n * @param selectInputs - Select input metadata\n * @param actionButtons - Action button metadata\n * @returns Markdown documentation string\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\n/**\n * Extracts component metadata for programmatic use\n *\n * Generates a simplified metadata object listing all props and events\n * without the full code generation.\n *\n * @param _appName - App name (currently unused)\n * @param pageName - Page name for component naming\n * @param sliders - Slider metadata\n * @param standaloneComponents - Component metadata\n * @param inputGroups - Input group metadata\n * @param forms - Form metadata\n * @param selectInputs - Select input metadata\n * @param actionButtons - Action button metadata\n * @returns Component metadata object\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","mode","pageMeta","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","embedsMapping","controlMapping","propKey","getComponentPropName","itemMapping","controlPropName","controlEntry","repeatingContainerControlsCode","inputGroupMapping","inputGroupHandlers","handlerPropName","index","formDataEntries","inputGroupsCode","onActionCode","embedsCode","propsParameter","propsInterfaceSection","shouldBundleData","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","e"],"mappings":"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"}