Compare commits

..

6 Commits

Author SHA1 Message Date
allanice001
efac33fba6 chore: updates in UI due to migration to OAS3.1 2025-11-17 19:57:04 +00:00
allanice001
22a411fed9 chore: updates in UI due to migration to OAS3.1
Signed-off-by: allanice001 <allanice001@gmail.com>
2025-11-17 19:56:41 +00:00
allanice001
83c3116ed9 Merge remote-tracking branch 'origin/main' 2025-11-17 19:56:26 +00:00
allanice001
07974c1359 chore: updates in UI due to migration to OAS3.1
Signed-off-by: allanice001 <allanice001@gmail.com>
2025-11-17 19:56:16 +00:00
public-glueops-renovatebot[bot]
d08528586c chore: lock file maintenance (#298)
Co-authored-by: public-glueops-renovatebot[bot] <186083205+public-glueops-renovatebot[bot]@users.noreply.github.com>
2025-11-17 19:12:50 +00:00
public-glueops-renovatebot[bot]
bb745d6a4e chore: lock file maintenance (#294)
Co-authored-by: public-glueops-renovatebot[bot] <186083205+public-glueops-renovatebot[bot]@users.noreply.github.com>
2025-11-17 18:23:43 +00:00
36 changed files with 4360 additions and 236 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

4167
internal/web/dist/assets/index-BRRMZeeQ.js vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -5,9 +5,9 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AutoGlue</title> <title>AutoGlue</title>
<script type="module" crossorigin src="/assets/index-52pog1DZ.js"></script> <script type="module" crossorigin src="/assets/index-BRRMZeeQ.js"></script>
<link rel="modulepreload" crossorigin href="/assets/react-B75e6Si-.js"> <link rel="modulepreload" crossorigin href="/assets/react-B7S5QDrv.js">
<link rel="stylesheet" crossorigin href="/assets/index-tX4seA_J.css"> <link rel="stylesheet" crossorigin href="/assets/index-VHZG0dIU.css">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

Binary file not shown.

Binary file not shown.

View File

@@ -12,7 +12,7 @@ export async function logoutEverywhere(): Promise<void> {
try { try {
const body: DtoLogoutRequest = { refresh_token: tokens.refresh_token } as DtoLogoutRequest const body: DtoLogoutRequest = { refresh_token: tokens.refresh_token } as DtoLogoutRequest
await makeAuthApi().logout({ body }) await makeAuthApi().logout({ dtoLogoutRequest: body })
} catch (err) { } catch (err) {
console.warn("Logout API failed; clearing local state anyway", err) console.warn("Logout API failed; clearing local state anyway", err)
} finally { } finally {

View File

@@ -1,4 +1,5 @@
; ;
// src/pages/ClustersPage.tsx // src/pages/ClustersPage.tsx
import { useEffect, useMemo, useState } from "react"; import { useEffect, useMemo, useState } from "react";
@@ -27,6 +28,36 @@ import { Label } from "@/components/ui/label.tsx";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select.tsx"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select.tsx";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table.tsx"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table.tsx";
import { Textarea } from "@/components/ui/textarea.tsx"; import { Textarea } from "@/components/ui/textarea.tsx";
;
@@ -1268,6 +1299,8 @@ export const ClustersPage = () => {
</DialogFooter> </DialogFooter>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
<pre>{JSON.stringify(clustersQ.data, null, 2)}</pre>
</div> </div>
) )
} }

View File

@@ -1,6 +1,12 @@
import { useEffect, useState, type FC } from "react" import { useEffect, useState, type FC } from "react"
import { archerAdminApi } from "@/api/archer_admin" import { archerAdminApi } from "@/api/archer_admin"
import type { AdminListArcherJobsRequest } from "@/sdk" import {
AdminListArcherJobsStatusEnum,
type AdminListArcherJobsRequest,
type DtoJob,
type DtoPageJob,
type DtoQueueInfo,
} from "@/sdk"
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"
import { Loader2, Plus, RefreshCw, Search, X } from "lucide-react" import { Loader2, Plus, RefreshCw, Search, X } from "lucide-react"
@@ -36,50 +42,16 @@ import {
} from "@/components/ui/table" } from "@/components/ui/table"
import { Textarea } from "@/components/ui/textarea" import { Textarea } from "@/components/ui/textarea"
// Types (align with generated client camelCase) type JobStatus = AdminListArcherJobsStatusEnum
type JobStatus =
| "queued"
| "running"
| "succeeded"
| "failed"
| "canceled"
| "retrying"
| "scheduled"
type DtoJob = {
id: string
type: string
queue: string
status: JobStatus
attempts: number
maxAttempts?: number
createdAt: string
updatedAt?: string
lastError?: string | null
runAt?: string | null
payload?: unknown
}
type DtoPageJob = {
items: DtoJob[]
total: number
page: number
pageSize: number
}
type QueueInfo = {
name: string
pending: number
running: number
failed: number
scheduled: number
}
const STATUS: JobStatus[] = [ const STATUS: JobStatus[] = [
"queued", AdminListArcherJobsStatusEnum.queued,
"running", AdminListArcherJobsStatusEnum.running,
"succeeded", AdminListArcherJobsStatusEnum.succeeded,
"failed", AdminListArcherJobsStatusEnum.failed,
"canceled", AdminListArcherJobsStatusEnum.canceled,
"retrying", AdminListArcherJobsStatusEnum.retrying,
"scheduled", AdminListArcherJobsStatusEnum.scheduled,
] ]
const statusClass: Record<JobStatus, string> = { const statusClass: Record<JobStatus, string> = {
@@ -95,7 +67,10 @@ const statusClass: Record<JobStatus, string> = {
function fmt(dt?: string | null) { function fmt(dt?: string | null) {
if (!dt) return "—" if (!dt) return "—"
const d = new Date(dt) const d = new Date(dt)
return new Intl.DateTimeFormat(undefined, { dateStyle: "medium", timeStyle: "short" }).format(d) return new Intl.DateTimeFormat(undefined, {
dateStyle: "medium",
timeStyle: "short",
}).format(d)
} }
// Small debounce hook for search input // Small debounce hook for search input
@@ -126,12 +101,12 @@ export const JobsPage: FC = () => {
queryKey: key, queryKey: key,
queryFn: () => queryFn: () =>
archerAdminApi.listJobs({ archerAdminApi.listJobs({
status: status, status: status ? (status as JobStatus) : undefined,
queue: queue || undefined, queue: queue || undefined,
q: debouncedQ || undefined, q: debouncedQ || undefined,
page, page,
pageSize, pageSize,
} as AdminListArcherJobsRequest) as Promise<DtoPageJob>, } as AdminListArcherJobsRequest),
placeholderData: (prev) => prev, placeholderData: (prev) => prev,
staleTime: 10_000, staleTime: 10_000,
}) })
@@ -139,7 +114,7 @@ export const JobsPage: FC = () => {
// Queues summary (optional header) // Queues summary (optional header)
const queuesQ = useQuery({ const queuesQ = useQuery({
queryKey: ["archer", "queues"], queryKey: ["archer", "queues"],
queryFn: () => archerAdminApi.listQueues() as Promise<QueueInfo[]>, queryFn: () => archerAdminApi.listQueues() as Promise<DtoQueueInfo[]>,
staleTime: 30_000, staleTime: 30_000,
}) })
@@ -153,10 +128,12 @@ export const JobsPage: FC = () => {
}) => archerAdminApi.enqueue(body), }) => archerAdminApi.enqueue(body),
onSuccess: () => qc.invalidateQueries({ queryKey: ["archer", "jobs"] }), onSuccess: () => qc.invalidateQueries({ queryKey: ["archer", "jobs"] }),
}) })
const retryM = useMutation({ const retryM = useMutation({
mutationFn: (id: string) => archerAdminApi.retryJob(id), mutationFn: (id: string) => archerAdminApi.retryJob(id),
onSuccess: () => qc.invalidateQueries({ queryKey: ["archer", "jobs"] }), onSuccess: () => qc.invalidateQueries({ queryKey: ["archer", "jobs"] }),
}) })
const cancelM = useMutation({ const cancelM = useMutation({
mutationFn: (id: string) => archerAdminApi.cancelJob(id), mutationFn: (id: string) => archerAdminApi.cancelJob(id),
onSuccess: () => qc.invalidateQueries({ queryKey: ["archer", "jobs"] }), onSuccess: () => qc.invalidateQueries({ queryKey: ["archer", "jobs"] }),
@@ -164,8 +141,10 @@ export const JobsPage: FC = () => {
const busy = jobsQ.isFetching const busy = jobsQ.isFetching
const data = jobsQ.data as DtoPageJob const data = jobsQ.data as DtoPageJob | undefined
const totalPages = data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1 const items: DtoJob[] = data?.items ?? []
const total = data?.total ?? 0
const totalPages = Math.max(1, Math.ceil(total / pageSize))
return ( return (
<div className="container mx-auto space-y-6 p-6"> <div className="container mx-auto space-y-6 p-6">
@@ -204,10 +183,10 @@ export const JobsPage: FC = () => {
<CardTitle className="text-base">{q.name}</CardTitle> <CardTitle className="text-base">{q.name}</CardTitle>
</CardHeader> </CardHeader>
<CardContent className="grid grid-cols-2 gap-2 text-sm"> <CardContent className="grid grid-cols-2 gap-2 text-sm">
<Metric label="Pending" value={q.pending} /> <Metric label="Pending" value={q.pending ?? 0} />
<Metric label="Running" value={q.running} /> <Metric label="Running" value={q.running ?? 0} />
<Metric label="Failed" value={q.failed} /> <Metric label="Failed" value={q.failed ?? 0} />
<Metric label="Scheduled" value={q.scheduled} /> <Metric label="Scheduled" value={q.scheduled ?? 0} />
</CardContent> </CardContent>
</Card> </Card>
))} ))}
@@ -321,67 +300,81 @@ export const JobsPage: FC = () => {
</TableCell> </TableCell>
</TableRow> </TableRow>
)} )}
{!jobsQ.isLoading && data && data.items.length === 0 && ( {!jobsQ.isLoading && items.length === 0 && (
<TableRow> <TableRow>
<TableCell colSpan={7} className="text-muted-foreground py-8 text-center"> <TableCell colSpan={7} className="text-muted-foreground py-8 text-center">
No jobs match your filters. No jobs match your filters.
</TableCell> </TableCell>
</TableRow> </TableRow>
)} )}
{data?.items.map((j) => ( {items.map((j) => {
<TableRow key={j.id}> const jobStatus: JobStatus =
<TableCell> (j.status as JobStatus | undefined) ?? AdminListArcherJobsStatusEnum.queued
<code className="text-xs">{j.id}</code>
</TableCell> return (
<TableCell> <TableRow key={j.id}>
<Badge variant="secondary">{j.queue}</Badge> <TableCell>
</TableCell> <code className="text-xs">{j.id}</code>
<TableCell> </TableCell>
<span className={cn("rounded-md px-2 py-0.5 text-xs", statusClass[j.status])}> <TableCell>
{j.status} <Badge variant="secondary">{j.queue}</Badge>
</span> </TableCell>
</TableCell> <TableCell>
<TableCell> <span
{j.maxAttempts ? `${j.attempts}/${j.maxAttempts}` : j.attempts} className={cn("rounded-md px-2 py-0.5 text-xs", statusClass[jobStatus])}
</TableCell> >
<TableCell>{fmt(j.runAt)}</TableCell> {jobStatus}
<TableCell>{fmt(j.updatedAt ?? j.createdAt)}</TableCell> </span>
<TableCell className="text-right"> </TableCell>
<div className="flex justify-end gap-2"> <TableCell>
{(j.status === "failed" || j.status === "canceled") && ( {j.max_attempts ? `${j.attempts}/${j.max_attempts}` : j.attempts}
<Button </TableCell>
size="sm" <TableCell>{fmt(j.run_at)}</TableCell>
variant="outline" <TableCell>{fmt(j.updated_at ?? j.created_at)}</TableCell>
disabled={retryM.isPending} <TableCell className="text-right">
onClick={() => retryM.mutate(j.id)} <div className="flex justify-end gap-2">
> {(jobStatus === AdminListArcherJobsStatusEnum.failed ||
Retry jobStatus === AdminListArcherJobsStatusEnum.canceled) && (
</Button> <Button
)} size="sm"
{(j.status === "queued" || variant="outline"
j.status === "running" || disabled={retryM.isPending || !j.id}
j.status === "scheduled") && ( onClick={() => {
<Button if (!j.id) return
size="sm" retryM.mutate(j.id)
variant="outline" }}
disabled={cancelM.isPending} >
onClick={() => cancelM.mutate(j.id)} Retry
> </Button>
Cancel )}
</Button> {(jobStatus === AdminListArcherJobsStatusEnum.queued ||
)} jobStatus === AdminListArcherJobsStatusEnum.running ||
<DetailsButton job={j} /> jobStatus === AdminListArcherJobsStatusEnum.scheduled) && (
</div> <Button
</TableCell> size="sm"
</TableRow> variant="outline"
))} disabled={cancelM.isPending || !j.id}
onClick={() => {
if (!j.id) return
cancelM.mutate(j.id)
}}
>
Cancel
</Button>
)}
<DetailsButton job={j} />
</div>
</TableCell>
</TableRow>
)
})}
</TableBody> </TableBody>
</Table> </Table>
{/* Pagination */} {/* Pagination */}
<div className="flex items-center justify-between border-t p-3 text-sm"> <div className="flex items-center justify-between border-t p-3 text-sm">
<div> <div>
Page {page} of {totalPages} {data?.total ?? 0} total Page {page} of {totalPages} {total} total
</div> </div>
<div className="flex gap-2"> <div className="flex gap-2">
<Button <Button
@@ -428,13 +421,13 @@ function DetailsButton({ job }: { job: DtoJob }) {
<DialogTitle>Job {job.id}</DialogTitle> <DialogTitle>Job {job.id}</DialogTitle>
</DialogHeader> </DialogHeader>
<div className="grid gap-3"> <div className="grid gap-3">
{job.lastError && ( {job.last_error && (
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle className="text-sm">Last error</CardTitle> <CardTitle className="text-sm">Last error</CardTitle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<pre className="overflow-auto text-xs whitespace-pre-wrap">{job.lastError}</pre> <pre className="overflow-auto text-xs whitespace-pre-wrap">{job.last_error}</pre>
</CardContent> </CardContent>
</Card> </Card>
)} )}

View File

@@ -56,7 +56,7 @@ const orgsApi = makeOrgsApi()
const orgApi = { const orgApi = {
create: (body: { name: string; domain?: string }) => create: (body: { name: string; domain?: string }) =>
withRefresh(async () => orgsApi.createOrg({ body })), // POST /orgs withRefresh(async () => orgsApi.createOrg({ handlersOrgCreateReq: body })), // POST /orgs
} }
const profileSchema = z.object({ const profileSchema = z.object({

View File

@@ -66,7 +66,7 @@ export const OrgApiKeys = () => {
} | null>(null) } | null>(null)
const createMut = useMutation({ const createMut = useMutation({
mutationFn: (v: CreateValues) => api.createOrgKey({ id: orgId!, body: v }), mutationFn: (v: CreateValues) => api.createOrgKey({ id: orgId!, handlersOrgKeyCreateReq: v }),
onSuccess: (resp) => { onSuccess: (resp) => {
void qc.invalidateQueries({ queryKey: ["org:keys", orgId] }) void qc.invalidateQueries({ queryKey: ["org:keys", orgId] })
setShowSecret({ key: resp.org_key, secret: resp.org_secret }) setShowSecret({ key: resp.org_key, secret: resp.org_secret })

View File

@@ -68,7 +68,7 @@ export const OrgMembers = () => {
}) })
const addMut = useMutation({ const addMut = useMutation({
mutationFn: (v: AddValues) => api.addOrUpdateMember({ id: orgId!, body: v }), mutationFn: (v: AddValues) => api.addOrUpdateMember({ id: orgId!, handlersMemberUpsertReq: v }),
onSuccess: () => { onSuccess: () => {
toast.success("Member added/updated") toast.success("Member added/updated")
void qc.invalidateQueries({ queryKey: ["org:members", orgId] }) void qc.invalidateQueries({ queryKey: ["org:members", orgId] })
@@ -88,7 +88,7 @@ export const OrgMembers = () => {
const roleMut = useMutation({ const roleMut = useMutation({
mutationFn: ({ userId, role }: { userId: string; role: "owner" | "admin" | "member" }) => mutationFn: ({ userId, role }: { userId: string; role: "owner" | "admin" | "member" }) =>
api.addOrUpdateMember({ id: orgId!, body: { user_id: userId, role } }), api.addOrUpdateMember({ id: orgId!, handlersMemberUpsertReq: { user_id: userId, role } }),
onMutate: async ({ userId, role }) => { onMutate: async ({ userId, role }) => {
setUpdatingId(userId) setUpdatingId(userId)
// cancel queries and snapshot previous // cancel queries and snapshot previous

View File

@@ -80,7 +80,7 @@ export const OrgSettings = () => {
}, [q.data, form]) }, [q.data, form])
const updateMut = useMutation({ const updateMut = useMutation({
mutationFn: (v: Partial<Values>) => api.updateOrg({ id: orgId!, body: v }), mutationFn: (v: Partial<Values>) => api.updateOrg({ id: orgId!, handlersOrgUpdateReq: v }),
onSuccess: () => { onSuccess: () => {
void qc.invalidateQueries({ queryKey: ["org", orgId] }) void qc.invalidateQueries({ queryKey: ["org", orgId] })
toast.success("Organization updated") toast.success("Organization updated")

View File

@@ -28,5 +28,5 @@
"@/*": ["./src/*"] "@/*": ["./src/*"]
} }
}, },
"include": ["src", "src/types"] "include": ["src"]
} }

View File

@@ -11,5 +11,4 @@
}, },
"jsx": "react-jsx" "jsx": "react-jsx"
}, },
"include": ["src", "src/types"]
} }

1
ui/tsconfig.tsbuildinfo Normal file

File diff suppressed because one or more lines are too long

View File

@@ -311,17 +311,17 @@
integrity sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A== integrity sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==
"@emnapi/core@^1.5.0", "@emnapi/core@^1.6.0": "@emnapi/core@^1.5.0", "@emnapi/core@^1.6.0":
version "1.7.0" version "1.7.1"
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.0.tgz#135de4e8858763989112281bdf38ca02439db7c3" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.1.tgz#3a79a02dbc84f45884a1806ebb98e5746bdfaac4"
integrity sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw== integrity sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==
dependencies: dependencies:
"@emnapi/wasi-threads" "1.1.0" "@emnapi/wasi-threads" "1.1.0"
tslib "^2.4.0" tslib "^2.4.0"
"@emnapi/runtime@^1.5.0", "@emnapi/runtime@^1.6.0": "@emnapi/runtime@^1.5.0", "@emnapi/runtime@^1.6.0":
version "1.7.0" version "1.7.1"
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.0.tgz#d7ef3832df8564fe5903bf0567aedbd19538ecbe" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.1.tgz#a73784e23f5d57287369c808197288b52276b791"
integrity sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q== integrity sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==
dependencies: dependencies:
tslib "^2.4.0" tslib "^2.4.0"
@@ -2277,11 +2277,16 @@
"@typescript-eslint/types" "8.46.4" "@typescript-eslint/types" "8.46.4"
"@typescript-eslint/visitor-keys" "8.46.4" "@typescript-eslint/visitor-keys" "8.46.4"
"@typescript-eslint/tsconfig-utils@8.46.4", "@typescript-eslint/tsconfig-utils@^8.46.4": "@typescript-eslint/tsconfig-utils@8.46.4":
version "8.46.4" version "8.46.4"
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz#989a338093b6b91b0552f1f51331d89ec6980382" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz#989a338093b6b91b0552f1f51331d89ec6980382"
integrity sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A== integrity sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==
"@typescript-eslint/tsconfig-utils@^8.46.4":
version "8.47.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz#4f178b62813538759e0989dd081c5474fad39b84"
integrity sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==
"@typescript-eslint/type-utils@8.46.4": "@typescript-eslint/type-utils@8.46.4":
version "8.46.4" version "8.46.4"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz#ae71b428a3c138b5084affe47893c129949171e0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz#ae71b428a3c138b5084affe47893c129949171e0"
@@ -2293,11 +2298,16 @@
debug "^4.3.4" debug "^4.3.4"
ts-api-utils "^2.1.0" ts-api-utils "^2.1.0"
"@typescript-eslint/types@8.46.4", "@typescript-eslint/types@^8.46.4": "@typescript-eslint/types@8.46.4":
version "8.46.4" version "8.46.4"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.4.tgz#38022bfda051be80e4120eeefcd2b6e3e630a69b" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.4.tgz#38022bfda051be80e4120eeefcd2b6e3e630a69b"
integrity sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w== integrity sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==
"@typescript-eslint/types@^8.46.4":
version "8.47.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.47.0.tgz#c7fc9b6642d03505f447a8392934b9d1850de5af"
integrity sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==
"@typescript-eslint/typescript-estree@8.46.4": "@typescript-eslint/typescript-estree@8.46.4":
version "8.46.4" version "8.46.4"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz#6a9eeab0da45bf400f22c818e0f47102a980ceaa" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz#6a9eeab0da45bf400f22c818e0f47102a980ceaa"
@@ -2470,9 +2480,9 @@ base64-js@^1.3.1:
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
baseline-browser-mapping@^2.8.25: baseline-browser-mapping@^2.8.25:
version "2.8.28" version "2.8.29"
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz#9ef511f5a7c19d74a94cafcbf951608398e9bdb3" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz#d8800b71399c783cb1bf2068c2bcc3b6cfd7892c"
integrity sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ== integrity sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==
body-parser@^2.2.0: body-parser@^2.2.0:
version "2.2.0" version "2.2.0"
@@ -2557,9 +2567,9 @@ callsites@^3.0.0:
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
caniuse-lite@^1.0.30001754: caniuse-lite@^1.0.30001754:
version "1.0.30001754" version "1.0.30001755"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz#7758299d9a72cce4e6b038788a15b12b44002759" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz#c01cfb1c30f5acf1229391666ec03492f4c332ff"
integrity sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg== integrity sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==
chalk@^4.0.0: chalk@^4.0.0:
version "4.1.2" version "4.1.2"
@@ -2726,9 +2736,9 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6:
which "^2.0.1" which "^2.0.1"
csstype@^3.0.2: csstype@^3.0.2:
version "3.1.3" version "3.2.3"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
version "3.2.4" version "3.2.4"
@@ -2911,9 +2921,9 @@ ee-first@1.1.1:
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
electron-to-chromium@^1.5.249: electron-to-chromium@^1.5.249:
version "1.5.251" version "1.5.255"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.251.tgz#8168db0cb8fcc520bd4e5be720f2d8e0e4f7fe74" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.255.tgz#fe9294ce172241eb50733bc00f2bd00d9c1e4ec7"
integrity sha512-lmyEOp4G0XT3qrYswNB4np1kx90k6QCXpnSHYv2xEsUuEu8JCobpDVYO6vMseirQyyCC6GCIGGxd5szMBa0tRA== integrity sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==
embla-carousel-react@^8.6.0: embla-carousel-react@^8.6.0:
version "8.6.0" version "8.6.0"
@@ -3368,9 +3378,9 @@ follow-redirects@^1.15.6:
integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
form-data@^4.0.4: form-data@^4.0.4:
version "4.0.4" version "4.0.5"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053"
integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
dependencies: dependencies:
asynckit "^0.4.0" asynckit "^0.4.0"
combined-stream "^1.0.8" combined-stream "^1.0.8"
@@ -4137,9 +4147,9 @@ ms@^2.1.3:
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
msw@^2.10.4: msw@^2.10.4:
version "2.12.1" version "2.12.2"
resolved "https://registry.yarnpkg.com/msw/-/msw-2.12.1.tgz#b3dee99d7692e92581234b4060b9a9250f5d998e" resolved "https://registry.yarnpkg.com/msw/-/msw-2.12.2.tgz#9e5c25ca5cffce6e9bd96c8ae1105096e81a82a2"
integrity sha512-arzsi9IZjjByiEw21gSUP82qHM8zkV69nNpWV6W4z72KiLvsDWoOp678ORV6cNfU/JGhlX0SsnD4oXo9gI6I2A== integrity sha512-Fsr8AR5Yu6C0thoWa1Z8qGBFQLDvLsWlAn/v3CNLiUizoRqBYArK3Ex3thXpMWRr1Li5/MKLOEZ5mLygUmWi1A==
dependencies: dependencies:
"@inquirer/confirm" "^5.0.0" "@inquirer/confirm" "^5.0.0"
"@mswjs/interceptors" "^0.40.0" "@mswjs/interceptors" "^0.40.0"
@@ -5133,17 +5143,17 @@ tinyglobby@^0.2.15:
fdir "^6.5.0" fdir "^6.5.0"
picomatch "^4.0.3" picomatch "^4.0.3"
tldts-core@^7.0.17: tldts-core@^7.0.18:
version "7.0.17" version "7.0.18"
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.17.tgz#dadfee3750dd272ed219d7367beb7cbb2ff29eb8" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.18.tgz#78edfd38e8c35e20fb4d2cde63c759139e169d31"
integrity sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g== integrity sha512-jqJC13oP4FFAahv4JT/0WTDrCF9Okv7lpKtOZUGPLiAnNbACcSg8Y8T+Z9xthOmRBqi/Sob4yi0TE0miRCvF7Q==
tldts@^7.0.5: tldts@^7.0.5:
version "7.0.17" version "7.0.18"
resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.17.tgz#a6cdc067b9e80ea05f3be471c0ea410688cc78b2" resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.18.tgz#72cac7a2bdb6bba78f8a09fdf7ef84843b09aa94"
integrity sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ== integrity sha512-lCcgTAgMxQ1JKOWrVGo6E69Ukbnx4Gc1wiYLRf6J5NN4HRYJtCby1rPF8rkQ4a6qqoFBK5dvjJ1zJ0F7VfDSvw==
dependencies: dependencies:
tldts-core "^7.0.17" tldts-core "^7.0.18"
to-regex-range@^5.0.1: to-regex-range@^5.0.1:
version "5.0.1" version "5.0.1"