Skip to content

Commit 9f2ed3a

Browse files
committed
Add noFutureProofEnums
1 parent 0a1fb9e commit 9f2ed3a

File tree

3 files changed

+66
-45
lines changed

3 files changed

+66
-45
lines changed

src/TypeScriptGenerator.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ function createVisitor(options: TypeGeneratorOptions) {
290290
usedEnums: {},
291291
usedFragments: new Set(),
292292
useHaste: options.useHaste,
293-
useSingleArtifactDirectory: options.useSingleArtifactDirectory
293+
useSingleArtifactDirectory: options.useSingleArtifactDirectory,
294+
noFutureProofEnums: options.noFutureProofEnums
294295
};
295296

296297
return {
@@ -564,7 +565,11 @@ function anyTypeAlias(typeName: string): ts.Statement {
564565
);
565566
}
566567

567-
function getEnumDefinitions({ enumsHasteModule, usedEnums }: State) {
568+
function getEnumDefinitions({
569+
enumsHasteModule,
570+
usedEnums,
571+
noFutureProofEnums
572+
}: State) {
568573
const enumNames = Object.keys(usedEnums).sort();
569574
if (enumNames.length === 0) {
570575
return [];
@@ -575,7 +580,9 @@ function getEnumDefinitions({ enumsHasteModule, usedEnums }: State) {
575580
return enumNames.map(name => {
576581
const values = usedEnums[name].getValues().map(({ value }) => value);
577582
values.sort();
578-
values.push("%future added value");
583+
if (!noFutureProofEnums) {
584+
values.push("%future added value");
585+
}
579586
return exportType(
580587
name,
581588
ts.createUnionTypeNode(

test/TypeScriptGenerator-test.ts

+55-42
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,64 @@ import {GraphQLCompilerContext, IRTransforms, transformASTSchema} from 'relay-co
66

77
import * as TypeScriptGenerator from '../src/TypeScriptGenerator'
88

9+
function generate(text, options) {
10+
const schema = transformASTSchema(RelayTestSchema, [
11+
IRTransforms.schemaExtensions[1], // RelayRelayDirectiveTransform.SCHEMA_EXTENSION,
12+
]);
13+
const {definitions} = parseGraphQLText(schema, text);
14+
return new GraphQLCompilerContext(RelayTestSchema, schema)
15+
.addAll(definitions)
16+
.applyTransforms(TypeScriptGenerator.transforms)
17+
.documents()
18+
.map(doc => TypeScriptGenerator.generate(doc, options))
19+
.join('\n\n');
20+
}
21+
922
describe('TypeScriptGenerator with a single artifact directory', () => {
10-
generateTestsFromFixtures(`${__dirname}/fixtures/type-generator`, text => {
11-
const schema = transformASTSchema(RelayTestSchema, [
12-
IRTransforms.schemaExtensions[1], // RelayRelayDirectiveTransform.SCHEMA_EXTENSION,
13-
]);
14-
const {definitions} = parseGraphQLText(schema, text);
15-
return new GraphQLCompilerContext(RelayTestSchema, schema)
16-
.addAll(definitions)
17-
.applyTransforms(TypeScriptGenerator.transforms)
18-
.documents()
19-
.map(doc =>
20-
TypeScriptGenerator.generate(doc, {
21-
customScalars: {},
22-
enumsHasteModule: null,
23-
existingFragmentNames: new Set(['PhotoFragment']),
24-
optionalInputFields: [],
25-
relayRuntimeModule: 'relay-runtime',
26-
useHaste: false,
27-
useSingleArtifactDirectory: true,
28-
}),
29-
)
30-
.join('\n\n');
31-
});
23+
generateTestsFromFixtures(`${__dirname}/fixtures/type-generator`, text =>
24+
generate(text, {
25+
customScalars: {},
26+
enumsHasteModule: null,
27+
existingFragmentNames: new Set(['PhotoFragment']),
28+
optionalInputFields: [],
29+
relayRuntimeModule: 'relay-runtime',
30+
useHaste: false,
31+
useSingleArtifactDirectory: true,
32+
}),
33+
);
3234
});
3335

3436
describe('TypeScriptGenerator without a single artifact directory', () => {
35-
generateTestsFromFixtures(`${__dirname}/fixtures/type-generator`, text => {
36-
const schema = transformASTSchema(RelayTestSchema, [
37-
IRTransforms.schemaExtensions[1], // RelayRelayDirectiveTransform.SCHEMA_EXTENSION,
38-
]);
39-
const {definitions} = parseGraphQLText(schema, text);
40-
return new GraphQLCompilerContext(RelayTestSchema, schema)
41-
.addAll(definitions)
42-
.applyTransforms(TypeScriptGenerator.transforms)
43-
.documents()
44-
.map(doc =>
45-
TypeScriptGenerator.generate(doc, {
46-
customScalars: {},
47-
enumsHasteModule: null,
48-
existingFragmentNames: new Set(['PhotoFragment']),
49-
optionalInputFields: [],
50-
relayRuntimeModule: 'relay-runtime',
51-
useHaste: true,
52-
}),
53-
)
54-
.join('\n\n');
37+
generateTestsFromFixtures(`${__dirname}/fixtures/type-generator`, text =>
38+
generate(text, {
39+
customScalars: {},
40+
enumsHasteModule: null,
41+
existingFragmentNames: new Set(['PhotoFragment']),
42+
optionalInputFields: [],
43+
relayRuntimeModule: 'relay-runtime',
44+
useHaste: false,
45+
}),
46+
);
47+
});
48+
49+
describe('Does not add `%future added values` when the noFutureProofEnums option is set', () => {
50+
const text = `
51+
fragment ScalarField on User {
52+
traits
53+
}
54+
`;
55+
const types = generate(text, {
56+
customScalars: {},
57+
enumsHasteModule: null,
58+
existingFragmentNames: new Set(['PhotoFragment']),
59+
optionalInputFields: [],
60+
relayRuntimeModule: 'relay-runtime',
61+
useHaste: false,
62+
noFutureProofEnums: true,
5563
});
64+
65+
// Without the option, PersonalityTraits would be `"CHEERFUL" | ... | "%future added value");`
66+
expect(types).toContain(
67+
'export type PersonalityTraits = "CHEERFUL" | "DERISIVE" | "HELPFUL" | "SNARKY";',
68+
);
5669
});

types/relay-compiler/language/RelayLanguagePluginInterface.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export interface TypeGeneratorOptions {
4343
readonly optionalInputFields: ReadonlyArray<string>;
4444
readonly relayRuntimeModule: string;
4545
readonly useSingleArtifactDirectory: boolean;
46+
readonly noFutureProofEnums: boolean;
4647
}
4748

4849
export interface TypeGenerator {

0 commit comments

Comments
 (0)