-
Notifications
You must be signed in to change notification settings - Fork 1
/
starWarsData.lua
182 lines (161 loc) · 4.06 KB
/
starWarsData.lua
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
--!strict
--[[
* Copyright (c) GraphQL Contributors
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
]]
-- ROBLOX upstream: https://github.com/graphql/graphql-js/blob/1611bbb08a88f734e9490b14cfe6afea11a838e0/src/__tests__/starWarsData.js
local rootWorkspace = script.Parent.Parent
local Packages = rootWorkspace.Parent
local LuauPolyfill = require(Packages.LuauPolyfill)
local Array = require(Packages.LuauPolyfill).Array
type Array<T> = LuauPolyfill.Array<T>
type Promise<T> = LuauPolyfill.Promise<T>
local Promise = require(Packages.Promise)
--[[*
* These are types which correspond to the schema.
* They represent the shape of the data visited during field resolution.
]]
export type Character = {
id: string,
name: string,
friends: Array<string>,
appearsIn: Array<number>,
-- ROBLOX TODO: this file will not typecheck until Luau can allow for derived type relationships
-- ...
}
export type Human = {
type: string, -- ROBLOX TODO: 'Human',
id: string,
name: string,
friends: Array<string>,
appearsIn: Array<number>,
homePlanet: string?,
}
export type Droid = {
type: string, -- ROBLOX TODO: 'Droid',
id: string,
name: string,
friends: Array<string>,
appearsIn: Array<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.
]]
local luke: Human = {
type = "Human",
id = "1000",
name = "Luke Skywalker",
friends = { "1002", "1003", "2000", "2001" },
appearsIn = { 4, 5, 6 },
homePlanet = "Tatooine",
}
local vader: Human = {
type = "Human",
id = "1001",
name = "Darth Vader",
friends = { "1004" },
appearsIn = { 4, 5, 6 },
homePlanet = "Tatooine",
}
local han: Human = {
type = "Human",
id = "1002",
name = "Han Solo",
friends = { "1000", "1003", "2001" },
appearsIn = { 4, 5, 6 },
}
local leia: Human = {
type = "Human",
id = "1003",
name = "Leia Organa",
friends = { "1000", "1002", "2000", "2001" },
appearsIn = { 4, 5, 6 },
homePlanet = "Alderaan",
}
local tarkin: Human = {
type = "Human",
id = "1004",
name = "Wilhuff Tarkin",
friends = { "1001" },
appearsIn = { 4 },
}
local humanData: { [string]: Human } = {
[luke.id] = luke,
[vader.id] = vader,
[han.id] = han,
[leia.id] = leia,
[tarkin.id] = tarkin,
}
local threepio: Droid = {
type = "Droid",
id = "2000",
name = "C-3PO",
friends = { "1000", "1002", "1003", "2001" },
appearsIn = { 4, 5, 6 },
primaryFunction = "Protocol",
}
local artoo: Droid = {
type = "Droid",
id = "2001",
name = "R2-D2",
friends = { "1000", "1002", "1003" },
appearsIn = { 4, 5, 6 },
primaryFunction = "Astromech",
}
local droidData: { [string]: Droid } = {
[threepio.id] = threepio,
[artoo.id] = artoo,
}
--[[*
* Helper function to get a character by ID.
]]
local function getCharacter(id: string): Promise<Character | nil>
-- Returning a promise just to illustrate that GraphQL-Lua supports it.
return Promise.resolve(humanData[id] or droidData[id])
end
--[[*
* Allows us to query for a character's friends.
]]
local function getFriends(character: Character): Array<Promise<Character | nil>>
-- Notice that GraphQL accepts Arrays of Promises.
return Array.map(character.friends, function(id)
return getCharacter(id)
end)
end
--[[*
* Allows us to fetch the undisputed hero of the Star Wars trilogy, R2-D2.
]]
local function getHero(episode: number): Character
if episode == 5 then
-- Luke is the hero of Episode V.
return luke
end
-- Artoo is the hero otherwise.
return artoo
end
--[[*
* Allows us to query for the human with the given id.
]]
local function getHuman(id: string): Human | nil
return humanData[id]
end
--[[*
* Allows us to query for the droid with the given id.
]]
local function getDroid(id: string): Droid | nil
return droidData[id]
end
return {
getHuman = getHuman,
getCharacter = getCharacter,
getDroid = getDroid,
getFriends = getFriends,
getHero = getHero,
}