// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Loads a source map file and outputs a human-readable version of it. library load; import 'dart:convert'; import 'dart:io'; import 'package:source_maps/source_maps.dart'; void main(List args) { if (args.isEmpty) { print(''' Usage: load or: load []'''); exit(1); } File? humanReadableSourceMapFile; File sourceMapFile; if (args.length == 1 && Directory(args[0]).existsSync()) { humanReadableSourceMapFile = File('${args[0]}/out.js.map2'); sourceMapFile = File('${args[0]}/out.js.map'); } else { sourceMapFile = File(args[0]); if (args.length > 1) { humanReadableSourceMapFile = File(args[1]); } } mainInternal(sourceMapFile, humanReadableSourceMapFile); } void mainInternal(File sourceMapFile, File? humanReadableSourceMapFile) { SingleMapping sourceMap = SingleMapping.fromJson( json.decode(sourceMapFile.readAsStringSync()), ); String humanReadableSourceMap = convertToHumanReadableSourceMap(sourceMap); if (humanReadableSourceMapFile != null) { humanReadableSourceMapFile.writeAsStringSync(humanReadableSourceMap); } else { print(humanReadableSourceMap); } } String convertToHumanReadableSourceMap(SingleMapping sourceMap) { StringBuffer sb = StringBuffer(); sb.write('{\n'); sb.write(' "file": "${sourceMap.targetUrl}",\n'); sb.write(' "sourceRoot": "${sourceMap.sourceRoot}",\n'); sb.write(' "sources": {\n'); for (int index = 0; index < sourceMap.urls.length; index++) { if (index > 0) { sb.write(',\n'); } sb.write(' "$index": "${sourceMap.urls[index]}"'); } sb.write('\n },\n'); sb.write(' "lines": [\n'); bool needsComma = false; for (int lineIndex = 0; lineIndex < sourceMap.lines.length; lineIndex++) { TargetLineEntry lineEntry = sourceMap.lines[lineIndex]; int line = lineEntry.line + 1; for ( int entryIndex = 0; entryIndex < lineEntry.entries.length; entryIndex++ ) { TargetEntry entry = lineEntry.entries[entryIndex]; int columnStart = entry.column + 1; int? columnEnd; String position; if (entryIndex + 1 < lineEntry.entries.length) { columnEnd = lineEntry.entries[entryIndex + 1].column + 1; position = '$line,$columnStart-$columnEnd'; } else { position = '$line,$columnStart-'; } if (entry.sourceUrlId != null || columnEnd == null) { if (needsComma) { sb.write(',\n'); } sb.write(' {"target": "$position"'); if (entry.sourceUrlId != null) { int sourceUrlId = entry.sourceUrlId!; int sourceLine = entry.sourceLine! + 1; int sourceColumn = entry.sourceColumn! + 1; sb.write(', "source": "$sourceUrlId:$sourceLine,$sourceColumn"'); if (entry.sourceNameId != null) { sb.write(', "name": "${sourceMap.names[entry.sourceNameId!]}"'); } } sb.write('}'); needsComma = true; } } } sb.write('\n ]\n'); sb.write('}'); return sb.toString(); }