mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-04 02:04:06 +00:00
Co-authored-by: alejandrobailo <alejandrobailo94@gmail.com>
86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
import type {
|
|
RegistryCredentialSchema,
|
|
RegistryCredentialValue,
|
|
} from "./provider-credential-schema";
|
|
|
|
export function getCredentialDefaults(
|
|
schema: RegistryCredentialSchema,
|
|
): Record<string, RegistryCredentialValue> {
|
|
return Object.fromEntries(
|
|
schema.fields.flatMap((field) =>
|
|
field.defaultValue !== undefined
|
|
? [[field.name, field.defaultValue]]
|
|
: field.kind === "checkbox" && field.required
|
|
? [[field.name, false]]
|
|
: [],
|
|
),
|
|
);
|
|
}
|
|
|
|
export function validateCredentialValues(
|
|
schema: RegistryCredentialSchema,
|
|
values: unknown,
|
|
):
|
|
| {
|
|
valid: true;
|
|
secret: Record<string, RegistryCredentialValue>;
|
|
errors: Record<string, string>;
|
|
}
|
|
| { valid: false; errors: Record<string, string> } {
|
|
if (!values || typeof values !== "object" || Array.isArray(values))
|
|
return {
|
|
valid: false,
|
|
errors: { _form: "Enter the required credentials." },
|
|
};
|
|
const entries = Object.entries(values);
|
|
if (
|
|
entries.some(
|
|
([name]) => !schema.fields.some((field) => field.name === name),
|
|
)
|
|
)
|
|
return {
|
|
valid: false,
|
|
errors: { _form: "The credential fields have changed. Reload the form." },
|
|
};
|
|
const fields = new Map(entries);
|
|
const errors: Record<string, string> = {};
|
|
const secret: Record<string, RegistryCredentialValue> = {};
|
|
for (const field of schema.fields) {
|
|
const value = fields.get(field.name);
|
|
if (value === undefined || (value === "" && field.kind !== "checkbox")) {
|
|
if (field.required) errors[field.name] = `${field.label} is required`;
|
|
} else if (field.kind === "checkbox") {
|
|
if (typeof value !== "boolean") {
|
|
errors[field.name] = `Enter a valid ${field.label}`;
|
|
} else {
|
|
secret[field.name] = value;
|
|
}
|
|
} else if (field.kind === "integer") {
|
|
const number =
|
|
typeof value === "string" && /^[+-]?\d+$/.test(value)
|
|
? Number(value)
|
|
: value;
|
|
if (
|
|
typeof number !== "number" ||
|
|
!Number.isSafeInteger(number) ||
|
|
(field.minimum !== undefined && number < field.minimum) ||
|
|
(field.maximum !== undefined && number > field.maximum)
|
|
) {
|
|
errors[field.name] = `Enter a valid ${field.label}`;
|
|
} else {
|
|
secret[field.name] = number;
|
|
}
|
|
} else if (
|
|
typeof value !== "string" ||
|
|
(field.options && !field.options.includes(value))
|
|
) {
|
|
errors[field.name] = `Enter a valid ${field.label}`;
|
|
} else {
|
|
secret[field.name] = value;
|
|
}
|
|
}
|
|
return Object.keys(errors).length > 0
|
|
? { valid: false, errors }
|
|
: { valid: true, secret, errors };
|
|
}
|