blob: 5630903771a12b868effacf98376b5fd55e3231c [file] [log] [blame] [edit]
import 'dart:io';
import 'package:source_maps/parser.dart';
import 'package:source_span/source_span.dart';
import 'dart2js_mapping.dart';
abstract class FileProvider {
String sourcesFor(Uri uri);
SourceFile fileFor(Uri uri);
Dart2jsMapping? mappingFor(Uri uri);
}
class CachingFileProvider implements FileProvider {
final Map<Uri, String> _sources = {};
final Map<Uri, SourceFile> _files = {};
final Map<Uri, Dart2jsMapping?> _mappings = {};
final Logger? logger;
CachingFileProvider({this.logger});
@override
String sourcesFor(Uri uri) =>
_sources[uri] ??= File.fromUri(uri).readAsStringSync();
@override
SourceFile fileFor(Uri uri) =>
_files[uri] ??= SourceFile.fromString(sourcesFor(uri));
@override
Dart2jsMapping? mappingFor(Uri uri) =>
_mappings[uri] ??= parseMappingFor(uri, logger: logger);
}
/// A provider that converts `http:` URLs to a `file:` URI assuming that all
/// files were downloaded on the current working directory.
///
/// Typically used when downloading the source and source-map files and applying
/// deobfuscation locally for debugging purposes.
class DownloadedFileProvider extends CachingFileProvider {
Uri _localize(Uri uri) {
if (uri.isScheme('http') || uri.isScheme('https')) {
String filename = uri.path.substring(uri.path.lastIndexOf('/') + 1);
return Uri.base.resolve(filename);
}
return uri;
}
@override
String sourcesFor(Uri uri) => super.sourcesFor(_localize(uri));
@override
SourceFile fileFor(Uri uri) => super.fileFor(_localize(uri));
@override
Dart2jsMapping? mappingFor(Uri uri) => super.mappingFor(_localize(uri));
}
class Logger {
final Set<String> _seenMessages = <String>{};
void log(String message) {
if (_seenMessages.add(message)) {
print(message);
}
}
}
var logger = Logger();
SingleMapping parseSingleMapping(Map json) => parseJson(json) as SingleMapping;