zorphy 2.3.1
zorphy: ^2.3.1 copied to clipboard
A powerful code generation package for Dart/Flutter that provides clean class definitions with copyWith, JSON serialization, toString, equality, and inheritance support
2.3.1 - 2026-08-27 #
Fix #
- CLI: escape special characters (apostrophes, backslashes, dollar signs) in
@JsonKey(name:)annotations when generating entity code (PR #133). - Generators:
copyWithFieldon child classes with interfaces now uses the parent'sField<Parent, T>type with@overrideinstead ofcovariant, keeping LSP-safe polymorphic dispatch via Dart's declaration-site covariance. - Generators:
copyWithFieldon child classes handles ALL fields (parent + own) — no need for separatecopyWith{Interface}Fieldmethods.
2.3.0 - 2026-08-23 #
Feat #
- Generators: value-comparison surface for
autoIdentities (issue #127, proposal #2). Every@Zorphy(autoId: true)concrete class now gets two NEW methods on the generated class:bool valueEquals(Object other)—trueiffotheris the same concrete type AND every field EXCEPT the autoId field (id) is equal to this instance's. Identity equality (the default==/hashCode) is preserved;valueEqualsis an additive surface for consumers that need value comparison.Map<String, dynamic> toJsonValue()— the fulltoJson()output with the autoId field (id) key removed. Stable across two instances with the same field values; use a canonical serialized representation (e.g.,toJsonValue().toString()) or an explicit value-key type for deduplication. Emitted only whengenerateJson: true(it calls_$XToJson(this)). Both methods also drop any field listed inequalityExcludes(see below). The autoIdidis always dropped by these methods.
- Annotation: field-level equality exclusion via
@Zorphy(equalityExcludes: ['id'])(issue #127, proposal #1). Fields listed inequalityExcludesare dropped from four generated surfaces:operator ==,hashCode,toJsonLean()andcompareToX().toJson()andtoString()keep every field — the entity still round-trips through JSON for persistence and the id stays in debug output. Defaults to an empty list (the v2.2.0 byte-for-byte output is preserved for non-autoId entities and for autoId entities that already existed — those now gain the NEWvalueEquals()/toJsonValue()methods while their existing==/hashCode/toJsonLean()/compareToX()behavior is unchanged). Field names are matched against the Dart field name (NOT a@JsonKey(name: ...)alias). zorphy_annotationbumped to 2.3.0 (newequalityExcludesfield on@Zorphy/@Zorphy2/ZorphyX; backward-compatible — defaults toconst []).zorphydepends on^2.3.0and uses adependency_overridespath to../zorphy_annotationfor in-tree development (matches thezorphy_migratorpattern).
Docs #
- Annotation:
Zorphy.autoIdnow documents the value-semantics caveat (the minted uuid is identity noise — two instances with the same field values compare unequal by default) and points to the two opt-outs (equalityExcludesfor full field-level exclusion,valueEquals/toJsonValuefor additive value comparison without changing identity equality).
Test #
- Add regression test
test/regression/issue_127_value_equality_test.dart(21 assertions) exercising three fixtures inexample/lib/various/issue127_value_equality_example.dart:$AutoIdDefault— back-compat default:==/hashCode/toJsonLean()/compareToX()still includeid, and the NEWvalueEquals/toJsonValuemethods drop it.$AutoIdExcludesId— opt-out:==/hashCode/toJsonLean()/compareToX()dropid;toJson()keeps it;valueEquals/toJsonValuealso drop it.$NonAutoIdExcludesCreatedAt— non-autoId opt-out:createdAtis dropped from the four surfaces; novalueEquals/toJsonValuemethods (autoId-only surface). All assertions pass; full test suite (253 tests) passes;dart analyzeis clean onzorphy,zorphy_annotation, andexample.
2.2.0 - 2026-08-21 #
Refactor #
- Generators: extract the cross-entity import guidance detector (issue #117)
into a public, testable, analyzer-free helper —
CrossEntityImportDetectoratpackage:zorphy/src/analysis/cross_entity_import_detector.dart. TheZorphyGeneratorstill emits the same guidance comment; the detector is now unit-tested directly.
Test #
- Add regression tests for issue #117 (cross-entity
patchWith/fromJsoncast targets the concrete entity type) and issue #119 (subtypepatchWithcast strips the leading$), withexample/lib/variousfixtures. - Add unit tests for
CrossEntityImportDetector(pre-filter, self-reference skip, missing-import detection, generic type arguments, snake_case conversion, and comment/string-literal-safe import scanning).
2.1.1 - 2026-08-21 #
Feat #
- CLI:
--staticflag emits static class members on generated entities (closes #107). - Generators:
Patch+FieldEnumgeneration for nonSealed abstract base classes (closes #111). - Generators: bare
Function/Function?callback fields on value-object entities no longer break json_serializable (closes #105).
2.1.0 - 2026-08-21 #
Feat #
- Polymorphic dispatch:
EntityConfiggainstypeKey(default__typename) andsubtypeWireValuefor custom polymorphic JSON keys/values, and the generatedChangeToextension now serializes sealed subtypes via aswitch (this)that calls the correcttoJson()per subtype (fixes malformed polymorphic payloads for explicit-subtype hierarchies).
Fix #
- Generators: strip the leading
$frompatchWith/fromJsoncast types for explicit-subtype fields — the generatedas $Credentials?cast (undefined in the consuming file) now resolves toas Credentials?(fixes arrrrny/zorphy#119).
2.0.1 - 2026-08-19 #
Fix #
- Generators: typed
patchWith— the generated_patchMapternary chains collapse todynamic; patched values are now cast with postfixas T(valid for nullable types too) instead of invalid prefix(T)?casts. - Generators:
toJsonLeansanitizes the map in place and returns the typedMap<String, dynamic>instead of returning thedynamicsanitizer result. - CLI:
ImportResolveremits relative sibling-entity imports for!Type(external) fields when the referenced entity exists on disk — cross-entity references now generate resolvable code (fixes json_serializableInvalidTypefailures).
Generated code from both fixes passes dart analyze with zero findings.
2.0.0 - 2026-08-16 #
Feat #
autoIdsupport: a@Zorphy(autoId: true)class whose source declaresString get id;gets an optionalString? idconstructor parameter defaulting toconst Uuid().v4()— the generated class is constructible without an explicit identity (zuraffa#307). The@ZValueObject/ZorphyKind.valueObjectkind is parsed and threaded intoGenerationConfigfor framework consumers.EntityConfig/template:autoIdandkindoptions —zfa entity create --auto-idemits theidgetter, the uuid import and theautoId: trueannotation option;--kind=value_objectemitskind: ZorphyKind.valueObject.zorphy_annotationbumped to 2.2.0 (newZorphyKind,autoId,ZValueObjectannotation surface).
[2.1.0] - 2026-08-03 #
Feat #
- AST-based smart regeneration engine — non-destructive merge of generated output with user edits (region markers, structural diff, conflict reporting)
- Plugin API & registry (
ZorphyPlugin,PluginContext,PluginRegistry) — post-spec transform hooks with topological ordering, import injection, and diagnostic accumulation MergeModeenum (smart/force) andisForcebuilder/ generator flag to bypass smart mergeZorphyPluginabstract class exported fromzorphy.dart
Change #
- Version synced with
zorphy_annotation2.1.0 zorphy_annotationdependency bumped to^2.1.0
[2.0.0] - 2026-07-30 #
Break #
analyzerconstraint widened to>=13.0.0 <15.0.0— consumers on modern Dart toolchains (analyzer 14.x) now resolve without overridesbuild.yamlconsolidated to a single builder: one generation pass per library (roughly 2x faster consumer builds). The second pass (zorphy2builder) no longer exists;@zorphy2/@Zorphy2keep working as deprecated aliases of@zorphy- Removed process-global static cross-asset state (
_allAnnotatedClasses) — annotated-class graphs are now built per library, so build_runner caching/invalidation works correctly - Fieldless explicit subtypes now emit a minimal patch class and identity
patchWith—changeToextensions reference them (previously produced undefined-method errors)
Feat #
ZorphyPreset(lean/standard/full) plus per-featurebool?flags (generateCopyWith,generatePropertyHelpers,generateEqualsToString,generateChangeTo, and existing flags now nullable) —nullinherits from the preset, explicit values override itstandardpreset reproduces 1.9.0 output semantics — upgrading with no annotation changes keeps full output (see note ongenerateFilterbelow)leanpreset emits only class + constructor + copyWith +==/hashCode/toString;fulladdscopyWithFn- All flag resolution is centralized in
GenerationConfig; generators no longer read annotations directly - CI matrix verifies
dart testagainst analyzer 13.x and 14.x
Note #
- The deprecated
const zorphy/const zorphy2top-level constants previously carriedgenerateFilter: false(while the class default wastrue); in 2.0 both paths resolve consistently to thestandardpreset (generateFilter: true). Affected files gainFieldsfilter descriptors on regeneration. PingenerateFilter: falseexplicitly to opt out.
See MIGRATION-v2.md for the upgrade path.
1.9.0 - 2026-07-21 #
Breaking #
- Replaced inline
_zc/ZorphyJsonHelpersafe-cast approach with nativejson_serializabledeserialization usingchecked: true— field-level error messages are now provided byCheckedFromJsonExceptionfrom thejson_serializablepackage rather than customZorphyJsonCastError - Removed
zorphy_annotationsource files:json_helper.dartandjson_cast_error.dart— these are no longer needed; all JSON deserialization is handled byjson_serializabledirectly
Fix #
Map<K, V>fields (e.g.Map<String, String>?,Map<String, Entity>?) now correctly deserialize becausechecked: true+ native generation produces recursive.map((k, e) => MapEntry(k, e as String))conversions in the.g.dartfile, resolving runtimetype '_Map<String, dynamic>' is not a subtype of type 'Map<String, String>'errors
Chore #
- Upgraded
build_runnerto ^2.15.2,source_gento ^4.2.3,json_annotationto ^4.12.0 - Removed
dependency_overridesforanalyzerandmeta— packages now resolve coherently against the SDK
Features preserved from earlier releases (cherry-picked) #
- Refined nullable-string property helpers:
text?.isNotEmpty == trueinstead oftext != null && text.isNotEmpty - Const constructor support for non-sealed abstract classes
1.8.10 - 2026-07-21 #
Fix #
- Replaced deprecated
@JsonKey(ignore: true)with@JsonKey(includeToJson: false, includeFromJson: false)onhashCodegetter Map<K,V>fields now use direct(json['f'] as Map<K,V>?)cast instead ofZorphyJsonHelper.castto avoid runtime type erasure issues (e.g.Map<String, dynamic>vsMap<String, String>)
1.8.9 - 2026-07-21 #
Fix #
- Replaced deprecated
@JsonKey(ignore: true)with@JsonKey(includeToJson: false, includeFromJson: false)onhashCodegetter
1.8.8 - 2026-07-21 #
Fix #
hashCodegetter is now annotated with@JsonKey(ignore: true)to prevent json_serializable from including it intoJsonoutput (regression fromcreateFactory: falsechanges)
1.8.7 - 2026-07-21 #
Fix #
List<Object>and other identity-cast list fields now cast directly to the target type (as List<Object>?) instead of going throughList<dynamic>which isn't assignable in Dart 3- Fields like
List<Object>? get matchnow generate(json['match'] as List<Object>?)
1.8.6 - 2026-07-20 #
Fix #
- Reverted
List/Setfield casts fromZorphyJsonHelper.cast<List<dynamic>>back to(json['f'] as List<dynamic>)— generic function return types don't satisfy Dart 3's type system for downstream typed list parameters - Enum detection now scans analyzer-level type arguments, catching enums that only appear inside generic types like
List<TransformationType>without a bareTransformationTypefield
1.8.5 - 2026-07-20 #
Fix #
List<EnumType>fields in fromJson now use$enumDecode(_$EnumTypeEnumMap, e)for element conversion instead of incorrectly callingEnumType.fromJson(e as Map<String, dynamic>)
1.8.4 - 2026-07-20 #
Fix #
- Fields with
@JsonKey(fromJson: someConverter)but noincludeFromJson: falsenow correctly call the converter instead of falling through to.fromJson()on the raw type
1.8.3 - 2026-07-20 #
Fix #
- Non-sealed abstract classes with
constconstructors now correctly generateconst ClassName();instead ofClassName();
1.8.2 - 2026-07-20 #
1.8.1 - 2026-07-20 #
Fix #
- Replaced per-class
_zc<T>()static helpers with sharedZorphyJsonHelper.cast<T>()fromzorphy_annotationfor Dart 3.12+ compatibility - Added
ZorphyJsonCastErrorwith field-level context in error messages
1.8.0 - 2026-07-20 #
Feature #
- Safe fromJson casts with field-level error messages — replaces json_serializable delegates with inline
_zc<T>()wrapper that throwsTypeError.withStackTraceincluding field name, expected type, actual type, and the value itself - Example error:
Zorphy: Field 'id' expected String, got int (42)
1.6.9 - 2026-04-27 #
Change #
- Revert property helper generation to ownFields and fix automated publishing flow
1.6.8 - 2026-04-27 #
Change #
- Streamline release process and fix PropertyHelpers extension generation for inherited fields
1.6.7 - 2026-04-06 #
Fix #
- Factory method parameter types now preserve import prefixes (
asclauses) in generated code
1.6.6 - 2026-04-05 #
Feature #
- Extracted Patch class boilerplate into
PatchBaseto drastically reduce generated code size. - Fixed
toJson()bug on abstract base classes in explicit subtypeschangeToextension.
1.6.1 - 2026-02-15 #
Change #
- Refactored CLI code to be more robust and consumable
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.5.7 - 2026-02-14 #
Fix #
- Modified skip logic in
getProperties()to not skip fields that exist in both parentFields and ownFields (overridden fields) - Prevents duplicate
@overrideannotation when source already has it - Constructor generation
isParentFieldcheck now excludes fields in ownFields so overridden fields usethis.fieldsyntax - Added
_getCovariantFields()helper to detect fields where class type differs from interface type getInterfaceCopyWithMethods()now uses class field types (not interface types) for parameters and adds covariant where neededgetInterfaceCopyWithFnMethods()now uses class field types for parameters
1.5.6 - 2026-02-14 #
Chore #
- Updated docs and created docusaurus website
- Create public constructors by default and only create private when hidden
1.5.4 - 2026-02-13 #
Change #
- Allow hybrid serialization with json_serializable for generic field types
1.5.3 - 2026-02-13 #
Fix #
- Fixed JsonKey and other annotations not being caught due to Analyzer 10 changes
1.5.2 - 2026-02-12 #
Fix #
- Updated copyWith generation to use a sentinel parameter pattern, preserving non-nullable fields while allowing explicit nulls for nullable fields
1.1.0 - 2026-02-05 #
Change #
- Fixed edge case where a class extends a sealed class and implements another class causing parameters not passed in super constructor
1.0.0 - 2026-02-04 #
Added #
- Initial release of zorphy_annotation package
- Core
@Zorphy()annotation with full configuration support generateJsonoption for JSON serializationgenerateCompareTooption for diff generationgenerateCopyWithFnoption for function-based copyWithexplicitSubTypesoption for sealed class hierarchies- Support for generic type parameters
- Support for nested object patching
- Support for self-referencing types
- Support for multiple inheritance via interfaces
- Support for enum fields
- Support for constant constructors
- Full TypeScript-style type safety
Features #
- Immutable data class generation
- Automatic constructor generation
- Smart copyWith methods
- Advanced patching system with fluent API
- JSON serialization with lean JSON option
- Sealed classes with polymorphic serialization
- Multiple inheritance support
- Generic class support
- Enum integration
- Self-referencing type support
- Comparison and diff generation
- Equality and hashCode generation
- ToString generation
- Type-safe field enums
Documentation #
- Comprehensive README with examples
- Quick start guide
- Feature reference
- Real-world usage examples