addDataAssetDirectories method

Future<void> addDataAssetDirectories(
  1. List<String> paths, {
  2. required BuildInput input,
  3. bool recursive = false,
})

Extension on BuildOutput to handle data asset directories and files.

This extension provides a convenient way for build hooks to add DataAsset dependencies from one or more directories or individual files.

If any specified path does not exist, a FileSystemException is thrown. Any error during the directory listing is caught and rethrown with additional context.

When recursive is set to true, the method will also add all subdirectories and their files as dependencies.

Implementation

Future<void> addDataAssetDirectories(
  List<String> paths, {
  required BuildInput input,
  bool recursive = false,
}) async {
  String assetName(Uri assetUri) => assetUri
      .toFilePath(windows: false)
      .substring(input.packageRoot.toFilePath().length);

  for (final path in paths) {
    final resolvedUri = input.packageRoot.resolve(path);
    final directory = Directory.fromUri(resolvedUri);
    final file = File.fromUri(resolvedUri);

    if (await directory.exists()) {
      try {
        addDependency(directory.uri);
        await for (final entity in directory.list(
          recursive: recursive,
          followLinks: false,
        )) {
          if (entity is File) {
            assets.data.add(
              DataAsset(
                package: input.packageName,
                name: assetName(entity.uri),
                file: entity.uri,
              ),
            );
          }
          addDependency(entity.uri);
        }
      } on FileSystemException catch (e) {
        throw FileSystemException(
          'Error reading directory "$path": ${e.message}',
          directory.path,
          e.osError,
        );
      }
    } else if (await file.exists()) {
      assets.data.add(
        DataAsset(
          package: input.packageName,
          name: assetName(file.uri),
          file: file.uri,
        ),
      );
      addDependency(file.uri);
    } else {
      throw FileSystemException(
        'Path does not exist',
        resolvedUri.toFilePath(windows: Platform.isWindows),
      );
    }
  }
}