Fix broken lockfile and upgrade JS tooling (#41698)

Signed-off-by: Jon Koops <jonkoops@gmail.com>
This commit is contained in:
Jon Koops 2025-08-06 19:30:08 +02:00 committed by GitHub
parent ac632d609e
commit a22fb31f6c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 979 additions and 1353 deletions

View File

@ -36,21 +36,21 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-hook-form": "^7.60.0", "react-hook-form": "^7.62.0",
"react-i18next": "^15.6.1", "react-i18next": "^15.6.1",
"react-router-dom": "^6.30.1" "react-router-dom": "^6.30.1"
}, },
"devDependencies": { "devDependencies": {
"@keycloak/keycloak-admin-client": "workspace:*", "@keycloak/keycloak-admin-client": "workspace:*",
"@playwright/test": "^1.54.1", "@playwright/test": "^1.54.2",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/react": "^18.3.18", "@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.5",
"@vitejs/plugin-react-swc": "^3.11.0", "@vitejs/plugin-react-swc": "^3.11.0",
"cross-env": "^7.0.3", "cross-env": "^10.0.0",
"lightningcss": "^1.30.1", "lightningcss": "^1.30.1",
"vite": "^7.0.6", "vite": "^7.0.6",
"vite-plugin-checker": "^0.10.0", "vite-plugin-checker": "^0.10.2",
"vite-plugin-dts": "^4.5.4" "vite-plugin-dts": "^4.5.4"
}, },
"wireit": { "wireit": {

View File

@ -105,7 +105,7 @@
"p-debounce": "^4.0.0", "p-debounce": "^4.0.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-hook-form": "^7.60.0", "react-hook-form": "^7.62.0",
"react-i18next": "^15.6.1", "react-i18next": "^15.6.1",
"react-router-dom": "^6.30.1", "react-router-dom": "^6.30.1",
"reactflow": "^11.11.4", "reactflow": "^11.11.4",
@ -113,7 +113,7 @@
}, },
"devDependencies": { "devDependencies": {
"@axe-core/playwright": "^4.10.2", "@axe-core/playwright": "^4.10.2",
"@playwright/test": "^1.54.1", "@playwright/test": "^1.54.2",
"@testing-library/dom": "^10.4.1", "@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.6.4", "@testing-library/jest-dom": "^6.6.4",
"@testing-library/react": "^16.3.0", "@testing-library/react": "^16.3.0",
@ -123,14 +123,14 @@
"@types/react": "^18.3.18", "@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.5",
"@vitejs/plugin-react-swc": "^3.11.0", "@vitejs/plugin-react-swc": "^3.11.0",
"cross-env": "^7.0.3", "cross-env": "^10.0.0",
"jsdom": "^26.1.0", "jsdom": "^26.1.0",
"lightningcss": "^1.30.1", "lightningcss": "^1.30.1",
"properties-file": "^3.5.13", "properties-file": "^3.5.13",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"uuid": "^11.1.0", "uuid": "^11.1.0",
"vite": "^7.0.6", "vite": "^7.0.6",
"vite-plugin-checker": "^0.10.0", "vite-plugin-checker": "^0.10.2",
"vite-plugin-dts": "^4.5.4", "vite-plugin-dts": "^4.5.4",
"vitest": "^3.2.4" "vitest": "^3.2.4"
} }

View File

@ -78,8 +78,7 @@ export const LogoutPanel = ({
label={t("frontchannelLogoutUrl")} label={t("frontchannelLogoutUrl")}
labelIcon={t("frontchannelLogoutUrlHelp")} labelIcon={t("frontchannelLogoutUrlHelp")}
rules={{ rules={{
validate: (uri) => validate: (uri) => validateUrl(uri, t("frontchannelUrlInvalid")),
validateUrl(uri, t("frontchannelUrlInvalid").toString()),
}} }}
/> />
)} )}
@ -105,8 +104,7 @@ export const LogoutPanel = ({
label={t("backchannelLogoutUrl")} label={t("backchannelLogoutUrl")}
labelIcon={t("backchannelLogoutUrlHelp")} labelIcon={t("backchannelLogoutUrlHelp")}
rules={{ rules={{
validate: (uri) => validate: (uri) => validateUrl(uri, t("backchannelUrlInvalid")),
validateUrl(uri, t("backchannelUrlInvalid").toString()),
}} }}
/> />
<FormGroup <FormGroup

View File

@ -33,7 +33,7 @@ const EmptyButton = ({
<Button <Button
data-testid={`create-${permissionType}`} data-testid={`create-${permissionType}`}
className={ className={
disabled ? "keycloak__permissions__empty_state " : "" + "pf-v5-u-m-sm" disabled ? "keycloak__permissions__empty_state " : "pf-v5-u-m-sm"
} }
variant="secondary" variant="secondary"
onClick={() => onClick={() =>

View File

@ -444,10 +444,7 @@ export const AdminEvents = ({ resourcePath }: AdminEventsProps) => {
} }
> >
{operationTypes?.map((option) => ( {operationTypes?.map((option) => (
<SelectOption <SelectOption key={option} value={option}>
key={option.toString()}
value={option}
>
{option} {option}
</SelectOption> </SelectOption>
))} ))}

View File

@ -479,7 +479,7 @@ export default function NewClientPolicy() {
required: t("required"), required: t("required"),
validate: (value) => validate: (value) =>
policies.some((policy) => policy.name === value) policies.some((policy) => policy.name === value)
? t("createClientProfileNameHelperText").toString() ? t("createClientProfileNameHelperText")
: true, : true,
}} }}
/> />

View File

@ -41,20 +41,20 @@ export const RevocationModal = ({
addAlert(t("noAdminUrlSet"), AlertVariant.warning); addAlert(t("noAdminUrlSet"), AlertVariant.warning);
} else if (failedCount > 0) { } else if (failedCount > 0) {
addAlert( addAlert(
t("" + prefixKey + "Success", { t(prefixKey + "Success", {
successNodes: result.successRequests, successNodes: result.successRequests,
}), }),
AlertVariant.success, AlertVariant.success,
); );
addAlert( addAlert(
t("" + prefixKey + "Fail", { t(prefixKey + "Fail", {
failedNodes: result.failedRequests, failedNodes: result.failedRequests,
}), }),
AlertVariant.danger, AlertVariant.danger,
); );
} else { } else {
addAlert( addAlert(
t("" + prefixKey + "Success", { t(prefixKey + "Success", {
successNodes: result.successRequests, successNodes: result.successRequests,
}), }),
AlertVariant.success, AlertVariant.success,

View File

@ -138,7 +138,7 @@ export const LdapSettingsGeneral = ({
control={form.control} control={form.control}
render={({ field }) => ( render={({ field }) => (
<KeycloakSelect <KeycloakSelect
isDisabled={!!vendorEdit} isDisabled={vendorEdit}
toggleId="kc-vendor" toggleId="kc-vendor"
onToggle={() => setIsVendorDropdownOpen(!isVendorDropdownOpen)} onToggle={() => setIsVendorDropdownOpen(!isVendorDropdownOpen)}
isOpen={isVendorDropdownOpen} isOpen={isVendorDropdownOpen}

View File

@ -161,7 +161,7 @@ export const ResetPasswordDialog = ({
await onChange(e); await onChange(e);
if (passwordConfirmation !== e.currentTarget.value) { if (passwordConfirmation !== e.currentTarget.value) {
setError("passwordConfirmation", { setError("passwordConfirmation", {
message: t("confirmPasswordDoesNotMatch").toString(), message: t("confirmPasswordDoesNotMatch"),
}); });
} else { } else {
clearErrors("passwordConfirmation"); clearErrors("passwordConfirmation");
@ -187,8 +187,7 @@ export const ResetPasswordDialog = ({
{...register("passwordConfirmation", { {...register("passwordConfirmation", {
required: true, required: true,
validate: (value) => validate: (value) =>
value === password || value === password || t("confirmPasswordDoesNotMatch"),
t("confirmPasswordDoesNotMatch").toString(),
})} })}
/> />
{errors.passwordConfirmation && ( {errors.passwordConfirmation && (

View File

@ -61,7 +61,7 @@ export async function assertRowExists(page: Page, name: string, exists = true) {
if (exists) { if (exists) {
await expect(locator).toBeVisible(); await expect(locator).toBeVisible();
} else { } else {
await expect(locator).not.toBeVisible(); await expect(locator).toBeHidden();
} }
} }

View File

@ -56,7 +56,7 @@ test.describe("Authentication test", () => {
const itemId = "browser"; const itemId = "browser";
await searchItem(page, "Search for flow", itemId); await searchItem(page, "Search for flow", itemId);
await expect(getRowByCellText(page, itemId)).toBeVisible(); await expect(getRowByCellText(page, itemId)).toBeVisible();
await expect(getRowByCellText(page, "clients")).not.toBeVisible(); await expect(getRowByCellText(page, "clients")).toBeHidden();
}); });
test("should create duplicate of existing flow", async ({ page }) => { test("should create duplicate of existing flow", async ({ page }) => {

View File

@ -79,7 +79,7 @@ export async function assertSwitchDisplayOnConsentScreenIsChecked(page: Page) {
export async function assertConsentInputIsVisible(page: Page, not = false) { export async function assertConsentInputIsVisible(page: Page, not = false) {
if (not) { if (not) {
await expect(getConsentScreenTextInput(page)).not.toBeVisible(); await expect(getConsentScreenTextInput(page)).toBeHidden();
} else { } else {
await expect(getConsentScreenTextInput(page)).toBeVisible(); await expect(getConsentScreenTextInput(page)).toBeVisible();
} }

View File

@ -14,7 +14,7 @@ export async function assertInitialAccessTokensIsEmpty(page: Page) {
export async function assertInitialAccessTokensIsNotEmpty(page: Page) { export async function assertInitialAccessTokensIsNotEmpty(page: Page) {
await expect( await expect(
page.getByTestId("no-initial-access-tokens-empty-action"), page.getByTestId("no-initial-access-tokens-empty-action"),
).not.toBeVisible(); ).toBeHidden();
} }
export async function goToCreateFromEmptyList(page: Page) { export async function goToCreateFromEmptyList(page: Page) {

View File

@ -51,7 +51,7 @@ export async function assertSearchButtonDisabled(page: Page, disabled = true) {
if (disabled) { if (disabled) {
await expect(page.getByTestId("search-events-btn")).toBeDisabled(); await expect(page.getByTestId("search-events-btn")).toBeDisabled();
} else { } else {
await expect(page.getByTestId("search-events-btn")).not.toBeDisabled(); await expect(page.getByTestId("search-events-btn")).toBeEnabled();
} }
} }
@ -68,7 +68,7 @@ export async function assertSearchChipGroupItemExist(
if (exist) { if (exist) {
await expect(locator).toHaveText(`User ID${itemName}`); await expect(locator).toHaveText(`User ID${itemName}`);
} else { } else {
await expect(locator).not.toBeVisible(); await expect(locator).toBeHidden();
} }
} }

View File

@ -2,14 +2,14 @@ import { Page, expect } from "@playwright/test";
import { switchOff, switchOn } from "../utils/form"; import { switchOff, switchOn } from "../utils/form";
export async function assertDialogClosed(page: Page) { export async function assertDialogClosed(page: Page) {
await expect(page.getByTestId("confirm")).not.toBeVisible(); await expect(page.getByTestId("confirm")).toBeHidden();
} }
export async function assertWarningMessage(page: Page, toBeVisible = false) { export async function assertWarningMessage(page: Page, toBeVisible = false) {
if (toBeVisible) { if (toBeVisible) {
await expect(page.getByTestId("warning-message")).toBeVisible(); await expect(page.getByTestId("warning-message")).toBeVisible();
} else { } else {
await expect(page.getByTestId("warning-message")).not.toBeVisible(); await expect(page.getByTestId("warning-message")).toBeHidden();
} }
} }

View File

@ -49,7 +49,7 @@ test.describe("Partial import test", () => {
test("Opens and closes partial import dialog", async ({ page }) => { test("Opens and closes partial import dialog", async ({ page }) => {
await expect(page.getByTestId("confirm")).toBeDisabled(); await expect(page.getByTestId("confirm")).toBeDisabled();
await cancelModal(page); await cancelModal(page);
await expect(page.getByTestId("confirm")).not.toBeVisible(); await expect(page.getByTestId("confirm")).toBeHidden();
}); });
test("Import button only enabled if JSON has something to import", async ({ test("Import button only enabled if JSON has something to import", async ({
@ -108,7 +108,7 @@ test.describe("Partial import test", () => {
await chooseFile(page, "../utils/files/client-only.json"); await chooseFile(page, "../utils/files/client-only.json");
await expect(page.locator("select")).not.toBeVisible(); await expect(page.locator("select")).toBeHidden();
await assertTextContent(page, "1 Clients"); await assertTextContent(page, "1 Clients");

View File

@ -5,7 +5,7 @@ export async function assertImportButtonDisabled(page: Page, disabled = true) {
if (disabled) { if (disabled) {
await expect(page.getByTestId("confirm")).toBeDisabled(); await expect(page.getByTestId("confirm")).toBeDisabled();
} else { } else {
await expect(page.getByTestId("confirm")).not.toBeDisabled(); await expect(page.getByTestId("confirm")).toBeEnabled();
} }
} }
@ -91,7 +91,7 @@ export async function assertClearButtonDisabled(page: Page, disabled = true) {
if (disabled) { if (disabled) {
await expect(getClearButton(page)).toBeDisabled(); await expect(getClearButton(page)).toBeDisabled();
} else { } else {
await expect(getClearButton(page)).not.toBeDisabled(); await expect(getClearButton(page)).toBeEnabled();
} }
} }

View File

@ -53,7 +53,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-hook-form": "7.60.0", "react-hook-form": "7.62.0",
"react-i18next": "^15.6.1" "react-i18next": "^15.6.1"
}, },
"devDependencies": { "devDependencies": {
@ -63,7 +63,7 @@
"@vitejs/plugin-react-swc": "^3.11.0", "@vitejs/plugin-react-swc": "^3.11.0",
"rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-peer-deps-external": "^2.2.4",
"vite": "^7.0.6", "vite": "^7.0.6",
"vite-plugin-checker": "^0.10.0", "vite-plugin-checker": "^0.10.2",
"vite-plugin-dts": "^4.5.4", "vite-plugin-dts": "^4.5.4",
"vite-plugin-lib-inject-css": "^2.2.2", "vite-plugin-lib-inject-css": "^2.2.2",
"vitest": "^3.2.4" "vitest": "^3.2.4"

View File

@ -258,7 +258,7 @@ function DataTable<T>({
rows[index + 1].cells.length === 0 rows[index + 1].cells.length === 0
? undefined ? undefined
: { : {
isExpanded: !!expandedRows[index], isExpanded: expandedRows[index] ?? false,
rowIndex: index, rowIndex: index,
expandId: "expandable-row-", expandId: "expandable-row-",
onToggle: (_, rowIndex, isOpen) => { onToggle: (_, rowIndex, isOpen) => {
@ -278,7 +278,7 @@ function DataTable<T>({
/> />
</Tr> </Tr>
) : ( ) : (
<Tr isExpanded={!!expandedRows[index - 1]}> <Tr isExpanded={expandedRows[index - 1] ?? false}>
<Td /> <Td />
<Td colSpan={columns.length}> <Td colSpan={columns.length}>
<ExpandableRowContent> <ExpandableRowContent>

View File

@ -73,7 +73,7 @@ export function setUserProfileServerError<T>(
).forEach((e) => { ).forEach((e) => {
const params = Object.assign( const params = Object.assign(
{}, {},
e.params?.map((p) => (isBundleKey(p?.toString()) ? t(unWrap(p)) : p)), e.params?.map((p) => (isBundleKey(p) ? t(unWrap(p)) : p)),
); );
setError(fieldName(e.field) as keyof T, { setError(fieldName(e.field) as keyof T, {
message: t( message: t(

View File

@ -2,7 +2,7 @@
"name": "root", "name": "root",
"private": true, "private": true,
"type": "module", "type": "module",
"packageManager": "pnpm@10.4.1+sha512.c753b6c3ad7afa13af388fa6d808035a008e30ea9993f58c6663e2bc5ff21679aa834db094987129aa4d488b86df57f7b634981b2f827cdcacc698cc0cfb88af", "packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748",
"scripts": { "scripts": {
"prepare": "cd .. && husky js/.husky", "prepare": "cd .. && husky js/.husky",
"build": "wireit" "build": "wireit"
@ -26,49 +26,19 @@
"eslint": "^9.32.0", "eslint": "^9.32.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-lodash": "^8.0.0", "eslint-plugin-lodash": "^8.0.0",
"eslint-plugin-playwright": "^2.2.0", "eslint-plugin-playwright": "^2.2.2",
"eslint-plugin-prettier": "^5.5.3", "eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "eslint-plugin-react-compiler": "19.1.0-rc.2",
"eslint-plugin-react-hooks": "~5.2.0", "eslint-plugin-react-hooks": "~5.2.0",
"husky": "^9.1.7", "husky": "^9.1.7",
"lint-staged": "^16.1.4", "lint-staged": "^16.1.4",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.8.3", "typescript": "^5.9.2",
"typescript-eslint": "^8.38.0", "typescript-eslint": "^8.39.0",
"wireit": "^0.14.12" "wireit": "^0.14.12"
}, },
"pnpm": {
"ignoredOptionalDependencies": [
"@types/c3",
"bootstrap-datepicker",
"bootstrap-sass",
"bootstrap-select",
"bootstrap-slider",
"bootstrap-switch",
"bootstrap-touchspin",
"c3",
"d3",
"datatables.net",
"datatables.net-colreorder",
"datatables.net-colreorder-bs",
"datatables.net-select",
"drmonty-datatables-colvis",
"eonasdan-bootstrap-datetimepicker",
"font-awesome-sass",
"google-code-prettify",
"jquery-match-height",
"moment",
"moment-timezone",
"patternfly-bootstrap-combobox",
"patternfly-bootstrap-treeview"
],
"onlyBuiltDependencies": [
"@swc/core",
"esbuild"
]
},
"lint-staged": { "lint-staged": {
"*.{js,jsx,mjs,ts,tsx}": "eslint --cache --fix" "*.{js,jsx,mjs,ts,tsx}": "eslint --cache --fix"
} }

2178
js/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -2,3 +2,31 @@ packages:
- apps/* - apps/*
- libs/* - libs/*
- themes-vendor - themes-vendor
onlyBuiltDependencies:
- '@swc/core'
- esbuild
ignoredOptionalDependencies:
- '@types/c3'
- bootstrap-datepicker
- bootstrap-sass
- bootstrap-select
- bootstrap-slider
- bootstrap-switch
- bootstrap-touchspin
- 'c3'
- 'd3'
- datatables.net
- datatables.net-colreorder
- datatables.net-colreorder-bs
- datatables.net-select
- drmonty-datatables-colvis
- eonasdan-bootstrap-datetimepicker
- font-awesome-sass
- google-code-prettify
- jquery-match-height
- moment
- moment-timezone
- patternfly-bootstrap-combobox
- patternfly-bootstrap-treeview

View File

@ -24,8 +24,8 @@
</modules> </modules>
<properties> <properties>
<node.version>v22.14.0</node.version> <node.version>v22.18.0</node.version>
<pnpm.version>10.4.1</pnpm.version> <pnpm.version>10.14.0</pnpm.version>
<!-- The JavaScript projects use non-standard folders for their sources, therefore, name it here explicitly --> <!-- The JavaScript projects use non-standard folders for their sources, therefore, name it here explicitly -->
<maven.build.cache.input.1>src</maven.build.cache.input.1> <maven.build.cache.input.1>src</maven.build.cache.input.1>
<maven.build.cache.input.2>public</maven.build.cache.input.2> <maven.build.cache.input.2>public</maven.build.cache.input.2>

View File

@ -34,6 +34,6 @@
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/plugin-replace": "^6.0.2", "@rollup/plugin-replace": "^6.0.2",
"@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-terser": "^0.4.4",
"rollup": "^4.45.1" "rollup": "^4.46.2"
} }
} }