Skip to content

Commit 07aa76c

Browse files
chore(): support typescript v4.8, remove enum/union releated features
1 parent 6f2860c commit 07aa76c

File tree

6 files changed

+276
-668
lines changed

6 files changed

+276
-668
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"supertest": "6.2.4",
6161
"ts-jest": "28.0.8",
6262
"ts-node": "10.9.1",
63-
"typescript": "4.7.4"
63+
"typescript": "4.8.2"
6464
},
6565
"changelog": {
6666
"labels": {

packages/graphql/lib/plugin/merge-options.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ import { isString } from '@nestjs/common/utils/shared.utils';
33
export interface PluginOptions {
44
typeFileNameSuffix?: string | string[];
55
introspectComments?: boolean;
6-
autoRegisterEnums?: boolean;
76
}
87

98
const defaultOptions: PluginOptions = {
109
typeFileNameSuffix: ['.input.ts', '.args.ts', '.entity.ts', '.model.ts'],
1110
introspectComments: false,
12-
autoRegisterEnums: false,
1311
};
1412

1513
export const mergePluginOptions = (

packages/graphql/lib/plugin/utils/ast-utils.ts

Lines changed: 130 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
import * as ts from 'typescript';
12
import {
23
CallExpression,
34
Decorator,
5+
getJSDocDeprecatedTag,
6+
getJSDocTags,
7+
getTextOfJSDocComment,
48
Identifier,
9+
JSDoc,
510
LeftHandSideExpression,
11+
ModifiersArray,
612
Node,
13+
NodeArray,
714
ObjectFlags,
815
ObjectType,
916
PropertyAccessExpression,
@@ -12,17 +19,27 @@ import {
1219
TypeChecker,
1320
TypeFlags,
1421
TypeFormatFlags,
15-
UnionTypeNode,
1622
TypeNode,
17-
JSDoc,
18-
getTextOfJSDocComment,
19-
getJSDocDeprecatedTag,
20-
ModifiersArray,
21-
NodeArray,
22-
getJSDocTags,
23+
UnionTypeNode,
2324
} from 'typescript';
2425
import { isDynamicallyAdded } from './plugin-utils';
25-
import * as ts from 'typescript';
26+
27+
const [tsVersionMajor, tsVersionMinor] = ts.versionMajorMinor
28+
?.split('.')
29+
.map((x) => +x);
30+
export const isInUpdatedAstContext = tsVersionMinor >= 8 || tsVersionMajor > 4;
31+
32+
export function getDecorators(node: ts.Node) {
33+
return isInUpdatedAstContext
34+
? (ts.canHaveDecorators(node) && ts.getDecorators(node)) ?? []
35+
: node.decorators;
36+
}
37+
38+
export function getModifiers(node: ts.Node) {
39+
return isInUpdatedAstContext
40+
? (ts.canHaveModifiers(node) && ts.getModifiers(node)) ?? []
41+
: node.modifiers;
42+
}
2643

2744
export function isArray(type: Type) {
2845
const symbol = type.getSymbol();
@@ -194,7 +211,7 @@ export function findNullableTypeFromUnion(
194211
}
195212

196213
export function hasModifiers(
197-
modifiers: ModifiersArray,
214+
modifiers: ModifiersArray | readonly ts.Modifier[],
198215
toCheck: SyntaxKind[],
199216
): boolean {
200217
if (!modifiers) {
@@ -204,7 +221,7 @@ export function hasModifiers(
204221
}
205222

206223
export function hasDecorators(
207-
decorators: NodeArray<Decorator>,
224+
decorators: NodeArray<Decorator> | readonly Decorator[],
208225
toCheck: string[],
209226
): boolean {
210227
if (!decorators) {
@@ -241,15 +258,22 @@ export function createImportEquals(
241258
): ts.ImportEqualsDeclaration {
242259
const [major, minor] = ts.versionMajorMinor?.split('.').map((x) => +x);
243260

244-
if (major == 4 && minor >= 2) {
261+
if (major >= 4 && minor >= 2) {
245262
// support TS v4.2+
246-
return f.createImportEqualsDeclaration(
247-
undefined,
248-
undefined,
249-
false,
250-
identifier,
251-
f.createExternalModuleReference(f.createStringLiteral(from)),
252-
);
263+
return minor >= 8
264+
? f.createImportEqualsDeclaration(
265+
undefined,
266+
false,
267+
identifier,
268+
f.createExternalModuleReference(f.createStringLiteral(from)),
269+
)
270+
: f.createImportEqualsDeclaration(
271+
undefined,
272+
undefined,
273+
false,
274+
identifier,
275+
f.createExternalModuleReference(f.createStringLiteral(from)),
276+
);
253277
}
254278
return (f.createImportEqualsDeclaration as any)(
255279
undefined,
@@ -264,20 +288,27 @@ export function createNamedImport(
264288
what: string[],
265289
from: string,
266290
) {
267-
return f.createImportDeclaration(
268-
undefined,
291+
const importClause = f.createImportClause(
292+
false,
269293
undefined,
270-
f.createImportClause(
271-
false,
272-
undefined,
273-
f.createNamedImports(
274-
what.map((name) =>
275-
f.createImportSpecifier(false, undefined, f.createIdentifier(name)),
276-
),
294+
f.createNamedImports(
295+
what.map((name) =>
296+
f.createImportSpecifier(false, undefined, f.createIdentifier(name)),
277297
),
278298
),
279-
f.createStringLiteral(from),
280299
);
300+
return isInUpdatedAstContext
301+
? f.createImportDeclaration(
302+
undefined,
303+
importClause,
304+
f.createStringLiteral(from),
305+
)
306+
: f.createImportDeclaration(
307+
undefined,
308+
undefined,
309+
importClause,
310+
f.createStringLiteral(from),
311+
);
281312
}
282313

283314
export function isCallExpressionOf(name: string, node: ts.CallExpression) {
@@ -348,15 +379,23 @@ export function safelyMergeObjects(
348379
}
349380
}
350381

351-
export function updateDecoratorArguments<T extends ts.ClassDeclaration | ts.PropertyDeclaration | ts.GetAccessorDeclaration>(
382+
export function updateDecoratorArguments<
383+
T extends
384+
| ts.ClassDeclaration
385+
| ts.PropertyDeclaration
386+
| ts.GetAccessorDeclaration,
387+
>(
352388
f: ts.NodeFactory,
353389
node: T,
354390
decoratorName: string,
355-
replaceFn: (decoratorArguments: ts.NodeArray<ts.Expression>) => ts.Expression[]
391+
replaceFn: (
392+
decoratorArguments: ts.NodeArray<ts.Expression>,
393+
) => ts.Expression[],
356394
): T {
357395
let updated = false;
358396

359-
const decorators = node.decorators.map((decorator) => {
397+
const nodeOriginalDecorators = getDecorators(node);
398+
const decorators = nodeOriginalDecorators.map((decorator) => {
360399
if (getDecoratorName(decorator) !== decoratorName) {
361400
return decorator;
362401
}
@@ -379,14 +418,71 @@ export function updateDecoratorArguments<T extends ts.ClassDeclaration | ts.Prop
379418
}
380419

381420
if (ts.isClassDeclaration(node)) {
382-
return f.updateClassDeclaration(node, decorators, node.modifiers, node.name, node.typeParameters, node.heritageClauses, node.members) as T;
421+
return (
422+
isInUpdatedAstContext
423+
? f.updateClassDeclaration(
424+
node,
425+
[...decorators, ...getModifiers(node)],
426+
node.name,
427+
node.typeParameters,
428+
node.heritageClauses,
429+
node.members,
430+
)
431+
: (f.updateClassDeclaration as any)(
432+
node,
433+
decorators,
434+
node.modifiers,
435+
node.name,
436+
node.typeParameters,
437+
node.heritageClauses,
438+
node.members,
439+
)
440+
) as T;
383441
}
384442

385443
if (ts.isPropertyDeclaration(node)) {
386-
return f.updatePropertyDeclaration(node, decorators, node.modifiers, node.name, node.questionToken, node.type, node.initializer) as T;
444+
return (
445+
isInUpdatedAstContext
446+
? f.updatePropertyDeclaration(
447+
node,
448+
[...decorators, ...getModifiers(node)],
449+
node.name,
450+
node.questionToken,
451+
node.type,
452+
node.initializer,
453+
)
454+
: (f.updatePropertyDeclaration as any)(
455+
node,
456+
decorators,
457+
node.modifiers,
458+
node.name,
459+
node.questionToken,
460+
node.type,
461+
node.initializer,
462+
)
463+
) as T;
387464
}
388465

389466
if (ts.isGetAccessorDeclaration(node)) {
390-
return f.updateGetAccessorDeclaration(node, decorators, node.modifiers, node.name, node.parameters, node.type, node.body) as T;
467+
return (
468+
isInUpdatedAstContext
469+
? f.updateGetAccessorDeclaration(
470+
node,
471+
[...decorators, ...getModifiers(node)],
472+
node.name,
473+
node.parameters,
474+
node.type,
475+
node.body,
476+
)
477+
: (f.updateGetAccessorDeclaration as any)(
478+
node,
479+
decorators,
480+
node.modifiers,
481+
node.name,
482+
node.parameters,
483+
node.type,
484+
node.body,
485+
)
486+
) as T;
391487
}
392488
}

0 commit comments

Comments
 (0)