Release History¶
This page mirrors the project CHANGELOG.md.
The format follows Keep a Changelog, and the project adheres
to Semantic Versioning.
0.4.0 — 2026-07-21¶
Changed¶
- Replaced kPointer's ad-hoc "dot notation" with the JavaScript access path (
jsPath) — the static member-access subset of JavaScript used by tools like Vega-Lite'sencoding.*.fieldaccessors (dot, quoted-bracket, numeric-bracket, with backslash escaping).fromJsPath/toJsPathreplacefromDotNotation/toDotNotationinkpointer-core, andKPointer.from()'s bare-string branch now dispatches tofromJsPath— sofrom("foo[0]")array-indexes instead of yielding the literal key"foo[0]". The notation count stays at three (RFC 6901, URI fragment, jsPath); this is a clean replacement, not an addition, since kPointer has no published consumers yet.ConformanceCapabilities.dotNotationis renamed tojsPathto match. TheKP-1004error code is reused (not retired) for jsPath's single collapsed "malformed" error, generalizing its old "dot-notation produced an empty segment" meaning. The conformance suite bumps to0.2.0accordingly — see the Conformance Changelog. - Upgraded to Kotlin 2.4.10 (and the matching
1.0.1-K2.4.0TestBalloon release). TheabiValidation {}DSL migrated fromabiValidation { enabled.set(true) }to a bareabiValidation(), following the Kotlin 2.4.0 removal of theenabledproperty. Committed ABI dumps were unaffected by the bump. - The root
detektAllaggregate (used byhostCheck, not the per-moduledetekttask) now analyzes test source as well as main source, closing a gap where test code went unlinted.
Fixed¶
hostTestandhostChecknow use Gradle's lazyTaskCollection.matching()to find each submodule's per-target test/verification tasks, instead of eagerly checking task names againstsubprojects.tasks.names. The eager form could throw when a submodule lacked one of the checked tasks (e.g. a JVM-only module with nocheckKotlinAbitask);checkAbi/updateAbiwere hardened the same way.
0.3.0 — 2026-07-18¶
Added¶
- The conformance suite is now a versioned, distributable artifact. Its schema
$ids resolve live on this site, and the whole suite ships as a downloadable, checksummed ZIP per version. See Distribution and the Conformance Changelog. - Portable conformance testing across the reference modules.
kpointer-corenow drives its own tests from the portableconformance/syntax/*fixtures, andkpointer-adapterfromconformance/algorithm/*, each against its own public API. A green 100% koverGate on either module is therefore a proxy for "every branch is exercised by a portable fixture." The:kpointer-conformancemodule's own syntax/relative tests were retired — already covered by:kpointer-core— but the module itself remains, now published as the conformance-suite runner for adapter authors. - Public canonical error mapping. The mapping from
KPointerExceptionsubtypes (inkpointer-core) andKpaAccessErrorsubtypes (inkpointer-adapter) to canonicalerrorCodestrings is now public API ascanonicalErrorCode(), reused by the conformance runners. - Typed error taxonomy for conformance. A sealed
KPointerExceptionfamily (parse/relative) and a sealedKpaAccessErrorfamily (resolve/mutate), each subtype extending the standard-library exception it replaces so existingcatchsites are unaffected. Conformance fixtures gain a normativeerrorCodeon everyerrorexpectation.KpaList.get(pointer)now returnsnull(absent) for an out-of-range index, matchingKpaStruct.get. RebuildableKpaStruct/RebuildableKpaListinterfaces, each extending their read-only counterpart with afactoryproperty. Themutate {}DSL now targets these interfaces, so calling.mutate {}on a read-only adapter (e.g. a ksoup adapter) is a compile error rather than a silent runtime mistake. Mutation-capable families (kxs, yamlkt) implement them; read-only ksoup implements the plain read interfaces.- Shared abstractions for adapter implementors:
BackedKpaElement<B>(singlebackingproperty plus arequireBacking<B>()unwrapper),AbstractKpaList<E>andAbstractKpaStructMap<E>(delegate the read members to a backing collection), andStringKpaPrimitive(fixes all type flags to the string case). See Writing a Custom Adapter. - Typed read-access extensions for
KpaStructandKpaList:stringAt,booleanAt,longAt,doubleAt,primitiveAt,structAt, andlistAt, each accepting aKPointeror aStringpath and returning the typed value ornullon absence/shape mismatch. kpointer-ksoupsynthetic accessors. An=-prefixed path-segment syntax for reaching text and markup (=ownText,=text,=wholeText,=wholeOwnText,=html,=outerHtml), forcing a child element (=child:NAME), and a shape-stable child list (=children:NAME), each with matching…Atextensions. Synthetic keys are resolvable by navigation but are not listed inkeys/toMap(). See Working with XML and HTML.- New
kpointer-ksoupmodule: read-only adapters exposing KSoup HTML/XML documents as pointer-addressableKpaStructtrees. Elements map to structs keyed by attribute names and distinct child tag names; attributes win on a clash; a repeated child tag becomes aKpaList. Text nodes and mutation are not supported in this release. Targets JVM, Android, iOS, Linux x64, and JS.
Fixed¶
- An invalid RFC 6901 tilde escape (e.g.
~2, or a trailing~) is now rejected (KP-1005) instead of being silently passed through. - List indices are now parsed per RFC 6902's
array-indexgrammar: leading zeros, non-ASCII digits, and a leading sign are rejected rather than silently accepted. - Resolving through a struct key that is absent partway through a pointer now returns absent, matching the existing behavior for an out-of-range intermediate list index.
Changed¶
KpaStruct/KpaListno longer declarefactory; it moved to theRebuildable*sub-interfaces. The internal mutation helpers now thread the factory from the root, so nested elements need not be rebuildable.Rebuildable*.mutatenow returns theRebuildable*type, enabling chained mutations without a cast.kpointer-kxsandkpointer-yamlktadapter classes now implement theRebuildable*interfaces and extend the sharedAbstract*base classes, removing duplicated delegation boilerplate; theirtoJsonElement()/toYamlElement()conversions collapse to a singlerequireBacking(...)call.kpointer-ksoupadapters now implement the plain read interfaces and its string-only primitives extendStringKpaPrimitive; calling.mutate {}on a ksoup adapter is now a compile error.
0.2.0 — 2026-06-15¶
Added¶
KpaPrimitivegained typed accessors (isString,isBoolean,isNumber,isNull,stringOrNull,booleanOrNull,doubleOrNull,longOrNull) andrenderedString()for inspecting and unwrapping leaf values without depending on a concrete adapter type.- New
kpointer-yamlktmodule: adapters for YamlKtYamlMap,YamlList, andYamlPrimitive, enabling read and mutation via JSON Pointer. Primitive typing follows the YAML 1.2 core schema; non-literal map keys are filtered from pointer addressing. Targets JVM, Android, iOS, Linux x64, and JS — not wasmJs (YamlKt publishes no wasmJs artifact).
Changed¶
YamlPrimitiveAdapternow derivesisNumber,doubleOrNull, andlongOrNullfrom a singlenumericLiteralContenthelper — an internal change that preserves all observable semantics and lets:kpointer-yamlktclear the 100% coverage gate.
0.1.0 — 2026-06-14¶
Added¶
Initial release, after migration from the original cw-json project.