Skip to content

Commit

Permalink
Correctly type empty variables in TypeScript (#4404)
Browse files Browse the repository at this point in the history
Summary:
Previously the compiler produced `{}` for empty objects in TypeScript. This is for example the case for the `...$variables` type, if no variables are present.

The problem is that `{}` does not mean "empty object" in TypeScript. It means "any value except null and undefined".
Because of this you're able to input **anything** besides those two values as variables for an operation without variables.

I opted to produce the more appropriate `Record<PropertyKey, never>`, which effectively represents an object without properties.

Pull Request resolved: #4404

Reviewed By: alunyov

Differential Revision: D48989147

Pulled By: captbaritone

fbshipit-source-id: 67bad8a670496a3caf7b2a3c439a8ff0b283793d
  • Loading branch information
tobias-tengler authored and facebook-github-bot committed Oct 6, 2023
1 parent cc47bc9 commit 16910c9
Show file tree
Hide file tree
Showing 23 changed files with 28 additions and 28 deletions.
8 changes: 4 additions & 4 deletions compiler/crates/relay-typegen/src/typescript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,15 @@ impl TypeScriptPrinter {

fn write_object(&mut self, props: &[Prop]) -> FmtResult {
if props.is_empty() {
write!(&mut self.result, "{{}}")?;
write!(&mut self.result, "Record<PropertyKey, never>")?;
return Ok(());
}

// Replication of babel printer oddity: objects only containing a spread
// are missing a newline.
if props.len() == 1 {
if let Prop::Spread(_) = props[0] {
write!(&mut self.result, "{{}}")?;
write!(&mut self.result, "Record<PropertyKey, never>")?;
return Ok(());
}
}
Expand Down Expand Up @@ -413,7 +413,7 @@ mod tests {
fn exact_object() {
assert_eq!(
print_type(&AST::ExactObject(ExactObject::new(Vec::new()))),
r"{}".to_string()
r"Record<PropertyKey, never>".to_string()
);

assert_eq!(
Expand Down Expand Up @@ -498,7 +498,7 @@ mod tests {
fn inexact_object() {
assert_eq!(
print_type(&AST::InexactObject(InexactObject::new(Vec::new()))),
"{}".to_string()
"Record<PropertyKey, never>".to_string()
);

assert_eq!(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fragment MyUserFragment on User {
}
==================================== OUTPUT ===================================
import { FragmentRefs } from "relay-runtime";
export type MyQuery$variables = {};
export type MyQuery$variables = Record<PropertyKey, never>;
export type MyQuery$data = {
readonly me: {
readonly my_inline_fragment: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
==================================== OUTPUT ===================================
import { FragmentRefs } from "relay-runtime";
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly node: {
readonly named_fragment: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
==================================== OUTPUT ===================================
import { FragmentRefs } from "relay-runtime";
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly me: {
readonly named_fragment: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
}
==================================== OUTPUT ===================================
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly me: {
readonly id: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
}
==================================== OUTPUT ===================================
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly named_fragment: {
readonly me: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
}
==================================== OUTPUT ===================================
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly me: {
readonly id: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ query UnionTypeTest {
}
}
==================================== OUTPUT ===================================
export type UnionTypeTest$variables = {};
export type UnionTypeTest$variables = Record<PropertyKey, never>;
export type UnionTypeTest$data = {
readonly neverNode: {
readonly __typename: "FakeNode";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ fragment MarkdownUserNameRenderer_name on MarkdownUserNameRenderer {
}
==================================== OUTPUT ===================================
import { FragmentRefs } from "relay-runtime";
export type NameRendererQuery$variables = {};
export type NameRendererQuery$variables = Record<PropertyKey, never>;
export type NameRendererQuery$data = {
readonly me: {
readonly nameRenderer: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ fragment MarkdownUserNameRenderer_name on MarkdownUserNameRenderer {
}
==================================== OUTPUT ===================================
import { FragmentRefs, Local3DPayload } from "relay-runtime";
export type Test$variables = {};
export type Test$variables = Record<PropertyKey, never>;
export type Test$data = {
readonly node: {
readonly " $fragmentSpreads": FragmentRefs<"NameRendererFragment">;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ fragment Test_userRenderer on PlainUserRenderer {
}
==================================== OUTPUT ===================================
import { FragmentRefs, Local3DPayload } from "relay-runtime";
export type Test$variables = {};
export type Test$variables = Record<PropertyKey, never>;
export type Test$data = {
readonly node: {
readonly " $fragmentSpreads": FragmentRefs<"Test_user">;
Expand All @@ -34,7 +34,7 @@ export type Test$rawResponse = {
readonly node: {
readonly __typename: "User";
readonly id: string;
readonly plainUserRenderer: Local3DPayload<"Test_user", {}> | {
readonly plainUserRenderer: Local3DPayload<"Test_user", Record<PropertyKey, never>> | {
readonly __module_component_Test_user: any | null | undefined;
readonly __module_operation_Test_user: any | null | undefined;
} | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ fragment MarkdownUserNameRenderer_name on MarkdownUserNameRenderer {
}
==================================== OUTPUT ===================================
import { FragmentRefs, Local3DPayload } from "relay-runtime";
export type Test$variables = {};
export type Test$variables = Record<PropertyKey, never>;
export type Test$data = {
readonly node: {
readonly username?: string | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ query TestDefer @raw_response_type {
}
}
==================================== OUTPUT ===================================
export type TestDefer$variables = {};
export type TestDefer$variables = Record<PropertyKey, never>;
export type TestDefer$data = {
readonly node: {
readonly friends?: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ query TestStream @raw_response_type {
}
}
==================================== OUTPUT ===================================
export type TestStream$variables = {};
export type TestStream$variables = Record<PropertyKey, never>;
export type TestStream$data = {
readonly node: {
readonly friends?: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ extend type User {
pop_star_game: ClientTypeWithNestedInterface @relay_resolver(fragment_name: "PopStarNameResolverFragment_name", import_path: "PopStarNameResolver", has_output_type: true)
}
==================================== OUTPUT ===================================
export type User__pop_star_game$normalization$variables = {};
export type User__pop_star_game$normalization$variables = Record<PropertyKey, never>;
export type User__pop_star_game$normalization$data = {
readonly client_interface: {
readonly __typename: "ClientType";
Expand All @@ -52,7 +52,7 @@ export type User__pop_star_game$normalization = {
variables: User__pop_star_game$normalization$variables;
};
-------------------------------------------------------------------------------
export type User__pop_star_name$normalization$variables = {};
export type User__pop_star_name$normalization$variables = Record<PropertyKey, never>;
export type User__pop_star_name$normalization$data = {
readonly __typename: "ClientType";
readonly name: string | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ extend type User {
pop_star_name: ClientUser @relay_resolver(fragment_name: "PopStarNameResolverFragment_name", import_path: "PopStarNameResolver", has_output_type: true)
}
==================================== OUTPUT ===================================
export type User__pop_star_name$normalization$variables = {};
export type User__pop_star_name$normalization$variables = Record<PropertyKey, never>;
export type User__pop_star_name$normalization$data = {
readonly name: string | null | undefined;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ query FooQuery {
}
}
==================================== OUTPUT ===================================
export type FooQuery$variables = {};
export type FooQuery$variables = Record<PropertyKey, never>;
export type FooQuery$data = {
readonly me: {
readonly firstName: string | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ query MyQuery @raw_response_type {
}
}
==================================== OUTPUT ===================================
export type MyQuery$variables = {};
export type MyQuery$variables = Record<PropertyKey, never>;
export type MyQuery$data = {
readonly me: {
readonly id: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ query FooQuery {
}
}
==================================== OUTPUT ===================================
export type FooQuery$variables = {};
export type FooQuery$variables = Record<PropertyKey, never>;
export type FooQuery$data = {
readonly me: {
readonly firstName: string | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ query FooQuery {
}
}
==================================== OUTPUT ===================================
export type FooQuery$variables = {};
export type FooQuery$variables = Record<PropertyKey, never>;
export type FooQuery$data = {
readonly me: {
readonly firstName: string | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
}
==================================== OUTPUT ===================================
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly node: {
readonly named_fragment: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ query RelayReaderNamedFragmentsTest2Query {
}
}
==================================== OUTPUT ===================================
export type RelayReaderNamedFragmentsTest2Query$variables = {};
export type RelayReaderNamedFragmentsTest2Query$variables = Record<PropertyKey, never>;
export type RelayReaderNamedFragmentsTest2Query$data = {
readonly me: {
readonly id: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ query FooQuery {
}
}
==================================== OUTPUT ===================================
export type FooQuery$variables = {};
export type FooQuery$variables = Record<PropertyKey, never>;
export type FooQuery$data = {
readonly me: {
readonly firstName: string | null | undefined;
Expand Down

0 comments on commit 16910c9

Please sign in to comment.