Fix trailing comma when adding to flow collections in yaml_edit (#2533) Fixes https://github.com/dart-lang/tools/issues/2532 ### Problem When appending elements to a flow list (`[...]`) or adding keys to a flow map (`{...}`) that contains a trailing comma, `yaml_edit` unconditionally prepended a comma without checking for the existing trailing comma. This produced invalid double-comma syntax (e.g. `, \n , android/**]`), failing internal YAML parsing validation with an assertion error. Furthermore, multiline flow collections with trailing commas had their newly appended elements and closing delimiters misaligned on column 0. ### Solution 1. **Trailing Comma Detection**: - Added `betweenHasTrailingComma` in `pkgs/yaml_edit/lib/src/utils.dart` to check if a comma exists between the last element and the closing delimiter while ignoring comments (`# ...`). - If a trailing comma is present, `_appendToFlowList` and `_addToFlowMap` avoid prepending an extra comma and preserve the trailing comma style. 2. **Multiline Indentation Alignment**: - Added `formatMultilineFlowTrailingEntry` in `pkgs/yaml_edit/lib/src/utils.dart` to calculate the indentation difference between collection elements and the closing delimiter. - Newly appended items in multiline flow lists and maps are now indented to match preceding entries, with the closing delimiter remaining on its own indented line. 3. **Tests**: - Added unit tests covering multiline flow lists/maps with and without trailing commas, comments, and nested structures in `pkgs/yaml_edit/test/append_test.dart` and `pkgs/yaml_edit/test/update_test.dart`. 4. **Changelog**: - Updated `pkgs/yaml_edit/CHANGELOG.md`.
This repository is home to tooling related Dart packages. Generally, this means packages published through the tools.dart.dev publisher that don't naturally belong to other topic monorepos (like dart-lang/build, dart-lang/test, or dart-lang/shelf).
| Package | Description | Issues | Version |
|---|---|---|---|
| api_summary | Creates an API summary for a package. | ||
| bazel_worker | Protocol and utilities to implement or invoke persistent bazel workers. | ||
| benchmark_harness | The official Dart project benchmark harness. | ||
| boolean_selector | A flexible syntax for boolean expressions, based on a simplified version of Dart's expression syntax. | ||
| browser_launcher | Provides a standardized way to launch web browsers for testing and tools. | ||
| cli_config | A library to take config values from configuration files, CLI arguments, and environment variables. | ||
| cli_util | A library to help in building Dart command-line apps. | ||
| clock | A fakeable wrapper for dart:core clock APIs. | ||
| code_builder | A fluent, builder-based library for generating valid Dart code. | ||
| coverage | Coverage data manipulation and formatting | ||
| csslib | A library for parsing and analyzing CSS (Cascading Style Sheets). | ||
| extension_discovery | A convention and utilities for package extension discovery. | ||
| file | A pluggable, mockable file system abstraction for Dart. | ||
| file_testing | Testing utilities for package:file. | ||
| glob | A library to perform Bash-style file and directory globbing. | ||
| graphs | Graph algorithms that operate on graphs in any representation. | ||
| html | APIs for parsing and manipulating HTML content outside the browser. | ||
| io | Utilities for the Dart VM Runtime including support for ANSI colors, file copying, and standard exit code values. | ||
| json_rpc_2 | Utilities to write a client or server using the JSON-RPC 2.0 spec. | ||
| markdown | A portable Markdown library written in Dart that can parse Markdown into HTML. | ||
| mime | Utilities for handling media (MIME) types, including determining a type from a file extension and file contents. | ||
| oauth2 | A client library for authenticating with a remote service via OAuth2 on behalf of a user, and making authorized HTTP requests with the user's OAuth2 credentials. | ||
| package_config | Support for reading and writing Dart Package Configuration files. | ||
| pool | Manage a finite pool of resources. Useful for controlling concurrent file system or network requests. | ||
| process | A pluggable, mockable process invocation abstraction for Dart. | ||
| pub_semver | Versions and version constraints implementing pub's versioning policy. This is very similar to vanilla semver, with a few corner cases. | ||
| pubspec_parse | Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting. | ||
| source_map_stack_trace | A package for applying source maps to stack traces. | ||
| source_maps | A library to programmatically manipulate source map files. | ||
| source_span | Provides a standard representation for source code locations and spans. | ||
| sse | Provides client and server functionality for setting up bi-directional communication through Server Sent Events (SSE) and corresponding POST requests. | ||
| stack_trace | A package for manipulating stack traces and printing them readably. | ||
| stream_channel | An abstraction for two-way communication channels based on the Dart Stream class. | ||
| stream_transform | A collection of utilities to transform and manipulate streams. | ||
| string_scanner | A class for parsing strings using a sequence of patterns. | ||
| term_glyph | Useful Unicode glyphs and ASCII substitutes. | ||
| test_reflective_loader | Support for discovering tests and test suites using reflection. | ||
| timing | A simple package for tracking the performance of synchronous and asynchronous actions. | ||
| unified_analytics | A package for logging analytics for all Dart and Flutter related tooling to Google Analytics. | ||
| watcher | A file system watcher. It monitors changes to contents of directories and sends notifications when files have been added, removed, or modified. | ||
| yaml | A parser for YAML, a human-friendly data serialization standard | ||
| yaml_edit | A library for YAML manipulation with comment and whitespace preservation. |
For information about our publishing automation and release process, see https://github.com/dart-lang/ecosystem/wiki/Publishing-automation.
For additional information about contributing, see our contributing page.