Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.

Commit 41f46dc

Browse files
committed
feat: implement $key
1 parent 135a209 commit 41f46dc

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

src/TypeScriptGenerator.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,28 @@ function createVisitor(options: TypeGeneratorOptions): IRVisitor.NodeVisitor {
429429
return [selection];
430430
});
431431
state.generatedFragments.add(node.name);
432+
433+
const refTypeName = getRefTypeName(node.name);
434+
const refTypeDataProperty = objectTypeProperty(
435+
"$data",
436+
ts.createTypeReferenceNode(`${node.name}$data`, undefined)
437+
);
438+
refTypeDataProperty.questionToken = ts.createToken(
439+
ts.SyntaxKind.QuestionToken
440+
);
441+
const refTypeFragmentRefProperty = objectTypeProperty(
442+
"$fragmentRefs",
443+
ts.createTypeReferenceNode(
444+
getOldFragmentTypeName(node.name),
445+
undefined
446+
)
447+
);
448+
const isPluralFragment = isPlural(node);
449+
const refType = exactObjectTypeAnnotation([
450+
refTypeDataProperty,
451+
refTypeFragmentRefProperty
452+
]);
453+
432454
const unmasked = node.metadata != null && node.metadata.mask === false;
433455
const baseType = selectionsToAST(
434456
selections,
@@ -445,7 +467,16 @@ function createVisitor(options: TypeGeneratorOptions): IRVisitor.NodeVisitor {
445467
return [
446468
...getFragmentRefsTypeImport(state),
447469
...getEnumDefinitions(state),
448-
exportType(node.name, type)
470+
exportType(node.name, type),
471+
exportType(
472+
refTypeName,
473+
isPluralFragment
474+
? ts.createTypeReferenceNode(
475+
ts.createIdentifier("ReadonlyArray"),
476+
[refType]
477+
)
478+
: refType
479+
)
449480
];
450481
},
451482
InlineFragment(node) {
@@ -891,6 +922,14 @@ function stringLiteralTypeAnnotation(name: string): ts.TypeNode {
891922
return ts.createLiteralTypeNode(ts.createLiteral(name));
892923
}
893924

925+
function getOldFragmentTypeName(name: string) {
926+
return `${name}$ref`;
927+
}
928+
929+
function getRefTypeName(name: string): string {
930+
return `${name}$key`;
931+
}
932+
894933
// Should match FLOW_TRANSFORMS array
895934
// https://github.com/facebook/relay/blob/v6.0.0/packages/relay-compiler/language/javascript/RelayFlowGenerator.js#L621-L627
896935
export const transforms: TypeGenerator["transforms"] = [

0 commit comments

Comments
 (0)