fix: template bugs

This commit is contained in:
Max 2025-11-24 13:43:15 +08:00
parent 95166f25e6
commit 15463bfc74
6 changed files with 94 additions and 25 deletions

View File

@ -122,10 +122,11 @@ mixin RetrofitApiSchema {
return 'unnamedMethod';
}
// 使 camelCase
// : GetTaskTypeInfo -> getTaskTypeInfo
// HTTP Swagger
final lastPart = pathParts.last.replaceAll(RegExp(r'\W+'), '');
final method = path.method.value.toLowerCase();
final pascalPart = StringHelper.toPascalCase(lastPart);
final methodName = '$method$pascalPart';
final methodName = StringHelper.toCamelCase(lastPart);
return methodName;
}

View File

@ -54,7 +54,7 @@ mixin RetrofitApiTemplateData {
List<String> _getImportsForPaths(List<ApiPath> paths) {
final imports = <String>{};
final config = ConfigRepository.loadSync();
//
imports
..add('package:dio/dio.dart')
@ -74,36 +74,26 @@ mixin RetrofitApiTemplateData {
/// models index.dart
String _getModelsIndexImport() {
final config = ConfigRepository.loadSync();
final apiDir = config.apiDir;
final modelsDir = config.modelsDir;
//
if (apiDir.isEmpty || modelsDir.isEmpty) {
if (modelsDir.isEmpty) {
return '';
}
// base_result_import
final baseResultImport = config.baseResultImport;
if (baseResultImport.isEmpty) {
// pubspec.yaml
final packageName = PathResolver.getPackageName();
if (packageName == null || packageName.isEmpty) {
return '';
}
// base_result_import
// : "package:example_app/common/base_result.dart" -> "example_app"
final packageMatch = RegExp(r'^package:([^/]+)/').firstMatch(baseResultImport);
if (packageMatch == null) {
return '';
}
final packageName = packageMatch.group(1)!;
// models_dir
// : "./lib/src/api_models" -> "package:example_app/src/api_models/index.dart"
var modelsPath = modelsDir
// : "./lib/src/api_models" -> "package:oa_api_hs/src/api_models/index.dart"
final modelsPath = modelsDir
.replaceAll(r'\', '/')
.replaceAll('./', '')
.replaceAll('lib/', '');
return 'package:$packageName/$modelsPath/index.dart';
}
@ -112,17 +102,24 @@ mixin RetrofitApiTemplateData {
}
Map<String, dynamic> _buildMethodData(ApiPath path) {
final params = _buildParametersData(path);
return {
'docLines': _buildDocLines(path),
'annotations': _buildAnnotations(path),
'returnType': _g._generateReturnType(path),
'methodName': _g._generateSimpleMethodName(path),
'params': _buildParametersData(path),
'params': params,
'hasParams': params.isNotEmpty,
};
}
List<String> _buildDocLines(ApiPath path) {
final docLines = <String>[];
// HTTP
final httpMethod = path.method.value.toUpperCase();
docLines.add('[$httpMethod]');
if (path.summary.isNotEmpty) {
// Clean summary to remove newlines and other problematic characters
docLines.add(TextCleaner.cleanDescription(path.summary));
@ -137,7 +134,7 @@ mixin RetrofitApiTemplateData {
List<String> _buildAnnotations(ApiPath path) {
final annotations = <String>[];
final method = path.method.value.toUpperCase();
annotations.add('@$method(\'${path.path}\')');
annotations.add("@$method('${path.path}')");
if (path.isMultipart) {
annotations.add('@MultiPart()');

View File

@ -2,6 +2,7 @@ import 'package:swagger_generator_flutter/core/config_repository.dart';
import 'package:swagger_generator_flutter/core/models.dart';
import 'package:swagger_generator_flutter/core/template_renderer.dart';
import 'package:swagger_generator_flutter/pipeline/generate/impl/base_generator.dart';
import 'package:swagger_generator_flutter/utils/path_resolver.dart';
import 'package:swagger_generator_flutter/utils/string_helper.dart';
import 'package:swagger_generator_flutter/utils/string_utils/index.dart';

View File

@ -53,6 +53,10 @@ class TemplateLoader {
// templates lib/templates
_collectUpwardTemplateDirs().forEach(addDir);
// lib/templates
final packageTemplateDirs = _findPackageTemplateDirs();
packageTemplateDirs.forEach(addDir);
return files;
}
@ -78,6 +82,48 @@ class TemplateLoader {
return dirs;
}
/// 使
List<String> _findPackageTemplateDirs() {
final dirs = <String>[];
try {
// .dart_tool/package_config.json
final packageConfigFile = File('.dart_tool/package_config.json');
if (!packageConfigFile.existsSync()) {
return dirs;
}
final configContent = packageConfigFile.readAsStringSync();
// swagger_generator_flutter rootUri
// : "name": "swagger_generator_flutter", ... "rootUri": "file:///path/to/package"
final pattern = RegExp(
r'"name"\s*:\s*"swagger_generator_flutter"[^}]*"rootUri"\s*:\s*"([^"]+)"',
multiLine: true,
);
final match = pattern.firstMatch(configContent);
if (match != null) {
var rootUri = match.group(1)!;
// file://
if (rootUri.startsWith('file://')) {
rootUri = rootUri.substring(7);
}
//
final templateDir = p.join(rootUri, 'lib', 'templates');
if (Directory(templateDir).existsSync()) {
dirs.add(templateDir);
}
}
} catch (_) {
//
}
return dirs;
}
void clearCache() {
_cache.clear();
}

View File

@ -4,6 +4,6 @@
{{#annotations}}
{{.}}
{{/annotations}}
Future<{{returnType}}> {{methodName}}(
Future<{{returnType}}> {{methodName}}({{#hasParams}}{
{{#params}} {{#annotation}}{{.}} {{/annotation}}{{type}} {{name}},
{{/params}} );
{{/params}} }{{/hasParams}});

View File

@ -47,6 +47,30 @@ class PathResolver {
return null;
}
/// pubspec.yaml
static String? getPackageName() {
final configDir = getConfigDirectory();
if (configDir == null) {
return null;
}
final pubspecFile = File(path.join(configDir, 'pubspec.yaml'));
if (!pubspecFile.existsSync()) {
return null;
}
try {
final content = pubspecFile.readAsStringSync();
//
// : name: package_name
final match =
RegExp(r'^name:\s*(\S+)', multiLine: true).firstMatch(content);
return match?.group(1);
} catch (_) {
return null;
}
}
///
///
static String resolvePath(String filePath) {