Skip to content

Commit dc71675

Browse files
committed
fix(fe): invalid types
1 parent 0ebaae2 commit dc71675

30 files changed

+117
-110
lines changed

.github/workflows/fe-pull-request.yml

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,13 @@ jobs:
1717
version: latest
1818
- name: Run Biome
1919
run: biome check . --reporter=github
20-
working-directory: ./frontend
2120
tsc:
2221
runs-on: ubuntu-latest
2322
steps:
2423
- uses: actions/checkout@v4
25-
- name: Setup Node.js
26-
uses: actions/setup-node@v3
27-
with:
28-
node-version: '20'
29-
cache: 'pnpm'
30-
- name: Install Dependencies
31-
run: pnpm install
32-
working-directory: ./frontend
24+
- uses: pnpm/action-setup@v4
25+
- run: pnpm install
26+
- run: pnpm turbo build:engine
3327
- name: Run TypeScript Compiler
3428
run: pnpm ts-check
3529
working-directory: ./frontend

frontend/src/app/billing/plan-card.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function PlanCard({
5151
<p>Includes:</p>
5252
<ul className="text-muted-foreground mt-2 space-y-1">
5353
{features?.map((feature, index) => (
54-
<li key={feature.label}>
54+
<li key={index}>
5555
<Icon icon={feature.icon} /> {feature.label}
5656
</li>
5757
))}

frontend/src/app/data-providers/cloud-data-provider.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Clerk } from "@clerk/clerk-js";
22
import { type Rivet, RivetClient } from "@rivet-gg/cloud";
33
import { fetcher } from "@rivetkit/engine-api-full/core";
4-
import { infiniteQueryOptions, queryOptions } from "@tanstack/react-query";
4+
import { infiniteQueryOptions, QueryKey, queryOptions, UseQueryOptions } from "@tanstack/react-query";
55
import { cloudEnv } from "@/lib/env";
66
import { queryClient } from "@/queries/global";
77
import { RECORDS_PER_PAGE } from "./default-data-provider";
@@ -19,13 +19,17 @@ function createClient({ clerk }: { clerk: Clerk }) {
1919
token: async () => {
2020
return (await clerk.session?.getToken()) || "";
2121
},
22+
// @ts-expect-error
2223
fetcher: async (args) => {
23-
Object.keys(args.headers).forEach((key) => {
24+
Object.keys(args.headers || {}).forEach((key) => {
2425
if (key.toLowerCase().startsWith("x-fern-")) {
25-
delete args.headers[key];
26+
delete args.headers?.[key];
2627
}
2728
});
28-
return await fetcher(args);
29+
return await fetcher(
30+
// @ts-expect-error
31+
args
32+
);
2933
},
3034
});
3135
}
@@ -207,7 +211,6 @@ export const createOrganizationContext = ({
207211
mutationKey: ["projects"],
208212
mutationFn: async (data: {
209213
displayName: string;
210-
nameId: string;
211214
}) => {
212215
const response = await client.projects.create({
213216
displayName: data.displayName,
@@ -350,7 +353,6 @@ export const createNamespaceContext = ({
350353
...createEngineNamespaceContext({
351354
...parent,
352355
namespace: engineNamespaceName,
353-
namespaceId: engineNamespaceId,
354356
engineToken: token,
355357
client: createEngineClient(cloudEnv().VITE_APP_API_URL, {
356358
token,

frontend/src/app/data-providers/engine-data-provider.tsx

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { type Rivet, RivetClient } from "@rivetkit/engine-api-full";
2-
import { type FetchFunction, fetcher } from "@rivetkit/engine-api-full/core";
2+
import { fetcher } from "@rivetkit/engine-api-full/core";
33
import {
44
infiniteQueryOptions,
55
mutationOptions,
66
QueryKey,
7-
QueryOptions,
87
queryOptions,
98
UseQueryOptions,
109
} from "@tanstack/react-query";
@@ -17,15 +16,14 @@ import {
1716
} from "@/components/actors";
1817
import { engineEnv } from "@/lib/env";
1918
import { convertStringToId } from "@/lib/utils";
20-
import { queryClient } from "@/queries/global";
2119
import { noThrow, shouldRetryAllExpect403 } from "@/queries/utils";
2220
import {
2321
ActorQueryOptions,
2422
ActorQueryOptionsSchema,
2523
createDefaultGlobalContext,
26-
type DefaultDataProvider,
2724
RECORDS_PER_PAGE,
2825
} from "./default-data-provider";
26+
import z from "zod";
2927

3028
const mightRequireAuth = __APP_TYPE__ === "engine";
3129

@@ -133,6 +131,7 @@ export const createGlobalContext = (opts: {
133131
export const createNamespaceContext = ({
134132
namespace,
135133
client,
134+
...parent
136135
}: { namespace: string; } & ReturnType<
137136
typeof createGlobalContext
138137
>) => {
@@ -407,7 +406,7 @@ export const createNamespaceContext = ({
407406
enabled: !!opts.runnerUrl,
408407
queryFn: async ({ signal: abortSignal }) => {
409408
const res =
410-
await client.runnerConfigs.serverlessHealthCheck(
409+
await client.runnerConfigsServerlessHealthCheck(
411410
{
412411
url: opts.runnerUrl,
413412
headers: opts.headers,
@@ -553,7 +552,7 @@ export const createNamespaceContext = ({
553552
name: string;
554553
config: Record<string, Rivet.RunnerConfig>;
555554
}) => {
556-
const response = await client.runnerConfigs.upsert(name, {
555+
const response = await client.runnerConfigsUpsert(name, {
557556
namespace,
558557
datacenters: config,
559558
});
@@ -572,7 +571,7 @@ export const createNamespaceContext = ({
572571
...opts,
573572
mutationKey: ["runner-config", "delete"] as QueryKey,
574573
mutationFn: async (name: string) => {
575-
await client.runnerConfigs.delete(name, { namespace });
574+
await client.runnerConfigsDelete(name, { namespace });
576575
},
577576
retry: shouldRetryAllExpect403,
578577
meta: {
@@ -587,7 +586,7 @@ export const createNamespaceContext = ({
587586
queryKey: [{ namespace }, "runners", "configs", opts] as QueryKey,
588587
initialPageParam: undefined as string | undefined,
589588
queryFn: async ({ signal: abortSignal, pageParam }) => {
590-
const response = await client.runnerConfigs.list(
589+
const response = await client.runnerConfigsList(
591590
{
592591
namespace,
593592
cursor: pageParam ?? undefined,
@@ -630,7 +629,7 @@ export const createNamespaceContext = ({
630629
queryKey: [{ namespace }, "runners", "config", opts] as QueryKey,
631630
enabled: !!opts.name,
632631
queryFn: async ({ signal: abortSignal }) => {
633-
const response = await client.runnerConfigs.list(
632+
const response = await client.runnerConfigsList(
634633
{
635634
namespace,
636635
runnerNames: opts.name,
@@ -653,13 +652,13 @@ export const createNamespaceContext = ({
653652
},
654653
});
655654
},
656-
engineAdminTokenQueryOptions(): UseQueryOptions<string> {
655+
engineAdminTokenQueryOptions() {
657656
return queryOptions({
658657
staleTime: 1000,
659658
gcTime: 1000,
660659
queryKey: [{ namespace }, "tokens", "engine-admin"] as QueryKey,
661660
queryFn: async () => {
662-
return ls.engineCredentials.get(getConfig().apiUrl) || "";
661+
return (ls.engineCredentials.get(getConfig().apiUrl) || "") as string;
663662
},
664663
meta: {
665664
mightRequireAuth,
@@ -699,3 +698,28 @@ function transformActor(a: Rivet.Actor): Actor {
699698
],
700699
};
701700
}
701+
702+
type RunnerConfig = [
703+
string,
704+
{
705+
datacenters: Record<string, { metadata?: { provider?: string } }>;
706+
},
707+
];
708+
709+
export function hasMetadataProvider(metadata: unknown): metadata is { provider?: string } {
710+
return z.object({ provider: z.string().optional() }).safeParse(metadata).success;
711+
}
712+
713+
export function hasProvider(
714+
configs: [string, Rivet.RunnerConfigsListResponseRunnerConfigsValue][] | undefined,
715+
providers: string[],
716+
): boolean {
717+
if (!configs) return false;
718+
return configs.some(([, config]) =>
719+
Object.values(config.datacenters).some(
720+
(datacenter) =>
721+
datacenter.metadata && hasMetadataProvider(datacenter.metadata) && datacenter.metadata.provider &&
722+
providers.includes(datacenter.metadata.provider),
723+
),
724+
);
725+
}

frontend/src/app/dialogs/connect-manual-frame.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ export default function CreateProjectFrameContent({
3333
type="single"
3434
className="border rounded-md gap-0"
3535
value={mode}
36-
onValueChange={setMode}
36+
onValueChange={(mode) => {
37+
setMode(mode === "serverfull" ? "serverless" : "serverfull");
38+
}}
3739
>
3840
<ToggleGroupItem
3941
value="serverless"

frontend/src/app/dialogs/connect-vercel-frame.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
Frame,
2121
getConfig,
2222
} from "@/components";
23-
import { type Region, useEngineCompatDataProvider } from "@/components/actors";
23+
import { type Region, useCloudNamespaceDataProvider, useEngineCompatDataProvider, useEngineNamespaceDataProvider } from "@/components/actors";
2424
import { cloudEnv } from "@/lib/env";
2525
import { queryClient } from "@/queries/global";
2626
import { type JoinStepSchemas, StepperForm } from "../forms/stepper-form";
@@ -36,17 +36,13 @@ interface CreateProjectFrameContentProps extends DialogContentProps { }
3636
function usePublishableToken() {
3737
return match(__APP_TYPE__)
3838
.with("cloud", () => {
39-
const routeContext = useRouteContext({
40-
from: "/_context/_cloud/orgs/$organization/projects/$project/ns/$namespace/connect",
41-
select: (ctx) => ctx.dataProvider,
42-
});
4339
return useSuspenseQuery(
44-
routeContext.publishableTokenQueryOptions(),
40+
useCloudNamespaceDataProvider().publishableTokenQueryOptions(),
4541
).data;
4642
})
4743
.with("engine", () => {
4844
return useSuspenseQuery(
49-
useEngineCompatDataProvider().engineAdminTokenQueryOptions(),
45+
useEngineNamespaceDataProvider().engineAdminTokenQueryOptions(),
5046
).data;
5147
})
5248
.otherwise(() => {
@@ -225,7 +221,7 @@ function FormStepper({
225221
// }
226222

227223
function StepApiRoute() {
228-
const plan = useWatch<FormValues>({ name: "plan" as const });
224+
const plan = useWatch({ name: "plan" });
229225
return <ConnectVercelForm.IntegrationCode plan={plan || "hobby"} />;
230226
}
231227

frontend/src/app/dialogs/create-namespace-frame.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ export default function CreateNamespacesFrameContent() {
8484
onSubmit={async (values) => {
8585
await mutateAsync({
8686
displayName: values.name,
87-
name: values.slug || convertStringToId(values.name),
8887
});
8988
}}
9089
defaultValues={{ name: "", slug: "" }}

frontend/src/app/forms/edit-runner-config-form.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const formSchema = z.object({
2626
requestLifespan: z.coerce.number().positive(),
2727
runnersMargin: z.coerce.number().min(0),
2828
slotsPerRunner: z.coerce.number().positive(),
29-
headers: z.array(z.string()).default([]),
29+
headers: z.array(z.array(z.string())).default([]),
3030
});
3131

3232
export type FormValues = z.infer<typeof formSchema>;
@@ -179,8 +179,8 @@ export const SlotsPerRunner = ({ className }: { className?: string }) => {
179179
};
180180

181181
export const Headers = function Headers() {
182-
const { control, setValue } = useFormContext();
183-
const { fields, append, remove } = useFieldArray<FormValues>({
182+
const { control, setValue, watch } = useFormContext();
183+
const { fields, append, remove } = useFieldArray({
184184
name: "headers",
185185
control,
186186
});
@@ -226,7 +226,7 @@ col-span-full flex-1"
226226
<Input
227227
placeholder="Enter a value"
228228
className="w-full"
229-
value={field[0]}
229+
value={watch(`headers.${index}.0`)}
230230
onChange={(e) => {
231231
setValue(
232232
`headers.${index}.0`,
@@ -258,7 +258,7 @@ col-span-full flex-1"
258258
<Input
259259
placeholder="Enter a value"
260260
className="w-full"
261-
value={field[1]}
261+
value={watch(`headers.${index}.1`)}
262262
onChange={(e) => {
263263
setValue(
264264
`headers.${index}.1`,

frontend/src/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ const Sidebar = ({
139139
ref,
140140
...props
141141
}: {
142-
ref?: RefObject<ImperativePanelHandle>;
142+
ref?: RefObject<ImperativePanelHandle | null>;
143143
} & ComponentProps<typeof ResizablePanel>) => {
144144
const sidebarMinWidth = useContext(SidebarDimensionsContext);
145145
return (

frontend/src/app/runner-config-table.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from "@/components";
2525
import { ActorRegion } from "@/components/actors";
2626
import { REGION_LABEL } from "@/components/matchmaker/lobby-region";
27+
import { hasMetadataProvider } from "./data-providers/engine-data-provider";
2728

2829
interface RunnerConfigsTableProps {
2930
isLoading?: boolean;
@@ -142,7 +143,7 @@ function Row({
142143
<WithTooltip
143144
content={config.serverless?.url || "-"}
144145
trigger={
145-
<DiscreteCopyButton value={config.serverless?.url}>
146+
<DiscreteCopyButton value={config.serverless?.url || ""}>
146147
<span>
147148
{config.serverless?.url &&
148149
config.serverless.url.length > 32
@@ -159,7 +160,7 @@ function Row({
159160

160161
<TableCell>
161162
<div className="flex gap-2 justify-end">
162-
{config.serverless ? (
163+
{config.serverless && hasMetadataProvider(config.metadata) ? (
163164
<WithTooltip
164165
content="Edit provider settings"
165166
trigger={

0 commit comments

Comments
 (0)