1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129## 1.4.3
* [CHORE] update Android Gradle Plugin to 9.0.0
## 1.4.2
* [FIX] implement `DecodeOptions.ListLimit` handling in `Utils.combine` function to prevent DoS via memory exhaustion
## 1.4.1
* [CHORE] update Kotlin to 2.3.0
## 1.4.0
* [FEAT] add `EncodeOptions.commaCompactNulls` to drop `null` values when using comma list format
## 1.3.4
* [CHORE] update Kotlin to 2.2.21
## 1.3.3
* [CHORE] update Android Gradle Plugin to 8.13.0
## 1.3.2
* [CHORE] update Kotlin to 2.2.20
* [CHORE] update Android Gradle Plugin to 8.12.3
* [CHORE] migrate to Gradle version catalog for dependency management
## 1.3.1
* [CHORE] update Android compileSdk to 36
## 1.3.0
* [BREAKING] `EncodeOptions.delimiter` now expects a `StringDelimiter` instead of a `String` for improved type safety
* [FEAT] add Java-friendly functional interfaces and factories for encoding, decoding, and filtering
## 1.2.3
* [CHORE] improve build reproducibility and enhance publication metadata
## 1.2.2
* [FIX] handle unterminated group when stashing remainder in key segmentation
* [CHORE] add tests for `splitKeyIntoSegments` remainder wrapping and `strictDepth` behavior
## 1.2.1
* [FIX] fix key decoding to treat dots consistently with values and update `DecodeOptions.decodeKey`/`DecodeOptions.decodeValue` visibility
* [FIX] handle encoded dots and nested brackets in key parsing for dot notation
* [FIX] remove unused `protectEncodedDotsForKeys` utility from `DecodeOptions`
* [CHORE] clarify `decodeDotInKeys` documentation and improve `DecodeOptions.decodeKey`/`DecodeOptions.decodeValue` convenience methods with default charset
* [CHORE] refactor `defaultDecode` signature to remove unused `DecodeKind` parameter in key decoding
* [CHORE]️ refactor dot-to-bracket conversion and key splitting to improve handling of top-level dots and bracket segments
* [CHORE] suppress deprecation warnings in `DecodeOptionsSpec`
* [CHORE] clarify documentation for encoded dot handling in key decoding and parser logic
* [CHORE] expand tests for key decoding with encoded dots and custom decoder behavior
* [CHORE] add comprehensive tests for encoded dot behavior in keys to ensure C# qs port (`QsNet`) parity and edge case coverage
* [CHORE] update `DecodeOptionsSpec` to use public decode method instead of `callDefaultDecode` reflection helper
* [CHORE] expand `DecodeSpec` coverage for encoded dot behavior in keys and C# qs port (`QsNet`) parity scenarios
## 1.2.0
* [FEAT] add `DecodeKind` enum to distinguish decoding context for keys and values
* [FEAT] add `LegacyDecoder` typealias and deprecate legacy decoder support in `DecodeOptions` for backward compatibility
* [FIX] protect encoded dots in key decoding to prevent premature conversion to '.' and ensure correct parsing
* [FIX] handle lowercase '%2e' in key decoding and improve bracketed key parsing for accurate dot conversion
* [FIX] fix key segment handling for depth 0 to preserve original key with encoded dots
* [FIX] optimize `protectEncodedDotsForKeys` to skip processing when no encoded dots are present; update deprecation message for `getDecoder` to clarify removal timeline
* [FIX] replace regex-based dot-to-bracket conversion with top-level parser to correctly handle encoded dots in key segments
* [FIX] fix `allowDots` logic to ensure `decodeDotInKeys` requires `allowDots` not explicitly false
* [CHORE] update deprecation annotation for indices option in `EncodeOptions` with message, replacement, and level
* [CHORE] add tests for key coercion and `depth=0` behavior with `allowDots` in `decode`
* [CHORE] update decoder tests to handle `DecodeKind` for selective key/value decoding
* [CHORE] remove explicit `Decoder` type annotations in custom decoder test cases for improved readability
* [CHORE] add tests for `defaultDecode` to verify encoded dot handling in keys with `allowDots` and `decodeDotInKeys` options
* [CHORE] clarify deprecation message for legacy decoder adapter and document bracket handling in `protectEncodedDotsForKeys`
* [CHORE] reformat deprecation and documentation comments for improved readability in `DecodeOptions`
* [CHORE] add comprehensive tests for encoded dot handling in keys with `allowDots` and `decodeDotInKeys` options
* [CHORE]️ deprecate `getDecoder` in favor of context-aware decode methods for value decoding
* [CHORE] update `Decoder` interface documentation to use code formatting for parameter names
* [CHORE] rename local variable for custom decoder in encoding test for clarity
* [CHORE] add tests for dot-to-bracket conversion guardrails in decode with `allowDots` option
## 1.1.3
* [FIX] ensure consistent string key usage for maps and correct numeric key handling in `Decoder`
## 1.1.2
* [FIX] change `HashMap` to `LinkedHashMap` in `Decoder.parseObject` for consistent iteration order
* [CHORE] update Android Gradle Plugin to v8.11.1
* [CHORE] add comparison tests with Node.js `qs` library to ensure compatibility with the original library
## 1.1.1
* [FEAT] add support for sparse Lists in `DecodeOptions` - if set to `true`, the lists will contain `null` values for missing values
* [FIX] fix parsing of negative integer indices in query strings by replacing `decodedRoot.all(Char::isDigit)` with `decodedRoot.toIntOrNull() != null` to properly handle negative numbers
* [FIX] fix merge semantics for `Map` targets: ignore `null`/`Undefined` sources and treat scalar sources as flag keys (`map[k] = true`) instead of merging—prevents accidental `"Undefined"` keys and duplicate `[true, true]` entries
* [CHORE] add comprehensive unit tests for query string encoding and decoding ported from https://github.com/atek-software/qsparser
## 1.1.0
* [CHORE] replace `QS` with top-level `encode` and `decode` functions for improved clarity
* [CHORE] refactor to use internal `Utils`, `Encoder` and `Decoder` for improved structure
## 1.0.4
* [FEAT] add `@JvmOverloads` annotation to decoder and encoder functions for improved Java interoperability
## 1.0.3
* [FEAT] add `@JvmStatic` to `QS.encode` and `QS.decode` methods to enable Java-friendly static calls
## 1.0.2
* [FIX] replace `URLDecoder.decode(String, Charset)` (API 33+) with `URLDecoder.decode(String, String)` to restore Android compatibility (minSdk 25)
* [CHORE] improve code readability by simplifying conditional expressions and comments
## 1.0.1
* [CHORE] Update Kotlin version to 2.0.21.
## 1.0.0
* [CHORE] Initial release of the project.