Suggest a potential valid name for the flutter project when using flutter create
(#130900)
Fixes https://github.com/flutter/flutter/issues/109775 *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*
This commit is contained in:
parent
764095ce1a
commit
be7c7e3e45
@ -784,12 +784,38 @@ bool isValidPackageName(String name) {
|
|||||||
!_keywords.contains(name);
|
!_keywords.contains(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a potential valid name from the given [name].
|
||||||
|
///
|
||||||
|
/// If a valid name cannot be found, returns `null`.
|
||||||
|
@visibleForTesting
|
||||||
|
String? potentialValidPackageName(String name){
|
||||||
|
String newName = name.toLowerCase();
|
||||||
|
if (newName.startsWith(RegExp(r'[0-9]'))) {
|
||||||
|
newName = '_$newName';
|
||||||
|
}
|
||||||
|
newName = newName.replaceAll('-', '_');
|
||||||
|
if (isValidPackageName(newName)) {
|
||||||
|
return newName;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Return null if the project name is legal. Return a validation message if
|
// Return null if the project name is legal. Return a validation message if
|
||||||
// we should disallow the project name.
|
// we should disallow the project name.
|
||||||
String? _validateProjectName(String projectName) {
|
String? _validateProjectName(String projectName) {
|
||||||
if (!isValidPackageName(projectName)) {
|
if (!isValidPackageName(projectName)) {
|
||||||
return '"$projectName" is not a valid Dart package name.\n\n'
|
final String? potentialValidName = potentialValidPackageName(projectName);
|
||||||
'See https://dart.dev/tools/pub/pubspec#name for more information.';
|
|
||||||
|
return <String>[
|
||||||
|
'"$projectName" is not a valid Dart package name.',
|
||||||
|
'\n\n',
|
||||||
|
'The name should be all lowercase, with underscores to separate words, "just_like_this".',
|
||||||
|
'Use only basic Latin letters and Arabic digits: [a-z0-9_].',
|
||||||
|
"Also, make sure the name is a valid Dart identifier—that it doesn't start with digits and isn't a reserved word.\n",
|
||||||
|
'See https://dart.dev/tools/pub/pubspec#name for more information.',
|
||||||
|
if (potentialValidName != null) '\nTry "$potentialValidName" instead.',
|
||||||
|
].join();
|
||||||
}
|
}
|
||||||
if (_packageDependencies.contains(projectName)) {
|
if (_packageDependencies.contains(projectName)) {
|
||||||
return "Invalid project name: '$projectName' - this will conflict with Flutter "
|
return "Invalid project name: '$projectName' - this will conflict with Flutter "
|
||||||
|
@ -735,10 +735,13 @@ void main() {
|
|||||||
testUsingContext('plugin project with invalid custom project name', () async {
|
testUsingContext('plugin project with invalid custom project name', () async {
|
||||||
expect(
|
expect(
|
||||||
() => _createProject(projectDir,
|
() => _createProject(projectDir,
|
||||||
<String>['--no-pub', '--template=plugin', '--project-name', 'xyz.xyz', '--platforms', 'android,ios',],
|
<String>['--no-pub', '--template=plugin', '--project-name', 'xyz-xyz', '--platforms', 'android,ios',],
|
||||||
<String>[],
|
<String>[],
|
||||||
),
|
),
|
||||||
throwsToolExit(message: '"xyz.xyz" is not a valid Dart package name.'),
|
allOf(
|
||||||
|
throwsToolExit(message: '"xyz-xyz" is not a valid Dart package name.'),
|
||||||
|
throwsToolExit(message: 'Try "xyz_xyz" instead.'),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -20,6 +20,18 @@ void main() {
|
|||||||
expect(isValidPackageName('Foo_bar'), false);
|
expect(isValidPackageName('Foo_bar'), false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Suggests a valid Pub package name', () {
|
||||||
|
expect(potentialValidPackageName('92'), '_92');
|
||||||
|
expect(potentialValidPackageName('a-b-c'), 'a_b_c');
|
||||||
|
|
||||||
|
|
||||||
|
expect(potentialValidPackageName('Foo_bar'), 'foo_bar');
|
||||||
|
expect(potentialValidPackageName('foo-_bar'), 'foo__bar');
|
||||||
|
|
||||||
|
expect(potentialValidPackageName('잘못된 이름'), isNull, reason: 'It should return null if it cannot find a valid name.');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
test('kWindowsDrivePattern', () {
|
test('kWindowsDrivePattern', () {
|
||||||
expect(CreateBase.kWindowsDrivePattern.hasMatch(r'D:\'), isFalse);
|
expect(CreateBase.kWindowsDrivePattern.hasMatch(r'D:\'), isFalse);
|
||||||
expect(CreateBase.kWindowsDrivePattern.hasMatch(r'z:\'), isFalse);
|
expect(CreateBase.kWindowsDrivePattern.hasMatch(r'z:\'), isFalse);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user