feat: create project folders from desktop app
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import 'dart:io';
|
||||
|
||||
bool get canCreateProjectFolders =>
|
||||
Platform.isWindows || Platform.isMacOS || Platform.isLinux;
|
||||
|
||||
Future<String> createProjectFolder(
|
||||
String parentPath,
|
||||
String projectName,
|
||||
) async {
|
||||
if (!canCreateProjectFolders) {
|
||||
throw UnsupportedError(
|
||||
'إنشاء مجلدات المشاريع متاح حاليًا على سطح المكتب فقط.',
|
||||
);
|
||||
}
|
||||
final name = _validatedProjectName(projectName);
|
||||
final parent = Directory(parentPath);
|
||||
if (!await parent.exists()) {
|
||||
throw ArgumentError('المجلد الأب غير موجود أو لا يمكن الوصول إليه.');
|
||||
}
|
||||
final resolvedParent = await parent.resolveSymbolicLinks();
|
||||
final separator = Platform.pathSeparator;
|
||||
final targetPath =
|
||||
resolvedParent.endsWith(separator)
|
||||
? '$resolvedParent$name'
|
||||
: '$resolvedParent$separator$name';
|
||||
if (await FileSystemEntity.type(targetPath, followLinks: false) !=
|
||||
FileSystemEntityType.notFound) {
|
||||
throw ArgumentError('يوجد ملف أو مجلد بالاسم نفسه في هذا الموقع.');
|
||||
}
|
||||
await Directory(targetPath).create();
|
||||
return await Directory(targetPath).resolveSymbolicLinks();
|
||||
}
|
||||
|
||||
String _validatedProjectName(String value) {
|
||||
final name = value.trim();
|
||||
if (name.isEmpty || name.length > 80) {
|
||||
throw ArgumentError('اكتب اسمًا للمشروع من حرف إلى 80 حرفًا.');
|
||||
}
|
||||
if (name.startsWith('.') || name == '.' || name == '..') {
|
||||
throw ArgumentError('لا يمكن أن يبدأ اسم المشروع بنقطة.');
|
||||
}
|
||||
if (RegExp(r'[<>:"/\\|?*\x00-\x1F]').hasMatch(name) ||
|
||||
name.endsWith('.') ||
|
||||
name.endsWith(' ')) {
|
||||
throw ArgumentError('الاسم يحتوي محارف لا يسمح بها نظام الملفات.');
|
||||
}
|
||||
if (RegExp(
|
||||
r'^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\..*)?$',
|
||||
caseSensitive: false,
|
||||
).hasMatch(name)) {
|
||||
throw ArgumentError('هذا اسم محجوز في Windows. اختر اسمًا آخر.');
|
||||
}
|
||||
if ({
|
||||
'.git',
|
||||
'.venv',
|
||||
'node_modules',
|
||||
'build',
|
||||
'__pycache__',
|
||||
}.contains(name.toLowerCase())) {
|
||||
throw ArgumentError('هذا الاسم مخصص لمجلد مستثنى من مساحة العمل.');
|
||||
}
|
||||
return name;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'project_folder_stub.dart'
|
||||
if (dart.library.io) 'project_folder_io.dart'
|
||||
as platform;
|
||||
|
||||
bool get canCreateProjectFolders => platform.canCreateProjectFolders;
|
||||
|
||||
Future<String> createProjectFolder(String parentPath, String projectName) =>
|
||||
platform.createProjectFolder(parentPath, projectName);
|
||||
@@ -0,0 +1,5 @@
|
||||
bool get canCreateProjectFolders => false;
|
||||
|
||||
Future<String> createProjectFolder(String parentPath, String projectName) {
|
||||
throw UnsupportedError('إنشاء مجلد مشروع غير مدعوم على هذه المنصة.');
|
||||
}
|
||||
Reference in New Issue
Block a user