|
| 1 | +# TinyTools Roadmap |
| 2 | + |
| 3 | +This document outlines the planned features, improvements, and direction for LowlandTech.TinyTools. |
| 4 | + |
| 5 | +> **Philosophy**: TinyTools stays **tiny** by design. We prioritize simplicity, performance, and zero dependencies over feature bloat. |
| 6 | +
|
| 7 | +--- |
| 8 | + |
| 9 | +## Current Version: 2026.1.0 |
| 10 | + |
| 11 | +**Status**: ? Stable |
| 12 | +**Released**: January 2026 |
| 13 | + |
| 14 | +### Core Features |
| 15 | +- ? Simple string interpolation (`{PropertyName}`) |
| 16 | +- ? Template engine with control flow (`@if`, `@foreach`) |
| 17 | +- ? Variable interpolation (`${Context.xxx}`) |
| 18 | +- ? Null coalescing (`${expr ?? "default"}`) |
| 19 | +- ? Pipe helpers (string, date, number, collection) |
| 20 | +- ? Hierarchical execution context |
| 21 | +- ? Template services (extensibility) |
| 22 | +- ? IoC/DI integration support |
| 23 | +- ? .NET 8, 9, 10 support |
| 24 | + |
| 25 | +--- |
| 26 | + |
| 27 | +## Version 2026.2.0 (Q2 2026) |
| 28 | + |
| 29 | +**Theme**: Enhanced Developer Experience |
| 30 | + |
| 31 | +### Planned Features |
| 32 | + |
| 33 | +#### ?? Template Validation |
| 34 | +- **Pre-render validation** - Catch syntax errors before rendering |
| 35 | +- **Template analysis** - Detect unused variables, missing properties |
| 36 | +- **Type-safe templates** - Optional strongly-typed template compilation |
| 37 | + |
| 38 | +```csharp |
| 39 | +// Validate template syntax |
| 40 | +var errors = engine.Validate(template); |
| 41 | +if (errors.Any()) |
| 42 | +{ |
| 43 | + foreach (var error in errors) |
| 44 | + Console.WriteLine($"Line {error.Line}: {error.Message}"); |
| 45 | +} |
| 46 | +``` |
| 47 | + |
| 48 | +#### ?? Template Caching |
| 49 | +- **Compiled template cache** - Parse once, render many times |
| 50 | +- **Performance boost** - 10-50x faster for repeated renders |
| 51 | + |
| 52 | +```csharp |
| 53 | +// Cache compiled template |
| 54 | +var compiledTemplate = engine.Compile(template); |
| 55 | + |
| 56 | +// Render many times (fast!) |
| 57 | +for (int i = 0; i < 1000; i++) |
| 58 | +{ |
| 59 | + var result = compiledTemplate.Render(context); |
| 60 | +} |
| 61 | +``` |
| 62 | + |
| 63 | +#### ?? Improved Error Messages |
| 64 | +- **Line/column information** - Pinpoint errors in templates |
| 65 | +- **Syntax highlighting** in error messages (console/terminal) |
| 66 | +- **Helpful suggestions** for common mistakes |
| 67 | + |
| 68 | +#### ?? Additional Pipe Helpers |
| 69 | +- `slice:start,end` - Extract substring by index |
| 70 | +- `match:pattern` - Regex matching |
| 71 | +- `contains:value` - Check if string/collection contains value |
| 72 | +- `split:separator` - Split string into array |
| 73 | + |
| 74 | +### Performance Improvements |
| 75 | +- ? 20% faster variable resolution |
| 76 | +- ? Reduce allocations in tight loops |
| 77 | +- ? Optimize pipe helper chaining |
| 78 | + |
| 79 | +--- |
| 80 | + |
| 81 | +## Version 2026.3.0 (Q3 2026) |
| 82 | + |
| 83 | +**Theme**: Advanced Templating |
| 84 | + |
| 85 | +### Planned Features |
| 86 | + |
| 87 | +#### ?? Template Includes/Partials |
| 88 | +- **Reusable template fragments** |
| 89 | +- **Nested templates** with isolated contexts |
| 90 | + |
| 91 | +```csharp |
| 92 | +var template = """ |
| 93 | + @include("header.tmpl") |
| 94 | + |
| 95 | + Content here |
| 96 | + |
| 97 | + @include("footer.tmpl") |
| 98 | + """; |
| 99 | +``` |
| 100 | + |
| 101 | +#### ?? Template Macros/Functions |
| 102 | +- **Define reusable blocks** within templates |
| 103 | +- **Parameters and return values** |
| 104 | + |
| 105 | +```csharp |
| 106 | +var template = """ |
| 107 | + @macro FormatUser(user) |
| 108 | + ${user.FirstName} ${user.LastName} (${user.Email}) |
| 109 | + @endmacro |
| 110 | + |
| 111 | + @foreach (var u in Context.Users) |
| 112 | + @FormatUser(u) |
| 113 | + @endforeach |
| 114 | + """; |
| 115 | +``` |
| 116 | + |
| 117 | +#### ?? Async Template Services |
| 118 | +- **Support async transformations** |
| 119 | +- **Useful for API calls, database lookups** |
| 120 | + |
| 121 | +```csharp |
| 122 | +context.RegisterServiceAsync("translate", |
| 123 | + async input => await translationService.TranslateAsync(input)); |
| 124 | + |
| 125 | +var template = "${Context.Services('translate')('Hello')}"; |
| 126 | +``` |
| 127 | + |
| 128 | +#### ?? Enhanced Collection Helpers |
| 129 | +- `where:condition` - Filter collections |
| 130 | +- `orderby:property` - Sort collections |
| 131 | +- `groupby:property` - Group collections |
| 132 | +- `distinct` - Remove duplicates |
| 133 | + |
| 134 | +--- |
| 135 | + |
| 136 | +## Version 2026.4.0 (Q4 2026) |
| 137 | + |
| 138 | +**Theme**: Ecosystem & Tooling |
| 139 | + |
| 140 | +### Planned Features |
| 141 | + |
| 142 | +#### ?? Visual Studio Extension |
| 143 | +- **Syntax highlighting** for `.tmpl` files |
| 144 | +- **IntelliSense** for context properties |
| 145 | +- **Live preview** of template output |
| 146 | +- **Error highlighting** in templates |
| 147 | + |
| 148 | +#### ?? Source Generator Templates |
| 149 | +- **Compile templates** into C# code at build time |
| 150 | +- **Type-safe, zero-runtime overhead** |
| 151 | +- **Perfect for embedded templates** |
| 152 | + |
| 153 | +```csharp |
| 154 | +// Template file: EmailTemplate.tmpl |
| 155 | +// Generated: EmailTemplate.g.cs with type-safe methods |
| 156 | +
|
| 157 | +var email = EmailTemplate.Render(new { Name = "John", Order = "12345" }); |
| 158 | +``` |
| 159 | + |
| 160 | +#### ?? Template Library/Registry |
| 161 | +- **NuGet packages** with pre-built templates |
| 162 | +- **Community templates** for common scenarios |
| 163 | +- **Template discovery** and reuse |
| 164 | + |
| 165 | +#### ?? CLI Tool |
| 166 | +- **Render templates** from command line |
| 167 | +- **Watch mode** for development |
| 168 | +- **Batch processing** |
| 169 | + |
| 170 | +```bash |
| 171 | +dotnet tinytools render --template email.tmpl --data data.json --output email.txt |
| 172 | +dotnet tinytools watch --template *.tmpl |
| 173 | +``` |
| 174 | + |
| 175 | +--- |
| 176 | + |
| 177 | +## Future Considerations (2027+) |
| 178 | + |
| 179 | +### Under Consideration |
| 180 | + |
| 181 | +#### ?? Localization/Internationalization |
| 182 | +- **Built-in i18n** support |
| 183 | +- **Resource file integration** |
| 184 | + |
| 185 | +#### ?? Template Debugging |
| 186 | +- **Breakpoints** in templates |
| 187 | +- **Step-through execution** |
| 188 | +- **Variable inspection** |
| 189 | + |
| 190 | +#### ?? Performance Mode |
| 191 | +- **Unsafe code** for extreme performance |
| 192 | +- **Memory pooling** and recycling |
| 193 | +- **SIMD optimizations** where applicable |
| 194 | + |
| 195 | +#### ?? Alternative Syntax Modes |
| 196 | +- **Mustache-style** `{{variable}}` |
| 197 | +- **Liquid-style** `{{ variable | filter }}` |
| 198 | +- **Custom delimiter** configuration |
| 199 | + |
| 200 | +--- |
| 201 | + |
| 202 | +## What We Won't Do |
| 203 | + |
| 204 | +To keep TinyTools **tiny**, we explicitly **won't** add: |
| 205 | + |
| 206 | +? **HTML/View Rendering** - Use Razor for that |
| 207 | +? **JavaScript Execution** - Use a JavaScript engine |
| 208 | +? **Heavy Dependencies** - Stays lightweight |
| 209 | +? **Complex DSL** - Keep it simple and readable |
| 210 | +? **Everything to Everyone** - Focus on core use cases |
| 211 | + |
| 212 | +--- |
| 213 | + |
| 214 | +## Breaking Changes Policy |
| 215 | + |
| 216 | +### Semantic Versioning |
| 217 | +- **YEAR.MINOR.PATCH** format (e.g., 2026.1.0) |
| 218 | +- **Breaking changes** only in YEAR increments |
| 219 | +- **MINOR versions** add features, maintain compatibility |
| 220 | +- **PATCH versions** fix bugs only |
| 221 | + |
| 222 | +### Deprecation Process |
| 223 | +1. **Mark as obsolete** with warning |
| 224 | +2. **Keep for one YEAR** (e.g., 2026.x) |
| 225 | +3. **Remove in next YEAR** (e.g., 2027.0) |
| 226 | +4. **Document** in changelog and migration guide |
| 227 | + |
| 228 | +--- |
| 229 | + |
| 230 | +## Community Requests |
| 231 | + |
| 232 | +**Want to influence the roadmap?** We welcome: |
| 233 | + |
| 234 | +- ?? **Bug reports** - [GitHub Issues](https://github.com/lowlandtech/tinytools/issues) |
| 235 | +- ?? **Feature requests** - [GitHub Discussions](https://github.com/lowlandtech/tinytools/discussions) |
| 236 | +- ?? **Pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) |
| 237 | +- ?? **Feedback** - [@wendellmva on Twitter](https://twitter.com/wendellmva) |
| 238 | + |
| 239 | +### Top Community Requests |
| 240 | +1. Template validation (? **Planned for 2026.2**) |
| 241 | +2. Template caching (? **Planned for 2026.2**) |
| 242 | +3. Better error messages (? **Planned for 2026.2**) |
| 243 | +4. Visual Studio extension (? **Planned for 2026.4**) |
| 244 | +5. Template includes (**Under consideration**) |
| 245 | + |
| 246 | +--- |
| 247 | + |
| 248 | +## Release Cadence |
| 249 | + |
| 250 | +- **Quarterly releases** (4 per year) |
| 251 | +- **Patch releases** as needed for critical bugs |
| 252 | +- **Preview releases** for early feedback |
| 253 | +- **LTS support** for previous YEAR versions (1 year) |
| 254 | + |
| 255 | +--- |
| 256 | + |
| 257 | +## Version Support Matrix |
| 258 | + |
| 259 | +| Version | Released | End of Support | Status | |
| 260 | +|---------|----------|----------------|--------| |
| 261 | +| 2026.x | Jan 2026 | Dec 2027 | ? Current | |
| 262 | +| 2025.x | Jan 2025 | Dec 2026 | ?? Maintenance | |
| 263 | +| 2024.x | Jan 2024 | Dec 2025 | ? End of Life | |
| 264 | + |
| 265 | +--- |
| 266 | + |
| 267 | +## Contributing to the Roadmap |
| 268 | + |
| 269 | +This roadmap is a living document. If you have ideas, suggestions, or feedback: |
| 270 | + |
| 271 | +1. **Open a discussion** on GitHub |
| 272 | +2. **Vote on features** using ?? reactions |
| 273 | +3. **Share your use cases** to help us prioritize |
| 274 | +4. **Contribute code** to help ship features faster |
| 275 | + |
| 276 | +**Last Updated**: January 2026 |
| 277 | +**Next Review**: April 2026 |
0 commit comments