Skip to content

Commit 10a1dc9

Browse files
feat: enhance Apollo Sandbox HTML with caching and improve resolver type definitions
1 parent 9348d49 commit 10a1dc9

File tree

2 files changed

+22
-25
lines changed

2 files changed

+22
-25
lines changed

src/index.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ async function loadResolvers() {
198198
return resolvers
199199
}
200200
201-
// Apollo Sandbox HTML
201+
// Apollo Sandbox HTML with 1 week cache
202202
const apolloSandboxHtml = \`<!DOCTYPE html>
203203
<html lang="en">
204204
<body style="margin: 0; overflow-x: hidden; overflow-y: hidden">
@@ -217,6 +217,13 @@ new window.EmbeddedSandbox({
217217
</body>
218218
</html>\`
219219
220+
// Set cache headers for Apollo Sandbox HTML (1 week = 604800 seconds)
221+
function setApolloSandboxCacheHeaders(event) {
222+
setHeader(event, 'Cache-Control', 'public, max-age=604800, s-maxage=604800')
223+
setHeader(event, 'Expires', new Date(Date.now() + 604800000).toUTCString())
224+
setHeader(event, 'ETag', \`"apollo-sandbox-\${Date.now()}"\`)
225+
}
226+
220227
// Lazy initialization
221228
let yoga = null
222229
let initPromise = null
@@ -287,7 +294,12 @@ export default defineEventHandler(async (event) => {
287294
// Return response body
288295
if (response.body) {
289296
const contentType = response.headers.get('content-type')
290-
if (contentType?.includes('text/html') || contentType?.includes('application/json')) {
297+
if (contentType?.includes('text/html')) {
298+
// Set cache headers for Apollo Sandbox HTML
299+
setApolloSandboxCacheHeaders(event)
300+
return await response.text()
301+
}
302+
if (contentType?.includes('application/json')) {
291303
return await response.text()
292304
}
293305
return response.body

src/utils.ts

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,25 @@
1-
import type { GraphQLResolveInfo } from 'graphql'
2-
import type { GraphQLContext } from './context'
3-
import type { GraphQLSchemaConfig } from './types'
4-
5-
export type ResolverFn<TResult = any, TParent = any, TContext = GraphQLContext, TArgs = any> = (
6-
parent: TParent,
7-
args: TArgs,
8-
context: TContext,
9-
info: GraphQLResolveInfo
10-
) => Promise<TResult> | TResult
11-
12-
export interface ResolverMap {
13-
[key: string]: {
14-
[key: string]: ResolverFn
15-
}
16-
}
1+
import type { GraphQLSchemaConfig, Resolvers } from './types'
172

183
export function defineGraphQLSchema(config: GraphQLSchemaConfig): GraphQLSchemaConfig {
194
return config
205
}
216

22-
export function defineGraphQLResolver<TResolvers extends ResolverMap = ResolverMap>(
23-
resolvers: TResolvers,
24-
): TResolvers {
7+
export function defineGraphQLResolver(
8+
resolvers: Resolvers,
9+
): Resolvers {
2510
return resolvers
2611
}
2712

28-
export function createResolver<TResolvers extends ResolverMap = ResolverMap>(
29-
resolvers: TResolvers,
30-
): TResolvers {
13+
export function createResolver(
14+
resolvers: Resolvers,
15+
): Resolvers {
3116
return resolvers
3217
}
3318

3419
/**
3520
* Define GraphQL resolvers map
3621
*/
37-
export function defineGraphQLResolvers(resolvers: ResolverMap): ResolverMap {
22+
export function defineGraphQLResolvers(resolvers: Resolvers): Resolvers {
3823
return resolvers
3924
}
4025

0 commit comments

Comments
 (0)