<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: hello-ediflow</title>
    <description>The latest articles on DEV Community by hello-ediflow (@helloediflow).</description>
    <link>https://dev.to/helloediflow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3744812%2F9ffd2db6-a51b-4773-bc11-bb11ac1b4acb.png</url>
      <title>DEV Community: hello-ediflow</title>
      <link>https://dev.to/helloediflow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/helloediflow"/>
    <language>en</language>
    <item>
      <title>Building EDIFlow in TypeScript: Part 2 - Domain Layer Deep-Dive</title>
      <dc:creator>hello-ediflow</dc:creator>
      <pubDate>Tue, 10 Feb 2026 11:08:44 +0000</pubDate>
      <link>https://dev.to/helloediflow/building-ediflow-domain-layer-deep-dive-en0</link>
      <guid>https://dev.to/helloediflow/building-ediflow-domain-layer-deep-dive-en0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Building EDIFlow - A Clean Architecture Journey in TypeScript (Part 2/6)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; EDIFlow&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Published:&lt;/strong&gt; February 2026&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Reading Time:&lt;/strong&gt; ~10-12 minutes  &lt;/p&gt;


&lt;h2&gt;
  
  
  Welcome Back! 👋
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/helloediflow/building-ediflow-in-typescript-part-1-why-clean-architecture-1hhm"&gt;Part 1&lt;/a&gt;, I shared &lt;strong&gt;why&lt;/strong&gt; I built EDIFlow and why Clean Architecture was the right choice.&lt;/p&gt;

&lt;p&gt;Now it’s time for the &lt;strong&gt;hard part&lt;/strong&gt;: &lt;strong&gt;design decisions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Today we focus on the &lt;strong&gt;Domain Layer&lt;/strong&gt; — not the implementation details, but the &lt;strong&gt;decisions&lt;/strong&gt; that shaped it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’ll learn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What objects&lt;/strong&gt; to model (and what NOT to model)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision criteria&lt;/strong&gt; for Entity vs Value Object&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trade-offs&lt;/strong&gt; that influenced the design&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why DDD + Clean Architecture belong together&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you can reuse&lt;/strong&gt; in your own systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No perfect solutions — just real decisions with real trade-offs.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. The First Question: What IS the Domain? 🤔
&lt;/h2&gt;

&lt;p&gt;This sounds obvious, but it’s the &lt;strong&gt;hardest question&lt;/strong&gt; in Clean Architecture:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“What belongs in the Domain Layer?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uncle Bob says in &lt;a href="https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164" rel="noopener noreferrer"&gt;Clean Architecture&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The Domain Layer contains Enterprise Business Rules. These are the rules that would exist even if the application didn't exist.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Translation:&lt;/strong&gt; Domain = &lt;strong&gt;pure business logic&lt;/strong&gt;, independent of technology.&lt;/p&gt;
&lt;h3&gt;
  
  
  My Challenge with EDIFlow
&lt;/h3&gt;

&lt;p&gt;EDIFlow parses messages. But what’s the “domain”?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First instinct (wrong):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain = Parsing logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ Parsing is technical, not business.&lt;/p&gt;

&lt;p&gt;I spent a week building parsers in the domain layer. Big mistake! When I tried to add X12 support, I had to change the domain. That's when I realized: &lt;strong&gt;if adding a new format changes your domain, your domain is wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second try:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain = Message structure (segments, elements)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Better, but still technical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain = Business concepts that exist independently
- A message has a type
- A message has a version
- A message has validation rules
- A message has identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;This is the domain.&lt;/strong&gt; It exists before parsing, after parsing, and independent of any parser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key lesson:&lt;/strong&gt; Don't confuse &lt;strong&gt;technical implementation&lt;/strong&gt; with &lt;strong&gt;business concepts&lt;/strong&gt;. I learned this the hard way!&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Enter Domain-Driven Design 📚
&lt;/h2&gt;

&lt;p&gt;Now I knew &lt;strong&gt;what&lt;/strong&gt; belongs in the Domain Layer. But I still had a problem: &lt;strong&gt;Which objects do I create?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clean Architecture tells me &lt;em&gt;where&lt;/em&gt; logic belongs. It doesn’t tell me &lt;strong&gt;how to model&lt;/strong&gt; that logic.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;Domain-Driven Design (DDD)&lt;/strong&gt; helps. Eric Evans describes several &lt;strong&gt;building blocks&lt;/strong&gt; for domain modeling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entities&lt;/strong&gt; - Objects with identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Objects&lt;/strong&gt; - Objects defined by value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregates&lt;/strong&gt; - Cluster of entities with a root&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Services&lt;/strong&gt; - Operations that don’t belong to objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repositories&lt;/strong&gt; - Persistence abstractions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factories&lt;/strong&gt; - Complex object creation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These ideas existed before DDD, but Evans made them &lt;strong&gt;clear and practical&lt;/strong&gt; for domain modeling.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why DDD + Clean Architecture? 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why do I need both?&lt;/strong&gt; Because they solve &lt;strong&gt;different problems&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Domain-Driven Design&lt;/th&gt;
&lt;th&gt;Clean Architecture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Answers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHAT&lt;/strong&gt; to model&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;HOW&lt;/strong&gt; to structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Question&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What objects? What relationships?&lt;/td&gt;
&lt;td&gt;Where does code go?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gives you&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entities, Value Objects, Aggregates&lt;/td&gt;
&lt;td&gt;Layers, Dependencies, Boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Model business correctly&lt;/td&gt;
&lt;td&gt;Structure code maintainably&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Together they’re powerful:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DDD tells you WHAT:
- EDIMessage is an Entity (identity)
- Version is a Value Object (value-based)
- Standard is an Enum (type-safe set)

Clean Architecture tells you WHERE:
- Entities live in Domain Layer
- Parsers live in Infrastructure Layer
- Use Cases live in Application Layer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real example (compact):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DDD Decision:
"Version is a Value Object" (immutable, no identity)

Clean Architecture Decision:
"Version lives in domain/value-objects/ with zero dependencies"

Result:
✅ Correct model (DDD)
✅ Correct structure (Clean Architecture)
✅ Portable + testable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Both complement each other:&lt;/strong&gt; DDD without structure = mess. Structure without domain insight = technical code without business value.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why Focus Only on Entities &amp;amp; Value Objects? 🎯
&lt;/h2&gt;

&lt;p&gt;DDD has many building blocks, but &lt;strong&gt;this article focuses on just two&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entities&lt;/strong&gt; - objects with identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Objects&lt;/strong&gt; - objects defined by value&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why only these two?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest answer:&lt;/strong&gt; Because EDIFlow’s Domain Layer is &lt;strong&gt;simple&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ No Aggregates (EDIMessage is simple enough)&lt;/li&gt;
&lt;li&gt;✅ No Domain Services (operations fit in objects or use cases)&lt;/li&gt;
&lt;li&gt;✅ No Repositories in Domain (they belong in Infrastructure)&lt;/li&gt;
&lt;li&gt;✅ No Factories needed (constructors are enough)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;YAGNI applies here.&lt;/strong&gt; Don’t add patterns you don’t need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Later parts in the series:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 3:&lt;/strong&gt; Use Cases, Services, DTOs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 4:&lt;/strong&gt; Repositories, Parsers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. The Big Decision: Entity or Value Object? 📦
&lt;/h2&gt;

&lt;p&gt;I use a simple decision matrix:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;If YES →&lt;/th&gt;
&lt;th&gt;If NO →&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Does it have an ID?&lt;/td&gt;
&lt;td&gt;Entity&lt;/td&gt;
&lt;td&gt;Value Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can two be equal with different values?&lt;/td&gt;
&lt;td&gt;Entity&lt;/td&gt;
&lt;td&gt;Value Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does it change over time?&lt;/td&gt;
&lt;td&gt;Entity&lt;/td&gt;
&lt;td&gt;Value Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Do I need to track its history?&lt;/td&gt;
&lt;td&gt;Entity&lt;/td&gt;
&lt;td&gt;Value Object&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Applied to all EDIFlow domain objects:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Object&lt;/th&gt;
&lt;th&gt;Has ID?&lt;/th&gt;
&lt;th&gt;Equal w/ diff values?&lt;/th&gt;
&lt;th&gt;Changes?&lt;/th&gt;
&lt;th&gt;Track history?&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EDIMessage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Entity&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Value Object&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MessageType&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Value Object&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delimiters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Value Object&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Value Object (Enum)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EDISegment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Value Object&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EDIElement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Value Object&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pattern:&lt;/strong&gt; Only &lt;code&gt;EDIMessage&lt;/code&gt; has identity. Everything else is a &lt;strong&gt;Value Object&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight (1:6 ratio):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 Entity&lt;/strong&gt; (EDIMessage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 Value Objects&lt;/strong&gt; (everything else)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DDD takeaway:&lt;/strong&gt; Start by assuming Value Object. Only choose Entity if identity truly matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  See It In Action
&lt;/h3&gt;

&lt;p&gt;Here's how the decision matrix plays out in real code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Entity: Has identity, can be equal despite different values&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EDIMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ORDER-001&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EDIMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ORDER-001&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;message1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ✅ true (same ID!)&lt;/span&gt;

&lt;span class="c1"&gt;// Value Object: No identity, equals by value only&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Standard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EDIFACT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;D.96A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Standard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EDIFACT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;D.96A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ✅ true (same value!)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;v3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Standard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EDIFACT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;D.01B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ❌ false (different value!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; Two orders with same content are &lt;strong&gt;different orders&lt;/strong&gt; (Entity). Two versions "D.96A" are the &lt;strong&gt;same version&lt;/strong&gt; (Value Object).&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Hardest Decision: Polymorphism vs Simplicity 🎭
&lt;/h2&gt;

&lt;p&gt;EDIFlow supports multiple formats (EDIFACT, X12, IDOC). Each has &lt;strong&gt;different rules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I model this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I struggled with this for &lt;strong&gt;days&lt;/strong&gt;. Every approach felt wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separate classes = duplication&lt;/li&gt;
&lt;li&gt;if/else = messy&lt;/li&gt;
&lt;li&gt;Polymorphism = complex?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me show you the three options I considered:&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Separate Classes (Naive)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EdifactVersion&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;X12Version&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IdocVersion&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Simple, clear&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Duplication, hard to extend&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Rejected&lt;/strong&gt; (violates DRY)&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 2: if/else Everywhere
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;standard&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EDIFACT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; One class&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Breaks OCP, hard to test&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Rejected&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 3: Polymorphic Value Object (Chosen)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;PATTERNS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;EDIFACT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/.../&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;X12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/.../&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; One class, extensible, type-safe&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Slightly more complex&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Chosen&lt;/strong&gt; (best trade-off)&lt;/p&gt;


&lt;h2&gt;
  
  
  7. Trade-Off Example: Validation Strategy 📊
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;th&gt;Chosen?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;External Validator&lt;/td&gt;
&lt;td&gt;Flexible&lt;/td&gt;
&lt;td&gt;Separate logic&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-validating constructor&lt;/td&gt;
&lt;td&gt;Fail-fast&lt;/td&gt;
&lt;td&gt;Exceptions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factory method&lt;/td&gt;
&lt;td&gt;Controlled&lt;/td&gt;
&lt;td&gt;Extra layer&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why self-validation:&lt;/strong&gt; It makes invalid state impossible.&lt;/p&gt;


&lt;h2&gt;
  
  
  8. What I'd Do Differently 🤔
&lt;/h2&gt;

&lt;p&gt;Let me be honest about &lt;strong&gt;mistakes and second thoughts&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Mistake #1: Almost Over-Engineered Version
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What I almost did:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IVersion&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EdifactVersion&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IVersion&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;X12Version&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IVersion&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why I didn't:&lt;/strong&gt; YAGNI! The polymorphic approach works great. Don't create interfaces until you &lt;strong&gt;need&lt;/strong&gt; them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Resist the urge to make everything "extensible." Simple solutions often stay simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake #2: First Draft Had 50+ Classes
&lt;/h3&gt;

&lt;p&gt;My &lt;strong&gt;very first&lt;/strong&gt; attempt had separate classes for everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EdifactDelimiters&lt;/code&gt;, &lt;code&gt;X12Delimiters&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EdifactSegment&lt;/code&gt;, &lt;code&gt;X12Segment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EdifactElement&lt;/code&gt;, &lt;code&gt;X12Element&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why that was bad:&lt;/strong&gt; Massive duplication. 80% of the code was identical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Look for patterns &lt;strong&gt;before&lt;/strong&gt; creating classes. Most Value Objects are format-agnostic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thought #1: Should I Use Result Types?
&lt;/h3&gt;

&lt;p&gt;Right now, constructors throw exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Standard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EDIFACT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INVALID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// throws!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Alternative:&lt;/strong&gt; Result types (functional style):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INVALID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// returns Result&amp;lt;Version, Error&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why I didn't:&lt;/strong&gt; Most TypeScript developers expect exceptions. Result types are great, but add learning curve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would I change it?&lt;/strong&gt; Maybe in v2.0 with a &lt;code&gt;Version.tryCreate()&lt;/code&gt; method. For now, exceptions work fine.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. What You Get From This Design 🎁
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Type safety&lt;/strong&gt; (less guessing)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Invalid state impossible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Clear separation of concerns&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Easier testing&lt;/strong&gt; (pure logic)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No breaking changes&lt;/strong&gt; when adding formats&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. What's Next? 🚀
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; Application Layer&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Cases&lt;/li&gt;
&lt;li&gt;Services&lt;/li&gt;
&lt;li&gt;DTOs&lt;/li&gt;
&lt;li&gt;Dependency Injection (no framework)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Domain design is about decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What to model&lt;/li&gt;
&lt;li&gt;How to classify objects&lt;/li&gt;
&lt;li&gt;What trade-offs to accept&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;EDIFlow’s Domain Model:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 Entity:&lt;/strong&gt; &lt;code&gt;EDIMessage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 Value Objects:&lt;/strong&gt; &lt;code&gt;Standard&lt;/code&gt;, &lt;code&gt;Version&lt;/code&gt;, &lt;code&gt;MessageType&lt;/code&gt;, &lt;code&gt;Delimiters&lt;/code&gt;, &lt;code&gt;EDISegment&lt;/code&gt;, &lt;code&gt;EDIElement&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; Start with Value Object. Promote to Entity only when identity truly matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Series Navigation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part 1 (Published):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/helloediflow/building-ediflow-in-typescript-part-1-why-clean-architecture-1hhm"&gt;Part 1: Why Clean Architecture?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Upcoming Parts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 3: Application Layer - Use Cases &amp;amp; Services&lt;/li&gt;
&lt;li&gt;Part 4: Infrastructure Layer &amp;amp; Monorepo&lt;/li&gt;
&lt;li&gt;Part 5: Presentation Layer - CLI&lt;/li&gt;
&lt;li&gt;Part 6: Lessons Learned &amp;amp; The Big Refactoring&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Let’s Discuss
&lt;/h2&gt;

&lt;p&gt;How do you decide between &lt;strong&gt;Entity&lt;/strong&gt; and &lt;strong&gt;Value Object&lt;/strong&gt; in your projects?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you prefer decision matrices like this?&lt;/li&gt;
&lt;li&gt;What trade-offs do you value most (simplicity, extensibility, strictness)?&lt;/li&gt;
&lt;li&gt;Have you used DDD + Clean Architecture together?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I’d love to hear your approach — drop your thoughts in the comments.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Links &amp;amp; Resources
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;EDIFlow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/@ediflow/core" rel="noopener noreferrer"&gt;npm: @ediflow/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/ediflow-lib/core" rel="noopener noreferrer"&gt;GitHub: ediflow-lib/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/ediflow-lib/core/blob/main/docs/ARCHITECTURE.md" rel="noopener noreferrer"&gt;Architecture Docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Community:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💬 &lt;a href="https://discord.gg/S5npqcv8Zu" rel="noopener noreferrer"&gt;Discord: EDIFlow Community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📣 &lt;a href="https://github.com/ediflow-lib/core/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Books:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;a href="https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164" rel="noopener noreferrer"&gt;Clean Architecture by Robert C. Martin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" rel="noopener noreferrer"&gt;Domain-Driven Design by Eric Evans&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" rel="noopener noreferrer"&gt;Clean Code by Robert C. Martin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Part 3 is next: Application Layer.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>cleanarchitecture</category>
      <category>edifact</category>
      <category>x12</category>
    </item>
    <item>
      <title>Building EDIFlow in TypeScript: Part 1 - Why Clean Architecture?</title>
      <dc:creator>hello-ediflow</dc:creator>
      <pubDate>Tue, 03 Feb 2026 06:14:36 +0000</pubDate>
      <link>https://dev.to/helloediflow/building-ediflow-in-typescript-part-1-why-clean-architecture-1hhm</link>
      <guid>https://dev.to/helloediflow/building-ediflow-in-typescript-part-1-why-clean-architecture-1hhm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Building EDIFlow - A Clean Architecture Journey in TypeScript (Part 1/6)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; EDIFlow&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Published:&lt;/strong&gt; February 2026&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Reading Time:&lt;/strong&gt; ~7 minutes  &lt;/p&gt;


&lt;h2&gt;
  
  
  1. Introduction - The Problem 🤔
&lt;/h2&gt;

&lt;p&gt;I've been working in data integration for over 20 years. SOAP, REST APIs, and yes—&lt;strong&gt;EDI&lt;/strong&gt;. Lots of EDI.&lt;/p&gt;

&lt;p&gt;If you've ever worked with EDIFACT, you know the pain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNH+1+ORDERS:D:96A:UN'
BGM+220+ORDER12345+9'
DTM+137:20240201:102'
NAD+BY+BUYER123::92'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What does &lt;code&gt;BGM+220&lt;/code&gt; mean?&lt;/strong&gt; What is &lt;code&gt;DTM+137&lt;/code&gt;? What's &lt;code&gt;::92&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;"old school EDI" world&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ No human-readable names&lt;/li&gt;
&lt;li&gt;❌ Just codes and tags (BGM, NAD, DTM...)&lt;/li&gt;
&lt;li&gt;❌ Makes onboarding new developers &lt;strong&gt;incredibly hard&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the existing parsers? They don't help much:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Typical EDI Parser - Generic segments&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bgm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BGM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;docNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bgm&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// What is element[1]? 🤷&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No type safety. No IntelliSense. No business logic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After 20+ years of this, I had enough. I wanted to build an EDI library that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Maps to &lt;strong&gt;type-safe TypeScript business objects&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Uses &lt;strong&gt;Clean Architecture&lt;/strong&gt; principles&lt;/li&gt;
&lt;li&gt;✅ Makes EDI development &lt;strong&gt;enjoyable&lt;/strong&gt; (yes, really!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I started &lt;strong&gt;EDIFlow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But here's the honest truth: &lt;strong&gt;I didn't just want to build a library. I wanted to LEARN Clean Architecture by doing.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Clean Architecture? 📚
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Honest Answer: I Wanted to Learn It!
&lt;/h3&gt;

&lt;p&gt;I first encountered &lt;strong&gt;Clean Architecture&lt;/strong&gt; around 2020. Read the books:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" rel="noopener noreferrer"&gt;Clean Code by Robert C. Martin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164" rel="noopener noreferrer"&gt;Clean Architecture by Robert C. Martin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445" rel="noopener noreferrer"&gt;Agile Software Development by Robert C. Martin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I was &lt;strong&gt;hooked&lt;/strong&gt;. The principles made so much sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single Responsibility&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency Inversion&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separation of Concerns&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testability&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But then I tried to apply it at work...&lt;/p&gt;

&lt;h3&gt;
  
  
  The Reality: Resistance to Change
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Typical problems I faced:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏢 "We've always done it this way"&lt;/li&gt;
&lt;li&gt;😰 "New architecture? Too risky!"&lt;/li&gt;
&lt;li&gt;⏰ "We don't have time to refactor"&lt;/li&gt;
&lt;li&gt;🤷 "Why change if it works?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The structures were &lt;strong&gt;too entrenched&lt;/strong&gt;. No trust in "new" architectures. The typical corporate fears.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: Build My Own Project
&lt;/h3&gt;

&lt;p&gt;I realized: &lt;strong&gt;The best way to learn Clean Architecture is to build something real from scratch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a TODO app. Not a toy example. A &lt;strong&gt;real-world library&lt;/strong&gt; that solves a &lt;strong&gt;real problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when I decided to build EDIFlow, I made a commitment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Clean Architecture&lt;/strong&gt; from Day 1&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;TDD&lt;/strong&gt; (Test-Driven Development)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Agile&lt;/strong&gt; principles (even solo!)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No compromises&lt;/strong&gt; on code quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Could I have hacked it together in a weekend?&lt;/strong&gt; Sure!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But where's the learning in that?&lt;/strong&gt; 🤷&lt;/p&gt;

&lt;h3&gt;
  
  
  So... Was Clean Architecture Worth It?
&lt;/h3&gt;

&lt;p&gt;This is the question everyone asks: &lt;strong&gt;"Is Clean Architecture worth the extra effort?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My answer:&lt;/strong&gt; YES! But it wasn't without challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What went well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;599 tests&lt;/strong&gt; - Writing tests became easy (and fun!)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero coupling&lt;/strong&gt; - Changed parser implementation twice, no problem&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Added 4 EDIFACT versions&lt;/strong&gt; - Clean separation made it trivial&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Confidence&lt;/strong&gt; - I can refactor without fear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But there were challenges too:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;More files&lt;/strong&gt; - Sometimes felt like overkill for simple features&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Initial velocity&lt;/strong&gt; - First weeks were slower ("I could have hacked this in a weekend!")&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;TypeScript DI complexity&lt;/strong&gt; - No framework = manual wiring gets verbose&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Solo discipline&lt;/strong&gt; - Easy to cut corners when no one is watching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The verdict?&lt;/strong&gt; For a library like EDIFlow: &lt;strong&gt;Absolutely worth it!&lt;/strong&gt; Every hour spent on architecture saved me days in maintenance.&lt;/p&gt;

&lt;p&gt;For a throwaway script? Probably overkill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(We'll dive into the honest pros &amp;amp; cons, with real examples, in Part 5!)&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why TypeScript? 💙
&lt;/h2&gt;

&lt;p&gt;EDI parsing is &lt;strong&gt;complex&lt;/strong&gt;. You're dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;618+ message types (ORDERS, INVOIC, DESADV...)&lt;/li&gt;
&lt;li&gt;Thousands of segment definitions&lt;/li&gt;
&lt;li&gt;Complex validation rules&lt;/li&gt;
&lt;li&gt;Delimiters, escape characters, special cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Without type safety, this becomes a nightmare.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript Benefits for EDIFlow:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Type Safety for Complex Parsing Logic
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ JavaScript - Runtime errors waiting to happen&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delimiters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;delimiters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;delimiters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Oops! No error! 💥&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ TypeScript - Caught at compile time&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Delimiters&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Delimiters must be different!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. IntelliSense = Developer Happiness
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Auto-completion works!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mapToBusinessObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;// IntelliSense suggests fields&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// Type-safe navigation&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineItems&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// No guessing!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Interface-Driven Design (Perfect for Clean Architecture!)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Domain Layer - Just an interface, no implementation details&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IEDIParser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;EDIMessage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Infrastructure Layer - Implements the interface&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EdifactMessageParser&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IEDIParser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;EDIMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// EDIFACT-specific logic here&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;Dependency Inversion&lt;/strong&gt; in action! The domain doesn't know about EDIFACT. The domain just knows "I need a parser."&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Easy to Publish to npm
&lt;/h4&gt;

&lt;p&gt;TypeScript compiles to JavaScript, so it works everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @ediflow/core     &lt;span class="c"&gt;# Works in Node.js&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; EdifactParser &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s1"&gt;'@ediflow/core'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;# Works in browsers (with bundler)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus, TypeScript generates &lt;code&gt;.d.ts&lt;/code&gt; files automatically—users get IntelliSense out of the box!&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Strong Ecosystem
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vitest&lt;/strong&gt; for testing (fast, great DX)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tsup&lt;/strong&gt; for building (zero config!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript strict mode&lt;/strong&gt; catches bugs early&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  TypeScript Made EDI Development Enjoyable
&lt;/h3&gt;

&lt;p&gt;Before EDIFlow, EDI development was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;😫 Debugging runtime errors&lt;/li&gt;
&lt;li&gt;🤷 Guessing what &lt;code&gt;element[3]&lt;/code&gt; means&lt;/li&gt;
&lt;li&gt;💥 Breaking changes at runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With TypeScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Compile-time safety&lt;/li&gt;
&lt;li&gt;✅ IntelliSense everywhere&lt;/li&gt;
&lt;li&gt;✅ Refactoring with confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TypeScript isn't just a nice-to-have for EDIFlow. It's essential.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why Open Source? 🌍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Learning in Public
&lt;/h3&gt;

&lt;p&gt;I could have built EDIFlow as a private project. But I chose &lt;strong&gt;open source&lt;/strong&gt; for several reasons:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Accountability
&lt;/h4&gt;

&lt;p&gt;When you know others might read your code, you write &lt;strong&gt;better code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No shortcuts. No "I'll fix this later." Everything has to be &lt;strong&gt;production-ready&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Community Feedback
&lt;/h4&gt;

&lt;p&gt;Open source means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Bug reports from real users&lt;/li&gt;
&lt;li&gt;💡 Feature suggestions I never thought of&lt;/li&gt;
&lt;li&gt;🤝 Potential contributors&lt;/li&gt;
&lt;li&gt;📖 Documentation improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The best products are built WITH the community, not just FOR them.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Portfolio &amp;amp; Learning
&lt;/h4&gt;

&lt;p&gt;Let's be honest: If I'm spending &lt;strong&gt;100+ hours&lt;/strong&gt; building this, I want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Show it in my portfolio&lt;/li&gt;
&lt;li&gt;✅ Get feedback from experts&lt;/li&gt;
&lt;li&gt;✅ Help others with the same problem&lt;/li&gt;
&lt;li&gt;✅ Build my personal brand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Open source is the ultimate resume.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Solving a Real Problem
&lt;/h4&gt;

&lt;p&gt;I'm not the only one struggling with EDI libraries. By open-sourcing EDIFlow, I hope to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Help developers new to EDI&lt;/li&gt;
&lt;li&gt;Provide a &lt;strong&gt;modern alternative&lt;/strong&gt; to legacy tools&lt;/li&gt;
&lt;li&gt;Show that &lt;strong&gt;EDI can be developer-friendly&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. MIT License = Maximum Freedom
&lt;/h4&gt;

&lt;p&gt;EDIFlow is &lt;strong&gt;MIT licensed&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use it commercially&lt;/li&gt;
&lt;li&gt;✅ Modify it however you want&lt;/li&gt;
&lt;li&gt;✅ No attribution required (but appreciated!)&lt;/li&gt;
&lt;li&gt;✅ No strings attached&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why MIT?&lt;/strong&gt; Because I want &lt;strong&gt;maximum adoption&lt;/strong&gt;. The more people use it, the better it gets.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. What is EDIFlow? 🚀
&lt;/h2&gt;

&lt;p&gt;Okay, enough about motivation. &lt;strong&gt;What IS EDIFlow?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  EDI = Electronic Data Interchange
&lt;/h3&gt;

&lt;p&gt;Companies exchange business documents electronically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purchase Orders&lt;/strong&gt; (ORDERS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoices&lt;/strong&gt; (INVOIC)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shipping Notices&lt;/strong&gt; (DESADV)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inventory Reports&lt;/strong&gt; (INVRPT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of paper, they send structured messages like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNH+1+ORDERS:D:96A:UN'
BGM+220+ORDER12345+9'
DTM+137:20240201:102'
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  EDIFACT = UN/EDIFACT Standard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;EDIFACT&lt;/strong&gt; (Electronic Data Interchange For Administration, Commerce and Transport) is the &lt;strong&gt;United Nations standard&lt;/strong&gt; for EDI.&lt;/p&gt;

&lt;p&gt;It's used globally, especially in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚢 Logistics &amp;amp; Supply Chain&lt;/li&gt;
&lt;li&gt;🏭 Manufacturing&lt;/li&gt;
&lt;li&gt;🏥 Healthcare&lt;/li&gt;
&lt;li&gt;🏛️ Government&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EDIFlow = Modern TypeScript Library for EDI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;EDIFlow is:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Parser&lt;/strong&gt; - EDIFACT string → TypeScript objects&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Validator&lt;/strong&gt; - 3-phase validation (Syntax → Structure → Business)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Builder&lt;/strong&gt; - TypeScript objects → EDIFACT string&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Mapper&lt;/strong&gt; - Auto-convert to/from business objects&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Schema Exporter&lt;/strong&gt; - Generate JSON Schema &amp;amp; TypeScript types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean Architecture (Uncle Bob)&lt;/li&gt;
&lt;li&gt;TypeScript (strict mode)&lt;/li&gt;
&lt;li&gt;TDD (599 tests!)&lt;/li&gt;
&lt;li&gt;Zero dependencies (core package)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;And this is just the beginning!&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;Right now, EDIFlow supports &lt;strong&gt;EDIFACT&lt;/strong&gt; (4 versions). But the journey continues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔜 &lt;strong&gt;X12&lt;/strong&gt; (ANSI ASC X12) - Coming soon!&lt;/li&gt;
&lt;li&gt;🔜 &lt;strong&gt;More EDI formats&lt;/strong&gt; - We're agile, we follow the flow!&lt;/li&gt;
&lt;li&gt;🔜 &lt;strong&gt;Community-driven features&lt;/strong&gt; - What does the community need?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Clean Architecture foundation makes adding new formats &lt;strong&gt;easy&lt;/strong&gt;. That's the power of good design!&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DIContainer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ediflow/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Parse EDIFACT string&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;DIContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parseUseCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ParseEDIUseCase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parseUseCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;edifactString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EDIFACT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messageType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "ORDERS"&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Map to business object (type-safe!)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BusinessObjectMapper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mapToBusinessObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;         &lt;span class="c1"&gt;// "ORDER12345"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// "BUYER123"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineItems&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// IntelliSense works!&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Modify with type safety&lt;/span&gt;
&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineItems&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 4. Build back to EDIFACT&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buildUseCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BuildEDIUseCase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ediString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;buildUseCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mapFromBusinessObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;standard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EDIFACT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is what "modern EDI" looks like.&lt;/strong&gt; ✨&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Project Stats 📊
&lt;/h2&gt;

&lt;p&gt;Let me give you a sneak peek at what we've built so far:&lt;/p&gt;

&lt;h3&gt;
  
  
  Packages (npm)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Current (EDIFACT):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@ediflow/core&lt;/strong&gt; - Parser, Validator, Builder engine (MIT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@ediflow/edifact-d96a&lt;/strong&gt; - D.96A (1996) - 89 messages (MIT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@ediflow/edifact-d01b&lt;/strong&gt; - D.01B (2001) - 155 messages (MIT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@ediflow/edifact-d20b&lt;/strong&gt; - D.20B (2020) - 178 messages (MIT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@ediflow/edifact-d12a&lt;/strong&gt; - D.12A (2012) - 196 messages (MIT, Prep)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Coming Soon:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@ediflow/x12&lt;/strong&gt; - ANSI ASC X12 support 🔜&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More formats&lt;/strong&gt; - We're agile, we follow where "Flow" leads us! 🌊&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Current Total:&lt;/strong&gt; 618 EDIFACT message types supported (and growing!)&lt;/p&gt;

&lt;h3&gt;
  
  
  Tests &amp;amp; Quality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;~600 tests&lt;/strong&gt; passing (unit + integration + e2e)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;~90% test coverage&lt;/strong&gt; (goal: 95%+)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Clean Architecture&lt;/strong&gt; - All layers tested independently&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;TypeScript strict mode&lt;/strong&gt; - No &lt;code&gt;any&lt;/code&gt; types!&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero dependencies&lt;/strong&gt; (core package)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────────────────────────┐
│     Presentation Layer                │  CLI, API, UI (Future)
│                                       │
│  ┌─────────────────────────────────┐ │
│  │   Infrastructure Layer          │ │  Parsers, Repositories
│  │                                 │ │
│  │  ┌───────────────────────────┐  │ │
│  │  │   Application Layer       │  │ │  Use Cases, Services
│  │  │                           │  │ │
│  │  │  ┌─────────────────────┐  │  │ │
│  │  │  │   Domain Layer      │  │  │ │  Entities, Value Objects
│  │  │  └─────────────────────┘  │  │ │
│  │  └───────────────────────────┘  │ │
│  └─────────────────────────────────┘ │
└───────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dependency direction:&lt;/strong&gt; Always &lt;strong&gt;inward&lt;/strong&gt; → → → →&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Presentation Layer (CLI, REST API, Web UI) is planned for future releases!&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What's Coming in This Series? 🗓️
&lt;/h2&gt;

&lt;p&gt;This is just &lt;strong&gt;Part 1 of 6&lt;/strong&gt;! Here's what's next:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 1 (This Article): Why?&lt;/strong&gt; ← You are here! ✅
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Motivation &amp;amp; personal story&lt;/li&gt;
&lt;li&gt;Why Clean Architecture?&lt;/li&gt;
&lt;li&gt;Why TypeScript?&lt;/li&gt;
&lt;li&gt;Why Open Source?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 2 (Next Week): Domain Layer Deep-Dive&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Entities (EDIMessage, Segment)&lt;/li&gt;
&lt;li&gt;Value Objects (Delimiters, Standard, Version)&lt;/li&gt;
&lt;li&gt;Business Rules (ValidationRule, MandatoryRule)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real code examples&lt;/strong&gt; from EDIFlow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 3: Application Layer - Use Cases &amp;amp; Services&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ParseEDIUseCase, ValidateMessageUseCase, BuildEDIUseCase&lt;/li&gt;
&lt;li&gt;ComposableValidationService&lt;/li&gt;
&lt;li&gt;DTOs &amp;amp; Dependency Injection&lt;/li&gt;
&lt;li&gt;How orchestration works&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 4: Infrastructure Layer &amp;amp; Monorepo Structure&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parsers (EdifactMessageParser)&lt;/li&gt;
&lt;li&gt;Repositories (FileBasedMessageStructureRepository)&lt;/li&gt;
&lt;li&gt;Why 5 packages? (Monorepo strategy)&lt;/li&gt;
&lt;li&gt;TypeScript project references&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 5: Presentation Layer - The Interface&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CLI tools and commands&lt;/li&gt;
&lt;li&gt;REST API design (planned)&lt;/li&gt;
&lt;li&gt;Web UI vision (future)&lt;/li&gt;
&lt;li&gt;How Presentation Layer stays clean&lt;/li&gt;
&lt;li&gt;Dependency Injection from top to bottom&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 6 (Finale): Lessons Learned &amp;amp; Future&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Was Clean Architecture worth it? (honest answer!)&lt;/li&gt;
&lt;li&gt;Performance analysis (benchmarks!)&lt;/li&gt;
&lt;li&gt;Testing insights (600 tests!)&lt;/li&gt;
&lt;li&gt;What I'd do differently&lt;/li&gt;
&lt;li&gt;Roadmap &amp;amp; future plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Each article:&lt;/strong&gt; 1000-1800 words, deep technical dive with real code!&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Conclusion &amp;amp; Call to Action 🚀
&lt;/h2&gt;

&lt;h3&gt;
  
  
  My Journey
&lt;/h3&gt;

&lt;p&gt;EDIFlow is more than just a library. It's my journey of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📚 Learning Clean Architecture by &lt;strong&gt;doing&lt;/strong&gt;, not just reading&lt;/li&gt;
&lt;li&gt;💙 Proving TypeScript is perfect for enterprise-grade libraries&lt;/li&gt;
&lt;li&gt;🌍 Building in public and sharing the process&lt;/li&gt;
&lt;li&gt;🔧 Making "old school EDI" developer-friendly&lt;/li&gt;
&lt;li&gt;🌊 Following the &lt;strong&gt;Flow&lt;/strong&gt; - Starting with EDIFACT, next X12, then... who knows? We're agile!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It's Not Perfect (Yet!)
&lt;/h3&gt;

&lt;p&gt;I'm not claiming EDIFlow is perfect. I've made mistakes. I've refactored. I've learned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And that's exactly what this series is about.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the next 4 articles, I'll show you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ What worked (spoiler: a lot!)&lt;/li&gt;
&lt;li&gt;❌ What didn't work (also a lot!)&lt;/li&gt;
&lt;li&gt;💡 How to apply Clean Architecture in TypeScript&lt;/li&gt;
&lt;li&gt;🚀 Real code from a production-ready library&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  This is Pair Programming... with You!
&lt;/h3&gt;

&lt;p&gt;I built EDIFlow with &lt;strong&gt;GitHub Copilot&lt;/strong&gt; as my pair programming partner. Now I'm sharing the journey with &lt;strong&gt;you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow along, and let's learn together!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Links &amp;amp; Resources
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Try EDIFlow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/@ediflow/core" rel="noopener noreferrer"&gt;npm: @ediflow/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/ediflow-lib/core" rel="noopener noreferrer"&gt;GitHub: ediflow-lib/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/ediflow-lib/core/blob/main/docs/QUICK_START.md" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Join the Community:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💬 &lt;a href="https://discord.gg/S5npqcv8Zu" rel="noopener noreferrer"&gt;Discord: EDIFlow Community&lt;/a&gt; - Real-time chat &amp;amp; support&lt;/li&gt;
&lt;li&gt;📣 &lt;a href="https://github.com/ediflow-lib/core/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📧 Email: &lt;a href="mailto:hello.ediflow@gmail.com"&gt;hello.ediflow@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read More:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" rel="noopener noreferrer"&gt;Clean Code by Robert C. Martin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164" rel="noopener noreferrer"&gt;Clean Architecture by Robert C. Martin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445" rel="noopener noreferrer"&gt;Agile Software Development by Robert C. Martin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💭 What Do YOU Want to Learn?
&lt;/h3&gt;

&lt;p&gt;This series is for &lt;strong&gt;you&lt;/strong&gt;. What topics should I cover?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain Layer patterns?&lt;/li&gt;
&lt;li&gt;TypeScript DI without frameworks?&lt;/li&gt;
&lt;li&gt;Testing strategies?&lt;/li&gt;
&lt;li&gt;Performance optimization?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comment below!&lt;/strong&gt; 👇&lt;/p&gt;




&lt;h3&gt;
  
  
  📢 Next Up: Part 2 - Domain Layer
&lt;/h3&gt;

&lt;p&gt;Next week, we'll dive into the &lt;strong&gt;Domain Layer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do Entities differ from Value Objects?&lt;/li&gt;
&lt;li&gt;Why immutability matters&lt;/li&gt;
&lt;li&gt;Real code examples from EDIFlow&lt;/li&gt;
&lt;li&gt;TypeScript patterns that make Clean Architecture easier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;See you next week!&lt;/strong&gt; 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you found this helpful:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;a href="https://github.com/ediflow-lib/core" rel="noopener noreferrer"&gt;Star EDIFlow on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://discord.gg/S5npqcv8Zu" rel="noopener noreferrer"&gt;Join our Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 Follow this series (click "Follow" on my Dev.to profile!)&lt;/li&gt;
&lt;li&gt;🔄 Share with your network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Let's make EDI development great again!&lt;/strong&gt; 😄&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is part of the "Building EDIFlow: A Clean Architecture Journey in TypeScript" series. Follow along as we build a production-ready EDIFACT library from scratch using Clean Architecture principles.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Word Count:&lt;/strong&gt; ~1,650 words&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Reading Time:&lt;/strong&gt; ~7 minutes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series:&lt;/strong&gt; Part 1 of 6&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Coming Soon:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 2: Domain Layer Deep-Dive&lt;/li&gt;
&lt;li&gt;Part 3: Application Layer&lt;/li&gt;
&lt;li&gt;Part 4: Infrastructure &amp;amp; Packages&lt;/li&gt;
&lt;li&gt;Part 5: Presentation Layer&lt;/li&gt;
&lt;li&gt;Part 6: Lessons Learned&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>cleanarchitecture</category>
      <category>edifact</category>
      <category>x12</category>
    </item>
  </channel>
</rss>
