make admin-ui build as a library (#30268)

* make admin-ui build as a library

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

* fix merge errors

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

* fix input

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

* added null check

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

* renamed workspace

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

* PR review

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

---------

Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>
This commit is contained in:
Erik Jan de Wit 2024-07-05 18:48:10 +02:00 committed by GitHub
parent 4edbd1549e
commit 0caca2d6f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 591 additions and 218 deletions

View file

@ -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]

View file

@ -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";
//...

View file

@ -70,6 +70,7 @@ export const PersonalInfo = () => {
);
await savePersonalInfo(context, { ...user, attributes });
const locale = attributes["locale"]?.toString();
if (locale)
i18n.changeLanguage(locale, (error) => {
if (error) {
console.warn("Error(s) loading locale", locale, error);

View file

@ -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)

View file

@ -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).
<KeycloakProvider environment={{
authServerUrl: "http://localhost:8080",
realm: "master",
clientId: "security-admin-console"
}}>
{/* rest of you application */}
</KeycloakProvider>
```
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<string, string> = {};
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
LIB=true pnpm run build
```
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)

View file

@ -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"
}
}

View file

@ -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";

View file

@ -1,27 +1,50 @@
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({
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: {
origin: "http://localhost:5174",
port: 5174,
},
build: {
outDir: "target/classes/theme/keycloak.v2/admin/resources",
...lib,
sourcemap: true,
target: "esnext",
modulePreload: false,
cssMinify: "lightningcss",
manifest: true,
rollupOptions: {
input: "src/main.tsx",
external: ["react", "react/jsx-runtime", "react-dom"],
input,
external,
},
},
plugins: [react(), checker({ typescript: true })],
plugins,
test: {
watch: false,
environment: "jsdom",
@ -31,4 +54,5 @@ export default defineConfig({
},
},
},
};
});

View file

@ -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