-
Notifications
You must be signed in to change notification settings - Fork 2k
/
starWarsData.ts
154 lines (137 loc) · 3.21 KB
/
starWarsData.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/**
* These are types which correspond to the schema.
* They represent the shape of the data visited during field resolution.
*/
export interface Character {
id: string;
name: string;
friends: ReadonlyArray<string>;
appearsIn: ReadonlyArray<number>;
}
export interface Human {
type: 'Human';
id: string;
name: string;
friends: ReadonlyArray<string>;
appearsIn: ReadonlyArray<number>;
homePlanet?: string;
}
export interface Droid {
type: 'Droid';
id: string;
name: string;
friends: ReadonlyArray<string>;
appearsIn: ReadonlyArray<number>;
primaryFunction: string;
}
/**
* This defines a basic set of data for our Star Wars Schema.
*
* This data is hard coded for the sake of the demo, but you could imagine
* fetching this data from a backend service rather than from hardcoded
* JSON objects in a more complex demo.
*/
const luke: Human = {
type: 'Human',
id: '1000',
name: 'Luke Skywalker',
friends: ['1002', '1003', '2000', '2001'],
appearsIn: [4, 5, 6],
homePlanet: 'Tatooine',
};
const vader: Human = {
type: 'Human',
id: '1001',
name: 'Darth Vader',
friends: ['1004'],
appearsIn: [4, 5, 6],
homePlanet: 'Tatooine',
};
const han: Human = {
type: 'Human',
id: '1002',
name: 'Han Solo',
friends: ['1000', '1003', '2001'],
appearsIn: [4, 5, 6],
};
const leia: Human = {
type: 'Human',
id: '1003',
name: 'Leia Organa',
friends: ['1000', '1002', '2000', '2001'],
appearsIn: [4, 5, 6],
homePlanet: 'Alderaan',
};
const tarkin: Human = {
type: 'Human',
id: '1004',
name: 'Wilhuff Tarkin',
friends: ['1001'],
appearsIn: [4],
};
const humanData: { [id: string]: Human } = {
[luke.id]: luke,
[vader.id]: vader,
[han.id]: han,
[leia.id]: leia,
[tarkin.id]: tarkin,
};
const threepio: Droid = {
type: 'Droid',
id: '2000',
name: 'C-3PO',
friends: ['1000', '1002', '1003', '2001'],
appearsIn: [4, 5, 6],
primaryFunction: 'Protocol',
};
const artoo: Droid = {
type: 'Droid',
id: '2001',
name: 'R2-D2',
friends: ['1000', '1002', '1003'],
appearsIn: [4, 5, 6],
primaryFunction: 'Astromech',
};
const droidData: { [id: string]: Droid } = {
[threepio.id]: threepio,
[artoo.id]: artoo,
};
/**
* Helper function to get a character by ID.
*/
function getCharacter(id: string): Promise<Character | null> {
// Returning a promise just to illustrate that GraphQL.js supports it.
return Promise.resolve(humanData[id] ?? droidData[id]);
}
/**
* Allows us to query for a character's friends.
*/
export function getFriends(
character: Character,
): Array<Promise<Character | null>> {
// Notice that GraphQL accepts Arrays of Promises.
return character.friends.map((id) => getCharacter(id));
}
/**
* Allows us to fetch the undisputed hero of the Star Wars trilogy, R2-D2.
*/
export function getHero(episode: number): Character {
if (episode === 5) {
// Luke is the hero of Episode V.
return luke;
}
// Artoo is the hero otherwise.
return artoo;
}
/**
* Allows us to query for the human with the given id.
*/
export function getHuman(id: string): Human | null {
return humanData[id];
}
/**
* Allows us to query for the droid with the given id.
*/
export function getDroid(id: string): Droid | null {
return droidData[id];
}