diff --git a/.github/workflows/js-ci.yml b/.github/workflows/js-ci.yml index 44fc0b4c6e1..1fbdeb57adf 100644 --- a/.github/workflows/js-ci.yml +++ b/.github/workflows/js-ci.yml @@ -130,7 +130,7 @@ jobs: if: needs.conditional.outputs.js-ci == 'true' runs-on: ubuntu-latest env: - WORKSPACE: admin-ui + WORKSPACE: keycloak-admin-ui steps: - uses: actions/checkout@v4 @@ -223,7 +223,7 @@ jobs: if: needs.conditional.outputs.js-ci == 'true' runs-on: ubuntu-latest env: - WORKSPACE: admin-ui + WORKSPACE: keycloak-admin-ui strategy: matrix: container: [1, 2, 3, 4, 5] diff --git a/js/apps/account-ui/README.md b/js/apps/account-ui/README.md index 87c8745b7d0..5048f838dd5 100644 --- a/js/apps/account-ui/README.md +++ b/js/apps/account-ui/README.md @@ -17,7 +17,7 @@ npm i @keycloak/keycloak-account-ui To use these pages you'll need to add `KeycloakProvider` in your component hierarchy to setup what client, realm and url to use. ```jsx -import { KeycloakProvider } from "@keycloak/keycloak-account-ui"; +import { KeycloakProvider } from "@keycloak/keycloak-ui-shared"; //... diff --git a/js/apps/account-ui/src/personal-info/PersonalInfo.tsx b/js/apps/account-ui/src/personal-info/PersonalInfo.tsx index c176f5c5b37..f7ec0a45f2d 100644 --- a/js/apps/account-ui/src/personal-info/PersonalInfo.tsx +++ b/js/apps/account-ui/src/personal-info/PersonalInfo.tsx @@ -70,11 +70,12 @@ export const PersonalInfo = () => { ); await savePersonalInfo(context, { ...user, attributes }); const locale = attributes["locale"]?.toString(); - i18n.changeLanguage(locale, (error) => { - if (error) { - console.warn("Error(s) loading locale", locale, error); - } - }); + if (locale) + i18n.changeLanguage(locale, (error) => { + if (error) { + console.warn("Error(s) loading locale", locale, error); + } + }); context.keycloak.updateToken(); addAlert(t("accountUpdatedMessage")); } catch (error) { diff --git a/js/apps/admin-ui/CONTRIBUTING.md b/js/apps/admin-ui/CONTRIBUTING.md new file mode 100644 index 00000000000..ad7bd56c167 --- /dev/null +++ b/js/apps/admin-ui/CONTRIBUTING.md @@ -0,0 +1,76 @@ +# Keycloak Admin UI + +This project is the next generation of the Keycloak Administration UI. It is written with React and [PatternFly 4](https://www.patternfly.org/v4/) and uses [Vite](https://vitejs.dev/guide/) and [Cypress](https://docs.cypress.io/guides/overview/why-cypress). + +## Development + +### Prerequisites + +Make sure that you have Node.js version 18 (or later) installed on your system. If you do not have Node.js installed we recommend using [Node Version Manager](https://github.com/nvm-sh/nvm) to install it. + +You can find out which version of Node.js you are using by running the following command: + +```bash +node --version +``` + +In order to run the Keycloak server you will also have to install the Java Development Kit (JDK). We recommend that you use the same version of the JDK as [required by the Keycloak server](https://github.com/keycloak/keycloak/blob/main/docs/building.md#building-from-source). + +### Running the Keycloak server + +See the instructions in the [Keycloak server app](../keycloak-server/README.md). + +### Running the development server + +Now that the Keycloak sever is running it's time to run the development server for the Admin UI. This server is used to build the Admin UI in a manner that it can be iterated on quickly in a browser, using features such as [Hot Module Replacement (HMR)](https://vitejs.dev/guide/features.html#hot-module-replacement) and [Fast Refresh](https://www.npmjs.com/package/react-refresh). + +To start the development server run the following command: + +```bash +pnpm dev +``` + +Once the process of optimization is done your browser will automatically open your local host on port `8080`. From here you will be redirected to the Keycloak server to authenticate, which you can do with the default credentials (`admin`/`admin`). + +You can now start making changes to the source code, and they will be reflected in your browser. + +## Building as a Keycloak theme + +If you want to build the application using Maven and produce a JAR that can be installed directly into Keycloak, check out the [Keycloak theme documentation](../../keycloak-theme/README.md). + +## Linting + +Every time you create a commit it should be automatically linted and formatted for you. It is also possible to trigger the linting manually: + +```bash +pnpm lint +``` + +## Integration testing with Cypress + +This repository contains integration tests developed with the [Cypress framework](https://www.cypress.io/). + +### Prerequisites + +Ensure the Keycloak and development server are running as [outlined previously](#running-the-keycloak-server) in this document. + +### Running the tests + +You can run the tests using the interactive graphical user interface using the following command: + +```bash +pnpm cy:open +``` + +Alternatively the tests can also run headless as follows: + +``` +pnpm cy:run +``` + +For more information about the Cypress command-line interface consult [the documentation](https://docs.cypress.io/guides/guides/command-line). + +### Project Structure + +You can find information about the project structure in the [official Cypress documentation](https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Folder-structure). +Read more about [how to write tests](./cypress/WRITING_TESTS.md) diff --git a/js/apps/admin-ui/README.md b/js/apps/admin-ui/README.md index ad7bd56c167..0333c5034f7 100644 --- a/js/apps/admin-ui/README.md +++ b/js/apps/admin-ui/README.md @@ -1,76 +1,59 @@ # Keycloak Admin UI -This project is the next generation of the Keycloak Administration UI. It is written with React and [PatternFly 4](https://www.patternfly.org/v4/) and uses [Vite](https://vitejs.dev/guide/) and [Cypress](https://docs.cypress.io/guides/overview/why-cypress). +This project is the next generation of the Keycloak Admin UI. It is written with React and [PatternFly 4](https://www.patternfly.org/v4/) and uses [Vite](https://vitejs.dev/guide/). -## Development +## Features -### Prerequisites +Contains all the "pages" from the admin-ui as re-usable components, all the functions to save and the side menu to use in your own build of the admin-ui -Make sure that you have Node.js version 18 (or later) installed on your system. If you do not have Node.js installed we recommend using [Node Version Manager](https://github.com/nvm-sh/nvm) to install it. - -You can find out which version of Node.js you are using by running the following command: +## Install ```bash -node --version +npm i @keycloak/keycloak-admin-ui ``` -In order to run the Keycloak server you will also have to install the Java Development Kit (JDK). We recommend that you use the same version of the JDK as [required by the Keycloak server](https://github.com/keycloak/keycloak/blob/main/docs/building.md#building-from-source). +## Usage -### Running the Keycloak server +To use these pages you'll need to add `KeycloakProvider` in your component hierarchy to setup what client, realm and url to use. -See the instructions in the [Keycloak server app](../keycloak-server/README.md). +```jsx +import { KeycloakProvider } from "@keycloak/keycloak-ui-shared"; -### Running the development server +//... -Now that the Keycloak sever is running it's time to run the development server for the Admin UI. This server is used to build the Admin UI in a manner that it can be iterated on quickly in a browser, using features such as [Hot Module Replacement (HMR)](https://vitejs.dev/guide/features.html#hot-module-replacement) and [Fast Refresh](https://www.npmjs.com/package/react-refresh). + + {/* rest of you application */} + +``` -To start the development server run the following command: +### Translation + +For the translation we use `react-i18next` you can [set it up](https://react.i18next.com/) as described on their website. +If you want to use the translations that are provided then you need to add `i18next-http-backend` to your project and add: + +```ts + +backend: { + loadPath: `http://localhost:8180/resources/master/admin/{{lng}}`, + parse: (data: string) => { + const messages = JSON.parse(data); + + const result: Record = {}; + messages.forEach((v) => (result[v.key] = v.value)); + return result; + }, +}, +``` +to the `i18next` config object. + +## Building + +To build a library instead of an app you need to add the `LIB=true` environment variable. ```bash -pnpm dev -``` - -Once the process of optimization is done your browser will automatically open your local host on port `8080`. From here you will be redirected to the Keycloak server to authenticate, which you can do with the default credentials (`admin`/`admin`). - -You can now start making changes to the source code, and they will be reflected in your browser. - -## Building as a Keycloak theme - -If you want to build the application using Maven and produce a JAR that can be installed directly into Keycloak, check out the [Keycloak theme documentation](../../keycloak-theme/README.md). - -## Linting - -Every time you create a commit it should be automatically linted and formatted for you. It is also possible to trigger the linting manually: - -```bash -pnpm lint -``` - -## Integration testing with Cypress - -This repository contains integration tests developed with the [Cypress framework](https://www.cypress.io/). - -### Prerequisites - -Ensure the Keycloak and development server are running as [outlined previously](#running-the-keycloak-server) in this document. - -### Running the tests - -You can run the tests using the interactive graphical user interface using the following command: - -```bash -pnpm cy:open -``` - -Alternatively the tests can also run headless as follows: - -``` -pnpm cy:run -``` - -For more information about the Cypress command-line interface consult [the documentation](https://docs.cypress.io/guides/guides/command-line). - -### Project Structure - -You can find information about the project structure in the [official Cypress documentation](https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Folder-structure). -Read more about [how to write tests](./cypress/WRITING_TESTS.md) +LIB=true pnpm run build +``` \ No newline at end of file diff --git a/js/apps/admin-ui/package.json b/js/apps/admin-ui/package.json index a0ea0ab289e..ed8bdde8b1c 100644 --- a/js/apps/admin-ui/package.json +++ b/js/apps/admin-ui/package.json @@ -1,7 +1,21 @@ { - "name": "admin-ui", - "private": true, + "name": "@keycloak/keycloak-admin-ui", + "version": "999.0.0-SNAPSHOT", "type": "module", + "main": "lib/keycloak-admin-ui.js", + "types": "./lib/keycloak-admin-ui.d.ts", + "exports": { + ".": { + "import": "./lib/keycloak-admin-ui.js", + "types": "./lib/keycloak-admin-ui.d.ts" + } + }, + "files": [ + "lib" + ], + "publishConfig": { + "access": "public" + }, "scripts": { "dev": "wireit", "build": "wireit", @@ -113,6 +127,7 @@ "uuid": "^10.0.0", "vite": "^5.3.3", "vite-plugin-checker": "^0.7.0", + "vite-plugin-dts": "^3.9.1", "vitest": "^1.6.0" } } diff --git a/js/apps/admin-ui/src/index.ts b/js/apps/admin-ui/src/index.ts index 169f7432e95..08eac74d0b2 100644 --- a/js/apps/admin-ui/src/index.ts +++ b/js/apps/admin-ui/src/index.ts @@ -1,2 +1,320 @@ -export * as ClientsSection from "./clients/ClientsSection"; +export * as AuthenticationSection from "./authentication/AuthenticationSection"; +export { AddMapperDialog } from "./client-scopes/add/MapperDialog"; +export { MapperList } from "./client-scopes/details/MapperList"; +export * as MappingDetails from "./client-scopes/details/MappingDetails"; +export { ScopeForm } from "./client-scopes/details/ScopeForm"; +export { SearchDropdown } from "./client-scopes/details/SearchFilter"; +export { ChangeTypeDropdown } from "./client-scopes/ChangeTypeDropdown"; export * as ClientScopeSection from "./client-scopes/ClientScopesSection"; +export * as CreateClientScope from "./client-scopes/CreateClientScope"; +export * as EditClientScope from "./client-scopes/EditClientScope"; +export { AuthorizationSettings } from "./clients/authorization/Settings"; +export { AccessSettings } from "./clients/add/AccessSettings"; +export { CapabilityConfig } from "./clients/add/CapabilityConfig"; +export { GeneralSettings } from "./clients/add/GeneralSettings"; +export { LoginSettings } from "./clients/add/LoginSettings"; +export { LoginSettingsPanel } from "./clients/add/LoginSettingsPanel"; +export { LogoutPanel } from "./clients/add/LogoutPanel"; +export * as NewClientForm from "./clients/add/NewClientForm"; +export { SamlConfig } from "./clients/add/SamlConfig"; +export { SamlSignature } from "./clients/add/SamlSignature"; +export { AddHostDialog } from "./clients/advanced/AddHostDialog"; +export { AdvancedSettings } from "./clients/advanced/AdvancedSettings"; +export { ApplicationUrls } from "./clients/advanced/ApplicationUrls"; +export { AuthenticationOverrides } from "./clients/advanced/AuthenticationOverrides"; +export { ClusteringPanel } from "./clients/advanced/ClusteringPanel"; +export { FineGrainOpenIdConnect } from "./clients/advanced/FineGrainOpenIdConnect"; +export { OpenIdConnectCompatibilityModes } from "./clients/advanced/OpenIdConnectCompatibilityModes"; +export { TokenLifespan } from "./clients/advanced/TokenLifespan"; +export { AuthorizationResources } from "./clients/authorization/Resources"; +export { AuthorizationScopes } from "./clients/authorization/Scopes"; +export { AuthorizationPolicies } from "./clients/authorization/Policies"; +export { AuthorizationPermissions } from "./clients/authorization/Permissions"; +export { AuthorizationEvaluate } from "./clients/authorization/AuthorizationEvaluate"; +export { AuthorizationExport } from "./clients/authorization/AuthorizationExport"; +export { ClientSecret } from "./clients/credentials/ClientSecret"; +export { Credentials } from "./clients/credentials/Credentials"; +export { SignedJWT } from "./clients/credentials/SignedJWT"; +export { X509 } from "./clients/credentials/X509"; +export * as ImportForm from "./clients/import/ImportForm"; +export { AccessTokenDialog } from "./clients/initial-access/AccessTokenDialog"; +export * as CreateInitialAccessToken from "./clients/initial-access/CreateInitialAccessToken"; +export * as InitialAccessTokenList from "./clients/initial-access/InitialAccessTokenList"; +export { Certificate } from "./clients/keys/Certificate"; +export { ExportSamlKeyDialog } from "./clients/keys/ExportSamlKeyDialog"; +export { GenerateKeyDialog } from "./clients/keys/GenerateKeyDialog"; +export { ImportKeyDialog } from "./clients/keys/ImportKeyDialog"; +export { Keys } from "./clients/keys/Keys"; +export { SamlImportKeyDialog } from "./clients/keys/SamlImportKeyDialog"; +export { SamlKeys } from "./clients/keys/SamlKeys"; +export { SamlKeysDialog } from "./clients/keys/SamlKeysDialog"; +export { StoreSettings } from "./clients/keys/StoreSettings"; +export { AddProviderDialog } from "./clients/registration/AddProviderDialog"; +export { ClientRegistration } from "./clients/registration/ClientRegistration"; +export { ClientRegistrationList } from "./clients/registration/ClientRegistrationList"; +export * as DetailProvider from "./clients/registration/DetailProvider"; +export * as CreateClientRole from "./clients/roles/CreateClientRole"; +export { AddScopeDialog } from "./clients/scopes/AddScopeDialog"; +export { ClientScopes } from "./clients/scopes/ClientScopes"; +export { CopyToClipboardButton } from "./clients/scopes/CopyToClipboardButton"; +export { DedicatedScope } from "./clients/scopes/DedicatedScope"; +export * as DedicatedScopes from "./clients/scopes/DedicatedScopes"; +export { EvaluateScopes } from "./clients/scopes/EvaluateScopes"; +export { GeneratedCodeTab } from "./clients/scopes/GeneratedCodeTab"; +export { ServiceAccount } from "./clients/service-account/ServiceAccount"; +export { AdvancedTab } from "./clients/AdvancedTab"; +export { ClientDescription } from "./clients/ClientDescription"; +export * as ClientDetails from "./clients/ClientDetails"; +export { ClientSessions } from "./clients/ClientSessions"; +export { ClientSettings } from "./clients/ClientSettings"; +export * as ClientsSection from "./clients/ClientsSection"; +export { AlertPanel } from "./components/alert/AlertPanel"; +export { useAlerts, AlertProvider } from "./components/alert/Alerts"; +export { GroupBreadCrumbs } from "./components/bread-crumb/GroupBreadCrumbs"; +export { PageBreadCrumbs } from "./components/bread-crumb/PageBreadCrumbs"; +export { ClientSelect } from "./components/client/ClientSelect"; +export { CellDropdown as ClientScopeCellDropdown } from "./components/client-scope/ClientScopeTypes"; +export { + useConfirmDialog, + ConfirmDialogModal, +} from "./components/confirm-dialog/ConfirmDialog"; +export { DownloadDialog } from "./components/download-dialog/DownloadDialog"; +export * as DropdownPanel from "./components/dropdown-panel/DropdownPanel"; +export { BooleanComponent } from "./components/dynamic/BooleanComponent"; +export { ClientSelectComponent } from "./components/dynamic/ClientSelectComponent"; +export { DynamicComponents } from "./components/dynamic/DynamicComponents"; +export { FileComponent } from "./components/dynamic/FileComponent"; +export { GroupComponent } from "./components/dynamic/GroupComponent"; +export { ListComponent } from "./components/dynamic/ListComponent"; +export { MapComponent } from "./components/dynamic/MapComponent"; +export { MultiValuedListComponent } from "./components/dynamic/MultivaluedListComponent"; +export { MultiValuedStringComponent } from "./components/dynamic/MultivaluedStringComponent"; +export { PasswordComponent } from "./components/dynamic/PasswordComponent"; +export { RoleComponent } from "./components/dynamic/RoleComponent"; +export { ScriptComponent } from "./components/dynamic/ScriptComponent"; +export { StringComponent } from "./components/dynamic/StringComponent"; +export { TextComponent } from "./components/dynamic/TextComponent"; +export { UrlComponent } from "./components/dynamic/UrlComponent"; +export { UserProfileAttributeListComponent } from "./components/dynamic/UserProfileAttributeListComponent"; +export { ErrorRenderer } from "./components/error/ErrorRenderer"; +export { FormattedLink } from "./components/external-link/FormattedLink"; +export { FixedButtonsGroup } from "./components/form/FixedButtonGroup"; +export { FormAccess } from "./components/form/FormAccess"; +export { GroupPath } from "./components/group/GroupPath"; +export { GroupPickerDialog } from "./components/group/GroupPickerDialog"; +export { HelpHeader } from "./components/help-enabler/HelpHeader"; +export { FileUploadForm } from "./components/json-file-upload/FileUploadForm"; +export { JsonFileUpload } from "./components/json-file-upload/JsonFileUpload"; +export { AttributesForm } from "./components/key-value-form/AttributeForm"; +export { KeySelect } from "./components/key-value-form/KeySelect"; +export { KeyValueInput } from "./components/key-value-form/KeyValueInput"; +export { ValueSelect } from "./components/key-value-form/ValueSelect"; +export { ClickableCard } from "./components/keycloak-card/ClickableCard"; +export { KeycloakCard } from "./components/keycloak-card/KeycloakCard"; +export { KeycloakSpinner } from "./components/keycloak-spinner/KeycloakSpinner"; +export { ListEmptyState } from "./components/list-empty-state/ListEmptyState"; +export { MultiLineInput } from "./components/multi-line-input/MultiLineInput"; +export { PermissionsTab } from "./components/permission-tab/PermissionTab"; +export { RealmSelector } from "./components/realm-selector/RealmSelector"; +export { RoleForm } from "./components/role-form/RoleForm"; +export { AddRoleMappingModal } from "./components/role-mapping/AddRoleMappingModal"; +export { RoleMapping } from "./components/role-mapping/RoleMapping"; +export { RolesList } from "./components/roles-list/RolesList"; +export { RoutableTabs } from "./components/routable-tabs/RoutableTabs"; +export { KeycloakDataTable } from "./components/table-toolbar/KeycloakDataTable"; +export { PaginatingTableToolbar } from "./components/table-toolbar/PaginatingTableToolbar"; +export { TableToolbar } from "./components/table-toolbar/TableToolbar"; +export { TimeSelector } from "./components/time-selector/TimeSelector"; +export { TimeSelectorControl } from "./components/time-selector/TimeSelectorControl"; +export { TimeSelectorForm } from "./components/time-selector/TimeSelectorForm"; +export { UserDataTable } from "./components/users/UserDataTable"; +export { UserDataTableAttributeSearchForm } from "./components/users/UserDataTableAttributeSearchForm"; +export { UserDataTableToolbarItems } from "./components/users/UserDataTableToolbarItems"; +export { ViewHeader } from "./components/view-header/ViewHeader"; +export { WizardSectionHeader } from "./components/wizard-section-header/WizardSectionHeader"; +export { DefaultSwitchControl } from "./components/SwitchControl"; +export { useAccess, AccessContext } from "./context/access/Access"; +export { fetchAdminUI } from "./context/auth/admin-ui-endpoint"; +export { + useRealm, + RealmContextProvider, +} from "./context/realm-context/RealmContext"; +export { + useServerInfo, + ServerInfoProvider, +} from "./context/server-info/ServerInfoProvider"; +export { useWhoAmI, WhoAmIContextProvider } from "./context/whoami/WhoAmI"; +export { + useErrorBoundary, + ErrorBoundaryProvider, +} from "./context/ErrorBoundary"; +export { useRecentRealms, RecentRealmsProvider } from "./context/RecentRealms"; +export * as DashboardSection from "./dashboard/Dashboard"; +export { ProviderInfo } from "./dashboard/ProviderInfo"; +export { AdminEvents } from "./events/AdminEvents"; +export * as EventsSection from "./events/EventsSection"; +export { ResourceLink } from "./events/ResourceLinks"; +export { CheckableTreeView } from "./groups/components/CheckableTreeView"; +export { DeleteGroup } from "./groups/components/DeleteGroup"; +export { GroupToolbar } from "./groups/components/GroupToolbar"; +export { GroupTree } from "./groups/components/GroupTree"; +export { MoveDialog } from "./groups/components/MoveDialog"; +export { GroupAttributes } from "./groups/GroupAttributes"; +export { GroupRoleMapping } from "./groups/GroupRoleMapping"; +export { GroupsModal } from "./groups/GroupsModal"; +export * as GroupsSection from "./groups/GroupsSection"; +export { GroupTable } from "./groups/GroupTable"; +export { Members } from "./groups/Members"; +export { MemberModal } from "./groups/MembersModal"; +export { useSubGroups, SubGroups } from "./groups/SubGroupsContext"; +export * as AddIdentyProvider from "./identity-providers/add/AddIdentityProvider"; +export * as AddMapper from "./identity-providers/add/AddMapper"; +export { AddMapperForm } from "./identity-providers/add/AddMapperForm"; +export * as AddOpenIdConnect from "./identity-providers/add/AddOpenIdConnect"; +export * as AddSamlConnect from "./identity-providers/add/AddSamlConnect"; +export { AdvancedSettings as IdpAdvancedSettings } from "./identity-providers/add/AdvancedSettings"; +export { DescriptorSettings } from "./identity-providers/add/DescriptorSettings"; +export * as DetailSettings from "./identity-providers/add/DetailSettings"; +export { DiscoverySettings } from "./identity-providers/add/DiscoverySettings"; +export { ExtendedNonDiscoverySettings } from "./identity-providers/add/ExtendedNonDiscoverySettings"; +export { GeneralSettings as IdpGeneralSettings } from "./identity-providers/add/GeneralSettings"; +export { OIDCAuthentication } from "./identity-providers/add/OIDCAuthentication"; +export { OIDCGeneralSettings } from "./identity-providers/add/OIDCGeneralSettings"; +export { OpenIdConnectSettings } from "./identity-providers/add/OpenIdConnectSettings"; +export { ReqAuthnConstraints } from "./identity-providers/add/ReqAuthnConstraintsSettings"; +export { SamlConnectSettings } from "./identity-providers/add/SamlConnectSettings"; +export { SamlGeneralSettings } from "./identity-providers/add/SamlGeneralSettings"; +export { ClientIdSecret } from "./identity-providers/component/ClientIdSecret"; +export { DiscoveryEndpointField } from "./identity-providers/component/DiscoveryEndpointField"; +export { DisplayOrder } from "./identity-providers/component/DisplayOrder"; +export { FormGroupField } from "./identity-providers/component/FormGroupField"; +export { RedirectUrl } from "./identity-providers/component/RedirectUrl"; +export { SwitchField } from "./identity-providers/component/SwitchField"; +export { TextField } from "./identity-providers/component/TextField"; +export * as IdentityProvidersSection from "./identity-providers/IdentityProvidersSection"; +export { ManageOrderDialog } from "./identity-providers/ManageOrderDialog"; +export { DetailOrganizationHeader } from "./organizations/DetailOraganzationHeader"; +export { IdentityProviders as OrganizationIdentityProviders } from "./organizations/IdentityProviders"; +export { InviteMemberModal } from "./organizations/InviteMemberModal"; +export { LinkIdentityProviderModal } from "./organizations/LinkIdentityProviderModal"; +export { Members as OrganizationMembers } from "./organizations/Members"; +export { OrganizationForm } from "./organizations/OrganizationForm"; +export * as OrganizationSection from "./organizations/OrganizationsSection"; +export * as Page from "./page/Page"; +export { PageHandler } from "./page/PageHandler"; +export * as PageList from "./page/PageList"; +export * as NewRealmForm from "./realm/add/NewRealmForm"; +export * as CreateRealmRole from "./realm-roles/CreateRealmRole"; +export * as RealmRolesSection from "./realm-roles/RealmRolesSection"; +export * as RealmRoleTabs from "./realm-roles/RealmRoleTabs"; +export { UsersInRoleTab } from "./realm-roles/UsersInRoleTab"; +export { AddEventTypesDialog } from "./realm-settings/event-config/AddEventTypesDialog"; +export { EventConfigForm } from "./realm-settings/event-config/EventConfigForm"; +export { EventListenersForm } from "./realm-settings/event-config/EventListenersForm"; +export { EventsTab } from "./realm-settings/event-config/EventsTab"; +export { EventsTypeTable } from "./realm-settings/event-config/EventsTypeTable"; +export { KeyProviderForm } from "./realm-settings/keys/key-providers/KeyProviderForm"; +export { KeyProviderModal } from "./realm-settings/keys/key-providers/KeyProviderModal"; +export { KeyProvidersPicker } from "./realm-settings/keys/key-providers/KeyProvidersPicker"; +export { KeysListTab } from "./realm-settings/keys/KeysListTab"; +export { KeysProvidersTab } from "./realm-settings/keys/KeysProvidersTab"; +export { KeysTab } from "./realm-settings/keys/KeysTab"; +export { EffectiveMessageBundles } from "./realm-settings/localization/EffectiveMessageBundles"; +export { LocalizationTab } from "./realm-settings/localization/LocalizationTab"; +export { RealmOverrides } from "./realm-settings/localization/RealmOverrides"; +export { BruteForceDetection } from "./realm-settings/security-defences/BruteForceDetection"; +export { HeadersForm } from "./realm-settings/security-defences/HeadersForm"; +export { HelpLinkTextInput } from "./realm-settings/security-defences/HelpLinkTextInput"; +export { SecurityDefenses } from "./realm-settings/security-defences/SecurityDefenses"; +export { Time } from "./realm-settings/security-defences/Time"; +export { AddTranslationsDialog } from "./realm-settings/user-profile/attribute/AddTranslationsDialog"; +export { AddValidatorDialog } from "./realm-settings/user-profile/attribute/AddValidatorDialog"; +export { AttributeAnnotations } from "./realm-settings/user-profile/attribute/AttributeAnnotations"; +export { AttributeGeneralSettings } from "./realm-settings/user-profile/attribute/AttributeGeneralSettings"; +export { AttributePermission } from "./realm-settings/user-profile/attribute/AttributePermission"; +export { AttributeValidations } from "./realm-settings/user-profile/attribute/AttributeValidations"; +export { ValidatorSelect } from "./realm-settings/user-profile/attribute/ValidatorSelect"; +export * as AttributesGroupDetails from "./realm-settings/user-profile/AttributesGroupDetails"; +export * as AttributesGroupForm from "./realm-settings/user-profile/AttributesGroupForm"; +export { AttributesGroupTab } from "./realm-settings/user-profile/AttributesGroupTab"; +export { AttributesTab } from "./realm-settings/user-profile/AttributesTab"; +export { JsonEditorTab } from "./realm-settings/user-profile/JsonEditorTab"; +export { + UserProfileContext, + useUserProfile, +} from "./realm-settings/user-profile/UserProfileContext"; +export { UserProfileTab } from "./realm-settings/user-profile/UserProfileTab"; +export { AddClientProfileModal } from "./realm-settings/AddClientProfileModal"; +export { AddTranslationModal } from "./realm-settings/AddTranslationModal"; +export * as ClientProfileForm from "./realm-settings/ClientProfileForm"; +export * as DefaultGroupsTab from "./realm-settings/DefaultGroupsTab"; +export { RealmSettingsEmailTab } from "./realm-settings/EmailTab"; +export { RealmSettingsGeneralTab } from "./realm-settings/GeneralTab"; +export { RealmSettingsLoginTab } from "./realm-settings/LoginTab"; +export * as NewAttributeSettings from "./realm-settings/NewAttributeSettings"; +export * as NewClientPolicy from "./realm-settings/NewClientPolicy"; +export * as NewClientPolicyCondition from "./realm-settings/NewClientPolicyCondition"; +export { PartialExportDialog } from "./realm-settings/PartialExport"; +export { PartialImportDialog } from "./realm-settings/PartialImport"; +export { PoliciesTab } from "./realm-settings/PoliciesTab"; +export * as RealmSettingsSection from "./realm-settings/RealmSettingsSection"; +export { RealmSettingsTabs } from "./realm-settings/RealmSettingsTabs"; +export { RealmSettingsSessionsTab } from "./realm-settings/SessionsTab"; +export { RealmSettingsThemesTab } from "./realm-settings/ThemesTab"; +export { RealmSettingsTokensTab } from "./realm-settings/TokensTab"; +export { UserRegistration } from "./realm-settings/UserRegistration"; +export { RevocationModal } from "./sessions/RevocationModal"; +export * as SessionsSection from "./sessions/SessionsSection"; +export * as SessionsTable from "./sessions/SessionsTable"; +export { + SearchDropdown as UserSearchDropdown, + SearchToolbar, +} from "./user/details/SearchFilter"; +export { CredentialDataDialog } from "./user/user-credentials/CredentialDataDialog"; +export { CredentialRow } from "./user/user-credentials/CredentialRow"; +export { InlineLabelEdit } from "./user/user-credentials/InlineLabelEdit"; +export { LifespanField } from "./user/user-credentials/LifespanField"; +export { RequiredActionMultiSelect } from "./user/user-credentials/RequiredActionMultiSelect"; +export { ResetCredentialDialog } from "./user/user-credentials/ResetCredentialDialog"; +export { ResetPasswordDialog } from "./user/user-credentials/ResetPasswordDialog"; +export * as CreateUser from "./user/CreateUser"; +export * as EditUser from "./user/EditUser"; +export { FederatedUserLink } from "./user/FederatedUserLink"; +export { UserAttributes } from "./user/UserAttributes"; +export { UserConsents } from "./user/UserConsents"; +export { UserCredentials } from "./user/UserCredentials"; +export { UserForm } from "./user/UserForm"; +export { UserGroups } from "./user/UserGroups"; +export { UserIdentityProviderLinks } from "./user/UserIdentityProviderLinks"; +export { UserIdpModal } from "./user/UserIdPModal"; +export { UserRoleMapping } from "./user/UserRoleMapping"; +export { UserSessions } from "./user/UserSessions"; +export * as UserSection from "./user/UsersSection"; +export * as CustomProviderSettings from "./user-federation/custom/CustomProviderSettings"; +export { KerberosSettingsRequired } from "./user-federation/kerberos/KerberosSettingsRequired"; +export * as LdapMapperDetails from "./user-federation/ldap/mappers/LdapMapperDetails"; +export { LdapMapperList } from "./user-federation/ldap/mappers/LdapMapperList"; +export { LdapSettingsAdvanced } from "./user-federation/ldap/LdapSettingsAdvanced"; +export { LdapSettingsConnection } from "./user-federation/ldap/LdapSettingsConnection"; +export { LdapSettingsGeneral } from "./user-federation/ldap/LdapSettingsGeneral"; +export { LdapSettingsKerberosIntegration } from "./user-federation/ldap/LdapSettingsKerberosIntegration"; +export { LdapSettingsSearching } from "./user-federation/ldap/LdapSettingsSearching"; +export { LdapSettingsSynchronization } from "./user-federation/ldap/LdapSettingsSynchronization"; +export { ExtendedHeader } from "./user-federation/shared/ExtendedHeader"; +export { Header as UserFederationHeader } from "./user-federation/shared/Header"; +export { SettingsCache } from "./user-federation/shared/SettingsCache"; +export * as CreateUserFederationLdapSettings from "./user-federation/CreateUserFederationLdapSettings"; +export { ManagePriorityDialog } from "./user-federation/ManagePriorityDialog"; +export * as UserFederationKerberosSettings from "./user-federation/UserFederationKerberosSettings"; +export { UserFederationKerberosWizard } from "./user-federation/UserFederationKerberosWizard"; +export { UserFederationLdapForm } from "./user-federation/UserFederationLdapForm"; +export * as UserFederationLdapSettings from "./user-federation/UserFederationLdapSettings"; +export { UserFederationLdapWizard } from "./user-federation/UserFederationLdapWizard"; +export * as UserFederationSection from "./user-federation/UserFederationSection"; +export { ForbiddenSection } from "./ForbiddenSection"; +export { Header } from "./PageHeader"; +export { PageNav } from "./PageNav"; +export { PageNotFoundSection } from "./PageNotFoundSection"; +export { App as AdminUi } from "./App"; +export type { Environment as AccountEnvironment } from "./environment"; +export { KeycloakProvider, useEnvironment } from "@keycloak/keycloak-ui-shared"; diff --git a/js/apps/admin-ui/vite.config.ts b/js/apps/admin-ui/vite.config.ts index fe229c3307a..b039718021b 100644 --- a/js/apps/admin-ui/vite.config.ts +++ b/js/apps/admin-ui/vite.config.ts @@ -1,34 +1,58 @@ -import { defineConfig } from "vitest/config"; import react from "@vitejs/plugin-react-swc"; +import path from "path"; +import { defineConfig, loadEnv } from "vite"; import { checker } from "vite-plugin-checker"; +import dts from "vite-plugin-dts"; // https://vitejs.dev/config/ -export default defineConfig({ - base: "", - server: { - origin: "http://localhost:5174", - port: 5174, - }, - build: { - outDir: "target/classes/theme/keycloak.v2/admin/resources", - sourcemap: true, - target: "esnext", - modulePreload: false, - cssMinify: "lightningcss", - manifest: true, - rollupOptions: { - input: "src/main.tsx", - external: ["react", "react/jsx-runtime", "react-dom"], - }, - }, - plugins: [react(), checker({ typescript: true })], - test: { - watch: false, - environment: "jsdom", +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), ""); + const external = ["react", "react/jsx-runtime", "react-dom"]; + const plugins = [react(), checker({ typescript: true })]; + const input = env.LIB ? undefined : "src/main.tsx"; + if (env.LIB) { + external.push("react-router-dom"); + external.push("react-i18next"); + plugins.push(dts({ insertTypesEntry: true })); + } + const lib = env.LIB + ? { + outDir: "lib", + lib: { + entry: path.resolve(__dirname, "src/index.ts"), + formats: ["es"], + }, + } + : { + outDir: "target/classes/theme/keycloak.v2/admin/resources", + }; + return { + base: "", server: { - deps: { - inline: [/@patternfly\/.*/], + origin: "http://localhost:5174", + port: 5174, + }, + build: { + ...lib, + sourcemap: true, + target: "esnext", + modulePreload: false, + cssMinify: "lightningcss", + manifest: true, + rollupOptions: { + input, + external, }, }, - }, + plugins, + test: { + watch: false, + environment: "jsdom", + server: { + deps: { + inline: [/@patternfly\/.*/], + }, + }, + }, + }; }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b6c7166a002..995f0032236 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: version: 5.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) admin-ui: specifier: 'file:' - version: file:js/apps/admin-ui(@types/react@18.3.3) + version: '@keycloak/keycloak-admin-ui@file:js/apps/admin-ui(@types/react@18.3.3)' dagre: specifier: ^0.8.5 version: 0.8.5 @@ -282,7 +282,7 @@ importers: version: 1.25.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.5.7)(@types/node@20.14.9)(typescript@5.5.2) + version: 10.9.2(@swc/core@1.5.7)(@types/node@20.14.9)(typescript@5.5.3) uuid: specifier: ^10.0.0 version: 10.0.0 @@ -291,7 +291,10 @@ importers: version: 5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0) vite-plugin-checker: specifier: ^0.7.0 - version: 0.7.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.5.2)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0)) + version: 0.7.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0)) + vite-plugin-dts: + specifier: ^3.9.1 + version: 3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0)) vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@20.14.9)(jsdom@24.1.0)(lightningcss@1.25.1)(terser@5.31.0) @@ -1048,6 +1051,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@keycloak/keycloak-admin-ui@file:js/apps/admin-ui': + resolution: {directory: js/apps/admin-ui, type: directory} + '@microsoft/api-extractor-model@7.28.13': resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} @@ -1661,9 +1667,6 @@ packages: '@types/mocha@10.0.7': resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} - '@types/node@20.14.8': - resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} - '@types/node@20.14.9': resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} @@ -1853,9 +1856,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - admin-ui@file:js/apps/admin-ui: - resolution: {directory: js/apps/admin-ui, type: directory} - agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} @@ -3936,6 +3936,10 @@ packages: peerDependencies: postcss: ^8.2.9 + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.4.39: resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} @@ -4633,11 +4637,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.5.3: resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} @@ -5454,7 +5453,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -5490,7 +5489,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5539,6 +5538,40 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@keycloak/keycloak-admin-ui@file:js/apps/admin-ui(@types/react@18.3.3)': + dependencies: + '@keycloak/keycloak-admin-client': link:js/libs/keycloak-admin-client + '@keycloak/keycloak-ui-shared': link:js/libs/ui-shared + '@patternfly/patternfly': 5.3.1 + '@patternfly/react-code-editor': 5.3.3(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-core': 5.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-icons': 5.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-styles': 5.3.1 + '@patternfly/react-table': 5.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + dagre: 0.8.5 + file-saver: 2.0.5 + file-selector: 0.6.0 + flat: 6.0.1 + i18next: 23.11.5 + i18next-http-backend: 2.5.2 + keycloak-js: link:js/libs/keycloak-js + lodash-es: 4.17.21 + monaco-editor: 0.50.0 + p-debounce: 4.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-dropzone: 14.2.3(react@18.3.1) + react-hook-form: 7.52.1(react@18.3.1) + react-i18next: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router-dom: 6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + reactflow: 11.11.4(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-react-router-breadcrumbs: 4.0.1(react-router-dom@6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - encoding + - immer + - react-native + '@microsoft/api-extractor-model@7.28.13(@types/node@20.14.9)': dependencies: '@microsoft/tsdoc': 0.14.2 @@ -6175,7 +6208,7 @@ snapshots: '@types/gunzip-maybe@1.4.2': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/lodash-es@4.17.12': dependencies: @@ -6185,10 +6218,6 @@ snapshots: '@types/mocha@10.0.7': {} - '@types/node@20.14.8': - dependencies: - undici-types: 5.26.5 - '@types/node@20.14.9': dependencies: undici-types: 5.26.5 @@ -6212,7 +6241,7 @@ snapshots: '@types/tar-fs@2.0.4': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/tar-stream': 3.1.3 '@types/tar-stream@3.1.3': @@ -6250,7 +6279,7 @@ snapshots: '@typescript-eslint/types': 7.14.1 '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.3) '@typescript-eslint/visitor-keys': 7.14.1 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.5.3 @@ -6266,7 +6295,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.3) '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: @@ -6278,17 +6307,17 @@ snapshots: '@typescript-eslint/types@7.14.1': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.1 - tsutils: 3.21.0(typescript@5.5.2) + tsutils: 3.21.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6296,7 +6325,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.14.1 '@typescript-eslint/visitor-keys': 7.14.1 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -6436,43 +6465,9 @@ snapshots: acorn@8.11.3: {} - admin-ui@file:js/apps/admin-ui(@types/react@18.3.3): - dependencies: - '@keycloak/keycloak-admin-client': link:js/libs/keycloak-admin-client - '@keycloak/keycloak-ui-shared': link:js/libs/ui-shared - '@patternfly/patternfly': 5.3.1 - '@patternfly/react-code-editor': 5.3.3(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@patternfly/react-core': 5.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@patternfly/react-icons': 5.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@patternfly/react-styles': 5.3.1 - '@patternfly/react-table': 5.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - dagre: 0.8.5 - file-saver: 2.0.5 - file-selector: 0.6.0 - flat: 6.0.1 - i18next: 23.11.5 - i18next-http-backend: 2.5.2 - keycloak-js: link:js/libs/keycloak-js - lodash-es: 4.17.21 - monaco-editor: 0.50.0 - p-debounce: 4.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-dropzone: 14.2.3(react@18.3.1) - react-hook-form: 7.52.1(react@18.3.1) - react-i18next: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router-dom: 6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - reactflow: 11.11.4(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - use-react-router-breadcrumbs: 4.0.1(react-router-dom@6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - encoding - - immer - - react-native - agent-base@7.1.1: dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7127,7 +7122,7 @@ snapshots: commander: 10.0.1 filing-cabinet: 4.2.0 precinct: 11.0.5 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -7154,8 +7149,8 @@ snapshots: detective-postcss@6.1.3: dependencies: is-url: 1.2.4 - postcss: 8.4.39 - postcss-values-parser: 6.0.2(postcss@8.4.39) + postcss: 8.4.38 + postcss-values-parser: 6.0.2(postcss@8.4.38) detective-sass@5.0.3: dependencies: @@ -7171,10 +7166,10 @@ snapshots: detective-typescript@11.2.0: dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) ast-module-types: 5.0.0 node-source-walk: 6.0.2 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -7671,7 +7666,7 @@ snapshots: sass-lookup: 5.0.1 stylus-lookup: 5.0.1 tsconfig-paths: 4.2.0 - typescript: 5.5.2 + typescript: 5.5.3 fill-range@7.0.1: dependencies: @@ -7704,7 +7699,7 @@ snapshots: '@babel/parser': 7.24.5 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) acorn-walk: 8.3.2 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 simple-bin-help: 1.8.0 transitivePeerDependencies: @@ -8767,13 +8762,19 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-values-parser@6.0.2(postcss@8.4.39): + postcss-values-parser@6.0.2(postcss@8.4.38): dependencies: color-name: 1.1.4 is-url-superb: 4.0.0 - postcss: 8.4.39 + postcss: 8.4.38 quote-unquote: 1.0.0 + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + postcss@8.4.39: dependencies: nanoid: 3.3.7 @@ -9216,7 +9217,7 @@ snapshots: spec-change@1.11.1: dependencies: arg: 5.0.2 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.4(supports-color@8.1.1) deep-equal: 2.2.3 dependency-tree: 10.0.9 globby: 11.1.0 @@ -9439,26 +9440,6 @@ snapshots: dependencies: typescript: 5.5.3 - ts-node@10.9.2(@swc/core@1.5.7)(@types/node@20.14.9)(typescript@5.5.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.9 - acorn: 8.11.3 - acorn-walk: 8.3.2 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.5.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.5.7 - ts-node@10.9.2(@swc/core@1.5.7)(@types/node@20.14.9)(typescript@5.5.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -9491,10 +9472,10 @@ snapshots: tslib@2.6.3: {} - tsutils@3.21.0(typescript@5.5.2): + tsutils@3.21.0(typescript@5.5.3): dependencies: tslib: 1.14.1 - typescript: 5.5.2 + typescript: 5.5.3 tsx@4.9.3: dependencies: @@ -9566,8 +9547,6 @@ snapshots: typescript@5.4.2: {} - typescript@5.5.2: {} - typescript@5.5.3: {} ufo@1.5.3: {} @@ -9666,29 +9645,6 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.7.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.5.2)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0)): - dependencies: - '@babel/code-frame': 7.24.2 - '@volar/typescript': 2.3.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - chokidar: 3.6.0 - commander: 8.3.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - npm-run-path: 4.0.1 - strip-ansi: 6.0.1 - tiny-invariant: 1.3.3 - vite: 5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0) - vscode-languageclient: 7.0.0 - vscode-languageserver: 7.0.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 - optionalDependencies: - eslint: 8.57.0 - optionator: 0.9.4 - typescript: 5.5.2 - vite-plugin-checker@0.7.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.0)): dependencies: '@babel/code-frame': 7.24.2