|
2 | 2 |
|
3 | 3 | All notable changes to [Noir](https://github.com/owasp-noir/noir) will be documented in this file. |
4 | 4 |
|
| 5 | +## v0.30.0 |
| 6 | + |
| 7 | +### Added |
| 8 | +- Tree-sitter foundation: vendored grammars for Java, Kotlin, JavaScript, and Python |
| 9 | +- Tree-sitter Query API for declarative detectors |
| 10 | +- ImportGraph module: unified Java/Kotlin cross-file resolution, relative-import support, Python half |
| 11 | +- 30+ new framework analyzers: |
| 12 | + - Java/Kotlin: JAX-RS, Quarkus, Dropwizard, Micronaut, Javalin, Spark Java, http4k, Kotlin Gateway |
| 13 | + - Node.js/JS/TS: Next.js, Hapi, Astro, SvelteKit, Remix, Fresh, Elysia, AdonisJS |
| 14 | + - Python: Bottle, Falcon, Starlette, aiohttp, Pyramid, Litestar |
| 15 | + - Ruby: Roda, Grape |
| 16 | + - PHP: Slim, Yii2, CodeIgniter |
| 17 | + - Go: Iris, Hertz |
| 18 | + - Rust: Poem |
| 19 | + - C++: Crow, Drogon |
| 20 | + - Dart: Dart Frog |
| 21 | +- MCP endpoint tagger |
| 22 | +- `--exclude-path` flag to filter files by glob |
| 23 | +- Crystal 1.20 support |
| 24 | +- RPM, DEB, APK, and AUR package release workflows |
| 25 | +- Shared engine base classes for PHP, Ruby, Rust, Elixir, Swift, Crystal, Scala, JavaScript, Python, and Go analyzers |
| 26 | +- Analyzer architecture documentation |
| 27 | + |
| 28 | +### Changed |
| 29 | +- Migrated Spring, Armeria, Ktor, and Flask analyzers to tree-sitter; retired legacy Java/Kotlin miniparser/minilexer |
| 30 | +- Migrated Python and Go route extraction to tree-sitter |
| 31 | +- Switched builder to official `crystallang/crystal` (Alpine) image |
| 32 | +- Consolidated duplicate `Endpoint` initializers |
| 33 | +- AI provider docs and Ollama model token map updates (gemma3/4, llama4, phi4) |
| 34 | + |
| 35 | +### Performance |
| 36 | +- Cached file contents in `CodeLocator` for analyzer reuse |
| 37 | +- Parse-once Spring/Kotlin extractors with shared DTO sibling cache |
| 38 | +- Skip already-matched detectors in the per-file detect loop |
| 39 | +- Pruned ignored directories at walk time and deduped media stats |
| 40 | +- Passive scan early-out per matcher |
| 41 | +- Migrated unified_ai, example, fasthttp, phoenix, and Python analyzers to `file_map` |
| 42 | +- Skip non-`.rb` files in Sinatra analyzer |
| 43 | + |
| 44 | +### Fixed |
| 45 | +- Bounded recursion depth in tree-walker extractors (security) |
| 46 | +- Added boundary check to `ImportGraph.resolve_relative_import` (security) |
| 47 | +- Express config-array mount pattern resolution |
| 48 | +- JS miniparser: reject bare-identifier routes from `Promise.all`, accept wildcard/bare param routes |
| 49 | +- Go miniparser: accept grouped routes without leading slash, guarantee separator on single-match group prefix |
| 50 | +- OAS2 analyzer: merged duplicate form/formData branches and corrected `form` → `json` param-type mapping |
| 51 | +- Non-deterministic endpoint dedup in Nitro and Nuxt.js analyzers |
| 52 | +- Elevated regex compile failures from debug to warn in passive scan |
| 53 | +- GraphQL analyzer now uses `Log.debug` instead of `STDERR.puts` |
| 54 | +- Warn when falling back to default `max_tokens` for unknown models |
| 55 | +- Corrected `SKIPPED_LEAVES` constant spelling in Fresh analyzer |
| 56 | + |
5 | 57 | ## v0.29.1 |
6 | 58 |
|
7 | 59 | ### Added |
|
0 commit comments