Show file size (#3509)

diff --git a/lib/src/ascii_tree.dart b/lib/src/ascii_tree.dart
index 302607f..1ab8a23 100644
--- a/lib/src/ascii_tree.dart
+++ b/lib/src/ascii_tree.dart
@@ -3,12 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// A simple library for rendering tree-like structures in ASCII.
+import 'dart:io';
+
 import 'package:path/path.dart' as path;
 
 import 'log.dart' as log;
 import 'utils.dart';
 
-/// Draws a tree for the given list of files. Given files like:
+/// Draws a tree for the given list of files
+///
+/// Shows each file with the file size if [showFileSize] is `true`.
+/// This will stats each file in the list for finding the size.
+///
+/// Given files like:
 ///
 ///     TODO
 ///     example/console_example.dart
@@ -16,11 +23,6 @@
 ///     example/web copy/web_example.dart
 ///     test/absolute_test.dart
 ///     test/basename_test.dart
-///     test/dirname_test.dart
-///     test/extension_test.dart
-///     test/is_absolute_test.dart
-///     test/is_relative_test.dart
-///     test/join_test.dart
 ///     test/normalize_test.dart
 ///     test/relative_test.dart
 ///     test/split_test.dart
@@ -34,48 +36,52 @@
 ///
 /// this renders:
 ///
-///     |-- .gitignore
-///     |-- README.md
-///     |-- TODO
+///     |-- .gitignore (1 KB)
+///     |-- README.md (23 KB)
+///     |-- TODO (1 MB)
 ///     |-- example
-///     |   |-- console_example.dart
-///     |   |-- main.dart
+///     |   |-- console_example.dart (20 B)
+///     |   |-- main.dart (200 B)
 ///     |   '-- web copy
-///     |       '-- web_example.dart
+///     |       '-- web_example.dart (3 KB)
 ///     |-- lib
-///     |   '-- path.dart
-///     |-- pubspec.yaml
+///     |   '-- path.dart (4 KB)
+///     |-- pubspec.yaml (10 KB)
 ///     '-- test
-///         |-- absolute_test.dart
-///         |-- all_test.dart
-///         |-- basename_test.dart
-///         | (7 more...)
-///         |-- path_windows_test.dart
-///         |-- relative_test.dart
-///         '-- split_test.dart
+///         |-- absolute_test.dart (102 KB)
+///         |-- all_test.dart (100 KB)
+///         |-- basename_test.dart (4 KB)
+///         |-- path_windows_test.dart (2 KB)
+///         |-- relative_test.dart (10 KB)
+///         '-- split_test.dart (50 KB)
 ///
 /// If [baseDir] is passed, it will be used as the root of the tree.
-///
-/// If [showAllChildren] is `false`, then directories with more than ten items
-/// will have their contents truncated. Defaults to `false`.
+
 String fromFiles(
   List<String> files, {
   String? baseDir,
-  bool showAllChildren = false,
+  required bool showFileSizes,
 }) {
   // Parse out the files into a tree of nested maps.
   var root = <String, Map>{};
   for (var file in files) {
-    if (baseDir != null) file = path.relative(file, from: baseDir);
+    final relativeFile =
+        baseDir == null ? file : path.relative(file, from: baseDir);
+    final parts = path.split(relativeFile);
+    if (showFileSizes) {
+      final size = File(path.normalize(file)).statSync().size;
+      final sizeString = _readableFileSize(size);
+      parts.last = '${parts.last} $sizeString';
+    }
     var directory = root;
-    for (var part in path.split(file)) {
+    for (var part in parts) {
       directory = directory.putIfAbsent(part, () => <String, Map>{})
           as Map<String, Map>;
     }
   }
 
   // Walk the map recursively and render to a string.
-  return fromMap(root, showAllChildren: showAllChildren);
+  return fromMap(root);
 }
 
 /// Draws a tree from a nested map. Given a map like:
@@ -99,12 +105,9 @@
 ///     barback
 ///
 /// Items with no children should have an empty map as the value.
-///
-/// If [showAllChildren] is `false`, then directories with more than ten items
-/// will have their contents truncated. Defaults to `false`.
-String fromMap(Map<String, Map> map, {bool showAllChildren = false}) {
+String fromMap(Map<String, Map> map) {
   var buffer = StringBuffer();
-  _draw(buffer, '', null, map, showAllChildren: showAllChildren);
+  _draw(buffer, '', null, map);
   return buffer.toString();
 }
 
@@ -155,25 +158,19 @@
         showAllChildren: showAllChildren, isLast: isLastChild);
   }
 
-  if (name == null || showAllChildren || childNames.length <= 10) {
-    // Not too many, so show all the children.
-    for (var i = 0; i < childNames.length; i++) {
-      drawChild(i == childNames.length - 1, childNames[i]);
-    }
+  for (var i = 0; i < childNames.length; i++) {
+    drawChild(i == childNames.length - 1, childNames[i]);
+  }
+}
+
+String _readableFileSize(int size) {
+  if (size >= 1 << 30) {
+    return log.red('(${size ~/ (1 << 30)} GB)');
+  } else if (size >= 1 << 20) {
+    return log.yellow('(${size ~/ (1 << 20)} MB)');
+  } else if (size >= 1 << 10) {
+    return log.gray('(${size ~/ (1 << 10)} KB)');
   } else {
-    // Show the first few.
-    drawChild(false, childNames[0]);
-    drawChild(false, childNames[1]);
-    drawChild(false, childNames[2]);
-
-    // Elide the middle ones.
-    buffer.write(prefix);
-    buffer.write(_getPrefix(false, isLast));
-    buffer.writeln(log.gray('| (${childNames.length - 6} more...)'));
-
-    // Show the last few.
-    drawChild(false, childNames[childNames.length - 3]);
-    drawChild(false, childNames[childNames.length - 2]);
-    drawChild(true, childNames[childNames.length - 1]);
+    return log.gray('(<1 KB)');
   }
 }
diff --git a/lib/src/command/deps.dart b/lib/src/command/deps.dart
index c860f02..a4203ab 100644
--- a/lib/src/command/deps.dart
+++ b/lib/src/command/deps.dart
@@ -287,7 +287,7 @@
       }
     }
 
-    _buffer.write(tree.fromMap(packageTree, showAllChildren: true));
+    _buffer.write(tree.fromMap(packageTree));
   }
 
   String _labelPackage(Package package) =>
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index 69c1c7e..2185110 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -226,7 +226,7 @@
     var package = entrypoint.root;
     log.message(
       'Publishing ${package.name} ${package.version} to $host:\n'
-      '${tree.fromFiles(files, baseDir: entrypoint.root.dir, showAllChildren: true)}',
+      '${tree.fromFiles(files, baseDir: entrypoint.root.dir, showFileSizes: true)}',
     );
 
     var packageBytesFuture =
diff --git a/test/ascii_tree_test.dart b/test/ascii_tree_test.dart
index 5d82d49..a4b0163 100644
--- a/test/ascii_tree_test.dart
+++ b/test/ascii_tree_test.dart
@@ -3,240 +3,102 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:pub/src/ascii_tree.dart' as tree;
+import 'package:pub/src/package.dart';
+import 'package:pub/src/utils.dart';
 import 'package:test/test.dart';
 
+import 'descriptor.dart';
+import 'golden_file.dart';
+import 'test_pub.dart';
+
 /// Removes ansi color codes from [s].
 String stripColors(String s) {
   return s.replaceAll(RegExp('\u001b\\[.*?m'), '');
 }
 
 void main() {
-  group('tree.fromFiles', () {
-    test('no files', () {
-      expect(stripColors(tree.fromFiles([])), equals(''));
-    });
-
-    test('up to ten files in one directory are shown', () {
-      var files = [
-        'dir/a.dart',
-        'dir/b.dart',
-        'dir/c.dart',
-        'dir/d.dart',
-        'dir/e.dart',
-        'dir/f.dart',
-        'dir/g.dart',
-        'dir/h.dart',
-        'dir/i.dart',
-        'dir/j.dart'
-      ];
-      expect(stripColors(tree.fromFiles(files)), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    |-- d.dart
-    |-- e.dart
-    |-- f.dart
-    |-- g.dart
-    |-- h.dart
-    |-- i.dart
-    '-- j.dart
-"""));
-    });
-
-    test('files are elided if there are more than ten', () {
-      var files = [
-        'dir/a.dart',
-        'dir/b.dart',
-        'dir/c.dart',
-        'dir/d.dart',
-        'dir/e.dart',
-        'dir/f.dart',
-        'dir/g.dart',
-        'dir/h.dart',
-        'dir/i.dart',
-        'dir/j.dart',
-        'dir/k.dart'
-      ];
-      expect(stripColors(tree.fromFiles(files)), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    | (5 more...)
-    |-- i.dart
-    |-- j.dart
-    '-- k.dart
-"""));
-    });
-
-    test('files are not elided at the top level', () {
-      var files = [
-        'a.dart',
-        'b.dart',
-        'c.dart',
-        'd.dart',
-        'e.dart',
-        'f.dart',
-        'g.dart',
-        'h.dart',
-        'i.dart',
-        'j.dart',
-        'k.dart'
-      ];
-      expect(stripColors(tree.fromFiles(files)), equals("""
-|-- a.dart
-|-- b.dart
-|-- c.dart
-|-- d.dart
-|-- e.dart
-|-- f.dart
-|-- g.dart
-|-- h.dart
-|-- i.dart
-|-- j.dart
-'-- k.dart
-"""));
-    });
-
-    test('a complex example', () {
-      var files = [
-        'TODO',
-        'example/console_example.dart',
-        'example/main.dart',
-        'example/web copy/web_example.dart',
-        'test/absolute_test.dart',
-        'test/basename_test.dart',
-        'test/dirname_test.dart',
-        'test/extension_test.dart',
-        'test/is_absolute_test.dart',
-        'test/is_relative_test.dart',
-        'test/join_test.dart',
-        'test/normalize_test.dart',
-        'test/relative_test.dart',
-        'test/split_test.dart',
-        '.gitignore',
-        'README.md',
-        'lib/path.dart',
-        'pubspec.yaml',
-        'test/all_test.dart',
-        'test/path_posix_test.dart',
-        'test/path_windows_test.dart'
-      ];
-
-      expect(stripColors(tree.fromFiles(files)), equals("""
-|-- .gitignore
-|-- README.md
-|-- TODO
-|-- example
-|   |-- console_example.dart
-|   |-- main.dart
-|   '-- web copy
-|       '-- web_example.dart
-|-- lib
-|   '-- path.dart
-|-- pubspec.yaml
-'-- test
-    |-- absolute_test.dart
-    |-- all_test.dart
-    |-- basename_test.dart
-    | (7 more...)
-    |-- path_windows_test.dart
-    |-- relative_test.dart
-    '-- split_test.dart
-"""));
-    });
+  setUp(() {
+    forceColors = ForceColorOption.always;
   });
 
-  group('treeFromMap', () {
-    test('empty map', () {
-      expect(stripColors(tree.fromMap({})), equals(''));
-    });
-
-    test('a complex example', () {
-      var map = {
-        '.gitignore': <String, Map>{},
-        'README.md': <String, Map>{},
-        'TODO': <String, Map>{},
-        'example': {
-          'console_example.dart': <String, Map>{},
-          'main.dart': <String, Map>{},
-          'web copy': {'web_example.dart': <String, Map>{}},
-        },
-        'lib': {'path.dart': <String, Map>{}},
-        'pubspec.yaml': <String, Map>{},
-        'test': {
-          'absolute_test.dart': <String, Map>{},
-          'basename_test.dart': <String, Map>{},
-          'dirname_test.dart': <String, Map>{},
-          'extension_test.dart': <String, Map>{},
-          'is_absolute_test.dart': <String, Map>{},
-          'is_relative_test.dart': <String, Map>{},
-          'join_test.dart': <String, Map>{},
-          'normalize_test.dart': <String, Map>{},
-          'relative_test.dart': <String, Map>{},
-          'split_test.dart': <String, Map>{}
-        }
-      };
-
-      expect(stripColors(tree.fromMap(map)), equals("""
-|-- .gitignore
-|-- README.md
-|-- TODO
-|-- example
-|   |-- console_example.dart
-|   |-- main.dart
-|   '-- web copy
-|       '-- web_example.dart
-|-- lib
-|   '-- path.dart
-|-- pubspec.yaml
-'-- test
-    |-- absolute_test.dart
-    |-- basename_test.dart
-    |-- dirname_test.dart
-    |-- extension_test.dart
-    |-- is_absolute_test.dart
-    |-- is_relative_test.dart
-    |-- join_test.dart
-    |-- normalize_test.dart
-    |-- relative_test.dart
-    '-- split_test.dart
-"""));
-    });
+  tearDown(() {
+    forceColors = ForceColorOption.auto;
+  });
+  test('tree.fromFiles no files', () {
+    expect(tree.fromFiles([], showFileSizes: true), equals(''));
   });
 
-  test('does not elide children if showAllChildren is true', () {
+  List<int> bytes(int size) => List.filled(size, 0);
+  testWithGolden('tree.fromFiles a complex example', colors: true, (ctx) async {
+    await dir(appPath, [
+      libPubspec('app', '1.0.0'),
+      file('TODO', bytes(10)),
+      dir('example', [
+        file('console_example.dart', bytes(1000)),
+        file('main.dart', bytes(1024)),
+        dir('web copy', [
+          file('web_example.dart', bytes(1025)),
+        ]),
+      ]),
+      dir('test', [
+        file('absolute_test.dart', bytes(0)),
+        file('basename_test.dart', bytes(1 << 20)),
+        file('dirname_test.dart', bytes((1 << 20) + 1)),
+        file('extension_test.dart', bytes(2300)),
+        file('is_absolute_test.dart', bytes(2400)),
+        file('is_relative_test.dart', bytes((1 << 20) * 25)),
+        file('join_test.dart', bytes(1023)),
+        file('normalize_test.dart', bytes((1 << 20) - 1)),
+        file('relative_test.dart', bytes(100)),
+        file('split_test.dart', bytes(1)),
+        file('all_test.dart', bytes(100)),
+        file('path_posix_test.dart', bytes(100)),
+        file('path_windows_test.dart', bytes(100)),
+      ]),
+      file('.gitignore', bytes(100)),
+      file('README.md', bytes(100)),
+      dir('lib', [
+        file('path.dart', bytes(100)),
+      ]),
+    ]).create();
+    var files = Package.load(
+      null,
+      path(appPath),
+      (name) => throw UnimplementedError(),
+    ).listFiles();
+    ctx.expectNextSection(
+        tree.fromFiles(files, baseDir: path(appPath), showFileSizes: true));
+  });
+  test('tree.fromMap empty map', () {
+    expect(tree.fromMap({}), equals(''));
+  });
+
+  testWithGolden('tree.fromMap a complex example', colors: true, (ctx) {
     var map = {
-      'dir': {
-        'a.dart': <String, Map>{},
-        'b.dart': <String, Map>{},
-        'c.dart': <String, Map>{},
-        'd.dart': <String, Map>{},
-        'e.dart': <String, Map>{},
-        'f.dart': <String, Map>{},
-        'g.dart': <String, Map>{},
-        'h.dart': <String, Map>{},
-        'i.dart': <String, Map>{},
-        'j.dart': <String, Map>{},
-        'k.dart': <String, Map>{},
-        'l.dart': <String, Map>{},
+      '.gitignore': <String, Map>{},
+      'README.md': <String, Map>{},
+      'TODO': <String, Map>{},
+      'example': {
+        'console_example.dart': <String, Map>{},
+        'main.dart': <String, Map>{},
+        'web copy': {'web_example.dart': <String, Map>{}},
+      },
+      'lib': {'path.dart': <String, Map>{}},
+      'pubspec.yaml': <String, Map>{},
+      'test': {
+        'absolute_test.dart': <String, Map>{},
+        'basename_test.dart': <String, Map>{},
+        'dirname_test.dart': <String, Map>{},
+        'extension_test.dart': <String, Map>{},
+        'is_absolute_test.dart': <String, Map>{},
+        'is_relative_test.dart': <String, Map>{},
+        'join_test.dart': <String, Map>{},
+        'normalize_test.dart': <String, Map>{},
+        'relative_test.dart': <String, Map>{},
+        'split_test.dart': <String, Map>{}
       }
     };
-    expect(stripColors(tree.fromMap(map, showAllChildren: true)), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    |-- d.dart
-    |-- e.dart
-    |-- f.dart
-    |-- g.dart
-    |-- h.dart
-    |-- i.dart
-    |-- j.dart
-    |-- k.dart
-    '-- l.dart
-"""));
+
+    ctx.expectNextSection(tree.fromMap(map));
   });
 }
diff --git a/test/golden_file.dart b/test/golden_file.dart
index 9db8ad0..3dcbfb6 100644
--- a/test/golden_file.dart
+++ b/test/golden_file.dart
@@ -46,10 +46,15 @@
   late String _header;
   final _results = <String>[];
   late bool _shouldRegenerateGolden;
+  final bool colors;
   bool _generatedNewData = false; // track if new data is generated
   int _nextSectionIndex = 0;
 
-  GoldenTestContext._(this._currentTestFile, this._testName) {
+  GoldenTestContext._(
+    this._currentTestFile,
+    this._testName, {
+    required this.colors,
+  }) {
     final rel = p.relative(
       _currentTestFile.replaceAll(RegExp(r'\.dart$'), ''),
       from: p.join(p.current, 'test'),
@@ -59,8 +64,8 @@
       'testdata',
       'goldens',
       rel,
-      // Sanitize the name, and add .txt
-      '${_testName.replaceAll(RegExp(r'[<>:"/\|?*%#]'), '~')}.txt',
+      // Sanitize the name, and add .ans or .txt.
+      '${_testName.replaceAll(RegExp(r'[<>:"/\|?*%#]'), '~')}.${colors ? 'ans' : 'txt'}',
     );
     _goldenFile = File(_goldenFilePath);
     _header = '# GENERATED BY: ${p.relative(_currentTestFile)}\n\n';
@@ -184,10 +189,12 @@
       s.writeln('\$ cd $directory');
     }
     s.writeln('\$ tree');
-    s.writeln(stripColors(ascii_tree.fromFiles(
+    final tree = ascii_tree.fromFiles(
       listDir(target, recursive: true),
       baseDir: target,
-    )));
+      showFileSizes: false,
+    );
+    s.writeln(colors ? tree : stripColors(tree));
 
     _expectSection(sectionIndex, s.toString());
   }
@@ -203,11 +210,20 @@
 ///   `test/testdata/goldens/path/to/myfile_test/<name>.txt`
 /// , when `path/to/myfile_test.dart` is the `_test.dart` file from which this
 /// function is called.
+///
+/// If [colors] is `true` the file will be created with an `.ans` extension that
+/// indicates ANSI colors will be used.
+///
+/// Such a file can eg. be viewed in vscode with this plugin:
+/// https://marketplace.visualstudio.com/items?itemName=iliazeus.vscode-ansi
 void testWithGolden(
-  String name,
-  FutureOr<void> Function(GoldenTestContext ctx) fn,
-) {
-  final ctx = GoldenTestContext._(_findCurrentTestFilename(), name);
+    String name, FutureOr<void> Function(GoldenTestContext ctx) fn,
+    {bool colors = false}) {
+  final ctx = GoldenTestContext._(
+    _findCurrentTestFilename(),
+    name,
+    colors: colors,
+  );
   test(name, () async {
     ctx._readGoldenFile();
     await fn(ctx);
diff --git a/test/testdata/goldens/ascii_tree_test/tree.fromFiles a complex example.ans b/test/testdata/goldens/ascii_tree_test/tree.fromFiles a complex example.ans
new file mode 100644
index 0000000..4ae381f
--- /dev/null
+++ b/test/testdata/goldens/ascii_tree_test/tree.fromFiles a complex example.ans
@@ -0,0 +1,26 @@
+# GENERATED BY: test/ascii_tree_test.dart
+
+|-- README.md (<1 KB)
+|-- TODO (<1 KB)
+|-- example
+|   |-- console_example.dart (<1 KB)
+|   |-- main.dart (1 KB)
+|   '-- web copy
+|       '-- web_example.dart (1 KB)
+|-- lib
+|   '-- path.dart (<1 KB)
+|-- pubspec.yaml (<1 KB)
+'-- test
+    |-- absolute_test.dart (<1 KB)
+    |-- all_test.dart (<1 KB)
+    |-- basename_test.dart (1 MB)
+    |-- dirname_test.dart (1 MB)
+    |-- extension_test.dart (2 KB)
+    |-- is_absolute_test.dart (2 KB)
+    |-- is_relative_test.dart (25 MB)
+    |-- join_test.dart (<1 KB)
+    |-- normalize_test.dart (1023 KB)
+    |-- path_posix_test.dart (<1 KB)
+    |-- path_windows_test.dart (<1 KB)
+    |-- relative_test.dart (<1 KB)
+    '-- split_test.dart (<1 KB)
diff --git a/test/testdata/goldens/ascii_tree_test/tree.fromMap a complex example.ans b/test/testdata/goldens/ascii_tree_test/tree.fromMap a complex example.ans
new file mode 100644
index 0000000..75932d7
--- /dev/null
+++ b/test/testdata/goldens/ascii_tree_test/tree.fromMap a complex example.ans
@@ -0,0 +1,24 @@
+# GENERATED BY: test/ascii_tree_test.dart
+
+|-- .gitignore
+|-- README.md
+|-- TODO
+|-- example
+|   |-- console_example.dart
+|   |-- main.dart
+|   '-- web copy
+|       '-- web_example.dart
+|-- lib
+|   '-- path.dart
+|-- pubspec.yaml
+'-- test
+    |-- absolute_test.dart
+    |-- basename_test.dart
+    |-- dirname_test.dart
+    |-- extension_test.dart
+    |-- is_absolute_test.dart
+    |-- is_relative_test.dart
+    |-- join_test.dart
+    |-- normalize_test.dart
+    |-- relative_test.dart
+    '-- split_test.dart
diff --git a/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt b/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt
index 9585341..30ff534 100644
--- a/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt
+++ b/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt
@@ -94,18 +94,18 @@
 ## Section 11
 $ pub publish -C myapp --dry-run
 Publishing test_pkg 1.0.0 to http://localhost:$PORT:
-|-- CHANGELOG.md
-|-- LICENSE
-|-- README.md
+|-- CHANGELOG.md (<1 KB)
+|-- LICENSE (<1 KB)
+|-- README.md (<1 KB)
 |-- bin
-|   '-- app.dart
+|   '-- app.dart (<1 KB)
 |-- example
-|   '-- pubspec.yaml
+|   '-- pubspec.yaml (<1 KB)
 |-- example2
-|   '-- pubspec.yaml
+|   '-- pubspec.yaml (<1 KB)
 |-- lib
-|   '-- test_pkg.dart
-'-- pubspec.yaml
+|   '-- test_pkg.dart (<1 KB)
+'-- pubspec.yaml (<1 KB)
 The server may enforce additional checks.
 [STDERR] 
 [STDERR] Package has 0 warnings.
diff --git a/test/testdata/goldens/lish/many_files_test/displays all files.txt b/test/testdata/goldens/lish/many_files_test/displays all files.txt
index 09a01da..81897c2 100644
--- a/test/testdata/goldens/lish/many_files_test/displays all files.txt
+++ b/test/testdata/goldens/lish/many_files_test/displays all files.txt
@@ -1,32 +1,32 @@
 # GENERATED BY: test/lish/many_files_test.dart
 
 Publishing test_pkg 1.0.0 to http://localhost:$PORT:
-|-- CHANGELOG.md
-|-- LICENSE
-|-- README.md
+|-- CHANGELOG.md (<1 KB)
+|-- LICENSE (<1 KB)
+|-- README.md (<1 KB)
 |-- lib
-|   |-- file_0.dart
-|   |-- file_1.dart
-|   |-- file_10.dart
-|   |-- file_11.dart
-|   |-- file_12.dart
-|   |-- file_13.dart
-|   |-- file_14.dart
-|   |-- file_15.dart
-|   |-- file_16.dart
-|   |-- file_17.dart
-|   |-- file_18.dart
-|   |-- file_19.dart
-|   |-- file_2.dart
-|   |-- file_3.dart
-|   |-- file_4.dart
-|   |-- file_5.dart
-|   |-- file_6.dart
-|   |-- file_7.dart
-|   |-- file_8.dart
-|   |-- file_9.dart
-|   '-- test_pkg.dart
-'-- pubspec.yaml
+|   |-- file_0.dart (<1 KB)
+|   |-- file_1.dart (<1 KB)
+|   |-- file_10.dart (<1 KB)
+|   |-- file_11.dart (<1 KB)
+|   |-- file_12.dart (<1 KB)
+|   |-- file_13.dart (<1 KB)
+|   |-- file_14.dart (<1 KB)
+|   |-- file_15.dart (<1 KB)
+|   |-- file_16.dart (<1 KB)
+|   |-- file_17.dart (<1 KB)
+|   |-- file_18.dart (<1 KB)
+|   |-- file_19.dart (<1 KB)
+|   |-- file_2.dart (<1 KB)
+|   |-- file_3.dart (<1 KB)
+|   |-- file_4.dart (<1 KB)
+|   |-- file_5.dart (<1 KB)
+|   |-- file_6.dart (<1 KB)
+|   |-- file_7.dart (<1 KB)
+|   |-- file_8.dart (<1 KB)
+|   |-- file_9.dart (<1 KB)
+|   '-- test_pkg.dart (<1 KB)
+'-- pubspec.yaml (<1 KB)
 
 Publishing is forever; packages cannot be unpublished.
 Policy details are available at https://pub.dev/policy