Skip to content

Commit

Permalink
fix: add support for TypeScript 4.8 (#3548)
Browse files Browse the repository at this point in the history
Closes #3547
  • Loading branch information
markostanimirovic authored Aug 29, 2022
1 parent ecb6377 commit d558ce1
Show file tree
Hide file tree
Showing 36 changed files with 180 additions and 66 deletions.
2 changes: 2 additions & 0 deletions modules/component-store/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/component-store/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
9 changes: 4 additions & 5 deletions modules/component-store/schematics-core/utility/visitors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as ts from 'typescript';
import { normalize, resolve } from '@angular-devkit/core';
import { Tree, DirEntry } from '@angular-devkit/schematics';
import { getNodeDecorators } from './decorators';

export function visitTSSourceFiles<Result = void>(
tree: Tree,
Expand Down Expand Up @@ -166,15 +167,13 @@ export function visitDecorator(
}

const classDeclarationNode = node as ts.ClassDeclaration;
const decorators = getNodeDecorators(classDeclarationNode);

if (
!classDeclarationNode.decorators ||
!classDeclarationNode.decorators.length
) {
if (!decorators || !decorators.length) {
return;
}

const componentDecorator = classDeclarationNode.decorators.find((d) => {
const componentDecorator = decorators.find((d) => {
return (
ts.isCallExpression(d.expression) &&
ts.isIdentifier(d.expression.expression) &&
Expand Down
2 changes: 2 additions & 0 deletions modules/component/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/component/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
9 changes: 4 additions & 5 deletions modules/component/schematics-core/utility/visitors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as ts from 'typescript';
import { normalize, resolve } from '@angular-devkit/core';
import { Tree, DirEntry } from '@angular-devkit/schematics';
import { getNodeDecorators } from './decorators';

export function visitTSSourceFiles<Result = void>(
tree: Tree,
Expand Down Expand Up @@ -166,15 +167,13 @@ export function visitDecorator(
}

const classDeclarationNode = node as ts.ClassDeclaration;
const decorators = getNodeDecorators(classDeclarationNode);

if (
!classDeclarationNode.decorators ||
!classDeclarationNode.decorators.length
) {
if (!decorators || !decorators.length) {
return;
}

const componentDecorator = classDeclarationNode.decorators.find((d) => {
const componentDecorator = decorators.find((d) => {
return (
ts.isCallExpression(d.expression) &&
ts.isIdentifier(d.expression.expression) &&
Expand Down
2 changes: 2 additions & 0 deletions modules/data/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/data/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
9 changes: 4 additions & 5 deletions modules/data/schematics-core/utility/visitors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as ts from 'typescript';
import { normalize, resolve } from '@angular-devkit/core';
import { Tree, DirEntry } from '@angular-devkit/schematics';
import { getNodeDecorators } from './decorators';

export function visitTSSourceFiles<Result = void>(
tree: Tree,
Expand Down Expand Up @@ -166,15 +167,13 @@ export function visitDecorator(
}

const classDeclarationNode = node as ts.ClassDeclaration;
const decorators = getNodeDecorators(classDeclarationNode);

if (
!classDeclarationNode.decorators ||
!classDeclarationNode.decorators.length
) {
if (!decorators || !decorators.length) {
return;
}

const componentDecorator = classDeclarationNode.decorators.find((d) => {
const componentDecorator = decorators.find((d) => {
return (
ts.isCallExpression(d.expression) &&
ts.isIdentifier(d.expression.expression) &&
Expand Down
18 changes: 9 additions & 9 deletions modules/effects/migrations/13_0_0/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
replaceImport,
commitChanges,
visitTSSourceFiles,
getNodeDecorators,
} from '../../schematics-core';

export function migrateToCreators(): Rule {
Expand All @@ -15,13 +16,10 @@ export function migrateToCreators(): Rule {
const effectsPerClass = sourceFile.statements
.filter(ts.isClassDeclaration)
.map((clas) =>
clas.members
.filter(ts.isPropertyDeclaration)
.filter(
(property) =>
property.decorators &&
property.decorators.some(isEffectDecorator)
)
clas.members.filter(ts.isPropertyDeclaration).filter((property) => {
const decorators = getNodeDecorators(property);
return decorators && decorators.some(isEffectDecorator);
})
);

const effects = effectsPerClass.reduce(
Expand Down Expand Up @@ -60,7 +58,9 @@ function replaceEffectDecorators(
if (!effect.initializer) {
return [];
}
const decorator = (effect.decorators || []).find(isEffectDecorator);
const decorator = (getNodeDecorators(effect) || []).find(
isEffectDecorator
);
if (!decorator) {
return [];
}
Expand All @@ -86,7 +86,7 @@ function replaceEffectDecorators(
.reduce((acc, inserts) => acc.concat(inserts), []);

const removes = effects
.map((effect) => effect.decorators)
.map((effect) => getNodeDecorators(effect))
.map((decorators) => {
if (!decorators) {
return [];
Expand Down
2 changes: 2 additions & 0 deletions modules/effects/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/effects/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
9 changes: 4 additions & 5 deletions modules/effects/schematics-core/utility/visitors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as ts from 'typescript';
import { normalize, resolve } from '@angular-devkit/core';
import { Tree, DirEntry } from '@angular-devkit/schematics';
import { getNodeDecorators } from './decorators';

export function visitTSSourceFiles<Result = void>(
tree: Tree,
Expand Down Expand Up @@ -166,15 +167,13 @@ export function visitDecorator(
}

const classDeclarationNode = node as ts.ClassDeclaration;
const decorators = getNodeDecorators(classDeclarationNode);

if (
!classDeclarationNode.decorators ||
!classDeclarationNode.decorators.length
) {
if (!decorators || !decorators.length) {
return;
}

const componentDecorator = classDeclarationNode.decorators.find((d) => {
const componentDecorator = decorators.find((d) => {
return (
ts.isCallExpression(d.expression) &&
ts.isIdentifier(d.expression.expression) &&
Expand Down
2 changes: 1 addition & 1 deletion modules/effects/src/effect_decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function Effect(config: EffectConfig = {}) {
};
}

export function getEffectDecoratorMetadata<T>(
export function getEffectDecoratorMetadata<T extends Object>(
instance: T
): EffectMetadata<T>[] {
const effectsDecorators: EffectMetadata<T>[] = compose(
Expand Down
8 changes: 6 additions & 2 deletions modules/effects/src/effects_metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import { EffectMetadata, EffectsMetadata } from './models';
import { getCreateEffectMetadata } from './effect_creator';
import { getEffectDecoratorMetadata } from './effect_decorator';

export function getEffectsMetadata<T>(instance: T): EffectsMetadata<T> {
export function getEffectsMetadata<T extends Object>(
instance: T
): EffectsMetadata<T> {
return getSourceMetadata(instance).reduce(
(
acc: EffectsMetadata<T>,
Expand All @@ -15,7 +17,9 @@ export function getEffectsMetadata<T>(instance: T): EffectsMetadata<T> {
);
}

export function getSourceMetadata<T>(instance: T): EffectMetadata<T>[] {
export function getSourceMetadata<T extends Object>(
instance: T
): EffectMetadata<T>[] {
const effects: Array<(instance: T) => EffectMetadata<T>[]> = [
getEffectDecoratorMetadata,
getCreateEffectMetadata,
Expand Down
4 changes: 2 additions & 2 deletions modules/effects/src/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ export interface EffectMetadata<T extends Object>
propertyName: EffectPropertyKey<T>;
}

export type EffectsMetadata<T> = {
[key in EffectPropertyKey<T>]?: EffectConfig;
export type EffectsMetadata<T extends Object> = {
[Key in EffectPropertyKey<T>]?: EffectConfig;
};
2 changes: 2 additions & 0 deletions modules/entity/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/entity/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
9 changes: 4 additions & 5 deletions modules/entity/schematics-core/utility/visitors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as ts from 'typescript';
import { normalize, resolve } from '@angular-devkit/core';
import { Tree, DirEntry } from '@angular-devkit/schematics';
import { getNodeDecorators } from './decorators';

export function visitTSSourceFiles<Result = void>(
tree: Tree,
Expand Down Expand Up @@ -166,15 +167,13 @@ export function visitDecorator(
}

const classDeclarationNode = node as ts.ClassDeclaration;
const decorators = getNodeDecorators(classDeclarationNode);

if (
!classDeclarationNode.decorators ||
!classDeclarationNode.decorators.length
) {
if (!decorators || !decorators.length) {
return;
}

const componentDecorator = classDeclarationNode.decorators.find((d) => {
const componentDecorator = decorators.find((d) => {
return (
ts.isCallExpression(d.expression) &&
ts.isIdentifier(d.expression.expression) &&
Expand Down
2 changes: 2 additions & 0 deletions modules/router-store/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/router-store/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
9 changes: 4 additions & 5 deletions modules/router-store/schematics-core/utility/visitors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as ts from 'typescript';
import { normalize, resolve } from '@angular-devkit/core';
import { Tree, DirEntry } from '@angular-devkit/schematics';
import { getNodeDecorators } from './decorators';

export function visitTSSourceFiles<Result = void>(
tree: Tree,
Expand Down Expand Up @@ -166,15 +167,13 @@ export function visitDecorator(
}

const classDeclarationNode = node as ts.ClassDeclaration;
const decorators = getNodeDecorators(classDeclarationNode);

if (
!classDeclarationNode.decorators ||
!classDeclarationNode.decorators.length
) {
if (!decorators || !decorators.length) {
return;
}

const componentDecorator = classDeclarationNode.decorators.find((d) => {
const componentDecorator = decorators.find((d) => {
return (
ts.isCallExpression(d.expression) &&
ts.isIdentifier(d.expression.expression) &&
Expand Down
2 changes: 1 addition & 1 deletion modules/router-store/src/router_selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export function createRouterSelector<
return createFeatureSelector(DEFAULT_ROUTER_FEATURENAME);
}

export function getSelectors<V>(
export function getSelectors<V extends Record<string, any>>(
selectState: (state: V) => RouterReducerState<any> = createRouterSelector<V>()
): RouterStateSelectors<V> {
const selectRouterState = createSelector(
Expand Down
2 changes: 2 additions & 0 deletions modules/schematics-core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,5 @@ export {
visitNgModules,
visitTemplates,
} from './utility/visitors';

export { getNodeDecorators } from './utility/decorators';
10 changes: 10 additions & 0 deletions modules/schematics-core/utility/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as ts from 'typescript';

/**
* In TS 4.8 the `decorators` are combined with the `modifiers` array.
* Once we drop support for older versions, we can remove this function
* and use `ts.getDecorators`.
*/
export function getNodeDecorators(node: ts.Node): ts.Decorator[] | undefined {
return (ts as any).getDecorators?.(node) || node.decorators;
}
Loading

0 comments on commit d558ce1

Please sign in to comment.