Skip to content

Commit 8b39737

Browse files
committed
update headers util
1 parent 3f69a4a commit 8b39737

File tree

5 files changed

+52
-43
lines changed

5 files changed

+52
-43
lines changed

app/root.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ import { getUserId, logout } from './utils/auth.server.ts'
4343
import { ClientHintCheck, getHints } from './utils/client-hints.tsx'
4444
import { prisma } from './utils/db.server.ts'
4545
import { getEnv } from './utils/env.server.ts'
46+
import { pipeHeaders } from './utils/headers.server.ts'
4647
import { honeypot } from './utils/honeypot.server.ts'
4748
import { combineHeaders, getDomainUrl, getUserImgSrc } from './utils/misc.tsx'
4849
import { useNonce } from './utils/nonce-provider.ts'
49-
import { pipeHeaders } from './utils/remix.server.ts'
5050
import { type Theme, getTheme } from './utils/theme.server.ts'
5151
import { makeTimings, time } from './utils/timing.server.ts'
5252
import { getToast } from './utils/toast.server.ts'

app/routes/settings+/profile.connections.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
providerNames,
2121
} from '#app/utils/connections.tsx'
2222
import { prisma } from '#app/utils/db.server.ts'
23-
import { pipeHeaders } from '#app/utils/remix.server.js'
23+
import { pipeHeaders } from '#app/utils/headers.server.js'
2424
import { makeTimings } from '#app/utils/timing.server.ts'
2525
import { createToastHeaders } from '#app/utils/toast.server.ts'
2626
import { type Info, type Route } from './+types/profile.connections.ts'

app/utils/headers.server.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { format, parse } from '@tusbar/cache-control'
2+
import { expect, test } from 'vitest'
3+
import { getConservativeCacheControl } from './headers.server.ts'
4+
5+
test('works for basic usecase', () => {
6+
const result = getConservativeCacheControl(
7+
'max-age=3600',
8+
'max-age=1800, s-maxage=600',
9+
'private, max-age=86400',
10+
)
11+
12+
expect(result).toEqual(
13+
format({
14+
maxAge: 1800,
15+
sharedMaxAge: 600,
16+
private: true,
17+
}),
18+
)
19+
})
20+
test('retains boolean directive', () => {
21+
const result = parse(
22+
getConservativeCacheControl('private', 'no-cache,no-store'),
23+
)
24+
25+
expect(result.private).toEqual(true)
26+
expect(result.noCache).toEqual(true)
27+
expect(result.noStore).toEqual(true)
28+
})
29+
test('gets smallest number directive', () => {
30+
const result = parse(
31+
getConservativeCacheControl(
32+
'max-age=10, s-maxage=300',
33+
'max-age=300, s-maxage=600',
34+
),
35+
)
36+
37+
expect(result.maxAge).toEqual(10)
38+
expect(result.sharedMaxAge).toEqual(300)
39+
})

app/utils/remix.server.ts renamed to app/utils/headers.server.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import { type CacheControlValue, parse, format } from '@tusbar/cache-control'
22
import { type HeadersArgs } from 'react-router'
33

4+
/**
5+
* A utility for handling route headers, merging common use-case headers.
6+
*
7+
* This function combines headers by:
8+
* 1. Forwarding headers from the route's loader or action.
9+
* 2. Inheriting headers from the parent.
10+
* 3. Falling back to parent headers (if any) when headers are missing.
11+
*/
412
export function pipeHeaders({
513
parentHeaders,
614
loaderHeaders,
@@ -61,6 +69,9 @@ export function pipeHeaders({
6169
return headers
6270
}
6371

72+
/**
73+
* Given multiple Cache-Control headers, merge them and get the most conservative one.
74+
*/
6475
export function getConservativeCacheControl(
6576
...cacheControlHeaders: Array<string | null>
6677
): string {

app/utils/remix.server.test.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)