---
# System prepended metadata

title: CodeMods - May
tags: [pitch]

---

---
robots: noindex, nofollow
tags: pitch
---

For instructions on shaping a project see here: [Shaping a Project](/kX02SXVbS6KzMOQd56i6Cg)

# CodeMods - May

### Problem
Codemods are great for the use, but they also need to be easy to write and run so the dev supporting them is excited to help upgrade codebases!

### Appetite
*From: [Appetite guidance](https://basecamp.com/shapeup/1.5-chapter-06#ingredient-2-appetite)*
2 weeks. The changes necessary are surrounding infrastructure/harnesses. This mostly new code that's being written but it will serve as a base for the rest of the codemod project

### Solution
A set of tools built with [ts-morph](https://ts-morph.com/) to solve the following:
1. Framework for testing codemods
    1. Interface/class for how a codemod should look
    2. Semvar based codemod selection. Each codemod should be related to a semvar for when the break is released. That way it is easy to detect and decide which codemods to apply
2. Applying codemods to a group of files
   1. Based on path/blob
   2. Based on the ts.config file
   * Example CLI to run codemods `npx migration.js <path to tsconfig>`
3. Document undocumented TS-morph functionality to make it easy for users to write their own mods.

Example codemod
```TYPESCRIPT
    
import {
  SourceFile
} from "ts-morph";
import { utilities } from "../utilities/utilities";
import {ICodeMod} from '..'

const searchString=/^office\-ui\-fabric\-react/;
const newString = '@fluentui/react';

// This should replace ALL office-ui-fabric-react imports with @fluentui/react
export function RepathOfficeToFluentImports(file: SourceFile) {
  let imports = utilities.getImportsByPath(file, searchString);
  imports.forEach(val => {
    utilities.repathImport(val, newString, searchString);
  })
}

export const Foo: ICodeMod = {
    run: RepathOfficeToFluentImports;
    version: "8.0.0"
}
```

### Risks (Rabbit holes)
*From: [Rabbit hole guidance](https://basecamp.com/shapeup/1.5-chapter-06#ingredient-4-rabbit-holes)*
It's possible to spend too much time trying to get the perfect interface. Start with the minimal interface necessary to run a group of codemods and we can build out from there.

### Out of scope (No-gos)
*From: [No-gos guidance](https://basecamp.com/shapeup/1.5-chapter-06#ingredient-5-no-gos)*
Writing a lot of codemod utilities. Instead this is focused on the core functionality of running a group of codemods based on either semvar or config or both.