createProject function

Answer createProject(
  1. String target,
  2. String name, {
  3. ProjectKind kind = ProjectKind.scene,
})

Writes a new project called name, of kind, into target, which must be empty or not exist, and wires the build hook. Returns what it did, or why it did not.

Implementation

Answer createProject(
  String target,
  String name, {
  ProjectKind kind = ProjectKind.scene,
}) {
  if (!isPackageName(name)) {
    return Answer(
      did: false,
      says:
          '"$name" is not a package name: lower case letters, digits and '
          'underscores, starting with a letter, and not the name of a package '
          'the project depends on',
    );
  }
  final root = Directory(target);
  if (root.existsSync() && root.listSync().isNotEmpty) {
    return Answer(
      did: false,
      says: '$target is not empty; a new project goes in an empty directory',
    );
  }
  final files = projectTemplate(name, kind: kind);
  for (final MapEntry(:key, :value) in files.entries) {
    File('$target/$key')
      ..parent.createSync(recursive: true)
      ..writeAsStringSync(value.startsWith('\n') ? value.substring(1) : value);
  }
  final binaries = <String, Uint8List>{
    if (kind == ProjectKind.viewer) viewerModelPath: viewerModelGlb(),
  };
  for (final MapEntry(:key, :value) in binaries.entries) {
    File('$target/$key')
      ..parent.createSync(recursive: true)
      ..writeAsBytesSync(value);
  }
  final steps = planInit(root);
  for (final step in steps) {
    if (!step.blocked) step.apply!();
  }
  return Answer(
    did: true,
    says: <String>[
      'created $name ($kind) in $target:',
      for (final path in <String>[...files.keys, ...binaries.keys]) '  $path',
      for (final step in steps) '  ${step.description}',
      '',
      'next:',
      '  cd $target',
      '  flutter create --platforms=macos,web .',
      '  flutter pub get && flutter run -d macos',
    ].join('\n'),
  );
}