diff --git a/openapi-generator-annotations/lib/src/openapi_generator_annotations_base.dart b/openapi-generator-annotations/lib/src/openapi_generator_annotations_base.dart index d7c73ac..3cf84e4 100644 --- a/openapi-generator-annotations/lib/src/openapi_generator_annotations_base.dart +++ b/openapi-generator-annotations/lib/src/openapi_generator_annotations_base.dart @@ -50,6 +50,11 @@ class Openapi { /// -o, --output final String? outputDirectory; + /// Defines whether the output directory should be cleaned up before generating the output. + /// + /// e.g [''], ['lib/src'] + final List? cleanSubOutputDirectory; + /// Skips the default behavior of validating an input specification. /// /// --skip-validate-spec @@ -118,6 +123,7 @@ class Openapi { this.templateDirectory, required this.generatorName, this.outputDirectory, + this.cleanSubOutputDirectory, this.typeMappings, this.importMappings, this.reservedWordsMappings, diff --git a/openapi-generator/lib/src/extensions/type_methods.dart b/openapi-generator/lib/src/extensions/type_methods.dart index aa8756e..b1e8bca 100644 --- a/openapi-generator/lib/src/extensions/type_methods.dart +++ b/openapi-generator/lib/src/extensions/type_methods.dart @@ -172,7 +172,7 @@ extension ReadProperty on ConstantReader { } else if (isA(v, Set)) { return v.setValue.map(convertToPropertyValue) as T; } else if (isA(v, List)) { - return v.listValue.map(convertToPropertyValue) as T; + return v.listValue.map(convertToPropertyValue).toList() as T; } else if (isA(v, Enum)) { return v.enumValue(); } else { diff --git a/openapi-generator/lib/src/models/generator_arguments.dart b/openapi-generator/lib/src/models/generator_arguments.dart index 2cbcbba..912c356 100644 --- a/openapi-generator/lib/src/models/generator_arguments.dart +++ b/openapi-generator/lib/src/models/generator_arguments.dart @@ -32,6 +32,9 @@ class GeneratorArguments { /// Default: Directory.current.path final String? outputDirectory; + /// Defines whether the output directory should be cleaned up before generating the output. + final List? cleanSubOutputDirectory; + /// Informs the generator to run source gen on the output. /// /// Default: true @@ -105,6 +108,8 @@ class GeneratorArguments { shouldFetchDependencies = annotations.readPropertyOrDefault('fetchDependencies', true), outputDirectory = annotations.readPropertyOrNull('outputDirectory'), + cleanSubOutputDirectory = + annotations.readPropertyOrNull('cleanSubOutputDirectory'), cachePath = annotations.readPropertyOrDefault('cachePath', defaultCachedPath), pubspecPath = annotations.readPropertyOrDefault( diff --git a/openapi-generator/lib/src/openapi_generator_runner.dart b/openapi-generator/lib/src/openapi_generator_runner.dart index c92a140..c432c01 100755 --- a/openapi-generator/lib/src/openapi_generator_runner.dart +++ b/openapi-generator/lib/src/openapi_generator_runner.dart @@ -90,6 +90,33 @@ class OpenapiGenerator extends GeneratorForAnnotation { ), ); + if (arguments.cleanSubOutputDirectory != null) { + arguments.cleanSubOutputDirectory?.forEach((directory) { + final childDirectory = + Directory('${arguments.outputDirectory}/${directory.toString()}'); + try { + final outputDirectory = Directory('${arguments.outputDirectory}') + .resolveSymbolicLinksSync(); + // Make sure is sub directory, avoid ../../ + if (childDirectory + .resolveSymbolicLinksSync() + .startsWith(outputDirectory)) { + childDirectory.delete(recursive: true); + } + } catch (e, st) { + logOutputMessage( + log: log, + communication: OutputMessage( + message: 'Output directory already empty', + additionalContext: e, + stackTrace: st, + level: Level.WARNING, + ), + ); + } + }); + } + var binPath = (await Isolate.resolvePackageUri( Uri.parse('package:openapi_generator_cli/openapi-generator.jar')))! .toFilePath(windows: Platform.isWindows);