generateDartComponent function

void generateDartComponent(
  1. String name,
  2. List<FieldDef> fields,
  3. String dartPath
)

Implementation

void generateDartComponent(
    String name, List<FieldDef> fields, String dartPath) {
  final className = '${toPascalCase(name)}Component';
  final componentType = toCamelCase(name);

  final buffer = StringBuffer();
  buffer.writeln("import 'package:flutter/material.dart';");
  buffer.writeln(
      "import 'package:sdui_flutter_sanity/sdui_flutter_sanity.dart';\n");

  buffer.writeln('class $className extends SduiComponent {');
  buffer.writeln("  @override");
  buffer.writeln("  String get type => '$componentType';\n");

  buffer.writeln('  @override');
  buffer.writeln(
      '  Widget build(BuildContext context, UiNode node, Widget Function(UiNode) buildChild) {');

  for (var field in fields) {
    final cast = getDartCast(field.type);
    // Preserve the original field name as the Dart variable name (already camelCase from CMS)
    final varName = toCamelCase(field.name);
    if (field.type.toLowerCase() == 'number') {
      buffer
          .writeln("    final $varName = (node.props['${field.name}'] $cast;");
    } else {
      buffer.writeln("    final $varName = node.props['${field.name}'] $cast;");
    }
  }

  buffer.writeln(
      '\n    // TODO: Implement your custom widget using the extracted properties.');
  buffer.writeln('    return const Placeholder();');
  buffer.writeln('  }');
  buffer.writeln('}');

  final dir = Directory(dartPath);
  if (!dir.existsSync()) {
    dir.createSync(recursive: true);
  }

  final file = File('${dir.path}/${toSnakeCase(name)}_component.dart');
  file.writeAsStringSync(buffer.toString());
  print('✅ Generated Dart Component: ${file.path}');
}