<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>dmx — Dart code generation</title>
  <subtitle>Dart code generation on save: copyWith, equality, toString and typed JSON, written into the class you annotated. No part files.</subtitle>
  <link href="https://dmx.dev/feed.xml" rel="self"/>
  <link href="https://dmx.dev/"/>
  <updated>2026-08-14T00:00:00.000Z</updated>
  <id>https://dmx.dev/</id>
  <author><name>Christian Findlay</name></author>
  <entry>
    <title>Dart model code generation without part files</title>
    <link href="https://dmx.dev/blog/introducing-dmx/"/>
    <id>https://dmx.dev/blog/introducing-dmx/</id>
    <updated>2026-08-14T00:00:00.000Z</updated>
    <content type="html">https://dmx.dev/%3Cp%3Edmx%20is%20a%20Dart%20code%20generation%20tool.%20Its%20primary%20use%20case%20is%20model%20code:%20%3Ccode%3EcopyWith%3C/code%3E,%20equality,%20%3Ccode%3EhashCode%3C/code%3E,%20%3Ccode%3EtoString%3C/code%3E,%20typed%20JSON,%20and%20unions%20%E2%80%94%20the%20work%20many%20Flutter%20projects%20currently%20give%20to%20Freezed,%20%3Ccode%3Ejson_serializable%3C/code%3E,%20dart_mappable,%20built_value,%20and%20similar%20packages.%3C/p%3E%3Cp%3EWhat%20makes%20it%20different%20is%20where%20the%20generated%20code%20goes.%20Here%20is%20a%20class%20before%20saving:%3C/p%3E%3Cpre%20class=%22language-dart%22%3E%3Ccode%20class=%22language-dart%22%3E%3Cspan%20class=%22token%20keyword%22%3Eimport%3C/span%3E%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;package:dmx/dmx.dart&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%3Cspan%20class=%22token%20metadata%20function%22%3E@dmx%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;model&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20keyword%22%3Eclass%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%20%3Cspan%20class=%22token%20punctuation%22%3E%7B%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Econst%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%7B%3C/span%3Erequired%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eid%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20required%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Ecount%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20required%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eactive%3Cspan%20class=%22token%20punctuation%22%3E%7D%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20int%20count%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20bool%20active%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%7D%3C/span%3E%3C/code%3E%3C/pre%3E%3Cp%3ESave%20the%20file,%20and%20the%20members%20appear%20inside%20that%20same%20class,%20between%20two%20markers:%3C/p%3E%3Cpre%20class=%22language-dart%22%3E%3Ccode%20class=%22language-dart%22%3E%3Cspan%20class=%22token%20metadata%20function%22%3E@dmx%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;model&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20keyword%22%3Eclass%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%20%3Cspan%20class=%22token%20punctuation%22%3E%7B%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Econst%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%7B%3C/span%3Erequired%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eid%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20required%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Ecount%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20required%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eactive%3Cspan%20class=%22token%20punctuation%22%3E%7D%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20int%20count%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20bool%20active%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20comment%22%3E/#region%3C/span%3E%20%20%3Cspan%20class=%22token%20keyword%22%3Estatic%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EResult%3C/span%3E%3Cspan%20class=%22token%20generics%22%3E%3Cspan%20class=%22token%20punctuation%22%3E&amp;lt;%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EDecodeError%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%3E%3C/span%3E%3C/span%3E%20%3Cspan%20class=%22token%20function%22%3EfromJson%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EObject%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20json%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20punctuation%22%3E[%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%20path%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;Plain&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E]%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20keyword%22%3Eswitch%3C/span%3E%20%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3Ejson%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%20%20%20%20%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%20%20%20%20%20%20%20%20%20%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;id&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%20%20%20%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;count&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20int%20count%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%20%20%20%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;active&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Efinal%3C/span%3E%20bool%20active%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%20%20%20%20%20%20%20%20%20%3Cspan%20class=%22token%20class-name%22%3EOk%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3Eid%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20count%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20count%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20active%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20active%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%20%20_%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EErr%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EDecodeError%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3Epath%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;Plain&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20json%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20class-name%22%3EMap%3C/span%3E%3Cspan%20class=%22token%20generics%22%3E%3Cspan%20class=%22token%20punctuation%22%3E&amp;lt;%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Edynamic%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%3E%3C/span%3E%3C/span%3E%20%3Cspan%20class=%22token%20function%22%3EtoJson%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20generics%22%3E%3Cspan%20class=%22token%20punctuation%22%3E&amp;lt;%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Edynamic%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%3E%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;id&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;count&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20count%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;active&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20active%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20metadata%20function%22%3E@override%3C/span%3E%20%20bool%20%3Cspan%20class=%22token%20keyword%22%3Eoperator%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E==%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EObject%3C/span%3E%20other%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20function%22%3Eidentical%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20other%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E||%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3Eother%20%3Cspan%20class=%22token%20operator%22%3Eis%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E&amp;amp;&amp;amp;%3C/span%3E%20%20%20%20%20%20%20%20%20%20other%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eid%20%3Cspan%20class=%22token%20operator%22%3E==%3C/span%3E%20id%20%3Cspan%20class=%22token%20operator%22%3E&amp;amp;&amp;amp;%3C/span%3E%20%20%20%20%20%20%20%20%20%20other%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Ecount%20%3Cspan%20class=%22token%20operator%22%3E==%3C/span%3E%20count%20%3Cspan%20class=%22token%20operator%22%3E&amp;amp;&amp;amp;%3C/span%3E%20%20%20%20%20%20%20%20%20%20other%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eactive%20%3Cspan%20class=%22token%20operator%22%3E==%3C/span%3E%20active%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20metadata%20function%22%3E@override%3C/span%3E%20%20int%20%3Cspan%20class=%22token%20keyword%22%3Eget%3C/span%3E%20hashCode%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EObject%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3E%3Cspan%20class=%22token%20function%22%3Ehash%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3EruntimeType%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20count%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20active%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20metadata%20function%22%3E@override%3C/span%3E%20%20%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%20%3Cspan%20class=%22token%20function%22%3EtoString%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%3Cspan%20class=%22token%20string-literal%22%3E%3Cspan%20class=%22token%20string%22%3E&#39;Plain(id:%20%3C/span%3E%3Cspan%20class=%22token%20interpolation%22%3E%3Cspan%20class=%22token%20punctuation%22%3E$%3C/span%3E%3Cspan%20class=%22token%20expression%22%3Eid%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20string%22%3E,%20count:%20%3C/span%3E%3Cspan%20class=%22token%20interpolation%22%3E%3Cspan%20class=%22token%20punctuation%22%3E$%3C/span%3E%3Cspan%20class=%22token%20expression%22%3Ecount%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20string%22%3E,%20active:%20%3C/span%3E%3Cspan%20class=%22token%20interpolation%22%3E%3Cspan%20class=%22token%20punctuation%22%3E$%3C/span%3E%3Cspan%20class=%22token%20expression%22%3Eactive%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20string%22%3E)&#39;%3C/span%3E%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%20%3Cspan%20class=%22token%20function%22%3EcopyWith%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20class-name%22%3EString%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20id%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20int%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20count%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20bool%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20active%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20operator%22%3E=%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E%3E%3C/span%3E%20%3Cspan%20class=%22token%20class-name%22%3EPlain%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%20%20%20%20%20%20%20%20id%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20id%20%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eid%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%20%20count%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20count%20%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Ecount%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%20%20active%3Cspan%20class=%22token%20punctuation%22%3E:%3C/span%3E%20active%20%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%3Cspan%20class=%22token%20operator%22%3E?%3C/span%3E%20%3Cspan%20class=%22token%20keyword%22%3Ethis%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E.%3C/span%3Eactive%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E;%3C/span%3E%20%20%3Cspan%20class=%22token%20comment%22%3E//#endregion%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3C/code%3E%3C/pre%3E%3Cp%3EThat%20is%20the%20whole%20file%20%E2%80%94%20the%20six%20members%20above%20are%20exactly%20what%20the%20shipped%20%3Ccode%3Emodel%3C/code%3E%20template%20emits,%20wrapped%20a%20little%20tighter%20here%20to%20fit%20the%20page.%20No%20%3Ccode%3Epart%3C/code%3E%20directive,%20no%20%3Ccode%3E.g.dart%3C/code%3E%20fragment,%20no%20generated%20mixin%20the%20class%20has%20to%20extend,%20and%20no%20delegating%20factory.%20You%20scroll%20down%20and%20read%20the%20%3Ccode%3EfromJson%3C/code%3E%20your%20app%20actually%20runs.%20Go-to-definition%20on%20%3Ccode%3EcopyWith%3C/code%3E%20lands%20on%20the%20line%20above,%20not%20in%20another%20file.%20The%20diff%20a%20reviewer%20sees%20puts%20the%20field%20change%20and%20the%20regenerated%20members%20side%20by%20side.%3C/p%3E%3Cp%3EThe%20decoder%20returns%20%3Ccode%3EResult&amp;lt;Plain,%20DecodeError&amp;gt;%3C/code%3E%20rather%20than%20throwing,%20because%20that%20is%20what%20the%20shipped%20template%20emits%20%E2%80%94%20and%20if%20a%20project%20wants%20something%20else,%20it%20edits%20the%20template.%20More%20on%20that%20below.%3C/p%3E%3Ch2%20id=%22why-generate-model-code-at-all%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#why-generate-model-code-at-all%22%3EWhy%20generate%20model%20code%20at%20all%3C/a%3E%3C/h2%3E%3Cp%3EDart%20gives%20you%20identity%20equality%20by%20default.%20Two%20objects%20with%20identical%20fields%20are%20not%20equal%20unless%20you%20write%20%3Ccode%3Eoperator%20==%3C/code%3E%20and%20%3Ccode%3EhashCode%3C/code%3E%20yourself,%20as%20the%20%3Ca%20href=%22https://api.dart.dev/dart-core/Object/operator_equals.html%22%3E%3Ccode%3EObject.==%3C/code%3E%20documentation%3C/a%3E%20spells%20out.%20Add%20copying,%20a%20readable%20%3Ccode%3EtoString%3C/code%3E,%20JSON%20in%20both%20directions,%20and%20sealed%20variants,%20and%20a%20modest%20app%20accumulates%20hundreds%20of%20lines%20nobody%20wants%20to%20write%20or%20review.%3C/p%3E%3Cp%3EFlutter&#39;s%20own%20%3Ca%20href=%22https://docs.flutter.dev/data-and-backend/serialization/json%22%3EJSON%20guide%3C/a%3E%20reaches%20the%20same%20conclusion.%20It%20says%20manual%20serialization%20becomes%20tedious%20and%20error-prone%20as%20a%20project%20grows,%20recommends%20code%20generation%20for%20medium-to-large%20projects,%20and%20explains%20why%20the%20obvious%20escape%20hatch%20is%20closed:%20Dart%20disables%20runtime%20reflection%20because%20it%20defeats%20tree%20shaking%20and%20inflates%20application%20size.%20The%20%3Ca%20href=%22https://github.com/dart-lang/language/issues/314%22%3Edata-classes%20request%3C/a%3E%20has%20been%20open%20for%20years,%20full%20of%20developers%20asking%20the%20language%20to%20absorb%20this%20work.%3C/p%3E%3Cp%3ESo%20the%20demand%20is%20real,%20and%20Freezed,%20%3Ca%20href=%22https://pub.dev/packages/json_serializable%22%3E%3Ccode%3Ejson_serializable%3C/code%3E%3C/a%3E,%20%3Ca%20href=%22https://pub.dev/packages/dart_mappable%22%3Edart_mappable%3C/a%3E,%20and%20%3Ca%20href=%22https://pub.dev/packages/built_value%22%3Ebuilt_value%3C/a%3E%20answer%20it.%20They%20save%20an%20enormous%20amount%20of%20typing,%20and%20plenty%20of%20teams%20are%20happy%20with%20them.%20I%20am%20not%20claiming%20otherwise,%20and%20dmx%20is%20not%20a%20feature-for-feature%20replacement%20for%20any%20of%20them.%3C/p%3E%3Cp%3EBut%20the%20code%20those%20packages%20generate%20lands%20in%20a%20separate%20file,%20and%20its%20shape%20belongs%20to%20the%20package.%3C/p%3E%3Ch2%20id=%22the-complaints-are-on-the-record%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-complaints-are-on-the-record%22%3EThe%20complaints%20are%20on%20the%20record%3C/a%3E%3C/h2%3E%3Cp%3EThis%20is%20not%20a%20niche%20irritation.%20Flutter&#39;s%20own%20triaged%20issue,%20%3Ca%20href=%22https://github.com/flutter/flutter/issues/63323%22%3ECode%20generation%20experience%20needs%20improvements%3C/a%3E,%20collects%20it:%20every%20project%20has%20to%20configure%20generation%20and%20remember%20to%20run%20it,%20generation%20delays%20feedback%20after%20an%20edit,%20deleting%20and%20recreating%20outputs%20can%20produce%20temporary%20analyzer%20errors,%20each%20generated%20class%20adds%20%3Ccode%3Epart%3C/code%3E%20declarations%20and%20package-specific%20factory%20boilerplate,%20and%20generated%20files%20fill%20the%20workspace,%20search%20results,%20and%20navigation.%3C/p%3E%3Cp%3EThat%20issue%20was%20opened%20in%202020,%20so%20read%20the%20specifics%20historically%20%E2%80%94%20tooling%20has%20moved%20on%20since.%20The%20categories%20have%20not.%20Developers%20still%20describe%20%3Ccode%3E.g.dart%3C/code%3E%20proliferation,%20searches%20that%20return%20generated%20symbols,%20and%20go-to-definition%20landing%20in%20a%20generated%20fragment;%20a%20%3Ca%20href=%22https://www.reddit.com/r/FlutterDev/comments/1pn9a8j/what_is_your_opinion_on_code_generation_in/%22%3EFlutterDev%20discussion%20on%20code%20generation%3C/a%3E%20gathers%20those%20complaints%20along%20with%20inflexible%20generated%20APIs%20and%20indirection%20nobody%20asked%20for.%3C/p%3E%3Cp%3EThen%20there%20is%20the%20version-control%20argument,%20which%20never%20ends.%20Commit%20the%20generated%20files%20and%20accept%20noisy%20diffs,%20conflicts,%20and%20review%20churn.%20Ignore%20them%20and%20every%20checkout,%20pull,%20editor,%20and%20CI%20job%20has%20to%20regenerate%20before%20the%20project%20is%20complete.%20People%20have%20been%20disagreeing%20about%20it%20for%20years%20on%20%3Ca%20href=%22https://stackoverflow.com/questions/56110386/should-i-commit-generated-code-in-flutter-dart-to-vcs%22%3EStack%20Overflow%3C/a%3E%20and%20in%20%3Ca%20href=%22https://www.reddit.com/r/FlutterDev/comments/1861t3j/should_we_add_files_created_with_code_generation/%22%3EFlutter%20community%20threads%3C/a%3E.%3C/p%3E%3Cp%3EInline%20generation%20sidesteps%20most%20of%20that%20by%20construction.%20There%20is%20no%20extra%20file%20to%20navigate,%20ignore,%20or%20fight%20over,%20because%20the%20generated%20members%20live%20in%20the%20file%20you%20already%20track.%20Macros%20that%20intentionally%20author%20a%20complete%20standalone%20file%20%E2%80%94%20a%20class%20per%20SQLite%20table,%20say%20%E2%80%94%20are%20still%20whole%20files%20with%20explicit%20ownership,%20and%20those%20you%20can%20commit%20or%20ignore%20as%20you%20prefer.%3C/p%3E%3Ch2%20id=%22darts-macros-were-supposed-to-fix-this-and-didnt%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#darts-macros-were-supposed-to-fix-this-and-didnt%22%3EDart&#39;s%20macros%20were%20supposed%20to%20fix%20this,%20and%20didn&#39;t%3C/a%3E%3C/h2%3E%3Cp%3EThe%20language%20team%20saw%20the%20problem%20clearly.%20In%20the%20%3Ca%20href=%22https://dart.dev/blog/announcing-dart-3-4%22%3EDart%203.4%20announcement%3C/a%3E%20they%20described%20existing%20generators%20as%20external%20tools%20that%20complicate%20the%20developer%20experience,%20and%20the%20experimental%20macro%20preview%20was%20meant%20to%20fold%20generation%20into%20the%20toolchain,%20visible%20to%20analysis%20and%20code%20completion.%3C/p%3E%3Cp%3EIt%20never%20shipped.%20In%20January%202025%20the%20team%20%3Ca%20href=%22https://dart.dev/blog/an-update-on-dart-macros-data-serialization%22%3Estopped%20work%20on%20macros%3C/a%3E.%20Deep%20semantic%20introspection%20kept%20slowing%20static%20analysis,%20code%20completion,%20and%20incremental%20compilation%20%E2%80%94%20and%20incremental%20compilation%20is%20the%20first%20stage%20of%20Flutter%20hot%20reload,%20so%20the%20cost%20hit%20the%20workflow%20everyone%20uses%20all%20day.%20They%20concluded%20they%20could%20not%20get%20the%20experience%20right%20in%20a%20reasonable%20timeframe%20and%20redirected%20the%20effort.%3C/p%3E%3Cp%3EWorth%20being%20precise%20about%20this:%20Dart%20did%20not%20ship%20macros%20and%20later%20deprecate%20them.%20It%20ended%20an%20experiment%20before%20it%20became%20a%20language%20feature.%20The%20implementation%20was%20%3Ca%20href=%22https://github.com/dart-lang/sdk/issues/60595%22%3Eremoved%20from%20the%20SDK%3C/a%3E,%20and%20the%20%3Ca%20href=%22https://dart.dev/tools/build_runner%22%3Ecurrent%20build%20documentation%3C/a%3E%20states%20plainly%20that%20Dart&#39;s%20compilers%20do%20not%20support%20macros.%20dmx%20is%20not%20that%20feature%20resurrected%20%E2%80%94%20it%20is%20an%20external%20tool%20that%20runs%20when%20you%20save.%20Narrower%20work%20continues%20on%20%3Ca%20href=%22https://github.com/dart-lang/language/issues/4154%22%3Eaugmentations%3C/a%3E,%20serialization,%20analyzer%20performance,%20and%20generator%20speed,%20but%20today,%20generated%20Dart%20comes%20from%20an%20external%20tool.%3C/p%3E%3Ch2%20id=%22what-about-build_runner%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-about-build_runner%22%3EWhat%20about%20build_runner?%3C/a%3E%3C/h2%3E%3Cp%3E%3Ccode%3Ebuild_runner%3C/code%3E%20is%20Dart&#39;s%20supported%20general-purpose%20build%20system,%20it%20is%20actively%20maintained,%20and%20it%20has%20a%20watch%20mode.%20Its%20%3Ca%20href=%22https://github.com/dart-lang/build/blob/master/build_runner/CHANGELOG.md%22%3Echangelog%3C/a%3E%20records%20real%20improvements%20in%202.13%20and%202.14%20%E2%80%94%20faster%20incremental%20builds,%20AOT-compiled%20builders,%20fewer%20unchanged%20writes,%20better%20startup%20%E2%80%94%20and%202.7%20removed%20the%20old%20conflicting-output%20prompt.%20Generator%20scalability%20is%20tracked%20as%20%3Ca%20href=%22https://github.com/dart-lang/build/issues/3800%22%3Ehigh-priority%20performance%20work%3C/a%3E.%3C/p%3E%3Cp%3EI%20want%20to%20be%20careful%20here,%20because%20it%20is%20easy%20to%20blame%20the%20build%20system%20for%20decisions%20it%20did%20not%20make.%20The%20%3Ccode%3Epart%3C/code%3E%20files%20and%20the%20fixed%20generated%20APIs%20come%20from%20the%20model%20generators%20layered%20on%20top,%20not%20from%20%3Ccode%3Ebuild_runner%3C/code%3E%20itself.%20If%20you%20are%20happy%20with%20your%20generator&#39;s%20output%20shape%20and%20happy%20with%20%3Ccode%3E.g.dart%3C/code%3E%20files,%20%3Ccode%3Ebuild_runner%3C/code%3E%20is%20not%20the%20thing%20standing%20in%20your%20way,%20and%20dmx%20has%20nothing%20to%20sell%20you.%3C/p%3E%3Cp%3Edmx%20is%20for%20the%20case%20where%20the%20output%20shape%20and%20the%20extra%20files%20%3Cem%3Eare%3C/em%3E%20the%20problem.%3C/p%3E%3Ch2%20id=%22how-it-works%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#how-it-works%22%3EHow%20it%20works%3C/a%3E%3C/h2%3E%3Cp%3EWhen%20you%20save,%20the%20VS%20Code%20extension&#39;s%20watcher%20picks%20up%20the%20change,%20regenerates%20only%20the%20affected%20declarations,%20and%20skips%20writes%20that%20would%20not%20change%20anything.%20In%20another%20editor%20you%20run%20%3Ccode%3Edmx%20watch%3C/code%3E%20once%20and%20leave%20it%20running.%20Either%20way%20there%20is%20no%20build%20command%20in%20your%20loop.%3C/p%3E%3Cp%3EInside,%20the%20pipeline%20is%20deliberately%20boring.%20tree-sitter%20parses%20the%20Dart%20into%20a%20concrete%20syntax%20tree.%20A%20Rust%20context%20builder%20works%20out%20the%20completed%20expressions%20%E2%80%94%20every%20decode,%20encode,%20equality,%20hash,%20and%20copy%20expression,%20with%20nullability,%20collections,%20and%20nested%20generics%20already%20resolved.%20A%20Mustache%20template%20arranges%20those%20finished%20strings%20into%20Dart.%20The%20candidate%20file%20is%20reparsed%20and%20validated.%20Only%20then%20does%20the%20emitter%20splice%20the%20result%20between%20the%20markers.%3C/p%3E%3Cp%3EThat%20split%20is%20the%20reason%20templates%20are%20usable.%20The%20template%20does%20not%20need%20to%20know%20that%20%3Ccode%3EList&amp;lt;Map&amp;lt;String,%20Product?&amp;gt;&amp;gt;%3C/code%3E%20decodes%20differently%20from%20%3Ccode%3Eint%3C/code%3E;%20the%20context%20builder%20already%20answered%20that.%20So%20the%20template%20stays%20legible:%3C/p%3E%3Cpre%20class=%22language-mustache%22%3E%3Ccode%20class=%22language-mustache%22%3E%20%20%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20variable%22%3EclassName%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%20%3Cspan%20class=%22token%20variable%22%3EcopyWith%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E#%3C/span%3E%3Cspan%20class=%22token%20variable%22%3Efields%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20variable%22%3EcopyParam%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E,%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E/%3C/span%3E%3Cspan%20class=%22token%20variable%22%3Efields%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%20%20%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E)%3C/span%3E%20%3Cspan%20class=%22token%20punctuation%22%3E=%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E%3E%3C/span%3E%20%20%20%20%20%20%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E{%3C/span%3E%3Cspan%20class=%22token%20variable%22%3EclassName%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E}%3C/span%3E%3Cspan%20class=%22token%20punctuation%22%3E(%3C/span%3E%3C/code%3E%3C/pre%3E%3Cp%3EChange%20that%20file%20and%20every%20model%20in%20the%20project%20adopts%20your%20conventions%20%E2%80%94%20your%20constructor%20style,%20your%20naming,%20your%20JSON%20failure%20behaviour.%20The%20built-ins%20that%20ship%20with%20dmx%20(%3Ccode%3Emodel%3C/code%3E,%20%3Ccode%3Eunion%3C/code%3E,%20%3Ccode%3Eenum%3C/code%3E,%20%3Ccode%3Ediff%3C/code%3E,%20%3Ccode%3Elerp%3C/code%3E,%20%3Ccode%3Evalidate%3C/code%3E,%20%3Ccode%3Etable%3C/code%3E,%20%3Ccode%3Eroute%3C/code%3E,%20%3Ccode%3Ecli%3C/code%3E,%20%3Ccode%3Efake%3C/code%3E,%20%3Ccode%3ErestClient%3C/code%3E)%20are%20the%20same%20templates,%20just%20compiled%20into%20the%20binary.%3C/p%3E%3Cp%3EWhen%20a%20template%20cannot%20answer%20the%20question,%20you%20write%20a%20macro%20in%20Dart.%20A%20macro%20sees%20typed%20parsed%20declarations%20and%20their%20siblings,%20and%20it%20can%20read%20whatever%20source%20of%20truth%20the%20project%20has%20%E2%80%94%20a%20SQLite%20schema,%20an%20OpenAPI%20document,%20a%20config%20file%20%E2%80%94%20then%20generate%20members%20or%20entire%20files.%20It%20can%20return%20Dart%20directly,%20which%20for%20a%20small%20macro%20is%20usually%20the%20right%20call,%20or%20hand%20its%20model%20to%20a%20Mustache%20template%20and%20let%20dmx%20render%20it%20with%20the%20same%20engine%20the%20built-ins%20use.%20That%20is%20how%20the%20generation%20logic%20and%20the%20output%20shape%20end%20up%20in%20separate%20files:%20the%20macro%20answers%20what%20only%20your%20project%20knows,%20the%20template%20decides%20what%20the%20Dart%20looks%20like.%3C/p%3E%3Cp%3ETwo%20honest%20limits.%20Macros%20currently%20receive%20typed%20parsed%20declarations,%20not%20the%20analyzer&#39;s%20full%20semantic%20model,%20so%20there%20is%20no%20full%20type%20inference%20to%20lean%20on%20yet.%20And%20validation%20is%20what%20stands%20between%20a%20template%20bug%20and%20a%20broken%20repository:%20dmx%20reparses%20the%20entire%20candidate%20file%20before%20writing,%20and%20on%20failure%20it%20emits%20a%20diagnostic%20and%20leaves%20your%20source%20exactly%20as%20it%20was.%20Bytes%20outside%20the%20region%20are%20never%20touched.%3C/p%3E%3Ctable%3E%3Cthead%3E%3Ctr%3E%3Cth%3ETypical%20generated-model%20package%3C/th%3E%3Cth%3Edmx%3C/th%3E%3C/tr%3E%3C/thead%3E%3Ctbody%3E%3Ctr%3E%3Ctd%3EGenerated%20members%20in%20%3Ccode%3E.freezed.dart%3C/code%3E,%20%3Ccode%3E.g.dart%3C/code%3E,%20or%20another%20%3Ccode%3Epart%3C/code%3E%20fragment%3C/td%3E%3Ctd%3EGenerated%20members%20inside%20the%20annotated%20declaration%3C/td%3E%3C/tr%3E%3Ctr%3E%3Ctd%3EThe%20package&#39;s%20generated%20API%20and%20structure%3C/td%3E%3Ctd%3EA%20Mustache%20template%20the%20project%20edits%3C/td%3E%3C/tr%3E%3Ctr%3E%3Ctd%3EWrite%20a%20generator%20package%20for%20custom%20behaviour%3C/td%3E%3Ctd%3EWrite%20a%20macro%20in%20Dart,%20and%20render%20its%20Mustache%20template%3C/td%3E%3C/tr%3E%3Ctr%3E%3Ctd%3EFragments%20validated%20by%20the%20surrounding%20toolchain%3C/td%3E%3Ctd%3EThe%20complete%20candidate%20file%20parsed%20and%20validated%20before%20writing%3C/td%3E%3C/tr%3E%3C/tbody%3E%3C/table%3E%3Ch2%20id=%22try-it-before-installing-anything%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#try-it-before-installing-anything%22%3ETry%20it%20before%20installing%20anything%3C/a%3E%3C/h2%3E%3Cp%3EThe%20%3Ca%20href=%22/playground.html%22%3Eplayground%3C/a%3E%20runs%20the%20production%20generator%20in%20your%20browser.%20Edit%20the%20Dart,%20edit%20the%20Mustache%20template,%20watch%20the%20output%20change.%20Nothing%20installs,%20and%20neither%20input%20leaves%20the%20tab%20%E2%80%94%20it%20is%20the%20actual%20generator%20compiled%20to%20WebAssembly,%20not%20a%20canned%20demo.%3C/p%3E%3Cp%3EIf%20it%20fits%20how%20you%20want%20to%20work,%20the%20%3Ca%20href=%22/docs/%22%3Einstallation%20guide%3C/a%3E%20takes%20it%20from%20there,%20and%20the%20source%20is%20at%20%3Ca%20href=%22https://github.com/Nimblesite/dmx%22%3ENimblesite/dmx%3C/a%3E.%3C/p%3E</content>
    <summary>dmx generates Dart model code on save inside the annotated class, with no generated part files and a project-controlled output shape.</summary>
  </entry>
</feed>
