Skip to content

Commit 2de0ff1

Browse files
chore(deps): modernize the web runtime stack for 1.0
Takes every available major on the webapp's runtime surface — ai 7, @ai-sdk/react 4, TanStack Table 9, Motion 13, GraphQL 17 — plus the current React, TanStack Query/Router, Sentry and PostHog releases. web-vitals is removed rather than bumped: reportWebVitals() was called with no callback, so the library was never loaded. PostHog wraps the same Chrome library, so Core Web Vitals now flow through the provider that is already consent-gated. Deprecated APIs the upgrades surfaced are migrated rather than suppressed: ensureQueryData/fetchQuery to queryClient.query, and Sentry's sendDefaultPii to an exhaustive dataCollection map that tsc holds complete. Refs #1584 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 793f4a4 commit 2de0ff1

36 files changed

Lines changed: 1465 additions & 1222 deletions
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
"hephaestus": minor
3+
---
4+
5+
Instances that run PostHog now receive Core Web Vitals — largest contentful paint, cumulative layout
6+
shift, first contentful paint and interaction to next paint — for the web application, so a slow
7+
page is visible in analytics rather than only in a complaint. The application never measured them
8+
before. Nothing is captured without the analytics consent that already gates every other event, and
9+
network request timing stays off.

.changeset/current-web-runtime.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"hephaestus": patch
3+
---
4+
5+
Updates the frameworks the web application is built from. Error reports still infer nothing about
6+
who reported them, and now say category by category what they may carry. No action is needed to
7+
upgrade.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
"hephaestus": patch
3+
---
4+
5+
The sortable columns in the workspace members and achievements admin tables now say which column is
6+
sorted and in which direction — the arrow points, and a screen reader announces it. Both showed the
7+
same static icon whatever the sort was. Their "Columns" menus no longer offer the column of row
8+
actions, which was never meaningful to hide, and while a search is active both tables now count
9+
"Showing 5 of 12" against the rows that matched rather than against every row.

bun.lock

Lines changed: 98 additions & 108 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
"@mermaid-js/layout-elk": "0.2.1",
2626
"clsx": "2.1.1",
2727
"prism-react-renderer": "2.4.1",
28-
"react": "19.2.6",
29-
"react-dom": "19.2.6",
28+
"react": "19.2.8",
29+
"react-dom": "19.2.8",
3030
"@docusaurus/plugin-content-docs": "3.10.1",
3131
"@docusaurus/plugin-content-pages": "3.10.1",
3232
"@docusaurus/plugin-css-cascade-layers": "3.10.1",
@@ -38,8 +38,8 @@
3838
"devDependencies": {
3939
"@docusaurus/module-type-aliases": "3.10.1",
4040
"@docusaurus/types": "3.10.1",
41-
"@types/react": "19.2.14",
42-
"@types/react-dom": "19.2.3",
41+
"@types/react": "19.2.18",
42+
"@types/react-dom": "19.2.5",
4343
"markdownlint-cli2": "0.22.1",
4444
"raw-loader": "4.0.2",
4545
"typescript": "7.0.2"

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
"commander": "14.0.3",
123123
"fast-xml-parser": "^5.11.0",
124124
"fast-xml-validator": "1.4.2",
125-
"graphql": "16.14.0",
125+
"graphql": "17.0.2",
126126
"husky": "9.1.7",
127127
"jsdom": "29.1.1",
128128
"jsonc-parser": "3.3.1",
@@ -154,8 +154,7 @@
154154
"lodash": "4.18.1",
155155
"lodash-es": "4.18.1",
156156
"serialize-javascript": "7.0.5",
157-
"js-yaml": "4.3.1",
158-
"@opentelemetry/core": "2.8.0"
157+
"js-yaml": "4.3.1"
159158
},
160159
"trustedDependencies": [
161160
"@swc/core",

scripts/check-package-manager.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,36 @@ if (!isRecord(packages)) throw new Error("bun.lock must contain packages");
8181
const packageValues = Object.values(packages).filter((value): value is unknown[] =>
8282
Array.isArray(value),
8383
);
84+
/**
85+
* `bunfig.toml#publicHoistPattern` lifts a package to the root `node_modules` so the whole repo
86+
* shares one copy. For React and its types a second copy is two incompatible `JSX.Element`s, which
87+
* surfaces as a type error deep inside an unrelated library. Hoisting can only lift one, so the
88+
* lockfile resolving two is the moment that guarantee is gone — and nothing else notices.
89+
*/
90+
const bunfig: unknown = Bun.TOML.parse(readFileSync("bunfig.toml", "utf8"));
91+
const publicHoistPattern =
92+
isRecord(bunfig) && isRecord(bunfig.install) ? bunfig.install.publicHoistPattern : undefined;
93+
if (!Array.isArray(publicHoistPattern) || publicHoistPattern.length === 0) {
94+
throw new Error("bunfig.toml must declare install.publicHoistPattern");
95+
}
96+
for (const pattern of publicHoistPattern) {
97+
// A glob cannot be matched against a resolution prefix, so it is left to Bun.
98+
if (typeof pattern !== "string" || /[*?[\]]/.test(pattern)) continue;
99+
const resolutions = new Set(
100+
packageValues
101+
.map(([resolution]) => resolution)
102+
.filter((resolution): resolution is string => typeof resolution === "string")
103+
.filter((resolution) => resolution.startsWith(`${pattern}@`)),
104+
);
105+
if (resolutions.size === 0)
106+
throw new Error(`Publicly hoisted ${pattern} matches no lockfile package`);
107+
if (resolutions.size > 1) {
108+
throw new Error(
109+
`Publicly hoisted ${pattern} resolves to ${resolutions.size} versions, so the workspaces cannot share one copy: ${[...resolutions].join(", ")}`,
110+
);
111+
}
112+
}
113+
84114
for (const [dependency, expected] of overrideEntries) {
85115
const resolutions = packageValues
86116
.map(([resolution]) => resolution)

server/generated-clients/src/main/resources/graphql/gitlab/schema.gitlab.graphql

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32768,7 +32768,7 @@ type Group implements GroupInterface & Todoable {
3276832768
sort: ComplianceViolationSort = SEVERITY_LEVEL_DESC
3276932769

3277032770
"""Filters applied when retrieving compliance violations."""
32771-
filters: ComplianceViolationInput = {}
32771+
filters: ComplianceViolationInput = { }
3277232772

3277332773
"""Returns the elements in the list that come after the specified cursor."""
3277432774
after: String
@@ -33237,7 +33237,7 @@ type Group implements GroupInterface & Todoable {
3323733237
"""
3323833238
projectComplianceRequirementsStatus(
3323933239
"""Filters applied when retrieving compliance requirement statuses."""
33240-
filters: GroupProjectRequirementComplianceStatusInput = {}
33240+
filters: GroupProjectRequirementComplianceStatusInput = { }
3324133241

3324233242
"""Field used to sort compliance requirement statuses."""
3324333243
orderBy: ProjectComplianceRequirementStatusOrderBy
@@ -33262,7 +33262,7 @@ type Group implements GroupInterface & Todoable {
3326233262
"""
3326333263
projectComplianceStandardsAdherence(
3326433264
"""Filters applied when retrieving compliance standards adherence."""
33265-
filters: ComplianceStandardsAdherenceInput = {}
33265+
filters: ComplianceStandardsAdherenceInput = { }
3326633266

3326733267
"""Returns the elements in the list that come after the specified cursor."""
3326833268
after: String
@@ -33284,7 +33284,7 @@ type Group implements GroupInterface & Todoable {
3328433284
"""
3328533285
projectComplianceViolations(
3328633286
"""Filters applied when retrieving compliance violations."""
33287-
filters: ProjectComplianceViolationFilterInput = {}
33287+
filters: ProjectComplianceViolationFilterInput = { }
3328833288

3328933289
"""Returns the elements in the list that come after the specified cursor."""
3329033290
after: String
@@ -60592,7 +60592,7 @@ type Project implements ProjectInterface & Todoable {
6059260592
"""
6059360593
Filters applied when retrieving compliance control statuses for the project.
6059460594
"""
60595-
filters: ProjectComplianceControlStatusInput = {}
60595+
filters: ProjectComplianceControlStatusInput = { }
6059660596

6059760597
"""Returns the elements in the list that come after the specified cursor."""
6059860598
after: String
@@ -60634,7 +60634,7 @@ type Project implements ProjectInterface & Todoable {
6063460634
"""
6063560635
complianceRequirementStatuses(
6063660636
"""Filters applied when retrieving compliance requirement statuses."""
60637-
filters: ProjectRequirementComplianceStatusInput = {}
60637+
filters: ProjectRequirementComplianceStatusInput = { }
6063860638

6063960639
"""Field used to sort compliance requirement statuses."""
6064060640
orderBy: ProjectComplianceRequirementStatusOrderBy
@@ -60657,7 +60657,7 @@ type Project implements ProjectInterface & Todoable {
6065760657
"""Compliance standards adherence for the project."""
6065860658
complianceStandardsAdherence(
6065960659
"""Filters applied when retrieving compliance standards adherence."""
60660-
filters: ComplianceStandardsProjectAdherenceInput = {}
60660+
filters: ComplianceStandardsProjectAdherenceInput = { }
6066160661

6066260662
"""Returns the elements in the list that come after the specified cursor."""
6066360663
after: String
@@ -62146,7 +62146,7 @@ type Project implements ProjectInterface & Todoable {
6214662146
sort: ComplianceViolationSort = SEVERITY_LEVEL_DESC
6214762147

6214862148
"""Filters applied when retrieving compliance violations."""
62149-
filters: ComplianceViolationProjectInput = {}
62149+
filters: ComplianceViolationProjectInput = { }
6215062150

6215162151
"""Returns the elements in the list that come after the specified cursor."""
6215262152
after: String

webapp/.storybook/main.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ const config: StorybookConfig = {
3939
"ai",
4040
"posthog-js/react",
4141
"uuid",
42-
"web-vitals",
4342
];
4443
return viteConfig;
4544
},

webapp/AGENTS.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,14 @@ suppressed at the call site with their reason.
181181
`forwardRef` are not imports you may take from `react` — the import line says so and why.
182182

183183
**A `useMemo` that survives is load-bearing, and deleting it breaks something that still type-checks.**
184-
There are only two shapes that earn the suppression, and each names its own on the line above the
184+
There are only three shapes that earn the suppression, and each names its own on the line above the
185185
import: the value is a **dependency of an effect**, so its identity is what decides whether the effect
186-
re-runs; or the component is **opted out of the compiler** by a library it uses, so nothing memoises
187-
for it. `useReactTable` is the second case — `react/incompatible-library` names the same fact — and
188-
TanStack Table rebuilds its column model, and every row model downstream, whenever `columns` changes
189-
identity. Anything else is the memo the compiler exists to remove.
186+
re-runs; the component is **opted out of the compiler** by a library it uses, so nothing memoises for
187+
it — `react/incompatible-library` names that case where it can; or a **library keys a cache on the
188+
value's identity**, which the compiler memoises as an optimisation rather than promises. TanStack
189+
Table is the third: `useTable` compares `options.columns` and `options.data` with `!==` and rebuilds
190+
the column model, and every row model downstream, when either changes — so a table here memoises
191+
them by hand. Anything else is the memo the compiler exists to remove.
190192

191193
## The time of day
192194

@@ -232,7 +234,7 @@ a routing table on the front page; its `RUBRIC.md` is the grading instrument for
232234
## Routing
233235

234236
Declare routes with `createFileRoute`. Keep loaders side-effect free and prefer
235-
`context.queryClient.ensureQueryData(...)` with the generated options. Put shared data (query client,
237+
`context.queryClient.query(...)` with the generated options. Put shared data (query client,
236238
auth) on the router context. Never hand-edit `routeTree.gen.ts` — there is no `tsr` CLI here; the
237239
TanStack Router Vite plugin regenerates it when the dev server runs.
238240

0 commit comments

Comments
 (0)