NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1053 most downloaded on pub.dev
A query string encoding and decoding library for Dart. Ported from qs for JavaScript.
Last release 8 days ago
29 Sep 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 58 of 58 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
58 releases · first in 2024
[FEAT] add an opt-in EncodeOptions.depth limit for Node qs 6.16.0 stringify parity
EncodeOptions.depth limit for Node qs 6.16.0 stringify parityencodeDotInKeys is enabledDateTime values, including dates in comma-format lists[]= before splitting[CHORE] upgrade GitHub Actions setup-node from v6 to v7
setup-node from v6 to v7Equatable dependency compatibility to include v3 while retaining v2 supportOne column per month.
[CHORE] update Equatable from 2.0.7 to 2.1.0
Equatable from 2.0.7 to 2.1.0EquatableMixin with Equatable across option and internal model classes[FIX] match Node qs 6.15.3 cumulative list-limit enforcement across duplicate-key combinations and mixed list merges
qs 6.15.3 cumulative list-limit enforcement across duplicate-key combinations and mixed list mergesthrowOnLimitExceeded is enabledqs 6.15.3 regression coverage for unbalanced bracket keys, chunk-boundary surrogate pairs, and cyclic compaction[BREAKING] stop exporting the internal Undefined sentinel from the public API
Undefined sentinel from the public API[CHORE] improve decode internals readability with clearer helper extraction, comments, formatting, and local type annotations
QS entry-point internals readability with clearer naming, comments, and local type annotationsByteBuffer decoding logic in the encoder internals and tighten nearby comments[FEAT] add DecodeOptions.strictMerge for Node qs strictMerge parity, defaulting to object/scalar array wrapping while supporting legacy scalar-key mer
DecodeOptions.strictMerge for Node qs strictMerge parity, defaulting to object/scalar array wrapping while supporting legacy scalar-key merge modeqs 6.14.2 list-limit semantics for indexed notation, comma-list overflow, and mixed overflow mapsqs 6.15.0 duplicate handling so bracket notation combines regardless of the selected duplicate strategyparameterLimit: double.infinity and throwOnLimitExceeded: trueqs 6.15.2 bracket parsing behavior for nested/literal bracket groups, encoded bracket text, and allowDots with depth: 0qs 6.15.2 stringify edge cases for charset sentinel delimiters, strict-null RFC1738 formatting, comma-list null slots, and null filter entries[FIX] restore Dart 3.0.0 test compatibility by materializing ByteBuffer fixtures via _byteBufferFrom instead of relying on List<int>.buffer
ByteBuffer fixtures via _byteBufferFrom instead of relying on List<int>.bufferlints dev dependency range to support versions from 3.0.0 up to 7.0.0[PERF] speed up decode for flat and mixed query workloads via structured-key pre-scan, flat-query early return, and parse/merge bypass when safe
[] map input, scalar→list transitions, and ignoring []= substrings inside values)tool/decode_perf_snapshot.dart for repeatable decode perf snapshots and remove obsolete JS-style slice list/string extensions[PERF] optimize deep encode=false workloads with a guarded single-key linear map fast path, segment-string reuse, and lower-allocation top-level fragm
encode=false workloads with a guarded single-key linear map fast path, segment-string reuse, and lower-allocation top-level fragment assemblyKeyPathNode.materialize() linear-time by replacing per-step toString() materialization with one final string buildtool/perf_snapshot.dart for repeatable deep encode snapshots (2000/5000/12000, median-of-7 with warmup)[FIX] restore robust cyclic detection when filter callbacks wrap values in fresh containers by tracking object identity before filter/date transformat
filter callbacks wrap values in fresh containers by tracking object identity before filter/date transformationsKeyPathNode caching (avoids recursive overflow risk and reuses ancestor caches)EncodeConfig and reduce per-frame option duplicationweak_map usage in encode cycle tracking with identity-based Set<Object> side-channel and remove weak_map dependencyKeyPathNode caching/encoding edge cases, and EncodeConfig.copyWith sentinel behaviorcleanRoot.contains('%2'))[FEAT] add DecodeOptions.throwOnLimitExceeded for strict limit enforcement on parameter, list, and depth overflows
DecodeOptions.throwOnLimitExceeded for strict limit enforcement on parameter, list, and depth overflowsByteBuffer values to match Node Buffer.toString('utf8')ByteBuffer values via charset even when encode=false (avoid Instance of 'ByteBuffer' output)Utils.encode consistently throws ArgumentErrorparseLists=false, and non-mutating list/set merges)EncodeFrame, MergeFrame, MergePhase) for deep-nesting safetyFakeEncoding test helper[FIX] prevent DecodeOptions.listLimit bypass in bracket notation to mitigate potential DoS via memory exhaustion
DecodeOptions.listLimit bypass in bracket notation to mitigate potential DoS via memory exhaustion[FEAT] add EncodeOptions.commaCompactNulls, allowing omission of null entries in lists when using the ListFormat.comma. This results in cleaner output
EncodeOptions.commaCompactNulls, allowing omission of null entries in lists when using the ListFormat.comma. This results in cleaner output (e.g., [true, false, null, true] becomes "true,false,true").[CHORE] add highlights section outlining key features to README
[CHORE] add screenshots section with package logo to pubspec.yaml
[CHORE] add issue tracker and funding links to pubspec.yaml
[FIX] fix handling of degenerate dot cases in key splitting logic
[FIX] enforce decodeDotInKeys and allowDots option consistency; clarify dot decoding in documentation
decodeDotInKeys and allowDots option consistency; clarify dot decoding in documentationallowDots and decodeDotInKeys consistency in DecodeOptionsDecodeOptions to support legacy decoders and unify decode logic; add decodeKey/decodeValue helpersDecodeOptionsDecodeKind from qs.dartDecodeOptions docs for allowDots and decodeDotInKeys interaction; improve charsetSentinel and decoder behavior descriptionsDecodeOptions; remove dynamic invocation and legacy overloadsDecodeKind; remove legacy dynamic invocation casesallowDots=truelistLimit behavior and list growth checks in decode logic commentslistLimit negative value behavior and throwOnLimitExceeded interaction in decode options commentslistLimit in decode logic comments[FIX] fix decoder type and include throwOnLimitExceeded in equality check
decoder type and include throwOnLimitExceeded in equality check[FEAT] add key-aware decoding capability to the query string decoder via DecodeKind
DecodeKind[FIX] optimize map merging and percent-encoding logic in Utils
UtilsUtils- [CHORE] improve documentation
[CHORE] enhance type safety and improve readability in Utils.compact method
Utils.compact method[CHORE] improve decode performance
decode performance[FIX] make encode.objKeys late final to ensure immutability
encode.objKeys late final to ensure immutability[FIX] enforce non-nullable serializeDate in EncodeOptions
serializeDate in EncodeOptionsserializeDate related tests[CHORE] re-release 1.3.7 due to a Github Actions issue
[FIX] fix Lists with indices always getting parsed into a Map
[FIX] respect Uri.toStringQs encode options
Uri.toStringQs encode options[FEAT] make QS.encode parameter for EncodeOptions optional
QS.encode parameter for EncodeOptions optionalQS.decode parameter for DecodeOptions optional[CHORE] fix URL-formatting in readme
[CHORE] refactor QS.encode logic for improved readability and efficiency
QS.encode logic for improved readability and efficiency[FIX] fix Utils.unescape for % characters
Utils.unescape for % characters (#28)[FEAT] use Utils.combine more in QS.decode
Utils.combine more in QS.decode[FEAT] add DecodeOptions.throwOnLimitExceeded option
DecodeOptions.throwOnLimitExceeded option (#26)Utils[CHORE] update lints to 5.0.0 (was 4.0.0)
[FIX] QS.decode: avoid a crash with interpretNumericEntities: true, comma: true, and charset: latin1
QS.decode: avoid a crash with interpretNumericEntities: true, comma: true, and charset: latin1[FEAT] add DecodeOptions.strictDepth option to throw when input is beyond depth
DecodeOptions.strictDepth option to throw when input is beyond depth (#22)[FIX] fix QS.decode output when both strictNullHandling and allowEmptyLists are set to true
QS.decode output when both strictNullHandling and allowEmptyLists are set to true (#21)[FEAT] QS.decode returns Map instead of Map
[FEAT] DateSerializer now returns String or null
DateSerializer now returns String or null- [CHORE] add documentation
[FIX] incorrect parsing of nested params with closing square bracket ] in the property name
] in the property name (#12)[CHORE] update readme / documentation
[FEAT] port String.prototype.slice() from JavaScript and use that instead of Dart's String.substring()
String.prototype.slice() from JavaScript and use that instead of Dart's String.substring()[FIX] fix optimization regressions introduced in v1.0.7
[FIX] disable DecodeOptions.decodeDotInKeys by default to restore previous behavior
DecodeOptions.decodeDotInKeys by default to restore previous behavior[CHORE] rename _encode.allowEmptyArrays to _encode.allowEmptyLists
Sets_encode.allowEmptyArrays to _encode.allowEmptyListsUtils.removeUndefinedFromList methodUtils.merge method[CHORE] get rid of unused filter variable in QS.encode method
filter variable in QS.encode method[FIX] prevent Utils.encode method from encoding Iterable, Map, Symbol, Record, Future and Undefined
Utils.encode method from encoding Iterable, Map, Symbol, Record, Future and Undefined[FIX] fix Utils.isNonNullishPrimitive method to enable encoding Enums
Utils.isNonNullishPrimitive method to enable encoding Enums[FEAT] add equatability to Undefined
[CHORE] lower meta dependency from ^1.11.0 to ^1.9.1
- [CHORE] update documentation
- [CHORE] add documentation
[FIX] fix repository url in pubspec.yaml
- Initial release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →