Skip to content

Allow for tree-shaking the Kind enum #4268

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ export type {
} from './type/index.js';

// Parse and operate on GraphQL language source files.
// eslint-disable-next-line @typescript-eslint/consistent-type-exports
export {
Token,
Source,
Expand Down
165 changes: 86 additions & 79 deletions src/language/__tests__/predicates-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,54 +26,55 @@ function filterNodes(predicate: (node: ASTNode) => boolean): Array<string> {

describe('AST node predicates', () => {
it('isDefinitionNode', () => {
expect(filterNodes(isDefinitionNode)).to.deep.equal([
'OperationDefinition',
'FragmentDefinition',
'SchemaDefinition',
'ScalarTypeDefinition',
'ObjectTypeDefinition',
'InterfaceTypeDefinition',
'UnionTypeDefinition',
'EnumTypeDefinition',
'InputObjectTypeDefinition',
'DirectiveDefinition',
'SchemaExtension',
'ScalarTypeExtension',
'ObjectTypeExtension',
'InterfaceTypeExtension',
'UnionTypeExtension',
'EnumTypeExtension',
'InputObjectTypeExtension',
]);
expect(filterNodes(isDefinitionNode)).to.deep.equal(
[
'OperationDefinition',
'FragmentDefinition',
'SchemaDefinition',
'ScalarTypeDefinition',
'ObjectTypeDefinition',
'InterfaceTypeDefinition',
'UnionTypeDefinition',
'EnumTypeDefinition',
'InputObjectTypeDefinition',
'DirectiveDefinition',
'SchemaExtension',
'ScalarTypeExtension',
'ObjectTypeExtension',
'InterfaceTypeExtension',
'UnionTypeExtension',
'EnumTypeExtension',
'InputObjectTypeExtension',
].sort(),
);
});

it('isExecutableDefinitionNode', () => {
expect(filterNodes(isExecutableDefinitionNode)).to.deep.equal([
'OperationDefinition',
'FragmentDefinition',
]);
expect(filterNodes(isExecutableDefinitionNode)).to.deep.equal(
['OperationDefinition', 'FragmentDefinition'].sort(),
);
});

it('isSelectionNode', () => {
expect(filterNodes(isSelectionNode)).to.deep.equal([
'Field',
'FragmentSpread',
'InlineFragment',
]);
expect(filterNodes(isSelectionNode)).to.deep.equal(
['Field', 'FragmentSpread', 'InlineFragment'].sort(),
);
});

it('isValueNode', () => {
expect(filterNodes(isValueNode)).to.deep.equal([
'Variable',
'IntValue',
'FloatValue',
'StringValue',
'BooleanValue',
'NullValue',
'EnumValue',
'ListValue',
'ObjectValue',
]);
expect(filterNodes(isValueNode)).to.deep.equal(
[
'Variable',
'IntValue',
'FloatValue',
'StringValue',
'BooleanValue',
'NullValue',
'EnumValue',
'ListValue',
'ObjectValue',
].sort(),
);
});

it('isConstValueNode', () => {
Expand All @@ -88,57 +89,63 @@ describe('AST node predicates', () => {
});

it('isTypeNode', () => {
expect(filterNodes(isTypeNode)).to.deep.equal([
'NamedType',
'ListType',
'NonNullType',
]);
expect(filterNodes(isTypeNode)).to.deep.equal(
['NamedType', 'ListType', 'NonNullType'].sort(),
);
});

it('isTypeSystemDefinitionNode', () => {
expect(filterNodes(isTypeSystemDefinitionNode)).to.deep.equal([
'SchemaDefinition',
'ScalarTypeDefinition',
'ObjectTypeDefinition',
'InterfaceTypeDefinition',
'UnionTypeDefinition',
'EnumTypeDefinition',
'InputObjectTypeDefinition',
'DirectiveDefinition',
]);
expect(filterNodes(isTypeSystemDefinitionNode)).to.deep.equal(
[
'SchemaDefinition',
'ScalarTypeDefinition',
'ObjectTypeDefinition',
'InterfaceTypeDefinition',
'UnionTypeDefinition',
'EnumTypeDefinition',
'InputObjectTypeDefinition',
'DirectiveDefinition',
].sort(),
);
});

it('isTypeDefinitionNode', () => {
expect(filterNodes(isTypeDefinitionNode)).to.deep.equal([
'ScalarTypeDefinition',
'ObjectTypeDefinition',
'InterfaceTypeDefinition',
'UnionTypeDefinition',
'EnumTypeDefinition',
'InputObjectTypeDefinition',
]);
expect(filterNodes(isTypeDefinitionNode)).to.deep.equal(
[
'ScalarTypeDefinition',
'ObjectTypeDefinition',
'InterfaceTypeDefinition',
'UnionTypeDefinition',
'EnumTypeDefinition',
'InputObjectTypeDefinition',
].sort(),
);
});

it('isTypeSystemExtensionNode', () => {
expect(filterNodes(isTypeSystemExtensionNode)).to.deep.equal([
'SchemaExtension',
'ScalarTypeExtension',
'ObjectTypeExtension',
'InterfaceTypeExtension',
'UnionTypeExtension',
'EnumTypeExtension',
'InputObjectTypeExtension',
]);
expect(filterNodes(isTypeSystemExtensionNode)).to.deep.equal(
[
'SchemaExtension',
'ScalarTypeExtension',
'ObjectTypeExtension',
'InterfaceTypeExtension',
'UnionTypeExtension',
'EnumTypeExtension',
'InputObjectTypeExtension',
].sort(),
);
});

it('isTypeExtensionNode', () => {
expect(filterNodes(isTypeExtensionNode)).to.deep.equal([
'ScalarTypeExtension',
'ObjectTypeExtension',
'InterfaceTypeExtension',
'UnionTypeExtension',
'EnumTypeExtension',
'InputObjectTypeExtension',
]);
expect(filterNodes(isTypeExtensionNode)).to.deep.equal(
[
'ScalarTypeExtension',
'ObjectTypeExtension',
'InterfaceTypeExtension',
'UnionTypeExtension',
'EnumTypeExtension',
'InputObjectTypeExtension',
].sort(),
);
});
});
65 changes: 65 additions & 0 deletions src/language/_kinds.ts

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A name of kinds_ would keep it co-located with the other module that imports from this fwiw. Not sure what's consistent for this repo.

Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/** Name */
export const NAME = 'Name';

/** Document */
export const DOCUMENT = 'Document';
export const OPERATION_DEFINITION = 'OperationDefinition';
export const VARIABLE_DEFINITION = 'VariableDefinition';
Comment on lines +5 to +7

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
export const DOCUMENT = 'Document';
export const OPERATION_DEFINITION = 'OperationDefinition';
export const VARIABLE_DEFINITION = 'VariableDefinition';
export const DOCUMENT = 'Document';
export type DOCUMENT = typeof DOCUMENT
export const OPERATION_DEFINITION = 'OperationDefinition';
export type OPERATION_DEFINITION = typeof OPERATION_DEFINITION
export const VARIABLE_DEFINITION = 'VariableDefinition';
// ...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I did not do these is mainly that it would cause a huge pain with our eslint rule no-redeclare

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would aslant complain about that? If so though, could we just ignore with an ignore directive at the top of the file?

export const SELECTION_SET = 'SelectionSet';
export const FIELD = 'Field';
export const ARGUMENT = 'Argument';
export const FRAGMENT_ARGUMENT = 'FragmentArgument';

/** Fragments */
export const FRAGMENT_SPREAD = 'FragmentSpread';
export const INLINE_FRAGMENT = 'InlineFragment';
export const FRAGMENT_DEFINITION = 'FragmentDefinition';

/** Values */
export const VARIABLE = 'Variable';
export const INT = 'IntValue';
export const FLOAT = 'FloatValue';
export const STRING = 'StringValue';
export const BOOLEAN = 'BooleanValue';
export const NULL = 'NullValue';
export const ENUM = 'EnumValue';
export const LIST = 'ListValue';
export const OBJECT = 'ObjectValue';
export const OBJECT_FIELD = 'ObjectField';

/** Directives */
export const DIRECTIVE = 'Directive';

/** Types */
export const NAMED_TYPE = 'NamedType';
export const LIST_TYPE = 'ListType';
export const NON_NULL_TYPE = 'NonNullType';

/** Type System Definitions */
export const SCHEMA_DEFINITION = 'SchemaDefinition';
export const OPERATION_TYPE_DEFINITION = 'OperationTypeDefinition';

/** Type Definitions */
export const SCALAR_TYPE_DEFINITION = 'ScalarTypeDefinition';
export const OBJECT_TYPE_DEFINITION = 'ObjectTypeDefinition';
export const FIELD_DEFINITION = 'FieldDefinition';
export const INPUT_VALUE_DEFINITION = 'InputValueDefinition';
export const INTERFACE_TYPE_DEFINITION = 'InterfaceTypeDefinition';
export const UNION_TYPE_DEFINITION = 'UnionTypeDefinition';
export const ENUM_TYPE_DEFINITION = 'EnumTypeDefinition';
export const ENUM_VALUE_DEFINITION = 'EnumValueDefinition';
export const INPUT_OBJECT_TYPE_DEFINITION = 'InputObjectTypeDefinition';

/** Directive Definitions */
export const DIRECTIVE_DEFINITION = 'DirectiveDefinition';

/** Type System Extensions */
export const SCHEMA_EXTENSION = 'SchemaExtension';

/** Type Extensions */
export const SCALAR_TYPE_EXTENSION = 'ScalarTypeExtension';
export const OBJECT_TYPE_EXTENSION = 'ObjectTypeExtension';
export const INTERFACE_TYPE_EXTENSION = 'InterfaceTypeExtension';
export const UNION_TYPE_EXTENSION = 'UnionTypeExtension';
export const ENUM_TYPE_EXTENSION = 'EnumTypeExtension';
export const INPUT_OBJECT_TYPE_EXTENSION = 'InputObjectTypeExtension';
2 changes: 1 addition & 1 deletion src/language/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export type { SourceLocation } from './location.js';

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

export { Kind } from './kinds.js';
export * from './kinds.js';

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

Expand Down
Loading
Loading