Skip to content

Commit ec20666

Browse files
jasonkuhrtyaacovCR
authored andcommitted
refactor: treeshakable kind enum (graphql#4270)
closes graphql#4253
1 parent 8f4229e commit ec20666

File tree

7 files changed

+201
-122
lines changed

7 files changed

+201
-122
lines changed

integrationTests/ts/package.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@
88
"dependencies": {
99
"graphql": "file:../graphql.tgz",
1010
"graphql-esm": "file:../graphql-esm.tgz",
11-
"typescript-4.4": "npm:[email protected]",
12-
"typescript-4.5": "npm:[email protected]",
13-
"typescript-4.6": "npm:[email protected]",
14-
"typescript-4.7": "npm:[email protected]",
15-
"typescript-4.8": "npm:[email protected]",
1611
"typescript-4.9": "npm:[email protected]",
1712
"typescript-5.0": "npm:[email protected]",
1813
"typescript-5.1": "npm:[email protected]",

src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ export type {
204204
} from './type/index.js';
205205

206206
// Parse and operate on GraphQL language source files.
207+
// @see https://github.com/typescript-eslint/typescript-eslint/issues/10313
208+
// eslint-disable-next-line @typescript-eslint/consistent-type-exports
209+
export { Kind } from './language/kinds.js';
207210
export {
208211
Token,
209212
Source,
@@ -229,7 +232,6 @@ export {
229232
visitInParallel,
230233
getEnterLeaveForKind,
231234
BREAK,
232-
Kind,
233235
DirectiveLocation,
234236
// Predicates
235237
isDefinitionNode,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* eslint-disable @typescript-eslint/no-unused-expressions */
2+
import { describe, it } from 'mocha';
3+
4+
import { Kind } from '../index.js';
5+
6+
describe('Kind', () => {
7+
it('is a term level namespace with term level enum members', () => {
8+
const a: Kind.NAME = Kind.NAME;
9+
a;
10+
const b: Kind = Kind.NAME;
11+
b;
12+
const c: Kind = Kind.ARGUMENT;
13+
c;
14+
});
15+
16+
it('is a type level namespace with type level enum members', () => {
17+
// @ts-expect-error
18+
const a: Kind.NAME = 'bad';
19+
a;
20+
const b: Kind.NAME = 'Name';
21+
b;
22+
// @ts-expect-error
23+
const c: Kind = 'bad';
24+
c;
25+
const d: Kind = 'Name';
26+
d;
27+
const e: Kind = 'Argument';
28+
e;
29+
});
30+
});

src/language/__tests__/predicates-test.ts

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,30 @@ function filterNodes(predicate: (node: ASTNode) => boolean): Array<string> {
2828
describe('AST node predicates', () => {
2929
it('isDefinitionNode', () => {
3030
expect(filterNodes(isDefinitionNode)).to.deep.equal([
31-
'OperationDefinition',
32-
'FragmentDefinition',
33-
'SchemaDefinition',
34-
'ScalarTypeDefinition',
35-
'ObjectTypeDefinition',
36-
'InterfaceTypeDefinition',
37-
'UnionTypeDefinition',
31+
'DirectiveDefinition',
3832
'EnumTypeDefinition',
33+
'EnumTypeExtension',
34+
'FragmentDefinition',
3935
'InputObjectTypeDefinition',
40-
'DirectiveDefinition',
41-
'SchemaExtension',
42-
'ScalarTypeExtension',
43-
'ObjectTypeExtension',
36+
'InputObjectTypeExtension',
37+
'InterfaceTypeDefinition',
4438
'InterfaceTypeExtension',
39+
'ObjectTypeDefinition',
40+
'ObjectTypeExtension',
41+
'OperationDefinition',
42+
'ScalarTypeDefinition',
43+
'ScalarTypeExtension',
44+
'SchemaDefinition',
45+
'SchemaExtension',
46+
'UnionTypeDefinition',
4547
'UnionTypeExtension',
46-
'EnumTypeExtension',
47-
'InputObjectTypeExtension',
4848
]);
4949
});
5050

5151
it('isExecutableDefinitionNode', () => {
5252
expect(filterNodes(isExecutableDefinitionNode)).to.deep.equal([
53-
'OperationDefinition',
5453
'FragmentDefinition',
54+
'OperationDefinition',
5555
]);
5656
});
5757

@@ -65,15 +65,15 @@ describe('AST node predicates', () => {
6565

6666
it('isValueNode', () => {
6767
expect(filterNodes(isValueNode)).to.deep.equal([
68-
'Variable',
69-
'IntValue',
70-
'FloatValue',
71-
'StringValue',
7268
'BooleanValue',
73-
'NullValue',
7469
'EnumValue',
70+
'FloatValue',
71+
'IntValue',
7572
'ListValue',
73+
'NullValue',
7674
'ObjectValue',
75+
'StringValue',
76+
'Variable',
7777
]);
7878
});
7979

@@ -90,56 +90,56 @@ describe('AST node predicates', () => {
9090

9191
it('isTypeNode', () => {
9292
expect(filterNodes(isTypeNode)).to.deep.equal([
93-
'NamedType',
9493
'ListType',
94+
'NamedType',
9595
'NonNullType',
9696
]);
9797
});
9898

9999
it('isTypeSystemDefinitionNode', () => {
100100
expect(filterNodes(isTypeSystemDefinitionNode)).to.deep.equal([
101-
'SchemaDefinition',
102-
'ScalarTypeDefinition',
103-
'ObjectTypeDefinition',
104-
'InterfaceTypeDefinition',
105-
'UnionTypeDefinition',
101+
'DirectiveDefinition',
106102
'EnumTypeDefinition',
107103
'InputObjectTypeDefinition',
108-
'DirectiveDefinition',
104+
'InterfaceTypeDefinition',
105+
'ObjectTypeDefinition',
106+
'ScalarTypeDefinition',
107+
'SchemaDefinition',
108+
'UnionTypeDefinition',
109109
]);
110110
});
111111

112112
it('isTypeDefinitionNode', () => {
113113
expect(filterNodes(isTypeDefinitionNode)).to.deep.equal([
114-
'ScalarTypeDefinition',
115-
'ObjectTypeDefinition',
116-
'InterfaceTypeDefinition',
117-
'UnionTypeDefinition',
118114
'EnumTypeDefinition',
119115
'InputObjectTypeDefinition',
116+
'InterfaceTypeDefinition',
117+
'ObjectTypeDefinition',
118+
'ScalarTypeDefinition',
119+
'UnionTypeDefinition',
120120
]);
121121
});
122122

123123
it('isTypeSystemExtensionNode', () => {
124124
expect(filterNodes(isTypeSystemExtensionNode)).to.deep.equal([
125-
'SchemaExtension',
126-
'ScalarTypeExtension',
127-
'ObjectTypeExtension',
128-
'InterfaceTypeExtension',
129-
'UnionTypeExtension',
130125
'EnumTypeExtension',
131126
'InputObjectTypeExtension',
127+
'InterfaceTypeExtension',
128+
'ObjectTypeExtension',
129+
'ScalarTypeExtension',
130+
'SchemaExtension',
131+
'UnionTypeExtension',
132132
]);
133133
});
134134

135135
it('isTypeExtensionNode', () => {
136136
expect(filterNodes(isTypeExtensionNode)).to.deep.equal([
137-
'ScalarTypeExtension',
138-
'ObjectTypeExtension',
139-
'InterfaceTypeExtension',
140-
'UnionTypeExtension',
141137
'EnumTypeExtension',
142138
'InputObjectTypeExtension',
139+
'InterfaceTypeExtension',
140+
'ObjectTypeExtension',
141+
'ScalarTypeExtension',
142+
'UnionTypeExtension',
143143
]);
144144
});
145145

src/language/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ export type { SourceLocation } from './location.js';
55

66
export { printLocation, printSourceLocation } from './printLocation.js';
77

8+
// @see https://github.com/typescript-eslint/typescript-eslint/issues/10313
9+
// eslint-disable-next-line @typescript-eslint/consistent-type-exports
810
export { Kind } from './kinds.js';
911

1012
export { TokenKind } from './tokenKind.js';

src/language/kinds.ts

Lines changed: 4 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,6 @@
1-
/**
2-
* The set of allowed kind values for AST nodes.
3-
*/
4-
export const Kind = {
5-
/** Name */
6-
NAME: 'Name' as const,
1+
/* eslint-disable import/no-namespace */
2+
import type * as Kind_ from './kinds_.js';
73

8-
/** Document */
9-
DOCUMENT: 'Document' as const,
10-
OPERATION_DEFINITION: 'OperationDefinition' as const,
11-
VARIABLE_DEFINITION: 'VariableDefinition' as const,
12-
SELECTION_SET: 'SelectionSet' as const,
13-
FIELD: 'Field' as const,
14-
ARGUMENT: 'Argument' as const,
15-
FRAGMENT_ARGUMENT: 'FragmentArgument' as const,
4+
export * as Kind from './kinds_.js';
165

17-
/** Fragments */
18-
FRAGMENT_SPREAD: 'FragmentSpread' as const,
19-
INLINE_FRAGMENT: 'InlineFragment' as const,
20-
FRAGMENT_DEFINITION: 'FragmentDefinition' as const,
21-
22-
/** Values */
23-
VARIABLE: 'Variable' as const,
24-
INT: 'IntValue' as const,
25-
FLOAT: 'FloatValue' as const,
26-
STRING: 'StringValue' as const,
27-
BOOLEAN: 'BooleanValue' as const,
28-
NULL: 'NullValue' as const,
29-
ENUM: 'EnumValue' as const,
30-
LIST: 'ListValue' as const,
31-
OBJECT: 'ObjectValue' as const,
32-
OBJECT_FIELD: 'ObjectField' as const,
33-
34-
/** Directives */
35-
DIRECTIVE: 'Directive' as const,
36-
37-
/** Types */
38-
NAMED_TYPE: 'NamedType' as const,
39-
LIST_TYPE: 'ListType' as const,
40-
NON_NULL_TYPE: 'NonNullType' as const,
41-
42-
/** Type System Definitions */
43-
SCHEMA_DEFINITION: 'SchemaDefinition' as const,
44-
OPERATION_TYPE_DEFINITION: 'OperationTypeDefinition' as const,
45-
46-
/** Type Definitions */
47-
SCALAR_TYPE_DEFINITION: 'ScalarTypeDefinition' as const,
48-
OBJECT_TYPE_DEFINITION: 'ObjectTypeDefinition' as const,
49-
FIELD_DEFINITION: 'FieldDefinition' as const,
50-
INPUT_VALUE_DEFINITION: 'InputValueDefinition' as const,
51-
INTERFACE_TYPE_DEFINITION: 'InterfaceTypeDefinition' as const,
52-
UNION_TYPE_DEFINITION: 'UnionTypeDefinition' as const,
53-
ENUM_TYPE_DEFINITION: 'EnumTypeDefinition' as const,
54-
ENUM_VALUE_DEFINITION: 'EnumValueDefinition' as const,
55-
INPUT_OBJECT_TYPE_DEFINITION: 'InputObjectTypeDefinition' as const,
56-
57-
/** Directive Definitions */
58-
DIRECTIVE_DEFINITION: 'DirectiveDefinition' as const,
59-
60-
/** Type System Extensions */
61-
SCHEMA_EXTENSION: 'SchemaExtension' as const,
62-
63-
/** Type Extensions */
64-
SCALAR_TYPE_EXTENSION: 'ScalarTypeExtension' as const,
65-
OBJECT_TYPE_EXTENSION: 'ObjectTypeExtension' as const,
66-
INTERFACE_TYPE_EXTENSION: 'InterfaceTypeExtension' as const,
67-
UNION_TYPE_EXTENSION: 'UnionTypeExtension' as const,
68-
ENUM_TYPE_EXTENSION: 'EnumTypeExtension' as const,
69-
INPUT_OBJECT_TYPE_EXTENSION: 'InputObjectTypeExtension' as const,
70-
71-
/** Schema Coordinates */
72-
TYPE_COORDINATE: 'TypeCoordinate' as const,
73-
MEMBER_COORDINATE: 'MemberCoordinate' as const,
74-
ARGUMENT_COORDINATE: 'ArgumentCoordinate' as const,
75-
DIRECTIVE_COORDINATE: 'DirectiveCoordinate' as const,
76-
DIRECTIVE_ARGUMENT_COORDINATE: 'DirectiveArgumentCoordinate' as const,
77-
} as const;
78-
// eslint-disable-next-line @typescript-eslint/no-redeclare
79-
export type Kind = (typeof Kind)[keyof typeof Kind];
6+
export type Kind = (typeof Kind_)[keyof typeof Kind_];

0 commit comments

Comments
 (0)