PackageTrack
Sign in Get early access

codemod

Write and run automated code modifications on a codebase. Primarily geared towards updating and refactoring Dart code, but can modify any files.

1.2.1 6.9K downloads/mo #3422 most downloaded on pub.dev Workiva/dart_codemod

What this package is like to depend on

Last release 3 months ago

28 Apr 2026

Release timing varies

gaps range from 3 weeks to 2.4 years

Nearly every release is documented

notes for 16 of 16 stable releases

Nothing withdrawn

no release was ever pulled

8 years old

16 releases · first in 2019

1 release in the last 12 months

see the full history below

Release timeline

16 releases · Jan 2019 to Apr 2026
2020 2021 2022 2023 2024 2025 2026
Release Pre-release

Releases

latest 16
  1. 1.2.1 28 Apr 2026
    Release notes

    Info

    Build: (waiting for build to complete)
    Skynet Results: (waiting for Skynet results)
    Pipeline: (waiting for pipeline to start)
    This patch release includes the following changes:

    Miscellaneous

    • #81 FEDX-685-take1 : GHA OSS changes to dart_codemod

      • FEDX-685 GHA OSS changes
    • #93 Allow analyzer 10

    • #94 RM-230186 Release dart_codemod 1.2.1

      • RM-230186 RELEASE dart_codemod 1.2.1

    Notes created on Tuesday, April 28 02:00 PM UTC

    Open source →
  2. 1.2.0 18 Dec 2023
    Release notes

    Info

    Build: https://ci.webfilings.com/build/5317099
    Skynet Results: https://wf-skynet-hrd.appspot.com/apps/test/smithy/5317099/latest
    Pipeline: No Pipeline
    This minor release includes the following changes:

    New Features and Improvements

    • #74 FEDX-522 Add APIs to help test suggestors with resolved AST
      • FEDX-522 Improve dart codemod testability

    Miscellaneous

    • #77 RM-221592 Release dart_codemod 1.2.0
      • RM-221592 RELEASE dart_codemod 1.2.0

    Notes created on Monday, December 18 05:58 PM UTC

    Open source →
    Release notes
    • Add PackageContextForTest to package:codemod/test.dart to help test suggestors that require a fully resolved AST from the analyzer (for example: suggestors using the AstVisitingSuggestor mixin with shouldResolveAst enabled).
    Open source →
  3. 1.1.0 31 Oct 2023
    Release notes

    Info

    Build: https://ci.webfilings.com/build/5138313
    Skynet Results: https://wf-skynet-hrd.appspot.com/apps/test/smithy/5138313/latest
    Pipeline: No Pipeline
    This minor release includes the following changes:

    Miscellaneous

    • #66 Raise analyzer minimum & unpin meta

    • #67 Pin mockito 5

    • #69 Rollout Analyzer 5

    • #72 Dart 2.19

    • #73 RM-161448 Release dart_codemod 1.1.0 with Dart 3 support

      • RM-161448 RELEASE dart_codemod 1.1.0

    Notes created on Tuesday, October 31 06:07 PM UTC

    Open source →
    Release notes
    • Compatibility with Dart 3 and analyzer 6.
    Open source →
  4. 1.0.11 22 Sep 2022
    Release notes

    Info

    Build: https://ci.webfilings.com/build/3932548
    Skynet Results: https://wf-skynet-hrd.appspot.com/apps/test/smithy/3932548/latest
    Pipeline: No Pipeline
    This patch release includes the following changes:

    Miscellaneous

    • #64 Analyzer v3, v4, and v5

    • #65 RM-161063 Release dart_codemod 1.0.11

      • RM-161063 RELEASE dart_codemod 1.0.11

    Notes created on Thursday, September 22 10:39 PM UTC

    Open source →
    Release notes
    • Widen analyzer dependency range to include v3, v4, and v5.
    Open source →
  5. 1.0.10 20 Sep 2022
    Release notes

    Info

    Build: https://ci.webfilings.com/build/3924638
    Skynet Results: https://wf-skynet-hrd.appspot.com/apps/test/smithy/3924638/latest
    Pipeline: No Pipeline
    This patch release includes the following changes:

    Miscellaneous

    • #62 FEA-661: Update to analyer v2
      • FEA-661 Update to analyer v2
    • #63 RM-157378 Release dart_codemod 1.0.10
      • RM-157378 RELEASE dart_codemod 1.0.10

    Notes created on Tuesday, September 20 08:57 PM UTC

    Open source →
    Release notes
    • Update analyzer dependency to v2
    Open source →
  6. 1.0.2 29 Sep 2021
    Release notes
    • Raise Dart SDK minimum to 2.11.0
    Open source →
  7. 1.0.1 09 Jun 2021
    Release notes
    • Include file path in error message when parsing a Dart file fails.
    Open source →
  8. 1.0.0 27 Apr 2021
    Release notes
    • Null-safety release.
    • AstVisitingSuggestor.context will throw a StateError if accessed outside one of the visitor methods.
    Open source →
  9. 0.3.1 08 Apr 2021
    Release notes
    • Fix invalid file path error on windows when applying patches.
    Open source →
  10. 0.3.0 16 Mar 2021
    Release notes
    • Breaking: runInteractiveCodemod and runInteractiveCodemodSequence are both now async.

    • Breaking: Suggestor is now a function typedef instead of a class. Addtionally, it takes the new FileContext type as its only parameter (previously the generatePatches method took a SourceFile) and now must return a Stream<Patch> instead of Iterable<Patch>.

      If you were extending Suggestor, you can either change the class to a function like so:

        final String licenseHeader = '...';
      
      - class LicenseHeaderInserter implements Suggestor {
      -   @override
      -   bool shouldSkip(String sourceFileContents) =>
      -       sourceFileContents.trimLeft().startsWith(licenseHeader);
      -
      -   @override
      -   Iterable<Patch> generatePatches(SourceFile sourceFile) sync* {
      -     yield Patch(sourceFile, sourceFile.span(0, 0), licenseHeader);
      -   }
      - }
      
      + Stream<Patch> licenseHeaderInserter(FileContext context) async* {
      +   // Skip if license header already exists.
      +   if (context.sourceText.trimLeft().startsWith(licenseHeader)) return;
      +
      +   yield Patch(licenseHeader, 0, 0);
      + }
      

      Or rename the generatePatches() method to call() so that the class is callable like a function:

        final String licenseHeader = '...';
      
      - class LicenseHeaderInserter implements Suggestor {
      + class LicenseHeaderInserter {
      -   @override
          bool shouldSkip(String sourceFileContents) =>
              sourceFileContents.trimLeft().startsWith(licenseHeader);
      
      -   @override
      -   Iterable<Patch> generatePatches(SourceFile sourceFile) sync* {
      +   Stream<Patch> call(FileContext context) async* {
      +     if (shouldSkip(context.sourceText)) return;
      -     yield Patch(sourceFile, sourceFile.span(0, 0), licenseHeader);
      +     yield Patch(licenseHeader, 0, 0);
          }
        }
      
    • Breaking: Simplify the Patch class to now only encapsulate the updated text, start offset, and end offset.

      - yield Patch(sourceFile, sourceFile.span(5, 10), 'updated text');
      + yield Patch('updated text', 5, 10);
      
    • Breaking: Rename AstVisitingSuggestorMixin to AstVisitingSuggestor since the Mixin suffix was redundant.

    • Breaking: Remove AggregateSuggestor class in favor of an aggregate(Iterable<Suggestor> suggestors) function.

    • Breaking: Move applyPatches from the main package:codemod/codemod.dart entrypoint to the new package:codemod/test.dart entrypoint to make its intended usage clear.

    • Add a shouldResolveAst(FileContext context) method to AstVisitingSuggestor. Defaults to false (since resolving is slower), but can be overridden to true if the fully resolved AST is needed.

    • Add package:codemod/test.dart entrypoint for testing suggestors. This entrypoint exports three functions:

      • Future<FileContext> fileContextForTest(String name, String contents)

      • void expectSuggestorGeneratesPatches(Suggestor suggestor, FileContext context, dynamic resultMatcher)

      • String applyPatches(SourceFile sourceFile, Iterable<Patch> patches)

        The first two should be sufficient for testing most suggestors.

    • Use GitHub Actions for CI (remove Travis CI).

    Open source →
  11. 0.2.0 06 Apr 2020
    Release notes
    • Breaking Change: remove the FileQuery class. The runInteractiveCodemod() function now expects an Iterable<File> instead of a FileQuery. This is intended to simplify consumption; package:glob can be used to easily query for the desired files.

    • Breaking Change: remove createPathFilter() - this was used with FileQuery and can be replaced by custom logic now that runInteractiveCodemod() accepts an Iterable<File>.

    • Breaking Change: remove isDartFile() - use package:glob instead to target files with the .dart extension (e.g. Glob('**.dart')).

    • Add a filePathsFromGlob() utility function that takes a Glob instance and returns the file paths matched by the glob, but filtered to exclude hidden files (e.g. files in .dart_tool/). This is intended to serve the most common use case of running codemods on Dart projects, e.g.:

      runInteractiveCodemod(
        filePathsFromGlob(Glob('**.dart', recursive: true)),
        suggestor);
      
    • Widen Analyzer dependency range to include 0.39.x.

    • Make Patch override operator == and hashCode so that instances can be compared for equality. If two Patch instances target the same span in the same file and have the same updatedText, they are considered equal.

    • AstVisitingSuggestorMixin now de-duplicates patches suggested for each source file. This can be useful for recursive and generalizing AST visitors that may end up suggesting duplicate patches in parts of the AST that get handled by multiple visit methods.

    • Improve the error/help output when overlapping patches are found.

    Open source →
  12. 0.1.5 19 Aug 2019
    Release notes
    • Widen Analyzer dependency range from ^0.37.0 to >=0.37.0 <0.39.0.

    • Exclude build/ folder when a codemod gets run.

    Open source →
  13. 0.1.4 10 Jul 2019
    Release notes
    • Prompts the user to either skip overlapping patches or quit when they are found.
    Open source →
  14. 0.1.3 05 Feb 2019
    Release notes
    • Codemod authors can now augment the help output and the changes required output via runInteractiveCodemod() and runInteractiveCodemodSequence() using the optional additionalHelpOutput and changesRequiredOutput params.

      • If additionalHelpOutput is given, it will be printed to stderr after the default help output when the codemod is run with the -h|--help flag.

      • If changesRequiredOutput is given, it will be printed to stderr after the default output when the codemod is run with the --fail-on-changes flag and changes are in fact required.

    Open source →
  15. 0.1.2 23 Jan 2019
    Release notes
    • Fix a typing issue with the AggregateSuggestor's constructor param.

    • Add tests for AggregateSuggestor and AstVisitingSuggestorMixin

    Open source →
  16. 0.1.1 16 Jan 2019
    Release notes
    • Update pubspec.yaml for initial OSS release.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive