diff --git a/.github/workflows/draft-builder-release.yml b/.github/workflows/draft-builder-release.yml index 8c84571..a723277 100644 --- a/.github/workflows/draft-builder-release.yml +++ b/.github/workflows/draft-builder-release.yml @@ -41,7 +41,7 @@ jobs: - name: Set up Dart uses: dart-lang/setup-dart@v1 with: - sdk: 3.7.0 + sdk: 3.10.1 - name: Install dependencies working-directory: ${{ env.PACKAGE_PATH }} diff --git a/.github/workflows/draft-builder-test.yml b/.github/workflows/draft-builder-test.yml new file mode 100644 index 0000000..24be138 --- /dev/null +++ b/.github/workflows/draft-builder-test.yml @@ -0,0 +1,64 @@ +name: Test draft_builder + +on: + pull_request: + branches: + - main + paths: + - packages/draft_builder/** + - .github/workflows/draft-builder-test.yml + +permissions: + contents: read + +jobs: + tests: + name: Run tests + runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/draft_builder + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Dart + uses: dart-lang/setup-dart@v1 + with: + sdk: 3.10.1 + + - name: Install dependencies + run: dart pub get + + - name: Run generator + run: dart run build_runner build --delete-conflicting-outputs + + - name: Run tests + run: dart test + + lint: + name: Run lint checks + runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/draft_builder + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Dart + uses: dart-lang/setup-dart@v1 + with: + sdk: 3.10.1 + + - name: Install dependencies + run: dart pub get + + - name: Run generator + run: dart run build_runner build --delete-conflicting-outputs + + - name: Verify formatting + run: dart format --output none --set-exit-if-changed . + + - name: Run analyzer + run: dart analyze . diff --git a/packages/draft_builder/lib/src/generator.dart b/packages/draft_builder/lib/src/generator.dart index 3107fc1..6eb0e3b 100644 --- a/packages/draft_builder/lib/src/generator.dart +++ b/packages/draft_builder/lib/src/generator.dart @@ -339,7 +339,9 @@ String _generateParameterSignature(List parameters) { final parts = []; if (positionalRequired.isNotEmpty) parts.add(positionalRequired.join(', ')); - if (positionalOptional.isNotEmpty) parts.add('[${positionalOptional.join(', ')}]'); + if (positionalOptional.isNotEmpty) { + parts.add('[${positionalOptional.join(', ')}]'); + } if (named.isNotEmpty) parts.add('{${named.join(', ')}}'); return parts.join(', '); @@ -366,11 +368,16 @@ String _generateArgumentList(List parameters) { } /// Helper to generate constructor parameter signature for draft class based on original constructor. -String _generateDraftConstructorSignature(ConstructorElement? constructor, List fields) { +String _generateDraftConstructorSignature( + ConstructorElement? constructor, + List fields, +) { if (constructor == null) { // Fallback to named parameters if no constructor found final processors = fields.map(_processorFor).toList(); - final params = processors.map((p) => p.generateConstructorParameter()).join(', '); + final params = processors + .map((p) => p.generateConstructorParameter()) + .join(', '); return params.isNotEmpty ? '{$params}' : ''; } @@ -382,10 +389,10 @@ String _generateDraftConstructorSignature(ConstructorElement? constructor, List< // Only include parameters that correspond to fields we're processing final field = fields.where((f) => f.name == p.name).firstOrNull; if (field == null) continue; - + final processor = _processorFor(field); final paramDecl = processor.generateConstructorParameter(); - + if (p.isNamed) { named.add(paramDecl); } else if (p.isOptionalPositional) { @@ -407,14 +414,19 @@ String _generateDraftConstructorSignature(ConstructorElement? constructor, List< final parts = []; if (positional.isNotEmpty) parts.add(positional.join(', ')); - if (optionalPositional.isNotEmpty) parts.add('[${optionalPositional.join(', ')}]'); + if (optionalPositional.isNotEmpty) { + parts.add('[${optionalPositional.join(', ')}]'); + } if (named.isNotEmpty) parts.add('{${named.join(', ')}}'); return parts.join(', '); } /// Helper to generate argument list for save() method based on original constructor. -String _generateSaveArgumentList(ConstructorElement? constructor, List fields) { +String _generateSaveArgumentList( + ConstructorElement? constructor, + List fields, +) { if (constructor == null) { // Fallback to named arguments return fields.map((f) => '${f.name}: ${f.name}').join(', '); @@ -426,7 +438,7 @@ String _generateSaveArgumentList(ConstructorElement? constructor, List f.name == p.name).firstOrNull; if (field == null) continue; - + if (p.isNamed) { named.add('${p.name}: ${field.name}'); } else { @@ -442,7 +454,10 @@ String _generateSaveArgumentList(ConstructorElement? constructor, List fields) { +String _generateDraftArgumentList( + ConstructorElement? constructor, + List fields, +) { if (constructor == null) { // Fallback to named arguments return fields.map((f) => '${f.name}: this.${f.name}').join(', '); @@ -454,7 +469,7 @@ String _generateDraftArgumentList(ConstructorElement? constructor, List f.name == p.name).firstOrNull; if (field == null) continue; - + if (p.isNamed) { named.add('${p.name}: this.${field.name}'); } else { @@ -522,14 +537,22 @@ class DraftGenerator extends GeneratorForAnnotation { .join('\n'); // Find the original constructor to get parameter structure - final originalConstructor = classElement.constructors - .where((c) => constructorName == null - ? (c.name?.isEmpty ?? true) - : c.name == constructorName) - .firstOrNull ?? classElement.unnamedConstructor; + final originalConstructor = + classElement.constructors + .where( + (c) => + constructorName == null + ? (c.name?.isEmpty ?? true) + : c.name == constructorName, + ) + .firstOrNull ?? + classElement.unnamedConstructor; // Constructor parameters and initializers. - final constructorParams = _generateDraftConstructorSignature(originalConstructor, fields); + final constructorParams = _generateDraftConstructorSignature( + originalConstructor, + fields, + ); final initializerList = processors .map((p) => p.generateConstructorInitializer()) .where((init) => init.trim().isNotEmpty)