NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3895 most downloaded on pub.dev
Schema validation and bidirectional codecs for Dart and Flutter
Last release today
07 Oct 2026
Release timing varies
gaps range from 8 days to 3 months
Most releases are documented
notes for 10 of 15 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
39 releases · first in 2025
One column per month.
Imported pattern expressions now use ECMA-262 Unicode mode. This is a deliberately accepted breaking change in 1.7.0, affecting users upgrading from s…
contains and if/then/else.keyword, documentUri, and pointer through JsonSchemaValidationError. Source pointers correctly encode URI fragments containing percent signs, spaces, #, and Unicode.Imported pattern expressions now use ECMA-262 Unicode mode. This is a deliberately accepted breaking change in 1.7.0, affecting users upgrading from stable 1.6.2 or earlier 1.7.0 betas.
. matches one code point: ^.$ accepts 😀, while ^..$ no longer matches its two UTF-16 code units. Review identity escapes too; replace ^\d{3}\-\d{4}$ with ^\d{3}-\d{4}$ outside character classes. Invalid Unicode-mode patterns fail import with an invalid_schema diagnostic.
Native Ack.string().matches() retains its Dart regex behavior. A native pattern can behave differently or fail import after export to JSON Schema.
Existing SchemaValidationError catches still work. Consumers requiring an exact runtime type or serialized error-map shape should allow the new subtype and its three additional fields. Initial null-input and JSON-value checks retain their existing Ack error types.
The beta.3 annotation and generator migrations still apply to users upgrading from older versions.
Full workspace tests, minimum Dart/Flutter checks, API comparison against 1.6.2, deterministic generation, Draft-7 validation, documentation validation, and zero-warning publish dry runs passed. The local aggregate passed 2,161 tests, including 394 generator tests; four opt-in Firebase live tests were skipped without credentials.
pattern in ECMA-262 Unicode mode (the
u flag), as the JSON Schema Test Suite requires. . matches one code point
and \p{...} is a Unicode property escape. Patterns that are invalid in
Unicode mode now fail import with an invalid_schema diagnostic. For
example, write - instead of \- outside a character class.
Ack.string().matches() retains native Dart regex behavior; a native pattern
can behave differently or fail import after export to JSON Schema. Review
imported patterns when upgrading from stable 1.6.2 or earlier 1.7.0 betas,
including expressions that count UTF-16 code units or use identity escapes.contains and if/then/else.
minContains and maxContains remain unsupported, because Draft-7 export
cannot represent them.JsonSchemaValidationError. Its keyword, documentUri, and pointer
identify the failing keyword in the source schema after $ref resolution.
Existing SchemaValidationError catches still work; consumers that require
an exact runtime type or serialized map shape should allow the subtype and
its three additional fields. Initial null-input and JSON-value checks retain
their existing Ack error types.#, or Unicode.All five packages are aligned at 1.7.0-beta.4 : ack , ack_generator , ack_json_schema_builder , ack_mcp_dart , and ack_firebase_ai .
All five packages are aligned at 1.7.0-beta.4: ack, ack_generator, ack_json_schema_builder, ack_mcp_dart, and ack_firebase_ai.
Ack.fromJsonSchema() now validates the supported date-time format automatically. Unsupported format labels continue to produce diagnostics.Ack.string().datetime() now accepts lowercase t and z on announced leap seconds.ack 1.7.0-beta.4 or later, without a new API or dependency minimum.final timestamp = Ack.fromJsonSchema({
'type': 'string',
'format': 'date-time',
});
timestamp.parse('2024-02-29T12:34:56.123456789+02:00');Ack's strict JSON Schema importer supports a documented subset; this release does not claim full JSON Schema Draft 2020-12 support.
No new generator or annotation migration is introduced in beta.4. When upgrading from beta.2 or earlier, the beta.3 breaking migrations still apply: annotations moved into ack, @Schemable() is the unified entry point, and JsonKey is no longer re-exported. See the repository changelog for the full migration details.
The reviewed release commit passed CI, browser tests, release preflight, schema validation, API compatibility checks, and zero-warning publish dry runs for all five packages.
Release commit: 0023d152288fb69b2967d230481fe8b681606d8b.
date-time format.
Other format labels remain unsupported and are reported at their schema
location. Parsing preserves the original timestamp string, including
announced leap seconds.t and z on announced leap
seconds, as it already did on ordinary RFC 3339 timestamps.Files that use constraint annotations or the deprecated spellings also import package:ack/annotations.dart , with a prefix ( as ack ) where a name cla…
ack_annotations package; the annotations ship in ack. Modelspackage:ack/ack.dart (@Schemable, @AckField, @Optional,@Required, @NotNull). Files that use constraint annotations or thepackage:ack/annotations.dart, with aas ack) where a name clashes with another type. Formatpackage:ack/format_annotations.dart.@Schemable() is the single annotation for schema-first and class-first@AckInfer() and @AckModel() are deprecated and will be@Pattern to @Matches. The deprecated Pattern alias stays inpackage:ack/annotations.dart; an unprefixed import of that library hidesdart:core's Pattern.ack no longer depends on json_annotation or re-exports JsonKey. A field@JsonKey(name: ...) imports JsonKey frompackage:json_annotation and the app depends on json_annotation.AckModel.jsonSerializable and AckGeneratedJson.config are removed.schema resolves to it withschema<A>() method that can receive each type argument's schema.@AckField(schema:) functions, non-finite constraint values, @SchemableJsonConverter annotations on class-firstack 1.7.0-beta.3.ack_annotations package is removed and its annotations ship in ack.
Remove ack_annotations from pubspec.yaml. package:ack/ack.dart
exports @Schemable() and the model annotations (AckField, Optional,
Required, NotNull, AckCaseStyle, AckUnknownPropertyPolicy, and the
deprecated AckFieldPresence). Replace
package:ack_annotations/ack_annotations.dart with
package:ack/annotations.dart, which exports the model annotations, the
constraints and the deprecated spellings, and
package:ack_annotations/format_annotations.dart with
package:ack/format_annotations.dart.@Pattern is renamed @Matches, matching Ack.string().matches(...).
Pattern remains a deprecated alias in package:ack/annotations.dart only.
Until 2.0.0, an unprefixed import of that library hides dart:core's
Pattern in the file; import it as ack, or with hide Pattern, where the
file needs dart:core's Pattern.package:ack/ack.dart or package:ack/annotations.dart
can clash with same-named classes from other libraries, such as
package:uuid's Uuid or package:meta's Required. Import
package:ack/annotations.dart with a prefix (as ack, then @ack.Uuid()),
or hide the name from one import.ack no longer depends on json_annotation and no longer re-exports
JsonKey. To rename one field with @JsonKey(name: ...), import
package:json_annotation/json_annotation.dart and add json_annotation to
the app's dependencies; caseStyle needs neither.
AckModel.jsonSerializable and AckGeneratedJson.config are removed.@Schemable() is the single code-generation annotation: on a top-level
schema it generates a model, and on a class it generates a schema.
Schemable.generatedJson marks generated schema-first models.@AckInfer() and @AckModel(); use @Schemable() with the same options.
They will be removed in 2.0.0.AckModelAdapter.modelSchema decodes a schema-first boundary value to its generated model and encodes the model through the source schema.
AckModelAdapter.modelSchema decodes a schema-first boundary value to its
generated model and encodes the model through the source schema.CodecSchema.canEncode reports whether a codec has its own encoder: false
for a one-way transform, true for a codec built with an encoder. It does
not inspect the schemas a codec wraps.This coordinated release publishes ack , ack_annotations , ack_generator , ack_json_schema_builder , ack_mcp_dart , and ack_firebase_ai at version 1.6
This coordinated release publishes ack, ack_annotations, ack_generator, ack_json_schema_builder, ack_mcp_dart, and ack_firebase_ai at version 1.6.2.
Ack.fromJsonSchema() now compiles the standard pattern keyword, restoring import of schemas exported from Ack. It uses an unanchored ECMA-262 search on strings and rejects invalid regular expressions at import time.Ack.fromJsonSchema() now accepts the standard propertyNames keyword to validate each object key against its subschema. Both keywords round-trip through Draft-7 export unchanged.The other five packages are version aligned and have no source or public API changes from 1.6.1. Compatible sibling dependency minimums remain unchanged.
See the publishing guide and changelogs for details.
Ack.fromJsonSchema() now compiles the pattern keyword, restoring import
of schemas exported from Ack. It uses an unanchored ECMA-262 search on
strings and rejects invalid regular expressions at import time.Ack.fromJsonSchema() now accepts the standard propertyNames keyword 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.Honor effective nullability consistently across unions, defaults, boundaries, codecs, object properties, and list-item validation.
All six ACK packages are aligned at 1.6.1. See the core package changelog for compatibility details and migration guidance.
safeParseAs documentation: mapper Exceptions become
SchemaTransformError failures, while mapper Errors are rethrown with
their original stack trace (the documented behavior never matched the code).isNullable flag. A union with a nullable branch, and any DefaultSchema,
BoundarySchema, or codec wrapping one, now encodes null wherever it
already parsed null: at the root, as an object property, and when nested
in another union. .transform(), .codec(), and Ack.codec() no longer
reject null on parse or encode when their input schema accepts it, which
matches the type: null branch their export already advertised.null now
encodes a present null as {"key": null} instead of omitting the key. A
missing key is still omitted.Ack.list(...) now throws its existing "nullable item schemas"
ArgumentError for item schemas whose null acceptance was previously hidden
behind a wrapper — a nested nullable union, or a codec, withDefault(...),
or Ack.preserveBoundary(...) over a nullable union.Ack.preserveBoundary(...) over a nullable union now exports an
outer {"type": "null"} branch, matching the null it accepts. The branch
is redundant with the union's own nullable branch but remains valid Draft-7.Error thrown by an encoder now propagates out of safeEncode with its
original stack trace at every nesting level. Previously only a root codec
rethrew: nested in Ack.object, Ack.list, Ack.map, or
Ack.discriminated the Error became a SchemaEncodeError failure, and in
Ack.anyOf it was swallowed entirely so a later branch could return ok. A
union no longer tries later branches once a branch encoder raises an
Error. To signal a value a codec cannot encode, throw an Exception or
express the rule with an output: schema; do not catch Error..min(Duration(seconds: 5)) used to
export minimum: 5000 while encoding 5. They are still enforced at
runtime, and the export now carries a
codec_runtime_constraint_not_exported warning 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 export minimum/maximum in milliseconds.Add strict Ack.fromJsonSchema() returning AckSchema for a documented draft 2020-12 subset. The runtime implementation is internal; failures expose imm
Ack.fromJsonSchema() returning AckSchema<Object, Object> for a
documented draft 2020-12 subset. The runtime implementation is internal;
failures expose immutable diagnostics through JsonSchemaImportException.
Supports supplied reference bundles, recursion, JSON-specific null/presence
semantics, and exact allOf, oneOf, and not composition. Exports are
self-contained and reflect only enforced assertions.$defs, normalize enums for valid Draft-7 output, and report unsupported
assertions only when they are reachable from the imported root.#).Ack.lazy() targets instead of exporting a reference to the wrong schema.$anchor keyword rather than at
the enclosing resource identifier.AckSchemaModel hierarchy. Imported roots use the
existing composition and reference models.Add Ack.map(valueSchema) and MapSchema for JSON objects with arbitrary string keys whose values all match one schema. Values may be null only when the
Ack.map(valueSchema) and MapSchema for JSON objects with arbitrary
string keys whose values all match one schema. Values may be null only
when the value schema is nullable, so Ack.map(Ack.any().nullable()) models
a JsonMap. JSON Schema export emits additionalProperties: <value schema>.Ack.any() parsing now returns a detached, recursively unmodifiable
snapshot of the input instead of the caller's own object, matching the
unmodifiable results of Ack.object() and Ack.list(). Encoding still
returns the validated runtime value unchanged.@AckField(presence: ...) remains during migration and is deprecated for removal in 2.0.0.
Ack 1.4 adds @Optional(), @Required(), and @NotNull() so class-first
models can override JSON key presence independently of whether a present
value may be null. @AckField(presence: ...) remains during migration
and is deprecated for removal in 2.0.0.
null on a nullable Dart field with @NotNull().copyWith from the constructor type so optional non-nullablenull.All six packages use version 1.4.0: ack, ack_annotations, ack_generator,
ack_firebase_ai, ack_json_schema_builder, and ack_mcp_dart.
The runtime, Firebase, JSON Schema, and MCP packages have no runtime or
public API changes from 1.3.0.
Ack 1.3 adds ack_mcp_dart , a small adapter that uses one ACK input contract for MCP tool discovery and runtime argument parsing with mcp_dart ^2.4.2
Ack 1.3 adds ack_mcp_dart, a small adapter that uses one ACK input contract for
MCP tool discovery and runtime argument parsing with mcp_dart ^2.4.2.
All six packages use version 1.3.0: ack, ack_annotations, ack_generator,
ack_firebase_ai, ack_json_schema_builder, and ack_mcp_dart.
The existing five packages have no runtime or public API changes from 1.2.0,
and compatible dependency minimums remain at ^1.2.0.
Release tooling now uses Melos fixed versions and a shared workspace tag,
compares APIs with 1.2.0, and supports resuming a partially completed publication.
ack_mcp_dart;
this package has no runtime or public API changes from 1.2.0.docs: align contracts and Firebase fixture dependencies by @leoafarias in #126
Full Changelog: v1.1.0...v1.2.0
AckModelAdapter as 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.Ack.preserveBoundary, which validates through a schema while returning
the original wire value instead of values decoded by nested codecs.deepUnmodifiableJsonMap, which creates detached, recursively
unmodifiable snapshots of nested maps, lists, and sets without validation.Error objects during validation instead of converting
programming defects into recoverable schema failures.int and double values now compare and
hash equally on native and web runtimes; other scalar types remain distinct.deepHashCode, and apply JSON
Schema Draft 7 numeric equality to uniqueItems (including nested values)..safe() without overflowing abs().deepEquals, deepHashCode, and deepUnmodifiableJsonMap for
generated Ack data classes and class-first constructors.Ack.integer() accepts losslessly representable numbers with no fractional
part and normalizes them to int. Ack.double() accepts exactly
representable numeric inputs and normalizes them to double. Numeric
anyOf branches can therefore overlap; the first matching branch determines
the runtime representation. Use Ack.number() to preserve the input's
numeric representation and .safe() to require JavaScript's portable
integer range.Ack 1.1.0 is a correctness-focused release that aligns runtime validation, generated schemas, and tooling with their documented contracts. It does not
Ack 1.1.0 is a correctness-focused release that aligns runtime validation,
generated schemas, and tooling with their documented contracts. It does not
change the public Dart API surface.
safeParse non-throwing for recoverable callback exceptions whileError values so programming defects remain visible.t and z separators.multipleOf, IPv6, RFC 3339 date-times, range bounds, collectionallOf, and export exactsource_gen diagnostics without undeclared debug-file output.Although the public API is unchanged, invalid or ambiguous inputs that were
previously accepted may now fail earlier:
ArgumentErrors.Ack.list(item).nullable()), not its item.multipleOf.toJsonSchema().AckException from parse() when a recoverable constraint orSee the package changelogs for the complete behavior notes.
safeParse non-throwing when refinements or constraints throw
recoverable Exceptions, while preserving Error values such as
StateError so programming defects are not masked as validation failures.t/z separators in Ack.datetime(), which its
own string validation already accepts (previously they failed at the decode
step with a misleading "Codec decode failed" message).No public API changed (verified with dart_apitool against 1.0.1); the following
now reject inputs that previously passed or misbehaved silently.
multipleOf, IPv6, and RFC 3339 date-time values strictly.
Announced leap seconds are preserved by Ack.string().datetime() but rejected
by Ack.datetime(), where Dart cannot represent them. (migration: some
previously-accepted strings and numbers now fail validation.)min > max ranges,
multipleOf <= 0, empty unions, empty or duplicate enum inputs, and unions
that can yield nullable list items — all throw ArgumentError. (migration:
fix the schema definition; put nullability on the list via
Ack.list(item).nullable().)toJsonSchema() merges conflicting duplicate keywords into allOf and emits
min/maxItems and min/maxProperties for exact counts. (migration: refresh
snapshot or golden tests of exported schemas.)parse() throws AckException — instead of the raw callback error — when a
constraint or refinement throws.This patch hardens recursive schemas built with Ack.lazy against unbounded recursion.
This patch hardens recursive schemas built with Ack.lazy against unbounded recursion.
Ack.lazy / LazySchema (#122): recursive schemas nowlazy_max_depth: "Maximum recursion depth (N) exceeded.") instead of crashing.Ack.lazy(...) accepts an optional maxDepth (default LazySchema.defaultMaxDepthcopyWith, equality, and serialization.maxDepth check can't be expressed via$ref and is omitted from the exported schema.Behavior note: recursion is now capped at depth 100 by default. Structures that
legitimately nest deeper must pass an explicit highermaxDepth.
The other packages (ack_annotations, ack_generator, ack_json_schema_builder,
ack_firebase_ai) are version-aligned to 1.0.1 with no functional changes.
Ack 1.0.0 is the first stable release of Ack, a schema validation library for Dart and Flutter. Ack helps you validate untrusted data at application b
Ack 1.0.0 is the first stable release of Ack, a schema validation library for Dart and Flutter. Ack helps you validate untrusted data at application boundaries, reuse the same schemas across runtime validation and JSON workflows, and generate typed wrappers when you want stronger ergonomics than map access.
Start with the documentation site or jump straight into the Quickstart Tutorial.
safeParse, SchemaResult, structured paths, and readable validation messages.@AckType() for extension types, typed getters, parse, and safeParse.toJsonSchema() and the reusable schema-model boundary for adapter authors.ack: core runtime validation library.ack_annotations: @AckType() annotation package.ack_generator: build_runner generator for typed schema wrappers.ack_json_schema_builder: adapter for json_schema_builder.ack_firebase_ai: Firebase AI structured-output schema adapter.Ack also publishes an llms.txt index with a compact overview of the packages, core APIs, code generation workflow, and common examples.
This release was validated with the full package test suites, documentation checks, example tests, and pub.dev dry-runs before publishing. All five packages are now available on pub.dev at version 1.0.0.
DoubleSchema and NumberSchema now reject non-finite values ( NaN , Infinity , -Infinity ) during runtime validation by default, aligning numeric schem
ackBreaking
DoubleSchema and NumberSchema now reject non-finite values (NaN, Infinity, -Infinity) during runtime validation by default, aligning numeric schemas with JSON-safe values.AckSchemaModel variants and a canonical AckSchema.toSchemaModel() adapter conversion.Added
Ack.enumCodec<T extends Enum>(List<T> values) returns a CodecSchema<String, T> wrapping EnumSchema<T>.NumberSchemaExtensions adds fluent numeric constraints to Ack.number(): .min, .max, .greaterThan, .lessThan, .positive, .negative, .multipleOf.Changed
Migration
double/num values. If a boundary must accept NaN/infinities, model that value outside the JSON numeric schema path before validation.ack_annotationsBreaking — Removed AckModel, AckField, and decorator annotations. Only @AckType() remains.
ack_generatorBreaking — Removed class-based schema generation. Only top-level @AckType() schema variables and getters are supported.
ack_firebase_aitoFirebaseAiResponseJsonSchema() for Firebase AI's GenerationConfig.responseJsonSchema path, plus committed golden fixtures and native fixture corpora.Schema conversion APIs — use toFirebaseAiResponseJsonSchema() instead.ack_json_schema_builderAckSchemaModel boundary and generic Draft-7 JSON Schema renderer; preserves defaults, const values, extension keywords, transformed metadata, and composition.All five packages are released in lockstep at 1.0.0-beta.12.
DoubleSchema and NumberSchema now reject non-finite values (NaN,
Infinity, -Infinity) during runtime validation by default, aligning
numeric schemas with JSON-safe values.AckSchemaModel variants and canonical AckSchema.toSchemaModel()
adapter conversion.Ack.enumCodec<T extends Enum>(List<T> values) returns a
CodecSchema<String, T> wrapping EnumSchema<T>. Use this when downstream
code expects every value-shape to be a CodecSchema (e.g. a registry of
codecs). Decode/encode are identity since EnumSchema already maps between
T and the enum's .name.NumberSchemaExtensions adds fluent numeric constraints to Ack.number():
.min, .max, .greaterThan, .lessThan, .positive, .negative, and
.multipleOf.double/num values. If a
boundary must accept NaN or infinities, model that value outside the JSON
numeric schema path before validation.chore(release): bump to 1.0.0-beta.11
chore(release): bump to 1.0.0-beta.11 (#102)
docs: add ack package README for pub.dev
docs: add ack package README for pub.dev (#98)
chore(release): bump to 1.0.0-beta.9
chore(release): bump to 1.0.0-beta.9 (#88)
REFACTOR (schemas): centralize null/default handling and extrac…
* See release notes for details.
Discriminated unions: Enforce Map-returning child schemas in discriminated unions (#67).
AckSchema.parseAs and AckSchema.safeParseAs for validated-value mapping with consistent SchemaTransformError handling.Equality: Implement value-based equality for schemas and constraints (#63). All schema and constraint classes now properly implement == and hashCode f
== and hashCode for structural comparison.meta and test dependencies to latest versions (#56).`withDescription` deprecated: Use describe() instead for setting schema descriptions.
email, uri, uuid, date, dateTime, ipv4, ipv6). Custom format strings are still supported via the format property.withDescription deprecated: Use describe() instead for setting schema descriptions.anyOf/oneOf compositions when nullable: true, producing valid JSON Schema Draft-07 format.REFACTOR: simplify validation workflow by eliminating duplicate nullable handling (#17).
* See release notes for details.
Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
ack_example - v0.3.0-beta.2Packages with breaking changes:
0.2.0-beta.1.Packages with breaking changes:
Packages with other changes:
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →