@keycloakify/keycloak-admin-ui
Version:
<p align="center"> <img src="https://github.com/user-attachments/assets/a6aaebbd-8f59-474d-9827-c282f4527aca"> </p> <p align="center"> <i>Repackaged Keycloak Admin UI</i> <br> <br> <a href="https://github.com/keycloakify/keycloak-adm
67 lines (57 loc) • 2.29 kB
text/typescript
/* eslint-disable */
// @ts-nocheck
import { ClientScopeDefaultOptionalType } from "../../components/client-scope/ClientScopeTypes";
import { convertAttributeNameToForm } from "../../util";
/* OID4VC attributes we explicitly clean up when empty/whitespace-only.
Keep this list in sync with optional OID4VC form fields; add to it when
new string/number-like attributes are introduced that should be pruned. */
export const OID4VC_ATTRIBUTE_KEYS = [
"vc.credential_configuration_id",
"vc.credential_identifier",
"vc.issuer_did",
"vc.expiry_in_seconds",
"vc.credential_build_config.token_jws_type",
"vc.supported_credential_types",
"vc.verifiable_credential_type",
"vc.credential_build_config.sd_jwt.visible_claims",
"vc.display",
"vc.binding_required",
"vc.binding_required_proof_types",
"vc.cryptographic_binding_methods_supported",
"vc.refresh_interval_in_seconds",
] as const;
const isEmptyValue = (value: unknown) =>
value === null ||
value === undefined ||
(typeof value === "string" && value.trim() === "");
/** Prune known optional OID4VC attributes from the payload when they are empty. */
export const removeEmptyOid4vcAttributes = (
values: ClientScopeDefaultOptionalType,
): ClientScopeDefaultOptionalType => {
const fieldNames = OID4VC_ATTRIBUTE_KEYS.map((attr) =>
convertAttributeNameToForm<ClientScopeDefaultOptionalType>(
`attributes.${attr}`,
),
);
/* Shallow copies are sufficient while OID4VC attributes stay flat; if we add
nested objects under attributes.vc.* we should switch to a deep clone here. */
const cleanedValues = { ...values } as Record<string, unknown>;
const hadAttributes = Boolean(cleanedValues.attributes);
const cleanedAttributes = {
...(cleanedValues.attributes as Record<string, unknown> | undefined),
};
for (const fieldName of fieldNames) {
const attrKey = fieldName.replace(/^attributes\./, "");
if (isEmptyValue(cleanedAttributes[attrKey])) {
delete cleanedAttributes[attrKey];
}
}
if (Object.keys(cleanedAttributes).length === 0) {
if (hadAttributes) {
delete cleanedValues.attributes;
}
} else {
cleanedValues.attributes = cleanedAttributes;
}
return cleanedValues as unknown as ClientScopeDefaultOptionalType;
};