mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-21 19:04:19 +00:00
Merge remote-tracking branch 'origin/master' into tmp-1454-merge
This commit is contained in:
160 files changed
+13358
-12137
No files matched your search
@@ -6,6 +6,7 @@ All notable changes to the **Prowler UI** are documented in this file.
|
||||
|
||||
### 🚀 Added
|
||||
|
||||
- UI health endpoint at `GET /api/health` for Docker Compose liveness checks [(#11145)](https://github.com/prowler-cloud/prowler/pull/11145)
|
||||
- AWS findings and resource details now expose a "View in AWS Console" link that opens the resource directly in the AWS Console via the universal `/go/view` ARN resolver. The per-provider external link is rendered by a new shared `ExternalResourceLink` component, which also covers the existing IaC repository link [(#9172)](https://github.com/prowler-cloud/prowler/pull/9172)
|
||||
|
||||
### 🔄 Changed
|
||||
@@ -21,6 +22,10 @@ All notable changes to the **Prowler UI** are documented in this file.
|
||||
- Muting a finding group on `/findings` now hides the row immediately without waiting for a manual reload; muted `check_id`s are tracked client-side under `prowler:optimistic-muted-groups` in `sessionStorage` with a 90s TTL so a fast reload still honors the optimistic hide while the background reaggregation catches up [(#11170)](https://github.com/prowler-cloud/prowler/pull/11170)
|
||||
- Mute Findings modal now enforces the 100-character limit on the rule name input with a live counter and inline error, matching the existing reason field behaviour [(#11158)](https://github.com/prowler-cloud/prowler/pull/11158)
|
||||
|
||||
### 🔐 Security
|
||||
|
||||
- UI npm dependencies updated to patched versions for Next.js, Vite, LangChain, XML parsing, lodash, and related transitive packages [(#11171)](https://github.com/prowler-cloud/prowler/pull/11171)
|
||||
|
||||
---
|
||||
|
||||
## [1.26.2] (Prowler 5.26.2)
|
||||
@@ -29,6 +34,10 @@ All notable changes to the **Prowler UI** are documented in this file.
|
||||
|
||||
- Finding drawer no longer renders literal backticks around inline code in Risk, Description and Remediation sections [(#11142)](https://github.com/prowler-cloud/prowler/pull/11142)
|
||||
|
||||
### 🐞 Fixed
|
||||
|
||||
- Launch Scan first-provider wizard continues after provider creation instead of resetting the Scans page [(#11136)](https://github.com/prowler-cloud/prowler/pull/11136)
|
||||
|
||||
---
|
||||
|
||||
## [1.26.1] (Prowler 5.26.1)
|
||||
|
||||
@@ -4,16 +4,11 @@ import { getAllProviders } from "@/actions/providers";
|
||||
import { getScans } from "@/actions/scans";
|
||||
import { auth } from "@/auth.config";
|
||||
import { MutedFindingsConfigButton } from "@/components/providers";
|
||||
import {
|
||||
NoProvidersAdded,
|
||||
NoProvidersConnected,
|
||||
ScansFilters,
|
||||
} from "@/components/scans";
|
||||
import { LaunchScanWorkflow } from "@/components/scans/launch-workflow";
|
||||
import { ScansFilters } from "@/components/scans";
|
||||
import { ScansLaunchSection } from "@/components/scans/scans-launch-section";
|
||||
import { SkeletonTableScans } from "@/components/scans/table";
|
||||
import { ScansTableWithPolling } from "@/components/scans/table/scans";
|
||||
import { ContentLayout } from "@/components/ui";
|
||||
import { CustomBanner } from "@/components/ui/custom/custom-banner";
|
||||
import {
|
||||
createProviderDetailsMapping,
|
||||
extractProviderUIDs,
|
||||
@@ -81,11 +76,15 @@ export default async function Scans({
|
||||
const thereIsNoProviders =
|
||||
!providersData?.data || providersData.data.length === 0;
|
||||
|
||||
const thereIsNoProvidersConnected = providersData?.data?.every(
|
||||
(provider: ProviderProps) => !provider.attributes.connection.connected,
|
||||
const thereIsNoProvidersConnected = Boolean(
|
||||
providersData?.data?.every(
|
||||
(provider: ProviderProps) => !provider.attributes.connection.connected,
|
||||
),
|
||||
);
|
||||
|
||||
const hasManageScansPermission = session?.user?.permissions?.manage_scans;
|
||||
const hasManageScansPermission = Boolean(
|
||||
session?.user?.permissions?.manage_scans,
|
||||
);
|
||||
|
||||
// Extract provider UIDs and create provider details mapping for filtering
|
||||
const providerUIDs = providersData ? extractProviderUIDs(providersData) : [];
|
||||
@@ -93,44 +92,30 @@ export default async function Scans({
|
||||
? createProviderDetailsMapping(providerUIDs, providersData)
|
||||
: [];
|
||||
|
||||
if (thereIsNoProviders) {
|
||||
return (
|
||||
<ContentLayout title="Scans" icon="lucide:timer">
|
||||
<NoProvidersAdded />
|
||||
</ContentLayout>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<ContentLayout title="Scans" icon="lucide:timer">
|
||||
<>
|
||||
<>
|
||||
{!hasManageScansPermission ? (
|
||||
<CustomBanner
|
||||
title={"Access Denied"}
|
||||
message={"You don't have permission to launch the scan."}
|
||||
<ScansLaunchSection
|
||||
providers={providerInfo}
|
||||
hasManageScansPermission={hasManageScansPermission}
|
||||
thereIsNoProviders={thereIsNoProviders}
|
||||
thereIsNoProvidersConnected={thereIsNoProvidersConnected}
|
||||
/>
|
||||
{!thereIsNoProviders && (
|
||||
<div className="flex flex-col gap-6">
|
||||
<ScansFilters
|
||||
providerUIDs={providerUIDs}
|
||||
providerDetails={providerDetails}
|
||||
completedScans={completedScans}
|
||||
/>
|
||||
) : thereIsNoProvidersConnected ? (
|
||||
<>
|
||||
<NoProvidersConnected />
|
||||
</>
|
||||
) : (
|
||||
<LaunchScanWorkflow providers={providerInfo} />
|
||||
)}
|
||||
</>
|
||||
<div className="flex flex-col gap-6">
|
||||
<ScansFilters
|
||||
providerUIDs={providerUIDs}
|
||||
providerDetails={providerDetails}
|
||||
completedScans={completedScans}
|
||||
/>
|
||||
<div className="flex items-center justify-end">
|
||||
<MutedFindingsConfigButton />
|
||||
<div className="flex items-center justify-end">
|
||||
<MutedFindingsConfigButton />
|
||||
</div>
|
||||
<Suspense fallback={<SkeletonTableScans />}>
|
||||
<SSRDataTableScans searchParams={resolvedSearchParams} />
|
||||
</Suspense>
|
||||
</div>
|
||||
<Suspense fallback={<SkeletonTableScans />}>
|
||||
<SSRDataTableScans searchParams={resolvedSearchParams} />
|
||||
</Suspense>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
</ContentLayout>
|
||||
);
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { GET } from "./route";
|
||||
|
||||
interface HealthResponse {
|
||||
status: "healthy";
|
||||
service: "prowler-ui";
|
||||
}
|
||||
|
||||
const parseHealthResponse = async (response: Response) =>
|
||||
(await response.json()) as HealthResponse;
|
||||
|
||||
describe("GET /api/health", () => {
|
||||
afterEach(() => {
|
||||
vi.unstubAllEnvs();
|
||||
vi.unstubAllGlobals();
|
||||
});
|
||||
|
||||
it("should return a healthy response when the Next.js route handler responds", async () => {
|
||||
// Given
|
||||
const expectedBody: HealthResponse = {
|
||||
status: "healthy",
|
||||
service: "prowler-ui",
|
||||
};
|
||||
|
||||
// When
|
||||
const response = await GET();
|
||||
const body = await parseHealthResponse(response);
|
||||
|
||||
// Then
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.headers.get("Cache-Control")).toBe("no-store");
|
||||
expect(body).toEqual(expectedBody);
|
||||
});
|
||||
|
||||
it("should not call fetch while evaluating UI liveness", async () => {
|
||||
// Given
|
||||
const fetchMock = vi.fn();
|
||||
vi.stubGlobal("fetch", fetchMock);
|
||||
|
||||
// When
|
||||
await GET();
|
||||
|
||||
// Then
|
||||
expect(fetchMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("should not depend on external health URLs", async () => {
|
||||
// Given
|
||||
vi.stubEnv(
|
||||
"PROWLER_API_HEALTH_URL",
|
||||
"https://api.example.com/health/ready",
|
||||
);
|
||||
const fetchMock = vi.fn();
|
||||
vi.stubGlobal("fetch", fetchMock);
|
||||
|
||||
// When
|
||||
const response = await GET();
|
||||
const body = await parseHealthResponse(response);
|
||||
|
||||
// Then
|
||||
expect(response.status).toBe(200);
|
||||
expect(body).toEqual({
|
||||
status: "healthy",
|
||||
service: "prowler-ui",
|
||||
});
|
||||
expect(fetchMock).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
const healthResponse = {
|
||||
status: "healthy",
|
||||
service: "prowler-ui",
|
||||
} as const;
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
export async function GET() {
|
||||
return Response.json(healthResponse, {
|
||||
headers: {
|
||||
"Cache-Control": "no-store",
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -11,23 +11,15 @@ import { Button } from "@/components/shadcn";
|
||||
import { CustomInput } from "@/components/ui/custom";
|
||||
import { Form } from "@/components/ui/form";
|
||||
import { toast } from "@/components/ui/toast";
|
||||
import { onDemandScanFormSchema } from "@/types";
|
||||
import { onDemandScanFormSchema, ScanProviderInfo } from "@/types";
|
||||
|
||||
import { SCAN_LAUNCHED_EVENT } from "../table/scans/scans-table-with-polling";
|
||||
import { SelectScanProvider } from "./select-scan-provider";
|
||||
|
||||
type ProviderInfo = {
|
||||
providerId: string;
|
||||
alias: string;
|
||||
providerType: string;
|
||||
uid: string;
|
||||
connected: boolean;
|
||||
};
|
||||
|
||||
export const LaunchScanWorkflow = ({
|
||||
providers,
|
||||
}: {
|
||||
providers: ProviderInfo[];
|
||||
providers: ScanProviderInfo[];
|
||||
}) => {
|
||||
const formSchema = z.object({
|
||||
...onDemandScanFormSchema().shape,
|
||||
|
||||
@@ -11,18 +11,13 @@ import {
|
||||
} from "@/components/shadcn";
|
||||
import { EntityInfo } from "@/components/ui/entities";
|
||||
import { FormControl, FormField, FormMessage } from "@/components/ui/form";
|
||||
import { ScanProviderInfo } from "@/types";
|
||||
|
||||
interface SelectScanProviderProps<
|
||||
TFieldValues extends FieldValues = FieldValues,
|
||||
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
||||
> {
|
||||
providers: {
|
||||
providerId: string;
|
||||
alias: string;
|
||||
providerType: string;
|
||||
uid: string;
|
||||
connected: boolean;
|
||||
}[];
|
||||
providers: ScanProviderInfo[];
|
||||
control: Control<TFieldValues>;
|
||||
name: TName;
|
||||
}
|
||||
|
||||
@@ -1,45 +1,38 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
import { ProviderWizardModal } from "@/components/providers/wizard";
|
||||
import { Button, Card, CardContent } from "@/components/shadcn";
|
||||
|
||||
import { InfoIcon } from "../icons/Icons";
|
||||
|
||||
export const NoProvidersAdded = () => {
|
||||
const [open, setOpen] = useState(false);
|
||||
interface NoProvidersAddedProps {
|
||||
onOpenWizard: () => void;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex min-h-screen items-center justify-center">
|
||||
<Card variant="base" className="mx-auto w-full max-w-3xl">
|
||||
<CardContent className="flex flex-col items-center gap-4 p-6 text-center sm:p-8">
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<InfoIcon className="h-10 w-10 text-gray-800 dark:text-white" />
|
||||
<h2 className="text-2xl font-bold text-gray-800 dark:text-white">
|
||||
No Providers Configured
|
||||
</h2>
|
||||
</div>
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<p className="text-md leading-relaxed text-gray-600 dark:text-gray-300">
|
||||
No providers have been configured. Start by setting up a
|
||||
provider.
|
||||
</p>
|
||||
</div>
|
||||
export const NoProvidersAdded = ({ onOpenWizard }: NoProvidersAddedProps) => (
|
||||
<div className="flex min-h-screen items-center justify-center">
|
||||
<Card variant="base" className="mx-auto w-full max-w-3xl">
|
||||
<CardContent className="flex flex-col items-center gap-4 p-6 text-center sm:p-8">
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<InfoIcon className="h-10 w-10 text-gray-800 dark:text-white" />
|
||||
<h2 className="text-2xl font-bold text-gray-800 dark:text-white">
|
||||
No Providers Configured
|
||||
</h2>
|
||||
</div>
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<p className="text-md leading-relaxed text-gray-600 dark:text-gray-300">
|
||||
No providers have been configured. Start by setting up a provider.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
aria-label="Open Add Provider modal"
|
||||
className="w-full max-w-xs justify-center"
|
||||
size="lg"
|
||||
onClick={() => setOpen(true)}
|
||||
>
|
||||
Get Started
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
<ProviderWizardModal open={open} onOpenChange={setOpen} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
<Button
|
||||
aria-label="Open Add Provider modal"
|
||||
className="w-full max-w-xs justify-center"
|
||||
size="lg"
|
||||
onClick={onOpenWizard}
|
||||
>
|
||||
Get Started
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
);
|
||||
@@ -0,0 +1,62 @@
|
||||
import { render, screen } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { ScansLaunchSection } from "./scans-launch-section";
|
||||
|
||||
vi.mock("@/components/providers/wizard", () => ({
|
||||
ProviderWizardModal: ({ open }: { open: boolean }) =>
|
||||
open ? <div role="dialog">Provider wizard</div> : null,
|
||||
}));
|
||||
|
||||
vi.mock("@/components/scans/launch-workflow", () => ({
|
||||
LaunchScanWorkflow: () => <div>Launch scan workflow</div>,
|
||||
}));
|
||||
|
||||
vi.mock("@/components/scans/no-providers-connected", () => ({
|
||||
NoProvidersConnected: () => <div>No providers connected</div>,
|
||||
}));
|
||||
|
||||
vi.mock("@/components/ui/custom/custom-banner", () => ({
|
||||
CustomBanner: ({ title }: { title: string }) => <div>{title}</div>,
|
||||
}));
|
||||
|
||||
const connectedProvider = {
|
||||
providerId: "provider-1",
|
||||
alias: "Production",
|
||||
providerType: "aws",
|
||||
uid: "123456789012",
|
||||
connected: true,
|
||||
};
|
||||
|
||||
describe("ScansLaunchSection", () => {
|
||||
it("should keep the provider wizard open when providers data refreshes after adding the first provider", async () => {
|
||||
// Given
|
||||
const user = userEvent.setup();
|
||||
const { rerender } = render(
|
||||
<ScansLaunchSection
|
||||
providers={[]}
|
||||
hasManageScansPermission
|
||||
thereIsNoProviders
|
||||
thereIsNoProvidersConnected
|
||||
/>,
|
||||
);
|
||||
|
||||
// When
|
||||
await user.click(
|
||||
screen.getByRole("button", { name: /open add provider modal/i }),
|
||||
);
|
||||
rerender(
|
||||
<ScansLaunchSection
|
||||
providers={[connectedProvider]}
|
||||
hasManageScansPermission
|
||||
thereIsNoProviders={false}
|
||||
thereIsNoProvidersConnected={false}
|
||||
/>,
|
||||
);
|
||||
|
||||
// Then
|
||||
expect(screen.getByRole("dialog")).toHaveTextContent("Provider wizard");
|
||||
expect(screen.getByText("Launch scan workflow")).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,47 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
import { ProviderWizardModal } from "@/components/providers/wizard";
|
||||
import { LaunchScanWorkflow } from "@/components/scans/launch-workflow";
|
||||
import { NoProvidersAdded } from "@/components/scans/no-providers-added";
|
||||
import { NoProvidersConnected } from "@/components/scans/no-providers-connected";
|
||||
import { CustomBanner } from "@/components/ui/custom/custom-banner";
|
||||
import { ScanProviderInfo } from "@/types";
|
||||
|
||||
interface ScansLaunchSectionProps {
|
||||
providers: ScanProviderInfo[];
|
||||
hasManageScansPermission: boolean;
|
||||
thereIsNoProviders: boolean;
|
||||
thereIsNoProvidersConnected: boolean;
|
||||
}
|
||||
|
||||
export function ScansLaunchSection({
|
||||
providers,
|
||||
hasManageScansPermission,
|
||||
thereIsNoProviders,
|
||||
thereIsNoProvidersConnected,
|
||||
}: ScansLaunchSectionProps) {
|
||||
const [isProviderWizardOpen, setIsProviderWizardOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
{thereIsNoProviders ? (
|
||||
<NoProvidersAdded onOpenWizard={() => setIsProviderWizardOpen(true)} />
|
||||
) : !hasManageScansPermission ? (
|
||||
<CustomBanner
|
||||
title={"Access Denied"}
|
||||
message={"You don't have permission to launch the scan."}
|
||||
/>
|
||||
) : thereIsNoProvidersConnected ? (
|
||||
<NoProvidersConnected />
|
||||
) : (
|
||||
<LaunchScanWorkflow providers={providers} />
|
||||
)}
|
||||
<ProviderWizardModal
|
||||
open={isProviderWizardOpen}
|
||||
onOpenChange={setIsProviderWizardOpen}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
+47
-47
@@ -10,10 +10,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "@aws-sdk/client-bedrock-runtime",
|
||||
"from": "3.948.0",
|
||||
"to": "3.988.0",
|
||||
"from": "3.988.0",
|
||||
"to": "3.1045.0",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-02-12T11:04:39.164Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -74,18 +74,18 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "@langchain/aws",
|
||||
"from": "0.1.15",
|
||||
"to": "1.1.0",
|
||||
"from": "1.1.0",
|
||||
"to": "1.3.7",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2025-12-12T10:01:54.132Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "@langchain/core",
|
||||
"from": "1.1.8",
|
||||
"to": "1.1.15",
|
||||
"from": "1.1.46",
|
||||
"to": "1.1.45",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-01-15T08:46:46.283Z"
|
||||
"generatedAt": "2026-05-14T10:22:47.378Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -98,10 +98,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "@langchain/openai",
|
||||
"from": "0.6.16",
|
||||
"to": "1.1.3",
|
||||
"from": "1.1.3",
|
||||
"to": "1.4.5",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2025-12-12T10:01:54.132Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -114,10 +114,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "@next/third-parties",
|
||||
"from": "16.1.6",
|
||||
"to": "16.2.3",
|
||||
"from": "16.2.3",
|
||||
"to": "16.2.6",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-17T09:52:03.464Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -442,10 +442,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "langchain",
|
||||
"from": "1.1.5",
|
||||
"to": "1.2.10",
|
||||
"from": "1.2.10",
|
||||
"to": "1.4.0",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-01-15T08:46:46.283Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -482,10 +482,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "next",
|
||||
"from": "16.1.6",
|
||||
"to": "16.2.3",
|
||||
"from": "16.2.3",
|
||||
"to": "16.2.6",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-17T09:52:03.464Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -506,10 +506,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "react",
|
||||
"from": "19.2.4",
|
||||
"to": "19.2.5",
|
||||
"from": "19.2.5",
|
||||
"to": "19.2.6",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-17T09:52:03.464Z"
|
||||
"generatedAt": "2026-05-14T10:34:34.526Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -522,10 +522,10 @@
|
||||
{
|
||||
"section": "dependencies",
|
||||
"name": "react-dom",
|
||||
"from": "19.2.4",
|
||||
"to": "19.2.5",
|
||||
"from": "19.2.5",
|
||||
"to": "19.2.6",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-17T09:52:03.464Z"
|
||||
"generatedAt": "2026-05-14T10:34:34.526Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -635,9 +635,9 @@
|
||||
"section": "dependencies",
|
||||
"name": "zod",
|
||||
"from": "4.1.11",
|
||||
"to": "4.1.11",
|
||||
"to": "4.4.3",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2025-10-22T12:36:37.962Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "dependencies",
|
||||
@@ -658,10 +658,10 @@
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "@next/eslint-plugin-next",
|
||||
"from": "16.1.6",
|
||||
"to": "16.2.3",
|
||||
"from": "16.2.3",
|
||||
"to": "16.2.6",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-17T09:52:03.464Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
@@ -778,26 +778,26 @@
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "@vitest/browser",
|
||||
"from": "4.0.18",
|
||||
"from": "4.1.6",
|
||||
"to": "4.0.18",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-30T13:13:39.682Z"
|
||||
"generatedAt": "2026-05-14T10:22:47.378Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "@vitest/browser-playwright",
|
||||
"from": "4.0.18",
|
||||
"from": "4.1.6",
|
||||
"to": "4.0.18",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-30T13:13:39.682Z"
|
||||
"generatedAt": "2026-05-14T10:22:47.378Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "@vitest/coverage-v8",
|
||||
"from": "4.0.18",
|
||||
"from": "4.1.6",
|
||||
"to": "4.0.18",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-01-29T16:42:27.795Z"
|
||||
"generatedAt": "2026-05-14T10:22:47.378Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
@@ -810,10 +810,10 @@
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "dotenv",
|
||||
"from": "16.6.1",
|
||||
"to": null,
|
||||
"from": null,
|
||||
"to": "16.6.1",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-05-12T10:13:36.469Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
@@ -931,9 +931,9 @@
|
||||
"section": "devDependencies",
|
||||
"name": "postcss",
|
||||
"from": "8.4.38",
|
||||
"to": "8.4.38",
|
||||
"to": "8.5.14",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-05-11T15:15:31.276Z"
|
||||
"generatedAt": "2026-05-14T10:09:04.901Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
@@ -970,17 +970,17 @@
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "vitest",
|
||||
"from": "4.0.18",
|
||||
"from": "4.1.6",
|
||||
"to": "4.0.18",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-01-29T16:42:27.795Z"
|
||||
"generatedAt": "2026-05-14T10:22:47.378Z"
|
||||
},
|
||||
{
|
||||
"section": "devDependencies",
|
||||
"name": "vitest-browser-react",
|
||||
"from": "2.0.4",
|
||||
"from": "2.2.0",
|
||||
"to": "2.0.4",
|
||||
"strategy": "installed",
|
||||
"generatedAt": "2026-04-30T13:23:20.132Z"
|
||||
"generatedAt": "2026-05-14T10:22:47.378Z"
|
||||
}
|
||||
]
|
||||
+21
-21
@@ -34,7 +34,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@ai-sdk/react": "2.0.111",
|
||||
"@aws-sdk/client-bedrock-runtime": "3.988.0",
|
||||
"@aws-sdk/client-bedrock-runtime": "3.1045.0",
|
||||
"@codemirror/language": "6.12.2",
|
||||
"@codemirror/state": "6.6.0",
|
||||
"@codemirror/view": "6.40.0",
|
||||
@@ -42,12 +42,12 @@
|
||||
"@extractus/feed-extractor": "7.1.7",
|
||||
"@heroui/react": "2.8.4",
|
||||
"@hookform/resolvers": "5.2.2",
|
||||
"@langchain/aws": "1.1.0",
|
||||
"@langchain/core": "1.1.15",
|
||||
"@langchain/aws": "1.3.7",
|
||||
"@langchain/core": "1.1.45",
|
||||
"@langchain/mcp-adapters": "1.1.3",
|
||||
"@langchain/openai": "1.1.3",
|
||||
"@langchain/openai": "1.4.5",
|
||||
"@lezer/highlight": "1.2.3",
|
||||
"@next/third-parties": "16.2.3",
|
||||
"@next/third-parties": "16.2.6",
|
||||
"@radix-ui/react-alert-dialog": "1.1.14",
|
||||
"@radix-ui/react-avatar": "1.1.11",
|
||||
"@radix-ui/react-checkbox": "1.3.3",
|
||||
@@ -88,17 +88,17 @@
|
||||
"import-in-the-middle": "2.0.0",
|
||||
"js-yaml": "4.1.1",
|
||||
"jwt-decode": "4.0.0",
|
||||
"langchain": "1.2.10",
|
||||
"langchain": "1.4.0",
|
||||
"lucide-react": "0.543.0",
|
||||
"marked": "15.0.12",
|
||||
"modern-screenshot": "4.7.0",
|
||||
"nanoid": "5.1.6",
|
||||
"next": "16.2.3",
|
||||
"next": "16.2.6",
|
||||
"next-auth": "5.0.0-beta.30",
|
||||
"next-themes": "0.2.1",
|
||||
"react": "19.2.5",
|
||||
"react": "19.2.6",
|
||||
"react-day-picker": "9.13.0",
|
||||
"react-dom": "19.2.5",
|
||||
"react-dom": "19.2.6",
|
||||
"react-hook-form": "7.62.0",
|
||||
"react-markdown": "10.1.0",
|
||||
"recharts": "2.15.4",
|
||||
@@ -112,12 +112,12 @@
|
||||
"use-stick-to-bottom": "1.1.1",
|
||||
"vaul": "1.1.2",
|
||||
"world-atlas": "2.0.2",
|
||||
"zod": "4.1.11",
|
||||
"zod": "4.4.3",
|
||||
"zustand": "5.0.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/react": "5.2.1",
|
||||
"@next/eslint-plugin-next": "16.2.3",
|
||||
"@next/eslint-plugin-next": "16.2.6",
|
||||
"@playwright/test": "1.56.1",
|
||||
"@testing-library/jest-dom": "6.9.1",
|
||||
"@testing-library/react": "16.3.2",
|
||||
@@ -151,7 +151,7 @@
|
||||
"jsdom": "27.4.0",
|
||||
"knip": "6.3.1",
|
||||
"msw": "2.13.4",
|
||||
"postcss": "8.4.38",
|
||||
"postcss": "8.5.14",
|
||||
"prettier": "3.6.2",
|
||||
"prettier-plugin-tailwindcss": "0.6.14",
|
||||
"tailwindcss": "4.1.18",
|
||||
@@ -163,16 +163,16 @@
|
||||
"overrides": {
|
||||
"@react-types/shared": "3.26.0",
|
||||
"@internationalized/date": "3.10.0",
|
||||
"@react-aria/ssr>react": "19.2.5",
|
||||
"@react-aria/ssr>react-dom": "19.2.5",
|
||||
"@react-aria/visually-hidden>react": "19.2.5",
|
||||
"@react-aria/interactions>react": "19.2.5",
|
||||
"lodash": "4.17.23",
|
||||
"lodash-es": "4.17.23",
|
||||
"hono": "4.12.4",
|
||||
"@hono/node-server": "1.19.10",
|
||||
"@react-aria/ssr>react": "19.2.6",
|
||||
"@react-aria/ssr>react-dom": "19.2.6",
|
||||
"@react-aria/visually-hidden>react": "19.2.6",
|
||||
"@react-aria/interactions>react": "19.2.6",
|
||||
"lodash": "4.18.1",
|
||||
"lodash-es": "4.18.1",
|
||||
"hono": "4.12.18",
|
||||
"@hono/node-server": "1.19.14",
|
||||
"@isaacs/brace-expansion": "5.0.1",
|
||||
"fast-xml-parser": "5.3.8",
|
||||
"fast-xml-parser": "5.8.0",
|
||||
"serialize-javascript": "7.0.5",
|
||||
"rollup@>=4": "4.59.0",
|
||||
"minimatch@<4": "3.1.4",
|
||||
|
||||
Generated
+3501
-4047
File diff suppressed because it is too large.
Load diff
+11
-3
@@ -45,18 +45,26 @@ export interface ScanRelationships {
|
||||
task: RelationshipWrapper;
|
||||
}
|
||||
|
||||
export interface ScanProviderInfo {
|
||||
export interface ScanResultProviderInfo {
|
||||
provider: ProviderType;
|
||||
uid: string;
|
||||
alias: string;
|
||||
}
|
||||
|
||||
export interface ScanProviderInfo {
|
||||
providerId: string;
|
||||
alias: string;
|
||||
providerType: string;
|
||||
uid: string;
|
||||
connected: boolean;
|
||||
}
|
||||
|
||||
export interface ScanProps {
|
||||
type: "scans";
|
||||
id: string;
|
||||
attributes: ScanAttributes;
|
||||
relationships: ScanRelationships;
|
||||
providerInfo?: ScanProviderInfo;
|
||||
providerInfo?: ScanResultProviderInfo;
|
||||
}
|
||||
|
||||
export interface ScanEntityProviderInfo {
|
||||
@@ -77,7 +85,7 @@ export interface ScanEntity {
|
||||
}
|
||||
|
||||
export interface ExpandedScanData extends ScanProps {
|
||||
providerInfo: ScanProviderInfo;
|
||||
providerInfo: ScanResultProviderInfo;
|
||||
}
|
||||
|
||||
export interface IncludedResource {
|
||||
|
||||
Reference in new issue
Block a user