feat: create project folders from desktop app

This commit is contained in:
Hamza Ayed
2026-10-04 04:40:51 +03:00
parent ab34825faf
commit f6a2e8c3d3
7 changed files with 244 additions and 6 deletions
@@ -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('إنشاء مجلد مشروع غير مدعوم على هذه المنصة.');
}