Merge remote-tracking branch 'origin/master' into tmp-1454-merge

This commit is contained in:
Hugo P.Brito committed 2026-05-18 14:50:44 +01:00
commit 98932c19e1
160 files changed
+13358 -12137

No files matched your search

+9
View File
@@ -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)
+28 -43
View File
@@ -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>
);
+69
View File
@@ -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();
});
});
+14
View File
@@ -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;
}
+30 -37
View File
@@ -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
View File
@@ -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
View File
@@ -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",
+3501 -4047
View File
File diff suppressed because it is too large. Load diff
+11 -3
View File
@@ -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 {