Skip to content

Commit f8565ef

Browse files
committed
chore: next 15, react 19, +more bumps
1 parent 9cb1185 commit f8565ef

13 files changed

+1089
-1118
lines changed

next-env.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
/// <reference types="next/image-types/global" />
33

44
// NOTE: This file should not be edited
5-
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
5+
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

next.config.mjs

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ const nextConfig = {
66
ignoreDuringBuilds: true,
77
dirs: ['src'],
88
},
9+
serverExternalPackages: ['prisma', '@navikt/next-logger', '@slack/bolt'],
910
experimental: {
1011
optimizePackageImports: ['@navikt/ds-react', '@navikt/aksel-icons', 'remeda', 'recharts'],
11-
serverComponentsExternalPackages: ['prisma', '@navikt/next-logger', '@slack/bolt'],
12-
instrumentationHook: true,
1312
},
1413
}
1514

package.json

+27-27
Original file line numberDiff line numberDiff line change
@@ -21,56 +21,56 @@
2121
"prepare": "husky"
2222
},
2323
"dependencies": {
24-
"@navikt/aksel-icons": "^7.4.2",
25-
"@navikt/ds-css": "^7.4.2",
26-
"@navikt/ds-react": "^7.4.2",
27-
"@navikt/ds-tailwind": "^7.4.2",
28-
"@navikt/next-logger": "^1.34.0",
29-
"@navikt/oasis": "^3.4.0",
24+
"@navikt/aksel-icons": "^7.8.0",
25+
"@navikt/ds-css": "^7.8.0",
26+
"@navikt/ds-react": "^7.8.0",
27+
"@navikt/ds-tailwind": "^7.8.0",
28+
"@navikt/next-logger": "^1.35.0",
29+
"@navikt/oasis": "^3.6.0",
3030
"@prisma/client": "6.1.0",
3131
"@slack/bolt": "^3.22.0",
3232
"@slack/logger": "^4.0.0",
3333
"@slack/types": "^2.14.0",
3434
"clsx": "^2.1.1",
3535
"date-fns": "^3.6.0",
36-
"next": "^14.2.16",
36+
"next": "^15.1.1",
3737
"next-logger": "^5.0.1",
3838
"nextleton": "^0.6.1",
3939
"node-cron": "^3.0.3",
4040
"pino": "^9.5.0",
41-
"postcss": "^8.4.47",
41+
"postcss": "^8.4.49",
4242
"prisma": "6.1.0",
43-
"react": "^18.3.1",
44-
"react-dom": "^18.3.1",
45-
"recharts": "^2.13.2",
46-
"remeda": "^2.16.0",
43+
"react": "^19.0.0",
44+
"react-dom": "^19.0.0",
45+
"recharts": "^2.15.0",
46+
"remeda": "^2.18.0",
4747
"sharp": "^0.33.5",
48-
"tailwind-merge": "^2.5.4",
49-
"uuid": "^11.0.2",
50-
"zod": "^3.23.8"
48+
"tailwind-merge": "^2.5.5",
49+
"uuid": "^11.0.3",
50+
"zod": "^3.24.1"
5151
},
5252
"devDependencies": {
53-
"@navikt/eslint-config-teamsykmelding": "^6.6.0",
54-
"@types/bun": "^1.1.12",
55-
"@types/node": "^22.8.5",
53+
"@navikt/eslint-config-teamsykmelding": "^7.1.0",
54+
"@types/bun": "^1.1.14",
55+
"@types/node": "^22.10.2",
5656
"@types/node-cron": "^3.0.11",
57-
"@types/react": "18.3.12",
57+
"@types/react": "19.0.2",
5858
"@types/uuid": "^10.0.0",
59-
"@typescript-eslint/eslint-plugin": "^7.18.0",
60-
"@typescript-eslint/parser": "^7.18.0",
59+
"@typescript-eslint/eslint-plugin": "^8.18.1",
60+
"@typescript-eslint/parser": "^8.18.1",
6161
"autoprefixer": "^10.4.20",
6262
"eslint": "^8.57.1",
63-
"eslint-config-next": "^14.2.16",
63+
"eslint-config-next": "^15.1.1",
6464
"eslint-plugin-import": "^2.31.0",
6565
"husky": "^9.1.6",
6666
"lint-staged": "^15.2.10",
67-
"pino-pretty": "^11.3.0",
67+
"pino-pretty": "^13.0.0",
6868
"postcss-import": "^16.1.0",
69-
"prettier": "^3.3.3",
69+
"prettier": "^3.4.2",
7070
"prettier-plugin-prisma": "^5.0.0",
71-
"prettier-plugin-tailwindcss": "^0.6.8",
72-
"tailwindcss": "^3.4.14",
73-
"typescript": "^5.6.3"
71+
"prettier-plugin-tailwindcss": "^0.6.9",
72+
"tailwindcss": "^3.4.17",
73+
"typescript": "^5.7.2"
7474
},
7575
"resolutions": {
7676
"eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705"

src/app/team/[groupId]/[teamId]/graph/page.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ export const metadata: Metadata = {
1919
}
2020

2121
type Props = {
22-
params: {
22+
params: Promise<{
2323
groupId: string
2424
teamId: string
25-
}
25+
}>
2626
}
2727

2828
async function Page({ params }: Props): Promise<ReactElement> {
29-
const team = await getTeamByAdGroupAndTeamId(params.groupId, params.teamId)
29+
const pageParams = await params
30+
const team = await getTeamByAdGroupAndTeamId(pageParams.groupId, pageParams.teamId)
3031
if (!team) {
3132
return (
3233
<div>
@@ -47,7 +48,7 @@ async function Page({ params }: Props): Promise<ReactElement> {
4748

4849
return (
4950
<div>
50-
<BackLink href={`/team/${params.groupId}/${params.teamId}`} />
51+
<BackLink href={`/team/${pageParams.groupId}/${pageParams.teamId}`} />
5152
<Heading size="large">Helsegraf for {team.name}</Heading>
5253
<Suspense fallback={<Skeleton height={300} variant="rounded" />}>
5354
<OverallGraph teamId={team.id} />

src/app/team/[groupId]/[teamId]/page.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ export const metadata: Metadata = {
2929
}
3030

3131
type Props = {
32-
params: {
32+
params: Promise<{
3333
groupId: string
3434
teamId: string
35-
}
35+
}>
3636
}
3737

3838
async function Page({ params }: Props): Promise<ReactElement> {
39-
const team = await getTeamByAdGroupAndTeamId(params.groupId, params.teamId)
39+
const pageParams = await params
40+
const team = await getTeamByAdGroupAndTeamId(pageParams.groupId, pageParams.teamId)
4041
if (!team) {
4142
return (
4243
<div>
@@ -61,7 +62,7 @@ async function Page({ params }: Props): Promise<ReactElement> {
6162
<Heading size="large">{team.name}</Heading>
6263
<LinkPanel
6364
as={Link}
64-
href={`/team/${params.groupId}/${params.teamId}/graph`}
65+
href={`/team/${pageParams.groupId}/${pageParams.teamId}/graph`}
6566
border
6667
className="my-2"
6768
prefetch={false}
@@ -71,7 +72,7 @@ async function Page({ params }: Props): Promise<ReactElement> {
7172
</LinkPanel>
7273
<LinkPanel
7374
as={Link}
74-
href={`/team/${params.groupId}/${params.teamId}/results`}
75+
href={`/team/${pageParams.groupId}/${pageParams.teamId}/results`}
7576
border
7677
className="my-2"
7778
prefetch={false}

src/app/team/[groupId]/[teamId]/results/page.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ export const metadata: Metadata = {
2222
}
2323

2424
type Props = {
25-
params: {
25+
params: Promise<{
2626
groupId: string
2727
teamId: string
28-
}
28+
}>
2929
}
3030

3131
async function Page({ params }: Props): Promise<ReactElement> {
32-
const team = await getTeamByAdGroupAndTeamId(params.groupId, params.teamId)
32+
const pageParams = await params
33+
const team = await getTeamByAdGroupAndTeamId(pageParams.groupId, pageParams.teamId)
3334
if (!team) {
3435
return (
3536
<div>
@@ -50,7 +51,7 @@ async function Page({ params }: Props): Promise<ReactElement> {
5051

5152
return (
5253
<div>
53-
<BackLink href={`/team/${params.groupId}/${params.teamId}`} />
54+
<BackLink href={`/team/${pageParams.groupId}/${pageParams.teamId}`} />
5455
<Heading size="large">Alle resultater for {team.name}</Heading>
5556
<Heading size="medium" level="3">
5657
Tidligere spørringer

src/auth/authentication.tsx

+8-8
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { getMembersOf } from './ms-graph'
1313
* Validates the wonderwall token according to nais.io. Should only actually redirect if the token has expired.
1414
*/
1515
export async function validateWonderwallToken(redirectPath: string): Promise<void> {
16-
const requestHeaders = headers()
16+
const requestHeaders = await headers()
1717

1818
if (isLocal) {
1919
logger.warn('Is running locally, skipping RSC auth')
@@ -50,11 +50,11 @@ export function getUserToken(headers: Headers): string {
5050
)
5151
}
5252

53-
export function getUser(): {
53+
export async function getUser(): Promise<{
5454
name: string
5555
email: string
56-
} {
57-
const token = getUserToken(headers())
56+
}> {
57+
const token = getUserToken(await headers())
5858
const jwt = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString('utf8'))
5959

6060
return {
@@ -76,7 +76,7 @@ export async function getUsersGroups(): Promise<string[]> {
7676
}
7777

7878
if (membersOf['@odata.nextLink'] != null) {
79-
const user = getUser()
79+
const user = await getUser()
8080
logger.error(
8181
`Whops! A user (${user.email}) has more than max page groups (${membersOf.value.length}), time to implement pagination?`,
8282
)
@@ -85,11 +85,11 @@ export async function getUsersGroups(): Promise<string[]> {
8585
return membersOf.value.map((group) => group.id)
8686
}
8787

88-
export function isUserLoggedIn(): boolean {
88+
export async function isUserLoggedIn(): Promise<boolean> {
8989
try {
90-
getUser()
90+
await getUser()
9191
return true
92-
} catch (e) {
92+
} catch {
9393
return false
9494
}
9595
}

src/auth/ms-graph.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export async function getMembersOf(): Promise<
1414
return fakeMembersOfResponse
1515
}
1616

17-
const token = getUserToken(headers())
17+
const token = getUserToken(await headers())
1818
const tokenSet = await requestOboToken(token, 'https://graph.microsoft.com/.default')
1919
if (!tokenSet.ok) {
2020
logger.error(new Error(`Unable to exchange OBO token: ${tokenSet.error.message}`, { cause: tokenSet.error }))

src/components/LoggedInUser.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Tooltip } from '@navikt/ds-react'
55
import { getUser, isUserLoggedIn } from '../auth/authentication'
66

77
async function LoggedInUser(): Promise<ReactElement> {
8-
if (!isUserLoggedIn()) {
8+
if (!(await isUserLoggedIn())) {
99
return (
1010
<div className="flex flex-col items-end p-4">
1111
<BodyShort className="w-32 text-right">Ikke logget inn</BodyShort>
@@ -14,7 +14,7 @@ async function LoggedInUser(): Promise<ReactElement> {
1414
)
1515
}
1616

17-
const user = getUser()
17+
const user = await getUser()
1818

1919
return (
2020
<div className="flex gap-4 p-4">

src/components/Teams.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Code from './core/Code'
1010
import TeamCard from './TeamCard'
1111

1212
async function Teams(): Promise<ReactElement> {
13-
if (!isUserLoggedIn()) {
13+
if (!(await isUserLoggedIn())) {
1414
return (
1515
<div className="max-w-prose">
1616
<Heading size="large" spacing>

src/instrumentation.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/* eslint-disable @typescript-eslint/no-require-imports */
2+
13
export async function register(): Promise<void> {
24
if (process.env.NEXT_RUNTIME === 'nodejs') {
35
await require('pino')

tsconfig.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
"resolveJsonModule": true,
1313
"isolatedModules": true,
1414
"jsx": "preserve",
15-
"plugins": [{ "name": "next" }]
15+
"plugins": [
16+
{
17+
"name": "next"
18+
}
19+
],
20+
"target": "ES2017"
1621
},
1722
"include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"],
1823
"exclude": ["node_modules", "tests", "seed"]

0 commit comments

Comments
 (0)