pubspecFile function

AnyFile pubspecFile(
  1. ClientServer server,
  2. Settings settings
)

Implementation

AnyFile pubspecFile(ClientServer server, Settings settings) {
  // TODO(mrgnhnt): what happens when the dependency is from git?
  final serverClient = Isolate.resolvePackageUriSync(
    Uri.parse('package:revali_client/'),
  ).toString();

  final imports = server.controllers
      .where((e) => !e.isExcluded)
      .expand(
        (e) => e.methods.expand((e) {
          return [
            ...e.returnType.imports,
            ...e.allParams.expand((e) => e.type.imports),
          ];
        }),
      )
      .expand((e) => e?.packages ?? <String>[])
      .toSet();

  final packages = <(String, String?)>{
    ('revali_client', serverClient),
    if (settings.integrateGetIt)
      if (_getIntegration('get_it') case final String? getIt) ('get_it', getIt),
  };
  for (final import in imports) {
    final [_, String packagePath] = import.split(':');
    final [String package, ...] = packagePath.split('/');

    final resolved = Isolate.resolvePackageUriSync(
      Uri.parse('package:$package/'),
    ).toString();

    packages.add((package, resolved));
  }

  final dependencies = StringBuffer();

  switch (server.hasWebsockets) {
    case true:
      dependencies.writeln('  web_socket_channel: ^3.0.2');

    case false:
      break;
  }

  final versionPattern = RegExp(r'-[\d-\.a-zA-Z+]+$');

  for (final (package, path) in packages) {
    if (path == null) {
      dependencies.writeln('  $package:');
      continue;
    }

    final segments = path.split('/');
    switch ((
      segments.contains('hosted'),
      segments.reversed.toList()..removeWhere((e) => e.isEmpty),
    )) {
      case (true, [_, final String package, ...]):
        final name = package.replaceAll(versionPattern, '');
        final version = package.replaceAll('$name-', '');

        dependencies.writeln('  $name: $version');
      case (false, _):
        Iterable<String> clean() sync* {
          for (final part in segments.skip(1)) {
            if (part.isEmpty) continue;
            if (part == 'lib') continue;
            yield part;
          }
        }

        final path = p.joinAll([p.separator, ...clean()]);

        dependencies.writeln('''
  $package:
    path: $path''');
    }
  }

  return AnyFile(
    basename: 'pubspec',
    extension: 'yaml',
    content:
        '''
name: ${settings.packageName}

environment:
  sdk: '>=3.5.0 <4.0.0'

dependencies:
  http: ^1.3.0
$dependencies
''',
  );
}