Handle null names field when parsing source map files (dart-lang/source_maps#40)

The field is required by the spec, but we can be more lenient.
diff --git a/pkgs/source_maps/lib/parser.dart b/pkgs/source_maps/lib/parser.dart
index 124ef6d..e3044aa 100644
--- a/pkgs/source_maps/lib/parser.dart
+++ b/pkgs/source_maps/lib/parser.dart
@@ -341,7 +341,7 @@
   SingleMapping.fromJson(Map map, {mapUrl})
       : targetUrl = map['file'],
         urls = List<String>.from(map['sources']),
-        names = List<String>.from(map['names']),
+        names = List<String>.from(map['names'] ?? []),
         files = List(map['sources'].length),
         sourceRoot = map['sourceRoot'],
         lines = <TargetLineEntry>[],
diff --git a/pkgs/source_maps/test/parser_test.dart b/pkgs/source_maps/test/parser_test.dart
index 275efd3..45ac52d 100644
--- a/pkgs/source_maps/test/parser_test.dart
+++ b/pkgs/source_maps/test/parser_test.dart
@@ -28,6 +28,14 @@
   'file': 'output.dart'
 };
 
+const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_MISSING_NAMES = {
+  'version': 3,
+  'sourceRoot': '',
+  'sources': ['input.dart'],
+  'mappings': 'AAAA',
+  'file': 'output.dart'
+};
+
 const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME = {
   'version': 3,
   'sourceRoot': '',
@@ -121,6 +129,20 @@
     expect(entry.sourceNameId, null);
   });
 
+  test('parse with source location and missing names entry', () {
+    SingleMapping map =
+        parse(jsonEncode(MAP_WITH_SOURCE_LOCATION_AND_MISSING_NAMES));
+    expect(map.lines.length, 1);
+    expect(map.lines.first.entries.length, 1);
+    var entry = map.lines.first.entries.first;
+
+    expect(entry.column, 0);
+    expect(entry.sourceUrlId, 0);
+    expect(entry.sourceColumn, 0);
+    expect(entry.sourceLine, 0);
+    expect(entry.sourceNameId, null);
+  });
+
   test('parse with source location and name', () {
     SingleMapping map = parse(jsonEncode(MAP_WITH_SOURCE_LOCATION_AND_NAME));
     expect(map.lines.length, 1);