Repository navigation
[pubspec_parse] Preserve input maps and YamlMap source spans - #2653
Conversation
…nt: true When `Pubspec.fromJson` is called with `lenient: true`, avoid removing the required `'name'` key on error, and re-bind any top-level `CheckedFromJsonException` thrown on a modified map copy back to the original `json` (`YamlMap`) so `toParsedYamlException` in `package:checked_yaml` does not fail with a `TypeError` (`_Map is not a subtype of YamlMap`).
- In `parseDeps`, only re-bind `CheckedFromJsonException.map` when the dependency value is not a `Map`, or when `source` is a `YamlMap` and `e.map` is not a `YamlMap` (so `Pubspec.fromJson` with plain Dart `Map`s preserves nested map/key context).
- In `GitDependency.fromData` and `HostedDetails.fromJson`, parse string values directly instead of wrapping them in synthetic `{'url': data}` plain maps that lost `YamlMap` source spans.
PR HealthCoverage ✔️
This check for test coverage is informational (issues shown here will not fail the PR). This check can be disabled by tagging the PR with License Headers ✔️
All source files should start with a license header. Unrelated files missing license headers
This check can be disabled by tagging the PR with Breaking changes ✔️
This check can be disabled by tagging the PR with Unused Dependencies ✔️
For details on how to fix these, see dependency_validator. This check can be disabled by tagging the PR with API leaks ✔️The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.
This check can be disabled by tagging the PR with Changelog Entry ✔️
Changes to files need to be accounted for in their respective changelogs. This check can be disabled by tagging the PR with |
There was a problem hiding this comment.
Code Review
This pull request improves error handling and parsing behavior in pubspec_parse. Specifically, it fixes Pubspec.fromJson with lenient: true to preserve the input Map when the name is invalid or missing, and ensures nested Map keys and spans are preserved when dependency shorthands fail to parse. Feedback on the changes suggests removing an unnecessary null assertion operator (!) on e.className when throwing a CheckedFromJsonException to prevent potential runtime exceptions.
…, web Revisions updated by `dart tools/rev_sdk_deps.dart`. core (https://github.com/dart-lang/core/compare/4d80610..72e71ca): 72e71ca0 Mon Oct 19 21:57:11 2026 +0200 Jonas Finnemann Jensen Optimize `HashSink` and `_MD5Sink.updateHash` (RFC impl) (dart-lang/core#1013) dartdoc (https://github.com/dart-lang/dartdoc/compare/e1859cf..c0e19cf): c0e19cf6 Mon Oct 19 11:41:42 2026 -0700 Konstantin Scheglov Import analyzer ast with explicit show. (dart-lang/dartdoc#4300) ecosystem (https://github.com/dart-lang/ecosystem/compare/622ef61..0ab0cfd): 0ab0cfd Mon Oct 19 15:44:26 2026 +0200 Moritz fix(firehose): bump dependency_validator to support analyzer 14 (dart-lang/ecosystem#453) 44a0768 Wed Oct 14 09:37:29 2026 -0700 Nate Bosch Improve firehose publish validation log output (dart-lang/ecosystem#468) http (https://github.com/dart-lang/http/compare/7d7aae2..a8a24a0): a8a24a0 Mon Oct 19 13:31:34 2026 -0700 Kevin Moore docs(web_socket): remove non-user-visible changelog entry (dart-lang/http#2023) 6f6ac5f Mon Oct 19 16:29:43 2026 -0400 Mouad Debbar [http_multi_server] Retry `loopback(0)` when IPv6 port is already bound (dart-lang/http#2025) 6e91ce3 Tue Oct 13 16:25:39 2026 -0700 Kevin Moore Sync root README.md package table from pubspec.yaml files (dart-lang/http#2024) native (https://github.com/dart-lang/native/compare/cc7e4b0..3cbe319): 3cbe319e3 Tue Oct 13 15:47:18 2026 +0200 Daco Harkes [hooks_runner] Fail eagerly when file locking is not supported on file system (dart-lang/native#3679) shelf (https://github.com/dart-lang/shelf/compare/b2cb503..b66665b): b66665b Fri Oct 16 15:12:05 2026 -0700 Kevin Moore chore: add health workflow and prepare shelf 1.4.3, shelf_router 1.1.5, and shelf_static 1.2.0 (dart-lang/shelf#546) test (https://github.com/dart-lang/test/compare/9bf69a8..d1afeb1): d1afeb14 Fri Oct 16 20:41:51 2026 -0400 Mouad Debbar Confirmation that `tearDown` is called on timeout (dart-lang/test#2798) 3f6c2f14 Thu Oct 15 18:21:35 2026 -0700 Jacob MacDonald Enable asserts in the cli compiler (dart-lang/test#2795) tools (https://github.com/dart-lang/tools/compare/c1471db..f6c7a2d): f6c7a2d62 Mon Oct 19 07:59:24 2026 -0700 Kevin Moore [pubspec_parse] Preserve input maps and YamlMap source spans (dart-lang/tools#2653) f1a55d953 Mon Oct 19 07:53:51 2026 -0700 Kevin Moore [yaml] Fix tag URI decoding, numeric tag RangeErrors, and dead checks (dart-lang/tools#2630) 340ded284 Mon Oct 19 07:43:31 2026 -0700 Kevin Moore [unified_analytics] Prepare for 8.2.0 release (dart-lang/tools#2689) a73703543 Fri Oct 16 11:55:03 2026 -0700 Kevin Moore [unified_analytics] Bump version to 8.2.0-wip (dart-lang/tools#2688) web (https://github.com/dart-lang/web/compare/63e6662..4e60e61): 4e60e61 Mon Oct 19 10:02:22 2026 -0700 dependabot[bot] Bump source-map-js from 1.2.1 to 1.2.2 in /web_generator (dart-lang/web#591) 7d63637 Mon Oct 19 09:50:26 2026 -0700 Kevin Moore Add an api.txt golden for package:web (dart-lang/web#590) [email protected] Change-Id: Ibe6ac8a8246a27caa8a4846ea1acc78c801ee2ae Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/566781 Commit-Queue: Nate Bosch <[email protected]> Reviewed-by: Brian Quinlan <[email protected]>
Preserve the original
jsonmap reference andYamlMapsource spans acrossPubspec.fromJson(lenient: true) anddependency.dart:lib/src/pubspec.dart(Pubspec.fromJson):jsonpointing to the caller's originalMap(typically aYamlMapfromcheckedYamlDecode) and mutate a localvar currentJson = json;in thelenientretry loop.'name'key whenlenient: true, preventingtoParsedYamlExceptioninpackage:checked_yamlfrom failing withtype '_Map<dynamic, dynamic>' is not a subtype of type 'YamlMap'when'name'is missing, null, or empty.CheckedFromJsonExceptionis thrown against a modifiedcurrentJsoncopy (for example,name: ""failing validation in thePubspec(...)constructor after an earlier pass stripped an invalid optional property), re-binde.mapback to the originaljsonYamlMapso source spans are preserved.lib/src/dependency.dart(parseDeps,GitDependency.fromData,HostedDetails.fromJson):parseDeps, only re-bindCheckedFromJsonException.mapwhen the dependency value is not aMap, or whensourceis aYamlMapande.mapis not aYamlMap(preserving nested map/key context whenPubspec.fromJsonis called with plain DartMaps).GitDependency.fromDataandHostedDetails.fromJson, parse string values directly instead of wrapping them in synthetic{'url': data}plain maps that lostYamlMapsource spans.