Skip to content

feat: add modelsdk — auto-generated type-safe model SDK#335

Open
engalar wants to merge 1 commit intomendixlabs:mainfrom
engalar:feat/modelsdk-core
Open

feat: add modelsdk — auto-generated type-safe model SDK#335
engalar wants to merge 1 commit intomendixlabs:mainfrom
engalar:feat/modelsdk-core

Conversation

@engalar
Copy link
Copy Markdown
Contributor

@engalar engalar commented Apr 27, 2026

Summary

Add a new modelsdk/ package — a fundamentally better architecture for reading and writing Mendix MPR files. This is additive only (no existing code modified) and coexists with sdk/ to enable gradual migration.

Why this is a better solution

The current sdk/ layer has five structural problems that can't be fixed incrementally:

Problem Current sdk/ New modelsdk/
Coverage ~480 hand-written types, 5-10 domains 1,500+ auto-generated types, 53 domains
Type dispatch Manual if/switch in 52 parser files Auto-registered init()DefaultRegistry
Dirty tracking None — full rewrite on every save Bitmap per element + container chain propagation
BSON roundtrip Unimplemented fields silently dropped Raw BSON preserved; unknown types survive read/write
Adding new types Touch 5+ files, write parser+writer by hand Update supplements.json, re-run codegen

Architecture highlights

  • Property abstractionPrimitive[T], Part[T], PartList[T], Enum[T], ByNameRef[T] unify field access with lazy init and dirty tracking
  • Three-branch encoder — self-dirty (full rebuild), child-dirty (selective rebuild), clean (zero-copy pass-through)
  • Lazy decodeInitFromRaw() parses BSON on first access; unaccessed fields cost nothing
  • Version metadata — every property records introduced/deleted/public version info from Mendix metamodel
  • Reference registry — auto-generated cross-domain relationship tracking (ByName/ById/ByNameList)
  • Unknown type safety — unrecognized $Type values decode to generic element.Base preserving raw bytes, so the document round-trips without data loss

What's included

Package Purpose
modelsdk/codec/ BSON encoder/decoder with type registry
modelsdk/element/ Element interface with dirty bitmap
modelsdk/property/ Generic property types with lazy init
modelsdk/gen/ (53 packages) Auto-generated domain types
modelsdk/mpr/ MPR v1/v2 reader/writer
modelsdk/widgets/ Widget template handling
modelsdk/meta/ System module metadata
cmd/modelsdk-codegen/ Code generator from TS SDK reflection data
internal/codegen/dtsparser/ TypeScript SDK .js file parser
internal/codegen/emitter/ Go code generation templates

Test plan

  • go build ./modelsdk/... compiles clean
  • go build ./cmd/modelsdk-codegen/... compiles clean
  • go test ./modelsdk/... — 7 packages pass (codec, element, property, version, widgets, mpk, model)
  • No existing tests broken (additive change only)

🤖 Generated with Claude Code

@engalar engalar force-pushed the feat/modelsdk-core branch from 65bd533 to 00ac646 Compare April 27, 2026 07:20
…undtrip

Add a new `modelsdk/` package that provides a fundamentally better
architecture for reading and writing Mendix MPR files compared to the
existing hand-written `sdk/` layer.

This is an additive, non-breaking change — no existing code is modified.
The new package coexists with `sdk/` to enable gradual migration.

Key improvements over current sdk/:

- 1,500+ auto-generated types across 53 Mendix domains (vs ~480 hand-written)
- Type registry with automatic init() registration (vs manual dispatch)
- Dirty tracking via bitmap + container chain propagation
- BSON roundtrip preservation — unknown fields survive read/write cycles
- Lazy decode via InitFromRaw() — zero cost for unaccessed fields
- Three-branch encoder: self-dirty / child-dirty / clean pass-through
- Property abstraction: Primitive[T], Part[T], PartList[T], Enum[T], ByNameRef[T]
- Per-property version metadata (introduced/deleted/public)
- Reference registry for cross-domain relationship tracking

Packages added:
- modelsdk/codec — BSON encoder/decoder with type registry
- modelsdk/element — Element interface with dirty tracking
- modelsdk/property — Generic property types with lazy init
- modelsdk/gen/ — 53 auto-generated domain packages
- modelsdk/mpr — MPR v1/v2 reader/writer
- modelsdk/widgets — Widget template handling
- modelsdk/meta — System module metadata
- modelsdk/version — Version compatibility info
- cmd/modelsdk-codegen — Code generator from TS SDK reflection data
- internal/codegen/dtsparser — TypeScript SDK parser
- internal/codegen/emitter — Go code generation templates
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants