Skip to main content

8.73.0 release (2026-02-11)

Total recipe count: 4755

info

This changelog only shows what recipes have been added, removed, or changed. OpenRewrite may do releases that do not include these types of changes. To see these changes, please go to the releases page.

Corresponding CLI version

  • Stable CLI version v3.53.2
  • Staging CLI version: v3.57.1

New Artifacts

  • rewrite-prethink

New Recipes

Usage in YAML recipes

Add org.openrewrite.Singleton as a precondition:

---
type: specs.openrewrite.org/v1beta/recipe
name: com.example.Append
displayName: My recipe
preconditions:
- org.openrewrite.Singleton
recipeList:
- org.openrewrite.text.AppendToTextFile:
relativeFileName: report.txt
content: 'Recipe executed'
```## Usage in Java recipes

Wrap visitors with `Singleton.singleton(this, visitor)` to ensure only the first *equivalent* recipe instance makes changes:

```java
@Override
public TreeVisitor<?, ExecutionContext> getVisitor(Accumulator acc) {
return singleton(this, new TreeVisitor<Tree, ExecutionContext>() {
@Override
public Tree visit(@Nullable Tree tree, ExecutionContext ctx) {
// Your transformation logic
return tree;
}
});
}
@Override
public Collection<SourceFile> generate(Accumulator acc, ExecutionContext ctx) {
if (!isSingleton(this, ctx)) {
return Collections.emptyList();
}
// Generate new sources
return results;
}

@Override
public TreeVisitor<?, ExecutionContext> getVisitor(Accumulator acc) {
return singleton(this, new TreeVisitor<Tree, ExecutionContext>() {
// Visitor logic
});
}

Note: Singleton status is determined by the recipe's equals() and hashCode() methods. If equivalent instances of a recipe are not considered singletons, ensure your recipe class correctly implements these methods. The easiest way is to use Lombok's @Value annotation on your recipe class, which automatically generates correct equals() and hashCode() implementations based on all fields.

Removed Recipes

  • org.openrewrite.docker.search.FindDockerImageUses: Produce an impact analysis of base images used in Dockerfiles, .gitlab-ci files, Kubernetes Deployment file, etc.

Changed Recipes

  • org.openrewrite.java.OrderImports was changed:
    • Old Options:
      • removeUnused: { type: Boolean, required: false }
    • New Options:
      • removeUnused: { type: Boolean, required: false }
      • style: { type: String, required: false }
  • org.openrewrite.javascript.change-import was changed:
    • Old Options:
      • newAlias: { type: String, required: false }
      • newMember: { type: String, required: false }
      • newModule: { type: String, required: true }
      • oldMember: { type: String, required: true }
      • oldModule: { type: String, required: true }
    • New Options:
      • None
  • org.openrewrite.javascript.dependencies.add-dependency was changed:
    • Old Options:
      • packageName: { type: String, required: true }
      • scope: { type: String, required: false }
      • version: { type: String, required: true }
    • New Options:
      • None
  • org.openrewrite.javascript.dependencies.find-dependency was changed:
    • Old Options:
      • onlyDirect: { type: String, required: false }
      • packageName: { type: String, required: true }
      • version: { type: String, required: false }
    • New Options:
      • None
  • org.openrewrite.javascript.dependencies.upgrade-dependency-version was changed:
    • Old Options:
      • newVersion: { type: String, required: true }
      • packageName: { type: String, required: true }
    • New Options:
      • None
  • org.openrewrite.javascript.dependencies.upgrade-transitive-dependency-version was changed:
    • Old Options:
      • dependencyPath: { type: String, required: false }
      • newVersion: { type: String, required: true }
      • packageName: { type: String, required: true }
    • New Options:
      • None
  • org.openrewrite.javascript.migrate.es6.modernize-octal-escape-sequences was changed:
    • Old Options:
      • useUnicodeEscapes: { type: String, required: false }
    • New Options:
      • None
  • org.openrewrite.json.AddKeyValue was changed:
    • Old Options:
      • key: { type: String, required: true }
      • keyPath: { type: String, required: true }
      • prepend: { type: boolean, required: false }
      • value: { type: String, required: true }
    • New Options:
      • key: { type: String, required: true }
      • keyPath: { type: String, required: true }
      • prepend: { type: Boolean, required: false }
      • value: { type: String, required: true }
  • org.openrewrite.java.migrate.lang.UseTextBlocks was changed:
    • Old Options:
      • convertStringsWithoutNewlines: { type: boolean, required: false }
    • New Options:
      • avoidLineContinuations: { type: boolean, required: false }
      • convertStringsWithoutNewlines: { type: boolean, required: false }
  • org.openrewrite.yaml.CopyValue was changed:
    • Old Options:
      • newFilePath: { type: String, required: false }
      • newKey: { type: String, required: true }
      • oldFilePath: { type: String, required: false }
      • oldKeyPath: { type: String, required: true }
    • New Options:
      • createNewKeys: { type: Boolean, required: false }
      • newFilePath: { type: String, required: false }
      • newKey: { type: String, required: true }
      • oldFilePath: { type: String, required: false }
      • oldKeyPath: { type: String, required: true }