blob: 9aa2cc67fe6527899a12e539d7094bdf2d1e3ea2 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:meta/meta.dart';
import 'file_system.dart';
import 'logger.dart';
/// Emum for each officially supported platform.
enum SupportedPlatform {
android,
ios,
linux,
macos,
web,
windows,
fuchsia,
}
class FlutterProjectFactory {
FlutterProjectFactory();
@visibleForTesting
final Map<String, FlutterProject> projects = <String, FlutterProject>{};
/// Returns a [FlutterProject] view of the given directory or a ToolExit error,
/// if `pubspec.yaml` or `example/pubspec.yaml` is invalid.
FlutterProject fromDirectory(Directory directory) {
return projects.putIfAbsent(directory.path, () {
return FlutterProject(directory);
});
}
}
/// Represents the contents of a Flutter project at the specified [directory].
class FlutterProject {
FlutterProject(this.directory);
/// Returns a [FlutterProject] view of the current directory or a ToolExit error,
/// if `pubspec.yaml` or `example/pubspec.yaml` is invalid.
static FlutterProject current(FileSystem fs) =>
FlutterProject(fs.currentDirectory);
/// Create a [FlutterProject] and bypass the project caching.
@visibleForTesting
static FlutterProject fromDirectoryTest(Directory directory,
[Logger? logger]) {
logger ??= BufferLogger.test();
return FlutterProject(directory);
}
Directory directory;
/// The `pubspec.yaml` file of this project.
File get pubspecFile => directory.childFile('pubspec.yaml');
/// The `.metadata` file of this project.
File get metadataFile => directory.childFile('.metadata');
/// Returns a list of platform names that are supported by the project.
List<SupportedPlatform> getSupportedPlatforms() {
final List<SupportedPlatform> platforms = <SupportedPlatform>[];
if (directory.childDirectory('android').existsSync()) {
platforms.add(SupportedPlatform.android);
}
if (directory.childDirectory('ios').existsSync()) {
platforms.add(SupportedPlatform.ios);
}
if (directory.childDirectory('web').existsSync()) {
platforms.add(SupportedPlatform.web);
}
if (directory.childDirectory('macos').existsSync()) {
platforms.add(SupportedPlatform.macos);
}
if (directory.childDirectory('linux').existsSync()) {
platforms.add(SupportedPlatform.linux);
}
if (directory.childDirectory('windows').existsSync()) {
platforms.add(SupportedPlatform.windows);
}
if (directory.childDirectory('fuchsia').existsSync()) {
platforms.add(SupportedPlatform.fuchsia);
}
return platforms;
}
}