Skip to content

Instantly share code, notes, and snippets.

@iota9star
Last active September 17, 2024 10:22
Show Gist options
  • Save iota9star/19e001ae76178b41d0a9ae8139215790 to your computer and use it in GitHub Desktop.
Save iota9star/19e001ae76178b41d0a9ae8139215790 to your computer and use it in GitHub Desktop.

Revisions

  1. iota9star revised this gist Sep 17, 2024. 1 changed file with 12 additions and 8 deletions.
    20 changes: 12 additions & 8 deletions export.dart
    Original file line number Diff line number Diff line change
    @@ -31,20 +31,24 @@ Future<bool> createExport(Directory root, Directory dir, {String? fileName, bool
    }

    final dirName = fileName ?? path.basename(dir.path);
    final export = File(path.join(dir.path, '$dirName.dart'));
    final exports = [];
    final exportFileName = '$dirName.dart';
    final exportFile = File(path.join(dir.path, exportFileName));
    final exportParts = [];
    for (final child in children) {
    final basename = path.basename(child);
    if (basename != '$dirName.dart') {
    exports.add("export '$basename';");
    if (basename != exportFileName) {
    exportParts.add("export '$basename';");
    }
    }
    for (final d in dirs) {
    exports.add("export '$d/$d.dart';");
    exportParts.add("export '$d/$d.dart';");
    }
    exports.sort();
    export.writeAsStringSync(exports.join('\n'));
    print('Created: ${export.path.substring(root.path.length + 1)}');
    exportParts.sort();
    final sb = StringBuffer();
    exportParts.forEach(sb.writeln);
    sb.writeln();
    exportFile.writeAsStringSync(sb.toString());
    print('Created: ${exportFile.path.substring(root.path.length + 1)}');
    return true;
    }

  2. iota9star created this gist Sep 17, 2024.
    59 changes: 59 additions & 0 deletions export.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    import 'dart:convert';
    import 'dart:io';

    import 'package:path/path.dart' as path;

    Future<void> main() async {
    final root = Directory.current;
    final lib = Directory(path.join(root.path, 'lib'));
    final projectName = await getProjectName(root);
    createExport(lib, lib, fileName: projectName, skipChildren: true);
    }

    Future<bool> createExport(Directory root, Directory dir, {String? fileName, bool skipChildren = false}) async {
    final children = [];
    final dirs = [];
    for (final file in dir.listSync()) {
    if (file is Directory) {
    final has = await createExport(root, file);
    if (has) {
    dirs.add(path.basename(file.path));
    }
    } else if (!skipChildren) {
    if (file.path.endsWith('.dart') && !file.path.endsWith('.web.dart') && !await hasPartOf(file as File)) {
    children.add(file.path);
    }
    }
    }

    if (children.isEmpty && dirs.isEmpty) {
    return false;
    }

    final dirName = fileName ?? path.basename(dir.path);
    final export = File(path.join(dir.path, '$dirName.dart'));
    final exports = [];
    for (final child in children) {
    final basename = path.basename(child);
    if (basename != '$dirName.dart') {
    exports.add("export '$basename';");
    }
    }
    for (final d in dirs) {
    exports.add("export '$d/$d.dart';");
    }
    exports.sort();
    export.writeAsStringSync(exports.join('\n'));
    print('Created: ${export.path.substring(root.path.length + 1)}');
    return true;
    }

    Future<String> getProjectName(Directory root) async {
    final lines = File(path.join(root.path, 'pubspec.yaml')).openRead().transform(utf8.decoder).transform(const LineSplitter());
    final name = await lines.firstWhere((line) => line.startsWith('name:'));
    return name.split(':').last.trim();
    }

    Future<bool> hasPartOf(File file) async {
    return file.openRead().transform(utf8.decoder).transform(const LineSplitter()).any((line) => line.startsWith('part of'));
    }