Summary
Survey Zod 4 APIs for potential integration or documentation with zen.
APIs to Investigate
Potentially Useful
-
z.codec() - Bidirectional transforms. Works with .db.type() but requires manual null handling. May be worth documenting as advanced pattern.
-
z.instanceof() - For class instances (e.g., z.instanceof(Date)). Could be relevant for custom types.
-
z.json() - Explicit JSON schema type. Currently we infer JSON from z.object()/z.array().
-
.brand() - Typed IDs (UserId vs PostId). Already works, just undocumented.
-
.readonly() - Freeze objects. Could auto-apply to query results.
-
z.stringbool() - String to boolean coercion. Relevant for form inputs.
-
z.file() - File/Blob handling. Could map to BLOB columns.
-
z.iso.datetime() - ISO string dates. Works already (it's just a string with validation).
Already Evaluated
.default() - Banned intentionally. Applies at parse-time, not write-time. Use .db.inserted() instead.
Current Conclusions
.db.encode()/.db.decode() is simpler than codecs for database use cases (auto-handles null)
- No breaking changes needed
- Some features may warrant documentation
Questions
- Should we document codec usage as an advanced pattern?
- Any utility in explicit
z.json() support vs inference?
- Worth documenting
.brand() for typed IDs?
🤖 Generated with Claude Code
Summary
Survey Zod 4 APIs for potential integration or documentation with zen.
APIs to Investigate
Potentially Useful
z.codec()- Bidirectional transforms. Works with.db.type()but requires manual null handling. May be worth documenting as advanced pattern.z.instanceof()- For class instances (e.g.,z.instanceof(Date)). Could be relevant for custom types.z.json()- Explicit JSON schema type. Currently we infer JSON fromz.object()/z.array()..brand()- Typed IDs (UserIdvsPostId). Already works, just undocumented..readonly()- Freeze objects. Could auto-apply to query results.z.stringbool()- String to boolean coercion. Relevant for form inputs.z.file()- File/Blob handling. Could map to BLOB columns.z.iso.datetime()- ISO string dates. Works already (it's just a string with validation).Already Evaluated
.default()- Banned intentionally. Applies at parse-time, not write-time. Use.db.inserted()instead.Current Conclusions
.db.encode()/.db.decode()is simpler than codecs for database use cases (auto-handles null)Questions
z.json()support vs inference?.brand()for typed IDs?🤖 Generated with Claude Code