-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(store): add createFeatureSelector migration (#3214)
* feat(store): add createFeatureSelector migration * chore: update test
- Loading branch information
1 parent
ba86496
commit 62334f9
Showing
3 changed files
with
114 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
import { Tree } from '@angular-devkit/schematics'; | ||
import { | ||
SchematicTestRunner, | ||
UnitTestTree, | ||
} from '@angular-devkit/schematics/testing'; | ||
import * as path from 'path'; | ||
|
||
describe('Store Migration 13_0_0 beta', () => { | ||
const collectionPath = path.join(__dirname, '../migration.json'); | ||
const pkgName = 'store'; | ||
|
||
it(`should replace createFeatureSelector usages with 2 generics`, async () => { | ||
const contents = ` | ||
import {createFeatureSelector} from '@ngrx/store' | ||
// untouched | ||
const featureSelector1 = createFeatureSelector('feature1'); | ||
const featureSelector2 = createFeatureSelector<Feature>(feature2); | ||
const featureSelector3 = createFeatureSelector<State,Feature,SomethingElse>(feature3); | ||
const featureSelector4 = createFeatureSelector<fromFeat.State>('feature4'); | ||
// modified | ||
const featureSelector5 = createFeatureSelector<State, Feature>('feature5'); | ||
const featureSelector6 = createFeatureSelector<State,Feature>(feature6); | ||
const featureSelector7 = createFeatureSelector<fromRoot.State, fromFeat.State>('feature7'); | ||
`; | ||
|
||
const expected = ` | ||
import {createFeatureSelector} from '@ngrx/store' | ||
// untouched | ||
const featureSelector1 = createFeatureSelector('feature1'); | ||
const featureSelector2 = createFeatureSelector<Feature>(feature2); | ||
const featureSelector3 = createFeatureSelector<State,Feature,SomethingElse>(feature3); | ||
const featureSelector4 = createFeatureSelector<fromFeat.State>('feature4'); | ||
// modified | ||
const featureSelector5 = createFeatureSelector< Feature>('feature5'); | ||
const featureSelector6 = createFeatureSelector<Feature>(feature6); | ||
const featureSelector7 = createFeatureSelector< fromFeat.State>('feature7'); | ||
`; | ||
|
||
const appTree = new UnitTestTree(Tree.empty()); | ||
appTree.create('./fixture.ts', contents); | ||
const runner = new SchematicTestRunner('schematics', collectionPath); | ||
|
||
const newTree = await runner | ||
.runSchematicAsync(`ngrx-${pkgName}-migration-13-beta`, {}, appTree) | ||
.toPromise(); | ||
const file = newTree.readContent('fixture.ts'); | ||
|
||
expect(file).toBe(expected); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import * as ts from 'typescript'; | ||
import { Rule, chain, Tree } from '@angular-devkit/schematics'; | ||
import { | ||
visitTSSourceFiles, | ||
RemoveChange, | ||
commitChanges, | ||
} from '../../schematics-core'; | ||
|
||
function updateCreateFeatureSelectorGenerics(): Rule { | ||
return (tree: Tree) => { | ||
visitTSSourceFiles(tree, (sourceFile) => { | ||
const runMigration = sourceFile.statements | ||
.filter(ts.isImportDeclaration) | ||
.filter( | ||
(importDeclaration) => | ||
importDeclaration.moduleSpecifier.getText(sourceFile) === | ||
"'@ngrx/store'" || | ||
importDeclaration.moduleSpecifier.getText(sourceFile) === | ||
'"@ngrx/store"' | ||
) | ||
.some((importDeclaration) => { | ||
return importDeclaration.importClause?.namedBindings | ||
?.getText(sourceFile) | ||
.includes('createFeatureSelector'); | ||
}); | ||
|
||
if (!runMigration) return; | ||
|
||
const changes: RemoveChange[] = []; | ||
ts.forEachChild(sourceFile, crawl); | ||
return commitChanges(tree, sourceFile.fileName, changes); | ||
|
||
function crawl(node: ts.Node) { | ||
ts.forEachChild(node, crawl); | ||
|
||
if (!ts.isCallExpression(node)) return; | ||
if (node.typeArguments?.length !== 2) return; | ||
if (!ts.isIdentifier(node.expression)) return; | ||
if (node.expression.text !== 'createFeatureSelector') return; | ||
|
||
changes.push( | ||
new RemoveChange( | ||
sourceFile.fileName, | ||
node.typeArguments[0].pos, | ||
node.typeArguments[1].pos | ||
) | ||
); | ||
} | ||
}); | ||
}; | ||
} | ||
|
||
export default function (): Rule { | ||
return chain([updateCreateFeatureSelectorGenerics()]); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters