ack 1.6.2
ack: ^1.6.2 copied to clipboard
Schema validation and bidirectional codecs for Dart and Flutter
1.6.2 #
Fixed #
Ack.fromJsonSchema()now compiles thepatternkeyword, restoring import of schemas exported from Ack. It uses an unanchored ECMA-262 search on strings and rejects invalid regular expressions at import time.
Added #
Ack.fromJsonSchema()now accepts the standardpropertyNameskeyword to validate every key of an object instance against its subschema. Both keywords round-trip through the Draft-7 export unchanged, raising the pinned upstream conformance selection to 631 cases.
1.6.1 #
Fixed #
- Correct the
safeParseAsdocumentation: mapperExceptions becomeSchemaTransformErrorfailures, while mapperErrors are rethrown with their original stack trace (the documented behavior never matched the code). - Encode now honors effective nullability instead of a schema's own
isNullableflag. A union with a nullable branch, and anyDefaultSchema,BoundarySchema, or codec wrapping one, now encodesnullwherever it already parsednull: at the root, as an object property, and when nested in another union..transform(),.codec(), andAck.codec()no longer rejectnullon parse or encode when their input schema accepts it, which matches thetype: nullbranch their export already advertised.
Changed #
- An optional object property whose schema effectively accepts
nullnow encodes a presentnullas{"key": null}instead of omitting the key. A missing key is still omitted. Ack.list(...)now throws its existing "nullable item schemas"ArgumentErrorfor item schemas whose null acceptance was previously hidden behind a wrapper — a nested nullable union, or a codec,withDefault(...), orAck.preserveBoundary(...)over a nullable union.- A codec or
Ack.preserveBoundary(...)over a nullable union now exports an outer{"type": "null"}branch, matching thenullit accepts. The branch is redundant with the union's own nullable branch but remains valid Draft-7. - An
Errorthrown by an encoder now propagates out ofsafeEncodewith its original stack trace at every nesting level. Previously only a root codec rethrew: nested inAck.object,Ack.list,Ack.map, orAck.discriminatedtheErrorbecame aSchemaEncodeErrorfailure, and inAck.anyOfit was swallowed entirely so a later branch could returnok. A union no longer tries later branches once a branch encoder raises anError. To signal a value a codec cannot encode, throw anExceptionor express the rule with anoutput:schema; do not catchError. - Constraints added to a codec are no longer projected onto its exported wire
schema, because they validate runtime values the encoder may map to a
different shape — a seconds codec's
.min(Duration(seconds: 5))used to exportminimum: 5000while encoding5. They are still enforced at runtime, and the export now carries acodec_runtime_constraint_not_exportedwarning naming the omitted constraint keys. Move rules the wire should advertise onto the input schema (Ack.string().minLength(5).codec(...)).Ack.duration().min()/.max()still exportminimum/maximumin milliseconds.
1.6.0 #
Added #
- Add strict
Ack.fromJsonSchema()returningAckSchema<Object, Object>for a documented draft 2020-12 subset. The runtime implementation is internal; failures expose immutable diagnostics throughJsonSchemaImportException. Supports supplied reference bundles, recursion, JSON-specific null/presence semantics, and exactallOf,oneOf, andnotcomposition. Exports are self-contained and reflect only enforced assertions. - Verify imports against 600 pinned upstream JSON Schema cases and selected
A2UI v0.9 protocol schemas. Support catalog JSON Pointer targets outside
$defs, normalize enums for valid Draft-7 output, and report unsupported assertions only when they are reachable from the imported root.
Fixed #
- Reject conflicting bundle documents with the same resolved retrieval URI, including conflicting copies of the root document.
- Accept the draft 2020-12 meta-schema URI with an empty fragment (
#). - Reject generated-definition name collisions between imported schemas and
Ack.lazy()targets instead of exporting a reference to the wrong schema. - Report duplicate anchors at the conflicting
$anchorkeyword rather than at the enclosing resource identifier. - Correct the executable reference-bundle example in the JSON Schema guide.
- Preserve imported JSON Schema definitions without adding an import-specific
variant to the sealed
AckSchemaModelhierarchy. Imported roots use the existing composition and reference models.
1.5.0 #
Added #
- Add
Ack.map(valueSchema)andMapSchemafor JSON objects with arbitrary string keys whose values all match one schema. Values may benullonly when the value schema is nullable, soAck.map(Ack.any().nullable())models aJsonMap. JSON Schema export emitsadditionalProperties: <value schema>.
Changed #
Ack.any()parsing now returns a detached, recursively unmodifiable snapshot of the input instead of the caller's own object, matching the unmodifiable results ofAck.object()andAck.list(). Encoding still returns the validated runtime value unchanged.
1.4.0 #
Changed #
- Align with the coordinated Ack 1.4 release adding class-first field annotations; this package has no runtime or public API changes from 1.3.0.
1.3.0 #
Changed #
- Align with the coordinated Ack 1.3 release introducing
ack_mcp_dart; this package has no runtime or public API changes from 1.2.0.
1.2.0 #
Added #
- Add
AckModelAdapteras the non-nullable runtime bridge used by generated immutable Ack models. The adapter keeps schema parse/encode around model mapping so public JSON methods remain schema-backed. - Add
Ack.preserveBoundary, which validates through a schema while returning the original wire value instead of values decoded by nested codecs. - Add
deepUnmodifiableJsonMap, which creates detached, recursively unmodifiable snapshots of nested maps, lists, and sets without validation.
Fixed #
- Preserve propagated
Errorobjects during validation instead of converting programming defects into recoverable schema failures. - Compare collection contents independently of growable or unmodifiable wrapper
implementations. Numerically equal
intanddoublevalues now compare and hash equally on native and web runtimes; other scalar types remain distinct. - Keep deep map-key equality consistent with
deepHashCode, and apply JSON Schema Draft 7 numeric equality touniqueItems(including nested values). - Reject the native minimum integer from
.safe()without overflowingabs().
Changed #
- Export
deepEquals,deepHashCode, anddeepUnmodifiableJsonMapfor generated Ack data classes and class-first constructors. Ack.integer()accepts losslessly representable numbers with no fractional part and normalizes them toint.Ack.double()accepts exactly representable numeric inputs and normalizes them todouble. NumericanyOfbranches can therefore overlap; the first matching branch determines the runtime representation. UseAck.number()to preserve the input's numeric representation and.safe()to require JavaScript's portable integer range.- Raise the minimum Dart SDK to 3.9.
1.1.0 #
Fixed #
- Keep
safeParsenon-throwing when refinements or constraints throw recoverableExceptions, while preservingErrorvalues such asStateErrorso programming defects are not masked as validation failures. - Decode RFC 3339 lowercase
t/zseparators inAck.datetime(), which its own string validation already accepts (previously they failed at the decode step with a misleading "Codec decode failed" message). - Bound direct, indirect, wrapper-mediated, and fluent-copy lazy-schema alias recursion (previously unbounded and prone to stack overflow).
- Snapshot factory collections so a caller mutating the passed list or map can no longer corrupt a constructed schema.
- Correct behavior-based schema and deep-collection equality.
Behavior changes #
No public API changed (verified with dart_apitool against 1.0.1); the following
now reject inputs that previously passed or misbehaved silently.
- Validate numeric
multipleOf, IPv6, and RFC 3339 date-time values strictly. Announced leap seconds are preserved byAck.string().datetime()but rejected byAck.datetime(), where Dart cannot represent them. (migration: some previously-accepted strings and numbers now fail validation.) - Reject invalid constraint configuration at construction — negative
lengths/item counts, non-finite numeric bounds,
min > maxranges,multipleOf <= 0, empty unions, empty or duplicate enum inputs, and unions that can yield nullable list items — all throwArgumentError. (migration: fix the schema definition; put nullability on the list viaAck.list(item).nullable().) toJsonSchema()merges conflicting duplicate keywords intoallOfand emitsmin/maxItemsandmin/maxPropertiesfor exact counts. (migration: refresh snapshot or golden tests of exported schemas.)parse()throwsAckException— instead of the raw callback error — when a constraint or refinement throws.
1.0.1 #
- See release notes for details.
1.0.0 #
- See release notes for details.
1.0.0-beta.12 #
Breaking Changes #
DoubleSchemaandNumberSchemanow reject non-finite values (NaN,Infinity,-Infinity) during runtime validation by default, aligning numeric schemas with JSON-safe values.- Remove the retired JSON Schema DTO converter APIs.
- Replace the interim JSON Schema model kind API with sealed
AckSchemaModelvariants and canonicalAckSchema.toSchemaModel()adapter conversion.
Added #
Ack.enumCodec<T extends Enum>(List<T> values)returns aCodecSchema<String, T>wrappingEnumSchema<T>. Use this when downstream code expects every value-shape to be aCodecSchema(e.g. a registry of codecs). Decode/encode are identity sinceEnumSchemaalready maps betweenTand the enum's.name.NumberSchemaExtensionsadds fluent numeric constraints toAck.number():.min,.max,.greaterThan,.lessThan,.positive,.negative, and.multipleOf.
Changed #
- Project discriminated schemas through union-owned discriminator branches.
- Preserve defaults, const values, extension keywords, transformed metadata, composition, and JSON Schema constraints through the schema model boundary.
Migration #
- Re-run tests for code paths that parse or encode
double/numvalues. If a boundary must acceptNaNor infinities, model that value outside the JSON numeric schema path before validation.
1.0.0-beta.11 #
- See release notes for details.
1.0.0-beta.10 #
- See release notes for details.
1.0.0-beta.9 #
- See release notes for details.
1.0.0-beta.8 #
- See release notes for details.
1.0.0-beta.7 #
- See release notes for details.
1.0.0-beta.6 #
Features #
- Discriminated unions: Enforce Map-returning child schemas in discriminated unions (#67).
- Schema mapping API: Add
AckSchema.parseAsandAckSchema.safeParseAsfor validated-value mapping with consistentSchemaTransformErrorhandling.
Improvements #
- Schemas: Centralize null/default handling and extract ObjectSchema helpers (#65).
Bug Fixes #
- Schemas: Fixes to schema correctness including transformed schema defaults and list unique items constraint (#50).
1.0.0-beta.5 - 2026-01-14 #
1.0.0-beta.4 - 2025-12-29 #
Breaking Changes #
- Format metadata: Reduced built-in format guidance to 7 core formats (
email,uri,uuid,date,dateTime,ipv4,ipv6). Custom format strings are still supported via theformatproperty. withDescriptiondeprecated: Usedescribe()instead for setting schema descriptions.
Bug Fixes #
- JSON Schema output: Now correctly adds null branch to
anyOf/oneOfcompositions whennullable: true, producing valid JSON Schema Draft-07 format.
Improvements #
- DRY refactoring: Consolidated duplicate primitive schema parsers into one.
- Hardened schema type handling: Improved map validation and schema type handling.
- Consolidated JSON schema utilities: Reduced duplication across JSON schema utilities.
1.0.0-beta.3 - 2025-10-27 #
- See release notes for details.
1.0.0-beta.2 - 2025-10-09 #
- See release notes for details.
1.0.0-beta.1 - 2025-10-06 #
- See release notes for details.