diff --git a/.gitignore b/.gitignore index b402cf0e..a6448f02 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node .factorypath .project .settings/ +.playwright-mcp/ \ No newline at end of file diff --git a/README.md b/README.md index 88fe993b..4e877762 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,32 @@ In addition to providing support for Identity Providers using OIDC and SAML, the ![youtube-video-gif](https://github.com/p2-inc/idp-wizard/assets/244253/e9b421c0-b487-4c07-9eed-87ea89fc574b) +## Repository structure + +This is a pnpm workspace monorepo. The frontend apps live under `apps/`, the Java Keycloak SPI extension lives under `ext/`, and the Maven build at the root packages everything into a deployable JAR. + +``` +idp-wizard/ +├── apps/ +│ ├── wizard-v1/ # Original PatternFly + webpack app (current production build) +│ └── wizard-v2/ # New Vite + Tailwind + shadcn + TanStack Router app (in development) +│ ├── docker/ # Dev Keycloak setup with pre-configured realm and client +│ ├── public/ # Static assets (favicons, logos, provider images, wizard screenshots) +│ ├── src/ # Application source +│ └── wizards/ # Declarative JSON wizard definitions +├── ext/ # Java Keycloak SPI extension +├── pom.xml # Maven build — packages the active frontend into a Keycloak JAR +└── pnpm-workspace.yaml +``` + +### wizard-v1 + +The original implementation. Each identity provider has its own set of per-step React components built on PatternFly 4. This is the currently deployed version. + +### wizard-v2 + +A rewrite in progress. Wizards are defined declaratively as JSON files (see `apps/wizard-v2/wizards/`) and rendered by a generic runtime engine, eliminating the need for per-provider component trees. Built with Vite, Tailwind CSS, shadcn/ui, TanStack Router, and oidc-spa for authentication. See [apps/wizard-v2/README.md](apps/wizard-v2/README.md) for full details. + ## Quick start The easiest way to get started is our [Docker image](https://quay.io/repository/phasetwo/phasetwo-keycloak?tab=info). Documentation and examples for using it are in the [phasetwo-containers](https://github.com/p2-inc/phasetwo-containers) repo. The most recent version of this extension is included. @@ -34,7 +60,9 @@ There are some reasonable defaults used for the configuration, but the behavior ## Building and installing -This uses the `frontend-maven-plugin` to build UI code and then packages it as a jar file that can be installed as an extension in Keycloak. Checkout this project and run `mvn package`, which will produce a jar in the `target/` directory. Place the jar in the `providers` dir of your Keycloak distribution. +This uses the `frontend-maven-plugin` to build the active frontend app and packages it as a JAR that can be installed as a Keycloak extension. Run `mvn package` from the repo root, which produces a JAR in `target/`. Place it in the `providers/` directory of your Keycloak distribution. + +The `pom.xml` `workingDirectory` controls which app is built. It currently points at `apps/wizard-v1`. When wizard-v2 is ready for production this will be updated to `apps/wizard-v2`. ### Dependencies @@ -78,47 +106,44 @@ Note: By submitting any code, documentation, or other materials submitted to thi ### Working with the code -Run the latest version of the Phase Two enhanced Keycloak distribution: +#### wizard-v1 (current) + +Run the Phase Two Keycloak distribution, create a realm, and in the `idp-wizard` client configuration update the redirect URI to `http://localhost:9090/*` and add `http://localhost:9090` to Web Origins. Download the client's `keycloak.json` and place it in `apps/wizard-v1/src/keycloak.json`. + +Using the wizard at a different relative path than `/auth`? Update the following: + +- `RELATIVE_PATH` within [routes.tsx](./apps/wizard-v1/src/app/routes.tsx) +- `wizard.ftl` ([login](./ext/main/resources/theme/wizard/login/wizard.ftl), [templates](./ext/main/resources/theme-resources/templates/wizard.ftl)) ` stats.json", + "clean": "rimraf dist" + }, + "dependencies": { + "@keycloak/keycloak-admin-client": "26.5.7", + "@patternfly/patternfly": "^4.224.5", + "@patternfly/react-core": "^4.278.1", + "@patternfly/react-icons": "^4.93.7", + "@patternfly/react-styles": "^4.92.8", + "@patternfly/react-table": "^4.113.7", + "@react-keycloak/web": "^3.4.0", + "@reduxjs/toolkit": "^1.9.7", + "axios": "^1.14.0", + "classnames": "^2.5.1", + "formik": "^2.4.9", + "keycloak-js": "^25.0.6", + "lodash": "^4.17.23", + "nanoid": "^3.3.11", + "nanoid-dictionary": "^4.3.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-hot-toast": "^2.6.0", + "react-redux": "^7.2.9", + "react-router-dom": "^6.30.3", + "react-use": "^17.6.0", + "redux-persist": "^6.0.0", + "sirv-cli": "^1.0.14", + "yup": "^0.32.11" + }, + "devDependencies": { + "@types/enzyme": "^3.10.19", + "@types/jest": "^30.0.0", + "@types/victory": "^33.1.5", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "@wojtekmaj/enzyme-adapter-react-17": "^0.6.7", + "astroturf": "^1.2.0", + "autoprefixer": "^10.4.27", + "copy-webpack-plugin": "^9.1.0", + "css-loader": "^5.2.7", + "css-minimizer-webpack-plugin": "^3.4.1", + "dotenv-webpack": "^7.1.1", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.8", + "enzyme-to-json": "^3.6.2", + "eslint": "^7.32.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^4.6.2", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.6.6", + "imagemin": "^8.0.1", + "jest": "^30.3.0", + "jest-environment-jsdom": "^30.3.0", + "mini-css-extract-plugin": "^1.6.2", + "postcss": "^8.5.8", + "postcss-loader": "^6.2.1", + "postcss-nested": "^7.0.2", + "prettier": "^2.8.8", + "prop-types": "^15.8.1", + "raw-loader": "^4.0.2", + "react-axe": "^3.5.4", + "react-docgen-typescript-loader": "^3.7.2", + "regenerator-runtime": "^0.13.11", + "rimraf": "^3.0.2", + "style-loader": "^2.0.0", + "svg-url-loader": "^7.1.1", + "terser-webpack-plugin": "^5.4.0", + "ts-jest": "^29.4.9", + "ts-loader": "^9.5.4", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "tslib": "^2.8.1", + "typescript": "^4.9.5", + "url-loader": "^4.1.1", + "webpack": "^5.105.4", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.3", + "webpack-merge": "^5.10.0" + } +} diff --git a/postcss.config.js b/apps/wizard-v1/postcss.config.js similarity index 100% rename from postcss.config.js rename to apps/wizard-v1/postcss.config.js diff --git a/src/app/AppLayout/AppLayout.tsx b/apps/wizard-v1/src/app/AppLayout/AppLayout.tsx similarity index 100% rename from src/app/AppLayout/AppLayout.tsx rename to apps/wizard-v1/src/app/AppLayout/AppLayout.tsx diff --git a/src/app/NotFound/NotFound.tsx b/apps/wizard-v1/src/app/NotFound/NotFound.tsx similarity index 100% rename from src/app/NotFound/NotFound.tsx rename to apps/wizard-v1/src/app/NotFound/NotFound.tsx diff --git a/src/app/Settings/General/GeneralSettings.tsx b/apps/wizard-v1/src/app/Settings/General/GeneralSettings.tsx similarity index 100% rename from src/app/Settings/General/GeneralSettings.tsx rename to apps/wizard-v1/src/app/Settings/General/GeneralSettings.tsx diff --git a/src/app/Settings/Profile/ProfileSettings.tsx b/apps/wizard-v1/src/app/Settings/Profile/ProfileSettings.tsx similarity index 100% rename from src/app/Settings/Profile/ProfileSettings.tsx rename to apps/wizard-v1/src/app/Settings/Profile/ProfileSettings.tsx diff --git a/src/app/__snapshots__/app.test.tsx.snap b/apps/wizard-v1/src/app/__snapshots__/app.test.tsx.snap similarity index 100% rename from src/app/__snapshots__/app.test.tsx.snap rename to apps/wizard-v1/src/app/__snapshots__/app.test.tsx.snap diff --git a/src/app/components/AccessDenied/AccessDenied.tsx b/apps/wizard-v1/src/app/components/AccessDenied/AccessDenied.tsx similarity index 100% rename from src/app/components/AccessDenied/AccessDenied.tsx rename to apps/wizard-v1/src/app/components/AccessDenied/AccessDenied.tsx diff --git a/src/app/components/Dashboard/ActivityLog.tsx b/apps/wizard-v1/src/app/components/Dashboard/ActivityLog.tsx similarity index 100% rename from src/app/components/Dashboard/ActivityLog.tsx rename to apps/wizard-v1/src/app/components/Dashboard/ActivityLog.tsx diff --git a/src/app/components/Dashboard/ConnectionStatus.tsx b/apps/wizard-v1/src/app/components/Dashboard/ConnectionStatus.tsx similarity index 100% rename from src/app/components/Dashboard/ConnectionStatus.tsx rename to apps/wizard-v1/src/app/components/Dashboard/ConnectionStatus.tsx diff --git a/src/app/components/Dashboard/Dashboard.tsx b/apps/wizard-v1/src/app/components/Dashboard/Dashboard.tsx similarity index 100% rename from src/app/components/Dashboard/Dashboard.tsx rename to apps/wizard-v1/src/app/components/Dashboard/Dashboard.tsx diff --git a/src/app/components/Dashboard/DashboardSummary.tsx b/apps/wizard-v1/src/app/components/Dashboard/DashboardSummary.tsx similarity index 100% rename from src/app/components/Dashboard/DashboardSummary.tsx rename to apps/wizard-v1/src/app/components/Dashboard/DashboardSummary.tsx diff --git a/src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdPProtocolSelector.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdPProtocolSelector.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdPProtocolSelector.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdPProtocolSelector.tsx diff --git a/src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdentityProviderSelector.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdentityProviderSelector.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdentityProviderSelector.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/IdentityProviderSelector/IdentityProviderSelector.tsx diff --git a/src/app/components/IdentityProviderWizard/IdentityProviderSelector/components/IdPButton.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/IdentityProviderSelector/components/IdPButton.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/IdentityProviderSelector/components/IdPButton.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/IdentityProviderSelector/components/IdPButton.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/ADFS/saml/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/AWS/saml/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/client-credentials.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/client-credentials.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/client-credentials.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/client-credentials.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/OIDC/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Auth0/shared/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Cloudflare/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/CyberArk/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Duo/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/bind.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/bind.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/bind.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/bind.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/server-configuration.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/server-configuration.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/server-configuration.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/forms/server-configuration.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/LDAP/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/client-credentials.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/client-credentials.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/client-credentials.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/client-credentials.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/config.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/config.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/config.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/config.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/OIDC/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/metadata-config.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/metadata-config.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/metadata-config.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/forms/metadata-config.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/SAML/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Generic/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/6.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/6.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/6.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/6.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/SAML/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Google/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Google/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/JumpCloud/saml/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/LastPass/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/MSFT_EntraID/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/bind.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/bind.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/bind.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/bind.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/groups.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/groups.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/groups.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/groups.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/server-configuration.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/server-configuration.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/server-configuration.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/forms/server-configuration.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/LDAP/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/6.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/6.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/6.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/6.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Okta/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/OneLogin/saml/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Oracle/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/PingOne/saml/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/2.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/2.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/2.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/2.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/client-credentials.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/client-credentials.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/client-credentials.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/client-credentials.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/OIDC/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/3.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/3.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/3.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/3.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/4.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/4.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/4.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/4.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/5.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/5.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/5.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/5.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/6.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/6.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/6.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/6.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/SAML/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/ConnectedApp.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/ConnectedApp.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/ConnectedApp.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/ConnectedApp.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/Salesforce/shared/Steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/template/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/template/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/index.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/index.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/index.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/index.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/1.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/1.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/1.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/1.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/Providers/template/protocol/steps/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/clipboard-copy.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/clipboard-copy.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/clipboard-copy.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/clipboard-copy.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/double-item-clipboard-copy.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/double-item-clipboard-copy.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/double-item-clipboard-copy.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/double-item-clipboard-copy.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/file-card.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/file-card.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/file-card.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/file-card.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/final-step-confirmation.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/final-step-confirmation.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/final-step-confirmation.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/final-step-confirmation.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/forms/file-text.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/file-text.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/forms/file-text.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/file-text.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/forms/file.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/file.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/forms/file.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/file.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/forms/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/forms/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/forms/url.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/url.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/forms/url.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/forms/url.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/header.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/header.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/header.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/header.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/instruction.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/instruction.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/instruction.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/instruction.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/select.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/select.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/select.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/select.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/step.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/step.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/step.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/step.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/triple-item-clipboard-copy.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/triple-item-clipboard-copy.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/triple-item-clipboard-copy.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/triple-item-clipboard-copy.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/url-card.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/url-card.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/url-card.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/url-card.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/components/zoom-image.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/zoom-image.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/components/zoom-image.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/components/zoom-image.tsx diff --git a/src/app/components/IdentityProviderWizard/Wizards/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/index.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/services/alias.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/alias.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/services/alias.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/alias.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/services/axios.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/axios.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/services/axios.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/axios.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/services/idps.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/idps.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/services/idps.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/idps.ts diff --git a/src/app/components/IdentityProviderWizard/Wizards/services/index.ts b/apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/index.ts similarity index 100% rename from src/app/components/IdentityProviderWizard/Wizards/services/index.ts rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/Wizards/services/index.ts diff --git a/src/app/components/IdentityProviderWizard/providers.tsx b/apps/wizard-v1/src/app/components/IdentityProviderWizard/providers.tsx similarity index 100% rename from src/app/components/IdentityProviderWizard/providers.tsx rename to apps/wizard-v1/src/app/components/IdentityProviderWizard/providers.tsx diff --git a/src/app/components/navigation/app-launcher.tsx b/apps/wizard-v1/src/app/components/navigation/app-launcher.tsx similarity index 100% rename from src/app/components/navigation/app-launcher.tsx rename to apps/wizard-v1/src/app/components/navigation/app-launcher.tsx diff --git a/src/app/components/navigation/index.ts b/apps/wizard-v1/src/app/components/navigation/index.ts similarity index 100% rename from src/app/components/navigation/index.ts rename to apps/wizard-v1/src/app/components/navigation/index.ts diff --git a/src/app/components/navigation/main-nav.tsx b/apps/wizard-v1/src/app/components/navigation/main-nav.tsx similarity index 100% rename from src/app/components/navigation/main-nav.tsx rename to apps/wizard-v1/src/app/components/navigation/main-nav.tsx diff --git a/src/app/components/navigation/org-picker.tsx b/apps/wizard-v1/src/app/components/navigation/org-picker.tsx similarity index 100% rename from src/app/components/navigation/org-picker.tsx rename to apps/wizard-v1/src/app/components/navigation/org-picker.tsx diff --git a/src/app/configurations/api-status.ts b/apps/wizard-v1/src/app/configurations/api-status.ts similarity index 100% rename from src/app/configurations/api-status.ts rename to apps/wizard-v1/src/app/configurations/api-status.ts diff --git a/src/app/configurations/identity-protocols.ts b/apps/wizard-v1/src/app/configurations/identity-protocols.ts similarity index 100% rename from src/app/configurations/identity-protocols.ts rename to apps/wizard-v1/src/app/configurations/identity-protocols.ts diff --git a/src/app/configurations/identity-providers.ts b/apps/wizard-v1/src/app/configurations/identity-providers.ts similarity index 100% rename from src/app/configurations/identity-providers.ts rename to apps/wizard-v1/src/app/configurations/identity-providers.ts diff --git a/src/app/configurations/index.ts b/apps/wizard-v1/src/app/configurations/index.ts similarity index 100% rename from src/app/configurations/index.ts rename to apps/wizard-v1/src/app/configurations/index.ts diff --git a/src/app/configurations/oidc-defaults.ts b/apps/wizard-v1/src/app/configurations/oidc-defaults.ts similarity index 100% rename from src/app/configurations/oidc-defaults.ts rename to apps/wizard-v1/src/app/configurations/oidc-defaults.ts diff --git a/src/app/configurations/saml-idp-defaults.ts b/apps/wizard-v1/src/app/configurations/saml-idp-defaults.ts similarity index 100% rename from src/app/configurations/saml-idp-defaults.ts rename to apps/wizard-v1/src/app/configurations/saml-idp-defaults.ts diff --git a/src/app/hooks/hooks.ts b/apps/wizard-v1/src/app/hooks/hooks.ts similarity index 100% rename from src/app/hooks/hooks.ts rename to apps/wizard-v1/src/app/hooks/hooks.ts diff --git a/src/app/hooks/index.ts b/apps/wizard-v1/src/app/hooks/index.ts similarity index 100% rename from src/app/hooks/index.ts rename to apps/wizard-v1/src/app/hooks/index.ts diff --git a/src/app/hooks/navigation.ts b/apps/wizard-v1/src/app/hooks/navigation.ts similarity index 100% rename from src/app/hooks/navigation.ts rename to apps/wizard-v1/src/app/hooks/navigation.ts diff --git a/src/app/hooks/useApi.ts b/apps/wizard-v1/src/app/hooks/useApi.ts similarity index 100% rename from src/app/hooks/useApi.ts rename to apps/wizard-v1/src/app/hooks/useApi.ts diff --git a/src/app/hooks/useCreateTestIdpLink.ts b/apps/wizard-v1/src/app/hooks/useCreateTestIdpLink.ts similarity index 100% rename from src/app/hooks/useCreateTestIdpLink.ts rename to apps/wizard-v1/src/app/hooks/useCreateTestIdpLink.ts diff --git a/src/app/hooks/useGenerateIdpDisplayName.ts b/apps/wizard-v1/src/app/hooks/useGenerateIdpDisplayName.ts similarity index 100% rename from src/app/hooks/useGenerateIdpDisplayName.ts rename to apps/wizard-v1/src/app/hooks/useGenerateIdpDisplayName.ts diff --git a/src/app/hooks/useHostname.ts b/apps/wizard-v1/src/app/hooks/useHostname.ts similarity index 100% rename from src/app/hooks/useHostname.ts rename to apps/wizard-v1/src/app/hooks/useHostname.ts diff --git a/src/app/hooks/useKeycloakAdminApi.ts b/apps/wizard-v1/src/app/hooks/useKeycloakAdminApi.ts similarity index 100% rename from src/app/hooks/useKeycloakAdminApi.ts rename to apps/wizard-v1/src/app/hooks/useKeycloakAdminApi.ts diff --git a/src/app/hooks/useOrganization.ts b/apps/wizard-v1/src/app/hooks/useOrganization.ts similarity index 100% rename from src/app/hooks/useOrganization.ts rename to apps/wizard-v1/src/app/hooks/useOrganization.ts diff --git a/src/app/hooks/useRoleAccess.ts b/apps/wizard-v1/src/app/hooks/useRoleAccess.ts similarity index 100% rename from src/app/hooks/useRoleAccess.ts rename to apps/wizard-v1/src/app/hooks/useRoleAccess.ts diff --git a/src/app/hooks/useTitle.ts b/apps/wizard-v1/src/app/hooks/useTitle.ts similarity index 100% rename from src/app/hooks/useTitle.ts rename to apps/wizard-v1/src/app/hooks/useTitle.ts diff --git a/src/app/images/adfs/index.ts b/apps/wizard-v1/src/app/images/adfs/index.ts similarity index 100% rename from src/app/images/adfs/index.ts rename to apps/wizard-v1/src/app/images/adfs/index.ts diff --git a/src/app/images/adfs/saml/adfs_saml_0.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_0.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_0.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_0.png diff --git a/src/app/images/adfs/saml/adfs_saml_1.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_1.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_1.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_1.png diff --git a/src/app/images/adfs/saml/adfs_saml_10.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_10.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_10.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_10.png diff --git a/src/app/images/adfs/saml/adfs_saml_11.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_11.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_11.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_11.png diff --git a/src/app/images/adfs/saml/adfs_saml_12.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_12.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_12.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_12.png diff --git a/src/app/images/adfs/saml/adfs_saml_13.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_13.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_13.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_13.png diff --git a/src/app/images/adfs/saml/adfs_saml_2.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_2.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_2.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_2.png diff --git a/src/app/images/adfs/saml/adfs_saml_3.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_3.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_3.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_3.png diff --git a/src/app/images/adfs/saml/adfs_saml_4.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_4.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_4.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_4.png diff --git a/src/app/images/adfs/saml/adfs_saml_5.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_5.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_5.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_5.png diff --git a/src/app/images/adfs/saml/adfs_saml_6.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_6.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_6.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_6.png diff --git a/src/app/images/adfs/saml/adfs_saml_7.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_7.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_7.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_7.png diff --git a/src/app/images/adfs/saml/adfs_saml_8.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_8.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_8.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_8.png diff --git a/src/app/images/adfs/saml/adfs_saml_9.png b/apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_9.png similarity index 100% rename from src/app/images/adfs/saml/adfs_saml_9.png rename to apps/wizard-v1/src/app/images/adfs/saml/adfs_saml_9.png diff --git a/src/app/images/adfs/saml/index.ts b/apps/wizard-v1/src/app/images/adfs/saml/index.ts similarity index 100% rename from src/app/images/adfs/saml/index.ts rename to apps/wizard-v1/src/app/images/adfs/saml/index.ts diff --git a/src/app/images/auth0/COMMON/auth0-1.png b/apps/wizard-v1/src/app/images/auth0/COMMON/auth0-1.png similarity index 100% rename from src/app/images/auth0/COMMON/auth0-1.png rename to apps/wizard-v1/src/app/images/auth0/COMMON/auth0-1.png diff --git a/src/app/images/auth0/COMMON/auth0-2.png b/apps/wizard-v1/src/app/images/auth0/COMMON/auth0-2.png similarity index 100% rename from src/app/images/auth0/COMMON/auth0-2.png rename to apps/wizard-v1/src/app/images/auth0/COMMON/auth0-2.png diff --git a/src/app/images/auth0/OIDC/auth0-3.png b/apps/wizard-v1/src/app/images/auth0/OIDC/auth0-3.png similarity index 100% rename from src/app/images/auth0/OIDC/auth0-3.png rename to apps/wizard-v1/src/app/images/auth0/OIDC/auth0-3.png diff --git a/src/app/images/auth0/OIDC/auth0-4.png b/apps/wizard-v1/src/app/images/auth0/OIDC/auth0-4.png similarity index 100% rename from src/app/images/auth0/OIDC/auth0-4.png rename to apps/wizard-v1/src/app/images/auth0/OIDC/auth0-4.png diff --git a/src/app/images/auth0/SAML/auth0-3SAML.png b/apps/wizard-v1/src/app/images/auth0/SAML/auth0-3SAML.png similarity index 100% rename from src/app/images/auth0/SAML/auth0-3SAML.png rename to apps/wizard-v1/src/app/images/auth0/SAML/auth0-3SAML.png diff --git a/src/app/images/auth0/SAML/auth0-4SAML.png b/apps/wizard-v1/src/app/images/auth0/SAML/auth0-4SAML.png similarity index 100% rename from src/app/images/auth0/SAML/auth0-4SAML.png rename to apps/wizard-v1/src/app/images/auth0/SAML/auth0-4SAML.png diff --git a/src/app/images/auth0/SAML/auth0-5SAML.png b/apps/wizard-v1/src/app/images/auth0/SAML/auth0-5SAML.png similarity index 100% rename from src/app/images/auth0/SAML/auth0-5SAML.png rename to apps/wizard-v1/src/app/images/auth0/SAML/auth0-5SAML.png diff --git a/src/app/images/auth0/SAML/auth0-6SAML.png b/apps/wizard-v1/src/app/images/auth0/SAML/auth0-6SAML.png similarity index 100% rename from src/app/images/auth0/SAML/auth0-6SAML.png rename to apps/wizard-v1/src/app/images/auth0/SAML/auth0-6SAML.png diff --git a/src/app/images/auth0/auth0-logo.png b/apps/wizard-v1/src/app/images/auth0/auth0-logo.png similarity index 100% rename from src/app/images/auth0/auth0-logo.png rename to apps/wizard-v1/src/app/images/auth0/auth0-logo.png diff --git a/src/app/images/aws/aws-logo.svg b/apps/wizard-v1/src/app/images/aws/aws-logo.svg similarity index 100% rename from src/app/images/aws/aws-logo.svg rename to apps/wizard-v1/src/app/images/aws/aws-logo.svg diff --git a/src/app/images/aws/awssso_saml_1.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_1.png similarity index 100% rename from src/app/images/aws/awssso_saml_1.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_1.png diff --git a/src/app/images/aws/awssso_saml_2.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_2.png similarity index 100% rename from src/app/images/aws/awssso_saml_2.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_2.png diff --git a/src/app/images/aws/awssso_saml_3.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_3.png similarity index 100% rename from src/app/images/aws/awssso_saml_3.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_3.png diff --git a/src/app/images/aws/awssso_saml_4.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_4.png similarity index 100% rename from src/app/images/aws/awssso_saml_4.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_4.png diff --git a/src/app/images/aws/awssso_saml_5.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_5.png similarity index 100% rename from src/app/images/aws/awssso_saml_5.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_5.png diff --git a/src/app/images/aws/awssso_saml_5a.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_5a.png similarity index 100% rename from src/app/images/aws/awssso_saml_5a.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_5a.png diff --git a/src/app/images/aws/awssso_saml_6.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_6.png similarity index 100% rename from src/app/images/aws/awssso_saml_6.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_6.png diff --git a/src/app/images/aws/awssso_saml_7.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_7.png similarity index 100% rename from src/app/images/aws/awssso_saml_7.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_7.png diff --git a/src/app/images/aws/awssso_saml_8.png b/apps/wizard-v1/src/app/images/aws/awssso_saml_8.png similarity index 100% rename from src/app/images/aws/awssso_saml_8.png rename to apps/wizard-v1/src/app/images/aws/awssso_saml_8.png diff --git a/src/app/images/aws/index.ts b/apps/wizard-v1/src/app/images/aws/index.ts similarity index 100% rename from src/app/images/aws/index.ts rename to apps/wizard-v1/src/app/images/aws/index.ts diff --git a/src/app/images/cloudflare/cloudflare-large.svg b/apps/wizard-v1/src/app/images/cloudflare/cloudflare-large.svg similarity index 100% rename from src/app/images/cloudflare/cloudflare-large.svg rename to apps/wizard-v1/src/app/images/cloudflare/cloudflare-large.svg diff --git a/src/app/images/cloudflare/cloudflare.svg b/apps/wizard-v1/src/app/images/cloudflare/cloudflare.svg similarity index 100% rename from src/app/images/cloudflare/cloudflare.svg rename to apps/wizard-v1/src/app/images/cloudflare/cloudflare.svg diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_0.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_0.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_0.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_0.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_1.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_1.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_1.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_1.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_2.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_2.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_2.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_2.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_3.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_3.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_3.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_3.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_4.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_4.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_4.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_4.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_5.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_5.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_5.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_5.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_6.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_6.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_6.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_6.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_7.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_7.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_7.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_7.png diff --git a/src/app/images/cloudflare/saml/cloudflare_saml_8.png b/apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_8.png similarity index 100% rename from src/app/images/cloudflare/saml/cloudflare_saml_8.png rename to apps/wizard-v1/src/app/images/cloudflare/saml/cloudflare_saml_8.png diff --git a/src/app/images/cloudflare/saml/index.ts b/apps/wizard-v1/src/app/images/cloudflare/saml/index.ts similarity index 100% rename from src/app/images/cloudflare/saml/index.ts rename to apps/wizard-v1/src/app/images/cloudflare/saml/index.ts diff --git a/src/app/images/cyberark/SAML/cyberark_saml_0.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_0.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_0.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_0.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_1.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_1.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_1.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_1.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_2.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_2.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_2.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_2.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_3.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_3.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_3.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_3.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_4.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_4.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_4.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_4.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_5.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_5.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_5.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_5.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_6.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_6.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_6.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_6.png diff --git a/src/app/images/cyberark/SAML/cyberark_saml_7.png b/apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_7.png similarity index 100% rename from src/app/images/cyberark/SAML/cyberark_saml_7.png rename to apps/wizard-v1/src/app/images/cyberark/SAML/cyberark_saml_7.png diff --git a/src/app/images/cyberark/SAML/index.ts b/apps/wizard-v1/src/app/images/cyberark/SAML/index.ts similarity index 100% rename from src/app/images/cyberark/SAML/index.ts rename to apps/wizard-v1/src/app/images/cyberark/SAML/index.ts diff --git a/src/app/images/duo/duo-large.svg b/apps/wizard-v1/src/app/images/duo/duo-large.svg similarity index 100% rename from src/app/images/duo/duo-large.svg rename to apps/wizard-v1/src/app/images/duo/duo-large.svg diff --git a/src/app/images/duo/duo.svg b/apps/wizard-v1/src/app/images/duo/duo.svg similarity index 100% rename from src/app/images/duo/duo.svg rename to apps/wizard-v1/src/app/images/duo/duo.svg diff --git a/src/app/images/duo/saml/duo_saml_0.png b/apps/wizard-v1/src/app/images/duo/saml/duo_saml_0.png similarity index 100% rename from src/app/images/duo/saml/duo_saml_0.png rename to apps/wizard-v1/src/app/images/duo/saml/duo_saml_0.png diff --git a/src/app/images/duo/saml/duo_saml_1.png b/apps/wizard-v1/src/app/images/duo/saml/duo_saml_1.png similarity index 100% rename from src/app/images/duo/saml/duo_saml_1.png rename to apps/wizard-v1/src/app/images/duo/saml/duo_saml_1.png diff --git a/src/app/images/duo/saml/duo_saml_2.png b/apps/wizard-v1/src/app/images/duo/saml/duo_saml_2.png similarity index 100% rename from src/app/images/duo/saml/duo_saml_2.png rename to apps/wizard-v1/src/app/images/duo/saml/duo_saml_2.png diff --git a/src/app/images/duo/saml/duo_saml_3.png b/apps/wizard-v1/src/app/images/duo/saml/duo_saml_3.png similarity index 100% rename from src/app/images/duo/saml/duo_saml_3.png rename to apps/wizard-v1/src/app/images/duo/saml/duo_saml_3.png diff --git a/src/app/images/duo/saml/duo_saml_4.png b/apps/wizard-v1/src/app/images/duo/saml/duo_saml_4.png similarity index 100% rename from src/app/images/duo/saml/duo_saml_4.png rename to apps/wizard-v1/src/app/images/duo/saml/duo_saml_4.png diff --git a/src/app/images/duo/saml/duo_saml_5.png b/apps/wizard-v1/src/app/images/duo/saml/duo_saml_5.png similarity index 100% rename from src/app/images/duo/saml/duo_saml_5.png rename to apps/wizard-v1/src/app/images/duo/saml/duo_saml_5.png diff --git a/src/app/images/duo/saml/index.ts b/apps/wizard-v1/src/app/images/duo/saml/index.ts similarity index 100% rename from src/app/images/duo/saml/index.ts rename to apps/wizard-v1/src/app/images/duo/saml/index.ts diff --git a/src/app/images/favicons/android-chrome-192x192.png b/apps/wizard-v1/src/app/images/favicons/android-chrome-192x192.png similarity index 100% rename from src/app/images/favicons/android-chrome-192x192.png rename to apps/wizard-v1/src/app/images/favicons/android-chrome-192x192.png diff --git a/src/app/images/favicons/android-chrome-512x512.png b/apps/wizard-v1/src/app/images/favicons/android-chrome-512x512.png similarity index 100% rename from src/app/images/favicons/android-chrome-512x512.png rename to apps/wizard-v1/src/app/images/favicons/android-chrome-512x512.png diff --git a/src/app/images/favicons/apple-touch-icon.png b/apps/wizard-v1/src/app/images/favicons/apple-touch-icon.png similarity index 100% rename from src/app/images/favicons/apple-touch-icon.png rename to apps/wizard-v1/src/app/images/favicons/apple-touch-icon.png diff --git a/src/app/images/favicons/browserconfig.xml b/apps/wizard-v1/src/app/images/favicons/browserconfig.xml similarity index 100% rename from src/app/images/favicons/browserconfig.xml rename to apps/wizard-v1/src/app/images/favicons/browserconfig.xml diff --git a/src/app/images/favicons/favicon-16x16.png b/apps/wizard-v1/src/app/images/favicons/favicon-16x16.png similarity index 100% rename from src/app/images/favicons/favicon-16x16.png rename to apps/wizard-v1/src/app/images/favicons/favicon-16x16.png diff --git a/src/app/images/favicons/favicon-32x32.png b/apps/wizard-v1/src/app/images/favicons/favicon-32x32.png similarity index 100% rename from src/app/images/favicons/favicon-32x32.png rename to apps/wizard-v1/src/app/images/favicons/favicon-32x32.png diff --git a/src/app/images/favicons/favicon.ico b/apps/wizard-v1/src/app/images/favicons/favicon.ico similarity index 100% rename from src/app/images/favicons/favicon.ico rename to apps/wizard-v1/src/app/images/favicons/favicon.ico diff --git a/src/app/images/favicons/mstile-144x144.png b/apps/wizard-v1/src/app/images/favicons/mstile-144x144.png similarity index 100% rename from src/app/images/favicons/mstile-144x144.png rename to apps/wizard-v1/src/app/images/favicons/mstile-144x144.png diff --git a/src/app/images/favicons/mstile-150x150.png b/apps/wizard-v1/src/app/images/favicons/mstile-150x150.png similarity index 100% rename from src/app/images/favicons/mstile-150x150.png rename to apps/wizard-v1/src/app/images/favicons/mstile-150x150.png diff --git a/src/app/images/favicons/mstile-310x150.png b/apps/wizard-v1/src/app/images/favicons/mstile-310x150.png similarity index 100% rename from src/app/images/favicons/mstile-310x150.png rename to apps/wizard-v1/src/app/images/favicons/mstile-310x150.png diff --git a/src/app/images/favicons/mstile-310x310.png b/apps/wizard-v1/src/app/images/favicons/mstile-310x310.png similarity index 100% rename from src/app/images/favicons/mstile-310x310.png rename to apps/wizard-v1/src/app/images/favicons/mstile-310x310.png diff --git a/src/app/images/favicons/mstile-70x70.png b/apps/wizard-v1/src/app/images/favicons/mstile-70x70.png similarity index 100% rename from src/app/images/favicons/mstile-70x70.png rename to apps/wizard-v1/src/app/images/favicons/mstile-70x70.png diff --git a/src/app/images/favicons/safari-pinned-tab.svg b/apps/wizard-v1/src/app/images/favicons/safari-pinned-tab.svg similarity index 100% rename from src/app/images/favicons/safari-pinned-tab.svg rename to apps/wizard-v1/src/app/images/favicons/safari-pinned-tab.svg diff --git a/src/app/images/favicons/site.webmanifest b/apps/wizard-v1/src/app/images/favicons/site.webmanifest similarity index 100% rename from src/app/images/favicons/site.webmanifest rename to apps/wizard-v1/src/app/images/favicons/site.webmanifest diff --git a/src/app/images/google/google_saml_1a.png b/apps/wizard-v1/src/app/images/google/google_saml_1a.png similarity index 100% rename from src/app/images/google/google_saml_1a.png rename to apps/wizard-v1/src/app/images/google/google_saml_1a.png diff --git a/src/app/images/google/google_saml_1b.png b/apps/wizard-v1/src/app/images/google/google_saml_1b.png similarity index 100% rename from src/app/images/google/google_saml_1b.png rename to apps/wizard-v1/src/app/images/google/google_saml_1b.png diff --git a/src/app/images/google/google_saml_2.png b/apps/wizard-v1/src/app/images/google/google_saml_2.png similarity index 100% rename from src/app/images/google/google_saml_2.png rename to apps/wizard-v1/src/app/images/google/google_saml_2.png diff --git a/src/app/images/google/google_saml_3.png b/apps/wizard-v1/src/app/images/google/google_saml_3.png similarity index 100% rename from src/app/images/google/google_saml_3.png rename to apps/wizard-v1/src/app/images/google/google_saml_3.png diff --git a/src/app/images/google/google_saml_4.png b/apps/wizard-v1/src/app/images/google/google_saml_4.png similarity index 100% rename from src/app/images/google/google_saml_4.png rename to apps/wizard-v1/src/app/images/google/google_saml_4.png diff --git a/src/app/images/google/google_saml_5.png b/apps/wizard-v1/src/app/images/google/google_saml_5.png similarity index 100% rename from src/app/images/google/google_saml_5.png rename to apps/wizard-v1/src/app/images/google/google_saml_5.png diff --git a/src/app/images/google/google_saml_6a.png b/apps/wizard-v1/src/app/images/google/google_saml_6a.png similarity index 100% rename from src/app/images/google/google_saml_6a.png rename to apps/wizard-v1/src/app/images/google/google_saml_6a.png diff --git a/src/app/images/google/google_saml_6b.png b/apps/wizard-v1/src/app/images/google/google_saml_6b.png similarity index 100% rename from src/app/images/google/google_saml_6b.png rename to apps/wizard-v1/src/app/images/google/google_saml_6b.png diff --git a/src/app/images/google/index.ts b/apps/wizard-v1/src/app/images/google/index.ts similarity index 100% rename from src/app/images/google/index.ts rename to apps/wizard-v1/src/app/images/google/index.ts diff --git a/src/app/images/jumpcloud/index.ts b/apps/wizard-v1/src/app/images/jumpcloud/index.ts similarity index 100% rename from src/app/images/jumpcloud/index.ts rename to apps/wizard-v1/src/app/images/jumpcloud/index.ts diff --git a/src/app/images/jumpcloud/jumpcloud-logo.svg b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud-logo.svg similarity index 100% rename from src/app/images/jumpcloud/jumpcloud-logo.svg rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud-logo.svg diff --git a/src/app/images/jumpcloud/jumpcloud_saml_1.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_1.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_1.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_1.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_10.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_10.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_10.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_10.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_2.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_2.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_2.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_2.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_3.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_3.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_3.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_3.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_4.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_4.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_4.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_4.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_5.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_5.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_5.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_5.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_6.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_6.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_6.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_6.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_7.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_7.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_7.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_7.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_8.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_8.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_8.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_8.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_9.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_9.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_9.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_9.png diff --git a/src/app/images/jumpcloud/jumpcloud_saml_9a.png b/apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_9a.png similarity index 100% rename from src/app/images/jumpcloud/jumpcloud_saml_9a.png rename to apps/wizard-v1/src/app/images/jumpcloud/jumpcloud_saml_9a.png diff --git a/src/app/images/lastpass/index.ts b/apps/wizard-v1/src/app/images/lastpass/index.ts similarity index 100% rename from src/app/images/lastpass/index.ts rename to apps/wizard-v1/src/app/images/lastpass/index.ts diff --git a/src/app/images/lastpass/lastpass-logo.svg b/apps/wizard-v1/src/app/images/lastpass/lastpass-logo.svg similarity index 100% rename from src/app/images/lastpass/lastpass-logo.svg rename to apps/wizard-v1/src/app/images/lastpass/lastpass-logo.svg diff --git a/src/app/images/lastpass/lastpass_saml_0.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_0.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_0.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_0.png diff --git a/src/app/images/lastpass/lastpass_saml_1.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_1.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_1.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_1.png diff --git a/src/app/images/lastpass/lastpass_saml_2.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_2.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_2.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_2.png diff --git a/src/app/images/lastpass/lastpass_saml_3.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_3.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_3.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_3.png diff --git a/src/app/images/lastpass/lastpass_saml_4.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_4.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_4.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_4.png diff --git a/src/app/images/lastpass/lastpass_saml_5.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_5.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_5.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_5.png diff --git a/src/app/images/lastpass/lastpass_saml_6.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_6.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_6.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_6.png diff --git a/src/app/images/lastpass/lastpass_saml_7.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_7.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_7.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_7.png diff --git a/src/app/images/lastpass/lastpass_saml_8.png b/apps/wizard-v1/src/app/images/lastpass/lastpass_saml_8.png similarity index 100% rename from src/app/images/lastpass/lastpass_saml_8.png rename to apps/wizard-v1/src/app/images/lastpass/lastpass_saml_8.png diff --git a/src/app/images/msft_entra_id/saml/azure-1.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-1.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-1.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-1.png diff --git a/src/app/images/msft_entra_id/saml/azure-10.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-10.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-10.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-10.png diff --git a/src/app/images/msft_entra_id/saml/azure-11.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-11.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-11.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-11.png diff --git a/src/app/images/msft_entra_id/saml/azure-12.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-12.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-12.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-12.png diff --git a/src/app/images/msft_entra_id/saml/azure-1a.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-1a.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-1a.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-1a.png diff --git a/src/app/images/msft_entra_id/saml/azure-2.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-2.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-2.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-2.png diff --git a/src/app/images/msft_entra_id/saml/azure-3.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-3.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-3.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-3.png diff --git a/src/app/images/msft_entra_id/saml/azure-3a.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-3a.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-3a.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-3a.png diff --git a/src/app/images/msft_entra_id/saml/azure-4.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-4.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-4.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-4.png diff --git a/src/app/images/msft_entra_id/saml/azure-5.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-5.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-5.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-5.png diff --git a/src/app/images/msft_entra_id/saml/azure-5a.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-5a.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-5a.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-5a.png diff --git a/src/app/images/msft_entra_id/saml/azure-6.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-6.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-6.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-6.png diff --git a/src/app/images/msft_entra_id/saml/azure-7.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-7.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-7.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-7.png diff --git a/src/app/images/msft_entra_id/saml/azure-8.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-8.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-8.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-8.png diff --git a/src/app/images/msft_entra_id/saml/azure-9.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-9.png similarity index 100% rename from src/app/images/msft_entra_id/saml/azure-9.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/azure-9.png diff --git a/src/app/images/msft_entra_id/saml/entraid-1.png b/apps/wizard-v1/src/app/images/msft_entra_id/saml/entraid-1.png similarity index 100% rename from src/app/images/msft_entra_id/saml/entraid-1.png rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/entraid-1.png diff --git a/src/app/images/msft_entra_id/saml/index.ts b/apps/wizard-v1/src/app/images/msft_entra_id/saml/index.ts similarity index 100% rename from src/app/images/msft_entra_id/saml/index.ts rename to apps/wizard-v1/src/app/images/msft_entra_id/saml/index.ts diff --git a/src/app/images/oidc/openid-logo.svg b/apps/wizard-v1/src/app/images/oidc/openid-logo.svg similarity index 100% rename from src/app/images/oidc/openid-logo.svg rename to apps/wizard-v1/src/app/images/oidc/openid-logo.svg diff --git a/src/app/images/okta/okta-1.png b/apps/wizard-v1/src/app/images/okta/okta-1.png similarity index 100% rename from src/app/images/okta/okta-1.png rename to apps/wizard-v1/src/app/images/okta/okta-1.png diff --git a/src/app/images/okta/okta-2.png b/apps/wizard-v1/src/app/images/okta/okta-2.png similarity index 100% rename from src/app/images/okta/okta-2.png rename to apps/wizard-v1/src/app/images/okta/okta-2.png diff --git a/src/app/images/okta/okta-3.png b/apps/wizard-v1/src/app/images/okta/okta-3.png similarity index 100% rename from src/app/images/okta/okta-3.png rename to apps/wizard-v1/src/app/images/okta/okta-3.png diff --git a/src/app/images/okta/okta-logo.png b/apps/wizard-v1/src/app/images/okta/okta-logo.png similarity index 100% rename from src/app/images/okta/okta-logo.png rename to apps/wizard-v1/src/app/images/okta/okta-logo.png diff --git a/src/app/images/okta/saml/index.ts b/apps/wizard-v1/src/app/images/okta/saml/index.ts similarity index 100% rename from src/app/images/okta/saml/index.ts rename to apps/wizard-v1/src/app/images/okta/saml/index.ts diff --git a/src/app/images/okta/saml/okta_saml_1.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_1.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_1.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_1.png diff --git a/src/app/images/okta/saml/okta_saml_2.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_2.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_2.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_2.png diff --git a/src/app/images/okta/saml/okta_saml_3.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_3.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_3.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_3.png diff --git a/src/app/images/okta/saml/okta_saml_4.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_4.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_4.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_4.png diff --git a/src/app/images/okta/saml/okta_saml_5.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_5.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_5.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_5.png diff --git a/src/app/images/okta/saml/okta_saml_6.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_6.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_6.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_6.png diff --git a/src/app/images/okta/saml/okta_saml_7.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_7.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_7.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_7.png diff --git a/src/app/images/okta/saml/okta_saml_7a.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_7a.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_7a.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_7a.png diff --git a/src/app/images/okta/saml/okta_saml_8.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_8.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_8.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_8.png diff --git a/src/app/images/okta/saml/okta_saml_9.png b/apps/wizard-v1/src/app/images/okta/saml/okta_saml_9.png similarity index 100% rename from src/app/images/okta/saml/okta_saml_9.png rename to apps/wizard-v1/src/app/images/okta/saml/okta_saml_9.png diff --git a/src/app/images/onelogin/index.ts b/apps/wizard-v1/src/app/images/onelogin/index.ts similarity index 100% rename from src/app/images/onelogin/index.ts rename to apps/wizard-v1/src/app/images/onelogin/index.ts diff --git a/src/app/images/onelogin/onelogin-logo.svg b/apps/wizard-v1/src/app/images/onelogin/onelogin-logo.svg similarity index 100% rename from src/app/images/onelogin/onelogin-logo.svg rename to apps/wizard-v1/src/app/images/onelogin/onelogin-logo.svg diff --git a/src/app/images/onelogin/saml/index.ts b/apps/wizard-v1/src/app/images/onelogin/saml/index.ts similarity index 100% rename from src/app/images/onelogin/saml/index.ts rename to apps/wizard-v1/src/app/images/onelogin/saml/index.ts diff --git a/src/app/images/onelogin/saml/onelogin_saml_1.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_1.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_1.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_1.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_2.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_2.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_2.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_2.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_3.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_3.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_3.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_3.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_4.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_4.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_4.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_4.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_5.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_5.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_5.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_5.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_5a.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_5a.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_5a.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_5a.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_6a.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_6a.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_6a.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_6a.png diff --git a/src/app/images/onelogin/saml/onelogin_saml_7.png b/apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_7.png similarity index 100% rename from src/app/images/onelogin/saml/onelogin_saml_7.png rename to apps/wizard-v1/src/app/images/onelogin/saml/onelogin_saml_7.png diff --git a/src/app/images/oracle/SAML/index.ts b/apps/wizard-v1/src/app/images/oracle/SAML/index.ts similarity index 100% rename from src/app/images/oracle/SAML/index.ts rename to apps/wizard-v1/src/app/images/oracle/SAML/index.ts diff --git a/src/app/images/oracle/SAML/oracle_saml_0.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_0.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_0.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_0.png diff --git a/src/app/images/oracle/SAML/oracle_saml_1.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_1.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_1.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_1.png diff --git a/src/app/images/oracle/SAML/oracle_saml_10.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_10.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_10.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_10.png diff --git a/src/app/images/oracle/SAML/oracle_saml_11.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_11.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_11.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_11.png diff --git a/src/app/images/oracle/SAML/oracle_saml_2.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_2.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_2.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_2.png diff --git a/src/app/images/oracle/SAML/oracle_saml_3.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_3.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_3.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_3.png diff --git a/src/app/images/oracle/SAML/oracle_saml_4.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_4.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_4.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_4.png diff --git a/src/app/images/oracle/SAML/oracle_saml_5.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_5.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_5.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_5.png diff --git a/src/app/images/oracle/SAML/oracle_saml_6.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_6.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_6.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_6.png diff --git a/src/app/images/oracle/SAML/oracle_saml_7.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_7.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_7.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_7.png diff --git a/src/app/images/oracle/SAML/oracle_saml_8.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_8.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_8.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_8.png diff --git a/src/app/images/oracle/SAML/oracle_saml_9.png b/apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_9.png similarity index 100% rename from src/app/images/oracle/SAML/oracle_saml_9.png rename to apps/wizard-v1/src/app/images/oracle/SAML/oracle_saml_9.png diff --git a/src/app/images/oracle/oracle-logo.png b/apps/wizard-v1/src/app/images/oracle/oracle-logo.png similarity index 100% rename from src/app/images/oracle/oracle-logo.png rename to apps/wizard-v1/src/app/images/oracle/oracle-logo.png diff --git a/src/app/images/phasetwo-logos/logo_phase_slash.svg b/apps/wizard-v1/src/app/images/phasetwo-logos/logo_phase_slash.svg similarity index 100% rename from src/app/images/phasetwo-logos/logo_phase_slash.svg rename to apps/wizard-v1/src/app/images/phasetwo-logos/logo_phase_slash.svg diff --git a/src/app/images/pingone/index.ts b/apps/wizard-v1/src/app/images/pingone/index.ts similarity index 100% rename from src/app/images/pingone/index.ts rename to apps/wizard-v1/src/app/images/pingone/index.ts diff --git a/src/app/images/pingone/pingone-logo.svg b/apps/wizard-v1/src/app/images/pingone/pingone-logo.svg similarity index 100% rename from src/app/images/pingone/pingone-logo.svg rename to apps/wizard-v1/src/app/images/pingone/pingone-logo.svg diff --git a/src/app/images/pingone/pingone_saml_1.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_1.png similarity index 100% rename from src/app/images/pingone/pingone_saml_1.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_1.png diff --git a/src/app/images/pingone/pingone_saml_2.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_2.png similarity index 100% rename from src/app/images/pingone/pingone_saml_2.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_2.png diff --git a/src/app/images/pingone/pingone_saml_3.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_3.png similarity index 100% rename from src/app/images/pingone/pingone_saml_3.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_3.png diff --git a/src/app/images/pingone/pingone_saml_4.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_4.png similarity index 100% rename from src/app/images/pingone/pingone_saml_4.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_4.png diff --git a/src/app/images/pingone/pingone_saml_5.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_5.png similarity index 100% rename from src/app/images/pingone/pingone_saml_5.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_5.png diff --git a/src/app/images/pingone/pingone_saml_6.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_6.png similarity index 100% rename from src/app/images/pingone/pingone_saml_6.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_6.png diff --git a/src/app/images/pingone/pingone_saml_7.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_7.png similarity index 100% rename from src/app/images/pingone/pingone_saml_7.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_7.png diff --git a/src/app/images/pingone/pingone_saml_8.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_8.png similarity index 100% rename from src/app/images/pingone/pingone_saml_8.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_8.png diff --git a/src/app/images/pingone/pingone_saml_9.png b/apps/wizard-v1/src/app/images/pingone/pingone_saml_9.png similarity index 100% rename from src/app/images/pingone/pingone_saml_9.png rename to apps/wizard-v1/src/app/images/pingone/pingone_saml_9.png diff --git a/src/app/images/provider-logos/active-directory.svg b/apps/wizard-v1/src/app/images/provider-logos/active-directory.svg similarity index 100% rename from src/app/images/provider-logos/active-directory.svg rename to apps/wizard-v1/src/app/images/provider-logos/active-directory.svg diff --git a/src/app/images/provider-logos/auth0_logo.png b/apps/wizard-v1/src/app/images/provider-logos/auth0_logo.png similarity index 100% rename from src/app/images/provider-logos/auth0_logo.png rename to apps/wizard-v1/src/app/images/provider-logos/auth0_logo.png diff --git a/src/app/images/provider-logos/aws.jpg b/apps/wizard-v1/src/app/images/provider-logos/aws.jpg similarity index 100% rename from src/app/images/provider-logos/aws.jpg rename to apps/wizard-v1/src/app/images/provider-logos/aws.jpg diff --git a/src/app/images/provider-logos/cyberark_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/cyberark_logo.svg similarity index 100% rename from src/app/images/provider-logos/cyberark_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/cyberark_logo.svg diff --git a/src/app/images/provider-logos/google-workspace-logo.svg b/apps/wizard-v1/src/app/images/provider-logos/google-workspace-logo.svg similarity index 100% rename from src/app/images/provider-logos/google-workspace-logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/google-workspace-logo.svg diff --git a/src/app/images/provider-logos/google_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/google_logo.svg similarity index 100% rename from src/app/images/provider-logos/google_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/google_logo.svg diff --git a/src/app/images/provider-logos/jumpcloud_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/jumpcloud_logo.svg similarity index 100% rename from src/app/images/provider-logos/jumpcloud_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/jumpcloud_logo.svg diff --git a/src/app/images/provider-logos/ldap_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/ldap_logo.svg similarity index 100% rename from src/app/images/provider-logos/ldap_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/ldap_logo.svg diff --git a/src/app/images/provider-logos/msft_entraid.svg b/apps/wizard-v1/src/app/images/provider-logos/msft_entraid.svg similarity index 100% rename from src/app/images/provider-logos/msft_entraid.svg rename to apps/wizard-v1/src/app/images/provider-logos/msft_entraid.svg diff --git a/src/app/images/provider-logos/okta_logo.png b/apps/wizard-v1/src/app/images/provider-logos/okta_logo.png similarity index 100% rename from src/app/images/provider-logos/okta_logo.png rename to apps/wizard-v1/src/app/images/provider-logos/okta_logo.png diff --git a/src/app/images/provider-logos/onelogin_logo.png b/apps/wizard-v1/src/app/images/provider-logos/onelogin_logo.png similarity index 100% rename from src/app/images/provider-logos/onelogin_logo.png rename to apps/wizard-v1/src/app/images/provider-logos/onelogin_logo.png diff --git a/src/app/images/provider-logos/openid_logo.png b/apps/wizard-v1/src/app/images/provider-logos/openid_logo.png similarity index 100% rename from src/app/images/provider-logos/openid_logo.png rename to apps/wizard-v1/src/app/images/provider-logos/openid_logo.png diff --git a/src/app/images/provider-logos/ping_federate_logo.png b/apps/wizard-v1/src/app/images/provider-logos/ping_federate_logo.png similarity index 100% rename from src/app/images/provider-logos/ping_federate_logo.png rename to apps/wizard-v1/src/app/images/provider-logos/ping_federate_logo.png diff --git a/src/app/images/provider-logos/ping_one_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/ping_one_logo.svg similarity index 100% rename from src/app/images/provider-logos/ping_one_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/ping_one_logo.svg diff --git a/src/app/images/provider-logos/saml_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/saml_logo.svg similarity index 100% rename from src/app/images/provider-logos/saml_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/saml_logo.svg diff --git a/src/app/images/provider-logos/vmware_logo.svg b/apps/wizard-v1/src/app/images/provider-logos/vmware_logo.svg similarity index 100% rename from src/app/images/provider-logos/vmware_logo.svg rename to apps/wizard-v1/src/app/images/provider-logos/vmware_logo.svg diff --git a/src/app/images/salesforce/COMMON/salesforce-0.png b/apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-0.png similarity index 100% rename from src/app/images/salesforce/COMMON/salesforce-0.png rename to apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-0.png diff --git a/src/app/images/salesforce/COMMON/salesforce-1.png b/apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-1.png similarity index 100% rename from src/app/images/salesforce/COMMON/salesforce-1.png rename to apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-1.png diff --git a/src/app/images/salesforce/COMMON/salesforce-2.png b/apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-2.png similarity index 100% rename from src/app/images/salesforce/COMMON/salesforce-2.png rename to apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-2.png diff --git a/src/app/images/salesforce/COMMON/salesforce-3.png b/apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-3.png similarity index 100% rename from src/app/images/salesforce/COMMON/salesforce-3.png rename to apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-3.png diff --git a/src/app/images/salesforce/COMMON/salesforce-4.png b/apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-4.png similarity index 100% rename from src/app/images/salesforce/COMMON/salesforce-4.png rename to apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-4.png diff --git a/src/app/images/salesforce/COMMON/salesforce-5.png b/apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-5.png similarity index 100% rename from src/app/images/salesforce/COMMON/salesforce-5.png rename to apps/wizard-v1/src/app/images/salesforce/COMMON/salesforce-5.png diff --git a/src/app/images/salesforce/OIDC/salesforce_oidc_0.png b/apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_0.png similarity index 100% rename from src/app/images/salesforce/OIDC/salesforce_oidc_0.png rename to apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_0.png diff --git a/src/app/images/salesforce/OIDC/salesforce_oidc_1.png b/apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_1.png similarity index 100% rename from src/app/images/salesforce/OIDC/salesforce_oidc_1.png rename to apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_1.png diff --git a/src/app/images/salesforce/OIDC/salesforce_oidc_2.png b/apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_2.png similarity index 100% rename from src/app/images/salesforce/OIDC/salesforce_oidc_2.png rename to apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_2.png diff --git a/src/app/images/salesforce/OIDC/salesforce_oidc_3.png b/apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_3.png similarity index 100% rename from src/app/images/salesforce/OIDC/salesforce_oidc_3.png rename to apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_3.png diff --git a/src/app/images/salesforce/OIDC/salesforce_oidc_4.png b/apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_4.png similarity index 100% rename from src/app/images/salesforce/OIDC/salesforce_oidc_4.png rename to apps/wizard-v1/src/app/images/salesforce/OIDC/salesforce_oidc_4.png diff --git a/src/app/images/salesforce/SAML/salesforce_saml_0.png b/apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_0.png similarity index 100% rename from src/app/images/salesforce/SAML/salesforce_saml_0.png rename to apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_0.png diff --git a/src/app/images/salesforce/SAML/salesforce_saml_1.png b/apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_1.png similarity index 100% rename from src/app/images/salesforce/SAML/salesforce_saml_1.png rename to apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_1.png diff --git a/src/app/images/salesforce/SAML/salesforce_saml_2.png b/apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_2.png similarity index 100% rename from src/app/images/salesforce/SAML/salesforce_saml_2.png rename to apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_2.png diff --git a/src/app/images/salesforce/SAML/salesforce_saml_3.png b/apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_3.png similarity index 100% rename from src/app/images/salesforce/SAML/salesforce_saml_3.png rename to apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_3.png diff --git a/src/app/images/salesforce/SAML/salesforce_saml_4.png b/apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_4.png similarity index 100% rename from src/app/images/salesforce/SAML/salesforce_saml_4.png rename to apps/wizard-v1/src/app/images/salesforce/SAML/salesforce_saml_4.png diff --git a/src/app/images/salesforce/salesforce-logo.png b/apps/wizard-v1/src/app/images/salesforce/salesforce-logo.png similarity index 100% rename from src/app/images/salesforce/salesforce-logo.png rename to apps/wizard-v1/src/app/images/salesforce/salesforce-logo.png diff --git a/src/app/index.tsx b/apps/wizard-v1/src/app/index.tsx similarity index 100% rename from src/app/index.tsx rename to apps/wizard-v1/src/app/index.tsx diff --git a/src/app/routes.tsx b/apps/wizard-v1/src/app/routes.tsx similarity index 100% rename from src/app/routes.tsx rename to apps/wizard-v1/src/app/routes.tsx diff --git a/src/app/services/DashboardData.ts b/apps/wizard-v1/src/app/services/DashboardData.ts similarity index 100% rename from src/app/services/DashboardData.ts rename to apps/wizard-v1/src/app/services/DashboardData.ts diff --git a/src/app/services/app-settings.ts b/apps/wizard-v1/src/app/services/app-settings.ts similarity index 100% rename from src/app/services/app-settings.ts rename to apps/wizard-v1/src/app/services/app-settings.ts diff --git a/src/app/services/feature-flags/flags-service.ts b/apps/wizard-v1/src/app/services/feature-flags/flags-service.ts similarity index 100% rename from src/app/services/feature-flags/flags-service.ts rename to apps/wizard-v1/src/app/services/feature-flags/flags-service.ts diff --git a/src/app/services/feature-flags/index.ts b/apps/wizard-v1/src/app/services/feature-flags/index.ts similarity index 100% rename from src/app/services/feature-flags/index.ts rename to apps/wizard-v1/src/app/services/feature-flags/index.ts diff --git a/src/app/services/index.ts b/apps/wizard-v1/src/app/services/index.ts similarity index 100% rename from src/app/services/index.ts rename to apps/wizard-v1/src/app/services/index.ts diff --git a/src/app/store/index.ts b/apps/wizard-v1/src/app/store/index.ts similarity index 100% rename from src/app/store/index.ts rename to apps/wizard-v1/src/app/store/index.ts diff --git a/src/app/store/store.ts b/apps/wizard-v1/src/app/store/store.ts similarity index 100% rename from src/app/store/store.ts rename to apps/wizard-v1/src/app/store/store.ts diff --git a/src/app/styles/app.css b/apps/wizard-v1/src/app/styles/app.css similarity index 100% rename from src/app/styles/app.css rename to apps/wizard-v1/src/app/styles/app.css diff --git a/src/app/styles/index.css b/apps/wizard-v1/src/app/styles/index.css similarity index 100% rename from src/app/styles/index.css rename to apps/wizard-v1/src/app/styles/index.css diff --git a/src/app/utils/Loading.tsx b/apps/wizard-v1/src/app/utils/Loading.tsx similarity index 100% rename from src/app/utils/Loading.tsx rename to apps/wizard-v1/src/app/utils/Loading.tsx diff --git a/src/app/utils/generate-id.ts b/apps/wizard-v1/src/app/utils/generate-id.ts similarity index 100% rename from src/app/utils/generate-id.ts rename to apps/wizard-v1/src/app/utils/generate-id.ts diff --git a/src/app/utils/utils.ts b/apps/wizard-v1/src/app/utils/utils.ts similarity index 100% rename from src/app/utils/utils.ts rename to apps/wizard-v1/src/app/utils/utils.ts diff --git a/src/index.html b/apps/wizard-v1/src/index.html similarity index 100% rename from src/index.html rename to apps/wizard-v1/src/index.html diff --git a/src/index.tsx b/apps/wizard-v1/src/index.tsx similarity index 100% rename from src/index.tsx rename to apps/wizard-v1/src/index.tsx diff --git a/src/keycloak.json b/apps/wizard-v1/src/keycloak.json similarity index 60% rename from src/keycloak.json rename to apps/wizard-v1/src/keycloak.json index a0e8211f..ade82997 100644 --- a/src/keycloak.json +++ b/apps/wizard-v1/src/keycloak.json @@ -1,6 +1,6 @@ { - "realm": "cloud", - "auth-server-url": "https://app.phasetwo.io/auth", + "realm": "master", + "auth-server-url": "http://localhost:8080/auth", "ssl-required": "external", "resource": "idp-wizard", "public-client": true, diff --git a/src/keycloak.ts b/apps/wizard-v1/src/keycloak.ts similarity index 100% rename from src/keycloak.ts rename to apps/wizard-v1/src/keycloak.ts diff --git a/src/silent-check-sso.html b/apps/wizard-v1/src/silent-check-sso.html similarity index 100% rename from src/silent-check-sso.html rename to apps/wizard-v1/src/silent-check-sso.html diff --git a/src/site.webmanifest b/apps/wizard-v1/src/site.webmanifest similarity index 100% rename from src/site.webmanifest rename to apps/wizard-v1/src/site.webmanifest diff --git a/src/typings.d.ts b/apps/wizard-v1/src/typings.d.ts similarity index 100% rename from src/typings.d.ts rename to apps/wizard-v1/src/typings.d.ts diff --git a/stylePaths.js b/apps/wizard-v1/stylePaths.js similarity index 100% rename from stylePaths.js rename to apps/wizard-v1/stylePaths.js diff --git a/test-setup.js b/apps/wizard-v1/test-setup.js similarity index 100% rename from test-setup.js rename to apps/wizard-v1/test-setup.js diff --git a/tsconfig.json b/apps/wizard-v1/tsconfig.json similarity index 100% rename from tsconfig.json rename to apps/wizard-v1/tsconfig.json diff --git a/webpack.common.js b/apps/wizard-v1/webpack.common.js similarity index 100% rename from webpack.common.js rename to apps/wizard-v1/webpack.common.js diff --git a/webpack.dev.js b/apps/wizard-v1/webpack.dev.js similarity index 100% rename from webpack.dev.js rename to apps/wizard-v1/webpack.dev.js diff --git a/webpack.prod.js b/apps/wizard-v1/webpack.prod.js similarity index 100% rename from webpack.prod.js rename to apps/wizard-v1/webpack.prod.js diff --git a/apps/wizard-v2/.env.local.sample b/apps/wizard-v2/.env.local.sample new file mode 100644 index 00000000..51545283 --- /dev/null +++ b/apps/wizard-v2/.env.local.sample @@ -0,0 +1,22 @@ +# Copy this to .env.local + +# --- Mock mode (no Keycloak required) --- +# Set to "true" to bypass Keycloak entirely during development. +VITE_OIDC_USE_MOCK=false + +# --- Real Keycloak (docker/docker-compose.yml) --- +# These values match the realm-export.json dev setup out of the box. +# Run: cd docker && docker compose up +VITE_OIDC_ISSUER_URI=http://localhost:8080/auth/realms/wizard +VITE_OIDC_CLIENT_ID=wizard-v2-dev + +# Enable verbose oidc-spa logs +VITE_OIDC_SPA_DEBUG=false + +# --- Wizard leave-confirmation guard --- +# When "true", suppresses the "Leave this wizard?" prompt that normally fires +# when navigating away from an in-progress wizard. Useful for e2e tests and +# staging environments where the prompt gets in the way. The guard is also +# disabled automatically in `vite dev` (import.meta.env.DEV) regardless of +# this setting. +VITE_WIZARD_DISABLE_LEAVE_GUARD=false diff --git a/apps/wizard-v2/.gitignore b/apps/wizard-v2/.gitignore new file mode 100644 index 00000000..324ef75f --- /dev/null +++ b/apps/wizard-v2/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Playwright +/playwright-report/ +/test-results/ +e2e/.auth/*.json + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/wizard-v2/AGENTS.md b/apps/wizard-v2/AGENTS.md new file mode 100644 index 00000000..e9efc4d9 --- /dev/null +++ b/apps/wizard-v2/AGENTS.md @@ -0,0 +1,444 @@ +# wizard-v2 — Agent Context + +This file is the authoritative context document for AI agents working on wizard-v2. Read it before making changes. It covers architecture decisions, key patterns, current state, and what comes next. + +--- + +## What this project is + +wizard-v2 is a rewrite of the Phase Two IDP (Identity Provider) Wizard — a Keycloak extension that guides administrators through connecting an external identity provider (Okta, Entra ID, Google, etc.) to a Keycloak realm. + +**The core goal:** replace per-provider React component trees (wizard-v1) with a declarative JSON-driven model. Each wizard is a JSON file. A generic runtime engine reads the JSON and renders the wizard. Adding a new provider = writing a new JSON file, not writing new components. + +**Deployment context:** wizard-v2 is a Vite SPA bundled into a Keycloak JAR via Maven's `frontend-maven-plugin`. When deployed, it runs inside Keycloak at a URL like `https://keycloak.example.com/realms/{realm}/wizard/`. The root `pom.xml` controls which app gets built into the JAR (`workingDirectory` in the Maven config — currently pointing at `apps/wizard-v1`; switch to `apps/wizard-v2` when ready). + +--- + +## Monorepo structure + +``` +idp-wizard/ ← Maven project root +├── pom.xml ← Maven build; workingDirectory selects which app builds +├── pnpm-workspace.yaml ← pnpm workspace: apps/* +├── apps/ +│ ├── wizard-v1/ ← PatternFly + webpack + Redux (production) +│ └── wizard-v2/ ← Vite + shadcn + Tailwind (in development) +└── README.md +``` + +All work described in this file is inside `apps/wizard-v2/`. + +--- + +## Stack + +| Layer | Choice | Why | +| --------- | ----------------------------------- | ---------------------------------------------------------- | +| Build | Vite 8 | Fast, modern, ESM-native | +| UI | React 19 + shadcn/ui (new-york) | Component library matching Phase Two dashboard-v2 | +| Styling | Tailwind CSS v4 | CSS-first, no separate config file; OKLCH color tokens | +| Routing | TanStack Router (file-based) | Full type-safe routing with `validateSearch`, `beforeLoad` | +| Auth | oidc-spa v10 | OIDC against Keycloak; `withAutoLogin()`, no token schema | +| API types | openapi-typescript + openapi-fetch | Typed clients from OpenAPI specs, no Redux needed | +| State | useReducer (local to wizard runner) | Lightweight; no Redux, no global store | +| Testing | Playwright | E2E, Page Object Model | + +--- + +## File structure + +``` +apps/wizard-v2/ +├── docker/ +│ ├── docker-compose.yml # Dev Keycloak (Phase Two image, pre-configured) +│ └── realm-export.json # Auto-imported: realm "wizard", client "wizard-v2-dev", test user +├── e2e/ +│ ├── fixtures/test.ts # Extended Playwright fixture with typed page objects +│ ├── pages/ +│ │ ├── ProviderSelectorPage.ts # Page object: landing page +│ │ └── WizardPage.ts # Page object: wizard + protocol picker +│ └── provider-selector.spec.ts # Smoke tests (navigation, search, help dialog) +├── openapi-codegen/ +│ └── gen.ts # Fetches both OpenAPI specs and generates src/api/types/ +├── public/ +│ ├── favicons/ # Browser favicon assets +│ ├── phasetwo-logos/ # Phase Two brand SVGs (logo_phase_slash.svg is default) +│ ├── provider-logos/ # Per-provider logos for the selector UI +│ └── wizards/ # Step screenshots: /wizards/{provider}/saml/step1.png etc. +├── src/ +│ ├── api/ +│ │ ├── clients.ts # createOrgsClient() + createAdminClient() — typed, auth-injecting +│ │ └── types/ +│ │ ├── orgs.d.ts # Generated: Phase Two Orgs API (org-scoped IDPs) +│ │ └── admin.d.ts # Generated: Keycloak Admin API (realm-wide IDPs) +│ ├── components/ui/ # shadcn/ui components (button, dialog, input, …) +│ ├── context/ +│ │ └── WizardContext.tsx # WizardContextValue, WizardState, WizardAction, wizardReducer +│ ├── data/ +│ │ └── providers.ts # Provider registry: id, name, logo, protocols[] +│ ├── hooks/ +│ │ ├── useWizardConfig.ts # Fetches {issuerUri}/wizard/config.json (logoUrl, appName, apiMode…) +│ │ └── useWizardApi.ts # Derives API context from env + orgId + config +│ ├── lib/ +│ │ ├── alias.ts # getOrCreateAlias() + clearAlias() — sessionStorage +│ │ └── utils.ts # cn() helper (clsx + tailwind-merge) +│ ├── routes/ +│ │ ├── __root.tsx # Root: OidcInitializationGate + devtools +│ │ ├── _authenticated.tsx # Layout: home button (hidden on index) +│ │ ├── _authenticated.index.tsx # Provider selector (/) +│ │ ├── _authenticated.wizard.$providerId.tsx # Protocol picker +│ │ └── _authenticated.wizard.$providerId.$protocol.tsx # Wizard runner ← main work area +│ ├── index.css # Tailwind v4 + Phase Two OKLCH color tokens +│ ├── main.tsx # RouterProvider entry point +│ └── oidc.ts # oidc-spa: useOidc, fetchWithAuth, OidcInitializationGate +├── wizards/ +│ ├── saml/ +│ │ └── saml.json # Generic SAML wizard (id="saml") ← canonical schema reference +│ ├── openid/ +│ │ └── oidc.json # Generic OpenID wizard (id="openid") — not yet written +│ ├── ldap/ +│ │ └── ldap.json # Generic LDAP wizard (id="ldap") — not yet written +│ └── {providerId}/ +│ └── {protocol}.json # e.g. okta/saml.json, entraid/saml.json — not yet written +├── .env.local.sample # Environment variable template +├── components.json # shadcn/ui config +├── playwright.config.ts # Playwright E2E config (mock OIDC, auto-starts Vite) +└── AGENTS.md # ← this file +``` + +--- + +## Environment + +``` +VITE_OIDC_USE_MOCK=true # Skip Keycloak entirely (UI-only dev) +VITE_OIDC_ISSUER_URI=http://localhost:8180/realms/wizard +VITE_OIDC_CLIENT_ID=wizard-v2-dev +VITE_OIDC_SPA_DEBUG=false +``` + +Parse `VITE_OIDC_ISSUER_URI` to get `serverUrl` and `realm` — the regex in `useWizardApi.ts` handles both `/auth/realms/` (legacy) and `/realms/` (modern) Keycloak paths. + +Dev Keycloak: `cd docker && docker compose up` +Test user: `wizard` / `password` with `realm-admin` role. + +--- + +## Routing + +TanStack Router file-based routing. The flat file naming convention uses dots for path segments: + +| File | Route | +| ------------------------------------------------- | ------------------------------------------ | +| `_authenticated.tsx` | Layout wrapper (no path segment, pathless) | +| `_authenticated.index.tsx` | `/` | +| `_authenticated.wizard.$providerId.tsx` | `/wizard/:providerId` | +| `_authenticated.wizard.$providerId.$protocol.tsx` | `/wizard/:providerId/:protocol` | + +**Critical gotcha — parent `beforeLoad` runs for child routes.** `$protocol` is a child of `$providerId` in the route tree. So the `$providerId` route's `beforeLoad` runs when navigating to `/wizard/adfs/saml`. Do not add redirects in `$providerId`'s `beforeLoad` that could target child routes — this causes infinite redirect loops. The `$providerId` route's `beforeLoad` only validates that the provider exists. + +**Search params** (`?org_id=...`) are declared via `validateSearch: z.object({ org_id: z.string().optional() })` on each route that needs them (index, `$providerId`, `$protocol`). The `org_id` is passed forward through navigation calls so it persists across the full wizard flow. + +--- + +## Organization context + +When the wizard is launched from a Phase Two organization (e.g., from the dashboard), `?org_id=abc123` is appended to the URL. + +- **`org_id` present → `apiMode: "cloud"`** → uses Phase Two Orgs API at `/{realm}/orgs/{orgId}/idps/...` +- **`org_id` absent → `apiMode: "onprem"`** → uses Keycloak Admin API at `/admin/realms/{realm}/identity-provider/...` + +The `apiMode` can also be set via the realm config (`config.apiMode` from `useWizardConfig`), but `org_id` in the URL always takes precedence. + +Both endpoint sets are fully typed via the generated OpenAPI clients. + +--- + +## API clients + +Two typed clients are available on `WizardContext`: + +```ts +const { orgsClient, adminClient, activeClient, realm, orgId } = + useWizardContext(); + +// Cloud (org-scoped) — Phase Two Orgs API +const { data, error } = await orgsClient.POST("/{realm}/orgs/{orgId}/idps", { + params: { path: { realm, orgId: orgId! } }, + body: { alias, providerId: "saml", hideOnLogin: true, config: metadata }, +}); + +// Onprem (realm-wide) — Keycloak Admin API +const { data, error } = await adminClient.POST( + "/admin/realms/{realm}/identity-provider/instances", + { + params: { path: { realm } }, + body: { alias, providerId: "saml", hideOnLogin: true, config: metadata }, + }, +); +``` + +Types are generated from the OpenAPI specs. Regenerate with `pnpm gen-api` when upstream specs change. The generated files (`src/api/types/orgs.d.ts`, `admin.d.ts`) are committed. + +Key endpoints: + +| Action | Cloud path | Onprem path | +| ----------------- | ------------------------------------------------- | ------------------------------------------------------------------------ | +| Validate metadata | `POST /{realm}/orgs/{orgId}/idps/import-config` | `POST /admin/realms/{realm}/identity-provider/import-config` | +| Create IDP | `POST /{realm}/orgs/{orgId}/idps` | `POST /admin/realms/{realm}/identity-provider/instances` | +| Add mapper | `POST /{realm}/orgs/{orgId}/idps/{alias}/mappers` | `POST /admin/realms/{realm}/identity-provider/instances/{alias}/mappers` | + +--- + +## Wizard JSON schema (`wizards/generic/saml.json`) + +This is the canonical reference. All wizard JSON files follow this schema. + +### Top-level shape + +```jsonc +{ + "schemaVersion": "1.0", + "id": "generic-saml", + "providerId": "saml", // matches Provider.id in providers.ts + "protocol": "saml", // "saml" | "oidc" | "ldap" + "title": "Generic SAML", + + "alias": { + "prefix": "generic-saml", // prefix for generated alias: "{prefix}-{6chars}" + "sessionKey": "p2_saml_saml" // sessionStorage key — unique per provider+protocol + }, + + "idpConfig": { // merged into the IDP creation request + "providerId": "saml", + "hideOnLogin": true, + "defaults": { ... } // merged into metadata before sending to Keycloak + }, + + "steps": [ ... ], + "forms": { ... }, + "actions": { ... } +} +``` + +### Steps + +Each step has: + +- `id` (number) — 1-indexed, sequential +- `title` (string) +- `type` (optional) — omit for normal steps; `"confirm"` for the final step +- `enableNextWhen` (optional) — expression string: e.g. `"state.metadataValidated"` +- `blocks` — array of UI blocks + +Block types: + +- `text` — `{ type: "text", content: "..." }` +- `copy` — copyable value: `{ type: "copy", label: "ACS URL", value: "{{api.ssoUrl}}", hint: "..." }` +- `formGroup` — renders a tabbed/exclusive set of forms: `{ type: "formGroup", id: "metadataInput", exclusive: true, forms: ["metadataUrl", "metadataFile", "metadataManual"] }` +- `attributeTable` — two-column mapping display +- `confirm` — final step confirmation button + result display + +### Template variables available in blocks and actions + +| Variable | Resolves to | +| ----------------------- | ----------------------------------------------------- | +| `{{api.entityId}}` | `{serverUrl}/realms/{realm}` | +| `{{api.ssoUrl}}` | `{serverUrl}/realms/{realm}/broker/{alias}/endpoint` | +| `{{api.samlMetadata}}` | `{serverUrl}/realms/{realm}/protocol/saml/descriptor` | +| `{{api.adminLinkSaml}}` | Keycloak admin console link for the SAML IDP | +| `{{api.adminLinkOidc}}` | Keycloak admin console link for the OIDC IDP | +| `{{alias}}` | The generated alias for this wizard session | +| `{{state.metadata}}` | The validated IDP config object from `import-config` | +| `{{form.fieldId}}` | A field value from the currently active form | +| `{{item.*}}` | Current item in a `foreach` action iteration | + +### Forms + +Each form in the `forms` dictionary has: + +- `title`, `description` +- `fields` — array of `{ id, type, label, required, placeholder?, accept?, ... }` + - Field types: `text`, `url`, `file` +- `submit` — `{ label: "Validate URL", action: "actionKey" }` + +### Actions + +Each action in the `actions` dictionary: + +```jsonc +{ + "endpoint": "importConfig", // named slot; runner resolves to actual URL from context + "method": "POST", + "contentType": "json", // "json" or "multipart" + "body": { ... }, // template vars resolved at call time + "foreach": [ ... ], // optional: iterate body over each item (used for mappers) + "onSuccess": { + "mergeIntoMetadata": "{{response}}", // merge response into state.metadata + "dispatch": ["METADATA_VALIDATED"], // fire reducer actions + "then": ["addSamlMappers", "clearAlias"] // chain follow-up actions + }, + "messages": { + "success": "...", + "error": "..." + } +} +``` + +Named endpoint slots (`endpoint` key): + +- `importConfig` — validates metadata; returns raw IDP config object +- `createIdp` — creates the identity provider +- `addMappers` — adds attribute mapper to an existing IDP + +Special action types (no `endpoint`): + +- `{ "type": "clearAlias" }` — removes alias from sessionStorage + +--- + +## Wizard state (useReducer) + +State lives in `WizardContext` and is managed by `wizardReducer` in `src/context/WizardContext.tsx`. + +```ts +interface WizardState { + alias: string; // stable for the session + currentStep: number; // the step currently displayed + stepIdReached: number; // furthest step reached (controls canJumpTo) + metadata: Record | null; // from import-config response + metadataValidated: boolean; + submitting: boolean; + submitted: boolean; + error: string | null; + result: string | null; + idpTestLink: string | null; +} + +type WizardAction = + | { type: "ADVANCE_STEP"; toStep: number } + | { type: "SET_METADATA"; metadata: Record } + | { type: "METADATA_VALIDATED" } + | { type: "SUBMIT_START" } + | { type: "SUBMIT_SUCCESS"; result: string; idpTestLink?: string } + | { type: "SUBMIT_ERROR"; error: string } + | { type: "CLEAR_ERROR" }; +``` + +--- + +## Alias lifecycle + +Aliases give each wizard session a unique Keycloak IDP alias (e.g. `generic-saml-a1b2c3`). This prevents collisions when a user abandons a wizard and re-enters. + +- Generated on wizard entry via `getOrCreateAlias(sessionKey, prefix)` in `src/lib/alias.ts` +- Stored in `sessionStorage` — survives page refresh within the same tab, auto-cleared on tab close +- Cleared explicitly by the `clearAlias` action after successful IDP creation + +Session key format: `p2_{providerId}_{protocol}` — e.g. `p2_saml_saml`, `p2_okta_saml`. + +--- + +## Wizard config (realm attributes) + +`useWizardConfig()` fetches `{issuerUri}/wizard/config.json` on load. This endpoint is served by the Keycloak extension and contains realm-level settings: + +```ts +interface WizardConfig { + appName: string | null; // displayed above the provider selector card + logoUrl: string | null; // displayed above the provider selector card + displayName: string; + apiMode: "cloud" | "onprem" | ""; + emailAsUsername: boolean; // affects SAML attribute mapper creation + enableDashboard: boolean; + enableLdap: boolean; + enableGroupMapping: boolean; + trustEmail: boolean; // passed to IDP creation payload +} +``` + +If the endpoint is unreachable (local dev without the extension), all values fall back to safe defaults. The logo falls back to `/phasetwo-logos/logo_phase_slash.svg`. + +--- + +## Provider selector (index route) + +- Centered card (`max-w-sm`, `rounded-xl`, `shadow-md`) on a flex-centered page +- Phase Two slash logo + optional `appName` above the card (from `useWizardConfig`) +- Search input with Fuse.js fuzzy matching (threshold 0.4, key: `name`) +- Scrollable list (`max-h-72`, ~6 items visible at once) +- Two groups: **Providers** (specific) → divider → **Generic** (saml/oidc/ldap) +- Protocol badges: `saml`=blue, `oidc`=emerald, `ldap`=amber +- "Not sure where to start?" link below the card → Dialog with step-by-step instructions +- Single-protocol providers navigate directly to `/wizard/$providerId/$protocol` +- Multi-protocol providers navigate to `/wizard/$providerId` (protocol picker) +- `org_id` search param is forwarded through all navigation calls + +--- + +## v1 → v2 patterns reference + +| v1 pattern | v2 equivalent | +| --------------------------------------------------------- | ------------------------------------------------------------ | +| Redux store + `state.settings.currentOrg` | `?org_id` URL search param | +| Redux `state.settings.apiMode` | Derived in `useWizardApi` from `org_id` + config | +| Keycloak JS adapter (`keycloak.token`) | `oidc-spa` `getOidc().getAccessToken()` | +| `Axios` interceptor with Bearer token | `openapi-fetch` middleware (same pattern) | +| `getAlias()` in `localStorage` | `getOrCreateAlias()` in `sessionStorage` | +| `CreateIdp()` / `SamlAttributeMapper()` utility functions | `orgsClient.POST(...)` / `adminClient.POST(...)` typed calls | +| Per-provider React component trees | Single `WizardRunner` + JSON wizard definition | +| RTK Query hooks for feature flags | `useWizardConfig()` hook | +| `usePrompt` for leave warning | Not yet implemented in v2 | +| `useCreateTestIdpLink` | Not yet implemented in v2 | + +--- + +## What is built + +- [x] Vite + React + Tailwind v4 + shadcn/ui project +- [x] pnpm workspace monorepo (v1 and v2 side by side) +- [x] TanStack Router file-based routing +- [x] oidc-spa authentication (mock mode + real Keycloak) +- [x] Dev Keycloak via Docker Compose (Phase Two image, auto-imported realm) +- [x] Provider selector UI (fuzzy search, protocol badges, grouped list, help dialog) +- [x] Protocol picker route +- [x] Org context (`org_id` search param, apiMode switching) +- [x] WizardContext with useReducer state +- [x] Alias management (sessionStorage) +- [x] useWizardApi — derives all API context from env + org_id + config +- [x] Typed API clients (openapi-fetch + generated types from Phase Two + Keycloak OpenAPI specs) +- [x] Wizard JSON schema (defined and documented, `wizards/generic/saml.json`) +- [x] Playwright E2E scaffold (Page Object Model, mock OIDC, smoke tests) +- [x] Home/back button in layout when inside a wizard + +## What is not yet built + +- [ ] **Wizard runner** — the component that reads a wizard JSON file and renders steps, forms, and blocks. This is the main remaining work. +- [ ] **Action executor** — the runtime that resolves template variables and executes `actions` from the JSON (makes API calls, dispatches reducer actions, chains follow-up actions) +- [ ] **Block renderers** — React components for each block type: `text`, `copy`, `formGroup`, `attributeTable`, `confirm` +- [ ] **Form renderer** — renders form fields from the JSON `forms` dictionary, handles validation and submission +- [ ] **Step navigation UI** — sidebar/stepper nav, next/back buttons, `enableNextWhen` gating +- [ ] **Company-specific wizard JSON files** — `wizards/okta/saml.json`, `wizards/entraid/saml.json`, etc. +- [ ] **OIDC wizard JSON** — `wizards/generic/oidc.json` (different flow: discovery URL + client credentials) +- [ ] **LDAP wizard JSON** — `wizards/generic/ldap.json` (different API: LDAP component, not IDP) +- [ ] **Leave-wizard confirmation prompt** (v1 used `usePrompt`) +- [ ] **IDP test link** (post-creation link to test the IDP login, v1 used `useCreateTestIdpLink`) +- [ ] **`emailAsUsername` + `usernameMapperImport` flag handling** in the mapper action + +--- + +## Key decisions and rationale + +**No Redux in v2.** The dashboard-v2 uses RTK Query because it has complex server state with caching needs. The wizard is a linear flow — `useReducer` is sufficient and keeps the dependency footprint small. + +**`openapi-fetch` over hand-written URLs.** Eliminates a category of bugs (wrong path, wrong body shape) and auto-updates when specs change. The same OpenAPI specs used by dashboard-v2. + +**`sessionStorage` for alias.** v1 used `localStorage` which could leave stale aliases across browser sessions. `sessionStorage` scopes to the tab, so a new session always starts fresh. + +**JSON schema drives the wizard, not code.** The `actions` block in the JSON declares what API calls each step makes. The runner interprets this — the JSON author doesn't write API code. This is the core architectural bet of v2. + +**`org_id` in the URL, not a cookie or context.** Makes the wizard linkable from an org context (dashboard can link directly to the wizard with the org pre-scoped), and the URL is the single source of truth. + +**oidc-spa without `withExpectedDecodedIdTokenShape`.** Keycloak token schemas vary by realm configuration and Phase Two extensions. Skipping schema validation avoids runtime errors on unpredictable token fields. Add schema validation back only if specific fields are actively required and reliably present. + +**`$providerId` route does NOT redirect to `$protocol`.** This was originally in the `beforeLoad` for convenience (auto-skip the protocol picker for single-protocol providers). It was removed because `$protocol` is a child route of `$providerId` in the TanStack Router tree — the parent `beforeLoad` runs on child navigation too, causing an infinite redirect loop. The index page handles the single-protocol shortcut instead. diff --git a/apps/wizard-v2/README.md b/apps/wizard-v2/README.md new file mode 100644 index 00000000..7c8e1e2c --- /dev/null +++ b/apps/wizard-v2/README.md @@ -0,0 +1,449 @@ +# wizard-v2 + +A rewrite of the Phase Two IDP Wizard. Wizards are defined declaratively as JSON files and rendered by a generic runtime engine — no per-provider component trees. This replaces wizard-v1 once complete. + +## Stack + +- **Vite** — build tooling +- **React 19** — UI +- **Tailwind CSS v4** — styling +- **shadcn/ui** (new-york style) — component library +- **TanStack Router** — file-based routing with full type safety +- **oidc-spa** — OIDC authentication against Keycloak +- **openapi-fetch** — typed HTTP clients generated from OpenAPI specs + +## Project structure + +``` +wizard-v2/ +├── docker/ +│ ├── docker-compose.yml # Dev Keycloak (Phase Two image, pre-configured) +│ └── realm-export.json # Auto-imported on first start: realm, client, test user +├── e2e/ +│ ├── .auth/ # Saved login state (gitignored); .gitkeep tracks the dir +│ ├── external-providers/ +│ │ ├── Auth0Page.ts # POM for Auth0 Dashboard +│ │ ├── OktaPage.ts # POM for Okta Admin Console +│ │ └── external-provider.spec.ts +│ ├── fixtures/ +│ │ ├── test.ts # Playwright fixture with typed page objects +│ │ └── test-saml-metadata.xml # Minimal SAML metadata for file upload tests +│ ├── pages/ +│ │ ├── KeycloakLoginPage.ts +│ │ ├── ProviderSelectorPage.ts +│ │ └── WizardPage.ts +│ ├── auth.setup.ts # OIDC login setup — saves storage state +│ ├── global-setup.ts # Creates orgs + assigns users (integration mode) +│ ├── organizations.spec.ts # Org management + org-scoped wizard tests +│ ├── provider-selector.spec.ts +│ └── wizard-completion.spec.ts # Full flow tests for all 21 wizards +├── openapi-codegen/ +│ └── gen.ts # Generates typed API clients from OpenAPI specs +├── public/ +│ ├── favicons/ # Favicon assets +│ ├── phasetwo-logos/ # Phase Two brand assets +│ ├── provider-logos/ # Per-provider logos for the selector UI +│ └── wizards/ # Step screenshots, one folder per provider +├── src/ +│ ├── api/ +│ │ ├── clients.ts # createOrgsClient / createAdminClient (openapi-fetch) +│ │ └── types/ +│ │ ├── orgs.d.ts # Generated types — Phase Two Orgs API +│ │ └── admin.d.ts # Generated types — Keycloak Admin API +│ ├── components/ +│ │ ├── ui/ # shadcn/ui components +│ │ └── wizard/ +│ │ ├── types.ts # TypeScript types for wizard JSON schema +│ │ ├── resolveTemplate.ts # {{token}} template resolver +│ │ ├── executeAction.ts # Action executor (HTTP calls, alias cleanup) +│ │ ├── WizardRunner.tsx # Loads JSON, renders steps + navigation +│ │ └── WizardStep.tsx # Renders individual step blocks +│ ├── context/ +│ │ └── WizardContext.tsx # State, reducer, and React context +│ ├── data/ +│ │ └── providers.ts # Provider registry (id, name, logo, protocols) +│ ├── hooks/ +│ │ ├── useWizardApi.ts # Resolves API clients, endpoints, apiMode +│ │ └── useWizardConfig.ts # Fetches realm config.json (logoUrl, appName…) +│ ├── lib/ +│ │ ├── alias.ts # sessionStorage alias helpers +│ │ └── utils.ts # cn() helper (clsx + tailwind-merge) +│ ├── routes/ +│ │ ├── __root.tsx # Root — OidcInitializationGate +│ │ ├── _authenticated.tsx # Layout — home button header +│ │ ├── _authenticated.index.tsx # Provider selector (/) +│ │ ├── _authenticated.wizard.$providerId.tsx # Layout wrapper — Outlet only +│ │ ├── _authenticated.wizard.$providerId.index.tsx # Protocol picker +│ │ └── _authenticated.wizard.$providerId.$protocol.tsx # Wizard page +│ ├── index.css # Tailwind + Phase Two color scheme (OKLCH tokens) +│ ├── main.tsx # TanStack RouterProvider entry point +│ └── oidc.ts # oidc-spa setup: useOidc, fetchWithAuth, OidcInitializationGate +├── wizards/ +│ ├── saml/ +│ │ └── saml.json # Generic SAML wizard definition +│ └── / +│ └── .json # Provider-specific wizard definitions +├── .env.local.sample # Environment variable template +├── playwright.config.ts # Playwright E2E config +└── components.json # shadcn/ui config +``` + +## Architecture + +Wizards are JSON files in `wizards/`. Each file describes a complete wizard — steps, UI blocks, forms, actions, and API calls — without any bespoke React components. A runtime engine reads the JSON and renders the wizard generically. + +This means adding a new identity provider requires only a new JSON file, not a new component tree. + +### Wizard JSON schema + +Wizard files live at `wizards/{providerId}/{protocol}.json`. The runtime loads the file for the active provider and protocol. If no provider-specific file exists, the wizard shows a "not yet available" message — there is no generic fallback. + +Each wizard JSON has four top-level keys: + +| Key | Description | +| --------- | ---------------------------------------------------------------------------------------------------------------------- | +| `steps` | Ordered list of wizard steps, each with an `id`, `title`, optional `enableNextWhen` expression, and a list of `blocks` | +| `forms` | Named form definitions (fields, validation) rendered by `FormGroup` blocks | +| `actions` | Named action definitions (HTTP calls, alias cleanup) invoked on form submit or confirm | +| `alias` | Alias configuration — `sessionKey` for sessionStorage, `prefix` for generated alias strings | + +Template tokens in JSON values (`{{api.entityId}}`, `{{form.fieldId}}`, `{{state.metadata}}`, `{{alias}}`, `{{item.*}}`) are resolved at runtime from the wizard context. + +## API clients + +The wizard uses two typed HTTP clients generated from OpenAPI specs — one for the Phase Two Orgs API (cloud/organization mode) and one for the Keycloak Admin API (on-premises/realm-wide mode). Both are created in `src/api/clients.ts` using [openapi-fetch](https://openapi-ts.dev/openapi-fetch/). + +### Regenerating types + +```bash +npx tsx openapi-codegen/gen.ts +``` + +This fetches the latest specs and writes: + +- `src/api/types/orgs.d.ts` — Phase Two Orgs API types +- `src/api/types/admin.d.ts` — Keycloak Admin API types + +### Cloud vs. on-premises mode + +The wizard operates in one of two API modes depending on how it is launched: + +| Mode | Trigger | API used | Endpoint pattern | +| ---------- | ----------------------------- | ------------------ | --------------------------------------------- | +| **cloud** | `?org_id=` present in URL | Phase Two Orgs API | `/{realm}/orgs/{orgId}/idps/...` | +| **onprem** | No `org_id` param | Keycloak Admin API | `/admin/realms/{realm}/identity-provider/...` | + +`useWizardApi` (in `src/hooks/useWizardApi.ts`) inspects the `org_id` search param to set `apiMode` and resolves the correct endpoint URLs and typed client for each mode. The wizard JSON actions reference named endpoint slots (`importConfig`, `createIdp`, `addMappers`) rather than raw URLs — these are resolved to the correct mode-specific URLs at runtime. + +### Endpoint reference + +| Slot | Cloud URL | On-prem URL | +| -------------- | ------------------------------------------------- | ------------------------------------------------------------------------ | +| `importConfig` | `POST /{realm}/orgs/{orgId}/idps/import-config` | `POST /admin/realms/{realm}/identity-provider/import-config` | +| `createIdp` | `POST /{realm}/orgs/{orgId}/idps` | `POST /admin/realms/{realm}/identity-provider/instances` | +| `addMappers` | `POST /{realm}/orgs/{orgId}/idps/{alias}/mappers` | `POST /admin/realms/{realm}/identity-provider/instances/{alias}/mappers` | + +### Realm and server URL + +Both are parsed from `VITE_OIDC_ISSUER_URI` at startup. The parser handles both legacy Keycloak paths (`/auth/realms/`) and modern paths (`/realms/`). + +### Realm config + +`useWizardConfig` fetches `{issuerUri}/wizard/config.json` and exposes optional realm-level overrides: + +| Key | Description | +| ----------------- | ----------------------------------------------------------------------------- | +| `logoUrl` | Replaces the Phase Two slash logo on the provider selector and wizard sidebar | +| `logoUrlLight` | Optional theme-specific override used when the UI is in light mode | +| `logoUrlDark` | Optional theme-specific override used when the UI is in dark mode | +| `appName` | Shown above the provider search card | +| `apiMode` | Override the auto-detected mode (`"cloud"` or `"onprem"`) | +| `emailAsUsername` | Adds an email→username mapper when creating the IDP | + +If the file is missing or the fetch fails, defaults are used silently. + +#### Logo resolution + +Logos cascade through three levels (first match wins): + +1. **Theme-specific override** — `logoUrlDark` in dark mode, `logoUrlLight` in light mode +2. **Single tenant override** — `logoUrl` (used for both themes) +3. **Phase Two fallback** — `/phasetwo-logos/{light|dark}/logo_phase_slash.svg`, served from `public/` + +Set `logoUrlLight` / `logoUrlDark` only if your brand logo doesn't render well across both backgrounds. Tenants that don't care about dark mode can keep using `logoUrl` alone — it's still honored. + +## IDP alias + +Each wizard session generates a unique IDP alias (e.g. `saml-saml-a1b2c3`) stored in `sessionStorage`. The alias is: + +- Stable for the duration of the browser tab/session +- Used as the IDP identifier in all API calls during the wizard +- Cleared from `sessionStorage` on successful wizard completion (via the `clearAlias` action) +- Scoped per provider+protocol pair so multiple concurrent wizard sessions don't collide + +## Local development + +### 1. Environment + +Copy the env sample. The defaults match the local Docker Keycloak setup: + +```bash +cp .env.local.sample .env.local +``` + +| Variable | Default | Description | +| ---------------------- | ------------------------------------------ | ---------------------------- | +| `VITE_OIDC_ISSUER_URI` | `http://localhost:8080/auth/realms/wizard` | Keycloak realm URL | +| `VITE_OIDC_CLIENT_ID` | `wizard-v2-dev` | Keycloak client ID | +| `VITE_OIDC_SPA_DEBUG` | `false` | Enable verbose oidc-spa logs | + +### 2. Start Keycloak + +```bash +cd docker +docker compose up +``` + +On first run, Keycloak auto-imports `realm-export.json` which creates: + +- **Realm:** `wizard` +- **Client:** `wizard-v2-dev` (public, redirect URI: `http://localhost:5173/*`) +- **Test user:** see below + +Keycloak data persists in a named Docker volume between restarts. + +> If the volume already exists from a previous run with bad state, recreate it cleanly: +> +> ```bash +> docker compose down -v && docker compose up +> ``` + +#### Dev test users + +| Username | Password | Email | Roles | +| ------------ | ---------- | ------------------------ | ------------- | +| `wizard` | `password` | `wizard@example.com` | `realm-admin` | +| `org-admin` | `password` | `org-admin@example.com` | — | +| `org-member` | `password` | `org-member@example.com` | — | + +`wizard` has full `realm-admin` permissions, which the wizard requires to create identity providers via the Keycloak Admin API. `org-admin` and `org-member` are plain users used by integration tests; `global-setup.ts` assigns them to test organizations at runtime. + +#### SCIM + +Enable SCIM on the Organizations > Gear icon > Select SCIM checkbox. + +More SCIM details: https://github.com/p2-inc/keycloak-orgs/blob/main/docs/scim.md + +### 3. Start the dev server + +```bash +pnpm dev +``` + +The app runs at `http://localhost:5173`. Log in with `wizard` / `password`. + +To test organization (cloud) mode, append `?org_id=` to the URL. The debug strip in dev mode shows the resolved `apiMode`, `orgId`, `realm`, alias, and endpoint URLs. + +### Mock mode + +To work on UI without a running Keycloak instance, set `VITE_OIDC_USE_MOCK=true` in `.env.local`. oidc-spa returns a mock authenticated user and all auth flows are bypassed. + +## Adding shadcn components + +```bash +pnpm dlx shadcn@latest add button +``` + +Components are added to `src/components/ui/` and automatically use the Phase Two color scheme defined in `src/index.css`. + +## Static assets + +Assets in `public/` are served at the root path with no imports required. + +| Path | Usage | +| ---------------------- | -------------------------------------------------- | +| `/favicons/` | Browser favicon assets | +| `/phasetwo-logos/` | Phase Two brand SVGs | +| `/provider-logos/` | Provider logos used in the selector UI | +| `/wizards//` | Step screenshots referenced from wizard JSON files | + +Example reference in a wizard JSON: `"/wizards/okta/saml/step1.png"` + +## Testing + +E2E tests use [Playwright](https://playwright.dev/) and the Page Object Model pattern. There are two test modes — a fast mock mode for everyday development and a full integration mode that drives a real Keycloak server. + +### Intent + +The test suite is designed to verify the wizard at every layer: + +- **UI and navigation** — does the step sequencing work? Are copy blocks, forms, and attribute tables rendered correctly? Does search and help work on the provider selector? +- **Wizard completion** — can each provider's wizard flow be driven from start to finish, including form submission and final IDP creation? This covers all 21 wizard files. +- **API routing** — does the wizard call the right endpoints (org-scoped vs. realm-wide) depending on how it was launched? +- **Organization context** — does the `?org_id=` launch mode work correctly? Are org memberships, roles, and API routes all correct? +- **External provider loop** _(optional)_ — can the browser automate the external provider setup (Auth0, Okta) and feed the resulting credentials directly into the wizard, end-to-end? + +### Running tests + +```bash +# Fast mock tests — no Keycloak required +pnpm test:e2e + +# Interactive Playwright UI +pnpm test:e2e:ui + +# View the last HTML report +pnpm test:e2e:report + +# Integration tests — requires Keycloak running (see below) +pnpm test:integration + +# External provider tests — requires provider credentials in env (see below) +pnpm test:external +``` + +### Test modes + +#### Mock mode (default) + +The Vite dev server runs with `VITE_OIDC_USE_MOCK=true` — oidc-spa returns a mock authenticated user and no real Keycloak is needed. Keycloak API calls (import-config, create IDP, add mappers, LDAP test) are intercepted with Playwright's `page.route()` so the full wizard UI flow can be exercised without any server. + +The `VITE_OIDC_ISSUER_URI` is still set so the wizard runner can resolve API URLs correctly — even though the calls are intercepted before they reach any real server. + +#### Integration mode (`PLAYWRIGHT_INTEGRATION=true`) + +Requires Keycloak to be running: + +```bash +cd docker && docker compose up -d +``` + +The Playwright run has three phases: + +1. **`auth:setup` project** — opens a browser, follows the OIDC redirect to Keycloak, logs in as `wizard`/`password`, and saves the browser storage state to `e2e/.auth/admin.json`. Subsequent test contexts load this state instead of re-authenticating. +2. **`global-setup.ts`** — runs once before the test suite. Uses the Keycloak admin API to create two test organizations (`test-org-alpha`, `test-org-beta`) and assign the `org-admin` and `org-member` test users to them. Org IDs are exposed via `process.env` so tests can reference them without hardcoding. +3. **Test projects** — run with the saved auth state and real API endpoints. + +### Test structure + +``` +e2e/ +├── .auth/ +│ └── admin.json # Saved browser state for integration tests (gitignored) +├── external-providers/ +│ ├── Auth0Page.ts # POM for Auth0 Dashboard (manage.auth0.com) +│ ├── OktaPage.ts # POM for Okta Admin Console +│ └── external-provider.spec.ts # Full-loop tests: configure provider, complete wizard +├── fixtures/ +│ ├── test.ts # Extended Playwright fixture with typed page objects +│ └── test-saml-metadata.xml # Minimal SAML IdP metadata for file upload tests +├── pages/ +│ ├── KeycloakLoginPage.ts # POM for Keycloak login screen (theme-agnostic) +│ ├── ProviderSelectorPage.ts # POM for the provider selector landing page +│ └── WizardPage.ts # POM for wizard runner — step nav, forms, confirmation +├── auth.setup.ts # Playwright setup project: OIDC login, save storage state +├── global-setup.ts # Pre-suite setup: create orgs, assign users via Orgs API +├── organizations.spec.ts # Organization membership, ?org_id routing, org-scoped completion +├── provider-selector.spec.ts # Smoke tests: provider list, search, help dialog, navigation +└── wizard-completion.spec.ts # Full flow tests for SAML, OIDC, and LDAP wizards +``` + +### Spec files + +#### `provider-selector.spec.ts` + +Smoke tests for the landing page and navigation. Runs in mock mode. Covers: + +- Provider list renders, fuzzy search works, clearing search restores grouped view +- Help dialog opens and closes +- Single-protocol providers navigate directly to the wizard; multi-protocol providers navigate to the protocol picker +- Home link returns to the provider selector + +#### `wizard-completion.spec.ts` + +Full wizard flow tests. Runs in mock mode with API interception. Covers: + +- **Auth0 SAML** — file upload flow: upload test metadata XML, validate, advance through attribute mapping and user access steps, confirm IDP creation +- **Auth0 OIDC** — credentials flow: fill domain, client ID, and secret, verify against the discovery endpoint, configure redirect URI, confirm +- **Okta LDAP** — connection flow: fill LDAP host and base DN, test connection, fill bind credentials, test authentication, confirm user federation creation +- **All 21 providers** — parametrized "loads without error" tests that navigate to every wizard and assert that at least one step renders. This ensures no wizard JSON has a syntax or schema error. + +Back-navigation and `enableNextWhen` gating (Next disabled until validation passes) are also tested. + +#### `organizations.spec.ts` + +Integration-mode tests (requires Keycloak). Covers: + +- Test organizations and memberships created by `global-setup.ts` exist and are correct +- Navigating to `/?org_id=` passes the org ID through to the wizard URL +- Wizard launched with `?org_id=` routes API calls through org-scoped endpoints rather than admin endpoints +- Org admin can complete a full SAML wizard for their organization + +#### `external-providers/external-provider.spec.ts` + +Full end-to-end tests that drive an external identity provider's admin UI and then complete the corresponding wizard. These are **skipped by default** — they run only when the relevant credential environment variables are set. + +Each test follows the same pattern: + +1. Open the provider's dashboard and create an application or integration +2. Configure it with the SP values (ACS URL, Entity ID) read from the wizard +3. Copy the resulting metadata URL or credentials +4. Return to the wizard and complete it using those values +5. Assert successful IDP creation + +| Test | Variables required | +| -------------------- | ----------------------------------------------- | +| Auth0 OIDC full loop | `AUTH0_DOMAIN`, `AUTH0_EMAIL`, `AUTH0_PASSWORD` | +| Auth0 SAML full loop | `AUTH0_DOMAIN`, `AUTH0_EMAIL`, `AUTH0_PASSWORD` | +| Okta SAML full loop | `OKTA_DOMAIN`, `OKTA_EMAIL`, `OKTA_PASSWORD` | + +> These tests create real applications in your provider accounts. Clean them up manually afterward. + +### Dev test users + +The `wizard` realm is pre-seeded with three test users (created from `docker/realm-export.json`): + +| Username | Password | Role | Purpose | +| ------------ | ---------- | ------------- | ---------------------------------------------------------------------------------- | +| `wizard` | `password` | `realm-admin` | Main admin — can call any Keycloak admin API. Used by `auth:setup` and most tests. | +| `org-admin` | `password` | — | Org-level admin. Assigned as admin of `test-org-alpha` by `global-setup.ts`. | +| `org-member` | `password` | — | Regular org member. Assigned as member of `test-org-alpha` by `global-setup.ts`. | + +### Keycloak admin theme + +Both the `wizard` realm and the `master` realm are configured to use the `phasetwo.v2` admin theme. This is set via: + +- `adminTheme: "phasetwo.v2"` in `docker/realm-export.json` for the wizard realm +- `docker/master-realm-export.json` (a minimal export mounted alongside the wizard realm) for the master realm — Keycloak merges it into the existing master realm on startup + +### CI + +In CI (`CI=true`), the web server is always started fresh, tests are retried up to 2 times, and the reporter uses GitHub annotations. Integration tests are not run in CI by default — set `PLAYWRIGHT_INTEGRATION=true` and ensure a Keycloak service is available to enable them. + +## Building + +```bash +pnpm build +``` + +Output goes to `dist/`. When wizard-v2 is ready for production, the root `pom.xml` `workingDirectory` will be updated to `apps/wizard-v2` and `mvn package` will bundle it into the Keycloak JAR. + +## Migration check + +- Existing provider setup is displayed +- Ability to change organizations if you are not in organization mode (as in if you were sent a link generated for a specific org, you can only view that org) + +## Wizard Review + +- AWS: complete +- Microsoft Entra ID: complete +- ADFS: complete +- Oracle: complete +- Salesforce (SAML): complete +- JumpCloud: complete +- Okta (SAML): complete +- Cloudflare: complete +- LastPass: complete +- OneLogin: complete +- CyberArk: complete +- Google Workspace (SAML): complete diff --git a/apps/wizard-v2/components.json b/apps/wizard-v2/components.json new file mode 100644 index 00000000..8bfc737f --- /dev/null +++ b/apps/wizard-v2/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/apps/wizard-v2/docker/docker-compose.yml b/apps/wizard-v2/docker/docker-compose.yml new file mode 100644 index 00000000..7c9bf0a8 --- /dev/null +++ b/apps/wizard-v2/docker/docker-compose.yml @@ -0,0 +1,26 @@ +services: + keycloak: + image: quay.io/phasetwo/phasetwo-keycloak:26.6.2.1780081975 + environment: + KEYCLOAK_ADMIN: admin + KEYCLOAK_ADMIN_PASSWORD: admin + KC_HTTP_RELATIVE_PATH: /auth + KC_HTTP_CORS_ALLOWED_ORIGINS: "http://localhost:5173" + KC_HTTP_CORS_ALLOWED_METHODS: "GET,POST,PUT,DELETE,OPTIONS" + KC_HTTP_CORS_ALLOWED_HEADERS: "Authorization,Content-Type" + command: + - start-dev + - --http-enabled=true + - --hostname-strict=false + - --import-realm + - --spi-email-template-provider=freemarker-plus-mustache + - --spi-email-template-freemarker-plus-mustache-enabled=true + - --spi-theme-cache-themes=false + ports: + - "8080:8080" + volumes: + - ./realm-export.json:/opt/keycloak/data/import/realm-export.json + - keycloak_data:/opt/keycloak/data + +volumes: + keycloak_data: diff --git a/apps/wizard-v2/docker/realm-export.json b/apps/wizard-v2/docker/realm-export.json new file mode 100644 index 00000000..fbcc39db --- /dev/null +++ b/apps/wizard-v2/docker/realm-export.json @@ -0,0 +1,84 @@ +{ + "realm": "wizard", + "enabled": true, + "displayName": "IDP Wizard Dev", + "adminTheme": "phasetwo.v2", + "attributes": { + "_providerConfig.wizard.apiMode": "onprem", + "_providerConfig.wizard.emailAsUsername": "false", + "_providerConfig.wizard.enableDashboard": "true", + "_providerConfig.wizard.enableDirectorySync": "true", + "_providerConfig.wizard.enableIdentityProvider": "true", + "_providerConfig.wizard.logoUrl": "", + "_providerConfig.wizard.trustEmail": "false" + }, + "clients": [ + { + "clientId": "wizard-v2-dev", + "name": "IDP Wizard v2 Dev", + "enabled": true, + "publicClient": true, + "standardFlowEnabled": true, + "directAccessGrantsEnabled": true, + "redirectUris": [ + "http://localhost:5173/*" + ], + "webOrigins": [ + "+" + ], + "attributes": {} + } + ], + "users": [ + { + "username": "wizard", + "email": "wizard@example.com", + "firstName": "Wizard", + "lastName": "Admin", + "enabled": true, + "emailVerified": true, + "credentials": [ + { + "type": "password", + "value": "password", + "temporary": false + } + ], + "clientRoles": { + "realm-management": [ + "realm-admin" + ] + } + }, + { + "username": "org-admin", + "email": "org-admin@example.com", + "firstName": "Org", + "lastName": "Admin", + "enabled": true, + "emailVerified": true, + "credentials": [ + { + "type": "password", + "value": "password", + "temporary": false + } + ] + }, + { + "username": "org-member", + "email": "org-member@example.com", + "firstName": "Org", + "lastName": "Member", + "enabled": true, + "emailVerified": true, + "credentials": [ + { + "type": "password", + "value": "password", + "temporary": false + } + ] + } + ] +} diff --git a/apps/wizard-v2/e2e/.auth/.gitkeep b/apps/wizard-v2/e2e/.auth/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/wizard-v2/e2e/auth.setup.ts b/apps/wizard-v2/e2e/auth.setup.ts new file mode 100644 index 00000000..0d427a12 --- /dev/null +++ b/apps/wizard-v2/e2e/auth.setup.ts @@ -0,0 +1,45 @@ +import { test as setup, expect } from "@playwright/test"; +import path from "path"; + +/** + * Authentication setup for integration tests. + * + * Navigates to the app, follows the OIDC redirect to Keycloak, logs in as the + * realm-admin wizard user, then saves the storage state (cookies + localStorage + * + sessionStorage) so that integration test projects can reuse the session + * without re-authenticating on every test. + * + * Run as part of the `auth:setup` Playwright project (see playwright.config.ts). + * Only executed when PLAYWRIGHT_INTEGRATION=true. + * + * Prerequisites: + * cd docker && docker compose up -d + * Wait for Keycloak to be healthy at http://localhost:8080/auth/realms/wizard + */ + +const AUTH_STATE_PATH = path.join("e2e", ".auth", "admin.json"); + +setup("authenticate as realm admin", async ({ page }) => { + // Navigate to the app — oidc-spa withAutoLogin() will redirect to Keycloak + await page.goto("/"); + + // Wait for Keycloak login page + await page.waitForURL(/localhost:8080/, { timeout: 15_000 }); + + await expect( + page.locator("input[name='username'], #username"), + "Keycloak login page should be visible" + ).toBeVisible({ timeout: 10_000 }); + + await page.locator("input[name='username'], #username").fill("wizard"); + await page.locator("input[name='password'], #password").fill("password"); + await page.locator("[type='submit'], #kc-login").click(); + + // Wait for redirect back to the app + await page.waitForURL("http://localhost:5173/**", { timeout: 15_000 }); + + // Brief pause so oidc-spa can finish the token exchange and write to storage + await page.waitForTimeout(1_000); + + await page.context().storageState({ path: AUTH_STATE_PATH }); +}); diff --git a/apps/wizard-v2/e2e/external-providers/Auth0Page.ts b/apps/wizard-v2/e2e/external-providers/Auth0Page.ts new file mode 100644 index 00000000..69d1cf53 --- /dev/null +++ b/apps/wizard-v2/e2e/external-providers/Auth0Page.ts @@ -0,0 +1,127 @@ +import { type Page } from "@playwright/test"; + +/** + * Page object for the Auth0 Dashboard (manage.auth0.com). + * + * Used in external-provider tests that drive Auth0 setup as part of a full + * end-to-end wizard test. This automates the steps described in the wizard's + * "Create a SAML Application" and "Create an Application" steps. + * + * Required environment variables: + * AUTH0_DOMAIN e.g. your-tenant.auth0.com + * AUTH0_EMAIL dashboard login email + * AUTH0_PASSWORD dashboard login password + * + * NOTE: Auth0 dashboard UI changes frequently. If selectors break, check + * manage.auth0.com and update the locators below. + */ +export class Auth0Page { + readonly page: Page; + readonly baseUrl: string; + + constructor(page: Page, _domain?: string) { + this.page = page; + // Auth0 dashboard is always at manage.auth0.com (not the tenant domain) + this.baseUrl = "https://manage.auth0.com"; + } + + // ── Authentication ──────────────────────────────────────────────────────── + + async login(email?: string, password?: string) { + const e = email ?? process.env["AUTH0_EMAIL"]; + const p = password ?? process.env["AUTH0_PASSWORD"]; + if (!e || !p) { + throw new Error( + "AUTH0_EMAIL and AUTH0_PASSWORD environment variables are required" + ); + } + + await this.page.goto(`${this.baseUrl}/`); + await this.page.getByLabel(/email/i).fill(e); + await this.page.getByRole("button", { name: /continue/i }).click(); + await this.page.getByLabel(/password/i).fill(p); + await this.page.getByRole("button", { name: /log in|continue/i }).click(); + await this.page.waitForURL(`${this.baseUrl}/dashboard/**`, { + timeout: 20_000, + }); + } + + // ── Application management ──────────────────────────────────────────────── + + async goToApplications() { + await this.page.goto(`${this.baseUrl}/dashboard/applications`); + } + + async createRegularWebApp(name: string): Promise { + await this.goToApplications(); + await this.page.getByRole("button", { name: /create application/i }).click(); + await this.page.getByLabel(/name/i).fill(name); + await this.page + .getByRole("radio", { name: /regular web applications/i }) + .click(); + await this.page.getByRole("button", { name: /create/i }).click(); + await this.page.waitForURL(/\/applications\//, { timeout: 10_000 }); + } + + async createSamlApp(name: string): Promise { + await this.goToApplications(); + await this.page.getByRole("button", { name: /create application/i }).click(); + await this.page.getByLabel(/name/i).fill(name); + // Any app type can have SAML — choose Regular Web App + await this.page + .getByRole("radio", { name: /regular web applications/i }) + .click(); + await this.page.getByRole("button", { name: /create/i }).click(); + await this.page.waitForURL(/\/applications\//, { timeout: 10_000 }); + // Enable SAML2 Web App addon + await this.page.getByRole("tab", { name: /addons/i }).click(); + await this.page.getByRole("button", { name: /saml2 web app/i }).click(); + } + + /** On the SAML2 addon settings modal, enter the ACS URL and Entity ID. */ + async configureSamlAddon(acsUrl: string, entityId: string): Promise { + await this.page.getByLabel(/application callback url/i).fill(acsUrl); + await this.page + .getByLabel(/audience|entity id/i) + .fill(entityId); + await this.page.getByRole("button", { name: /enable|save/i }).click(); + } + + /** + * Returns the SAML metadata download URL for the current application. + * Must be called after navigating to an application's Addons > SAML2 tab. + */ + samlMetadataUrl(domain: string, clientId: string): string { + return `https://${domain}/samlp/metadata/${clientId}`; + } + + // ── OIDC credentials ───────────────────────────────────────────────────── + + /** + * Returns the Client ID and Client Secret from the current application page. + * Assumes you are already on the application's Settings tab. + */ + async getOidcCredentials(): Promise<{ clientId: string; clientSecret: string }> { + const clientIdLocator = this.page.getByLabel(/client id/i).first(); + const clientSecretReveal = this.page.getByRole("button", { + name: /reveal client secret/i, + }); + + await clientSecretReveal.click().catch(() => {}); + const clientSecretLocator = this.page.getByLabel(/client secret/i).first(); + + return { + clientId: (await clientIdLocator.inputValue()) ?? "", + clientSecret: (await clientSecretLocator.inputValue()) ?? "", + }; + } + + /** Add a URL to the Allowed Callback URLs list. */ + async addCallbackUrl(url: string): Promise { + const input = this.page.getByLabel(/allowed callback urls/i); + const current = await input.inputValue(); + const updated = current ? `${current},${url}` : url; + await input.fill(updated); + await this.page.getByRole("button", { name: /save changes/i }).click(); + } +} diff --git a/apps/wizard-v2/e2e/external-providers/OktaPage.ts b/apps/wizard-v2/e2e/external-providers/OktaPage.ts new file mode 100644 index 00000000..25d39eea --- /dev/null +++ b/apps/wizard-v2/e2e/external-providers/OktaPage.ts @@ -0,0 +1,118 @@ +import { type Page } from "@playwright/test"; + +/** + * Page object for the Okta Admin Console (your-org.okta.com/admin). + * + * Used in external-provider tests that automate Okta setup steps described by + * the okta/saml.json and okta/ldap.json wizards. + * + * Required environment variables: + * OKTA_DOMAIN e.g. your-org.okta.com + * OKTA_EMAIL admin login email + * OKTA_PASSWORD admin login password + * + * NOTE: Okta's admin console uses React and Lit and the UI changes between + * versions. If selectors break, inspect the console at /admin and update. + */ +export class OktaPage { + readonly page: Page; + readonly adminBase: string; + + constructor(page: Page, domain?: string) { + this.page = page; + const d = domain ?? process.env["OKTA_DOMAIN"] ?? "your-org.okta.com"; + this.adminBase = `https://${d}/admin`; + } + + // ── Authentication ──────────────────────────────────────────────────────── + + async login(email?: string, password?: string) { + const e = email ?? process.env["OKTA_EMAIL"]; + const p = password ?? process.env["OKTA_PASSWORD"]; + if (!e || !p) { + throw new Error( + "OKTA_EMAIL and OKTA_PASSWORD environment variables are required" + ); + } + + await this.page.goto(`${this.adminBase}/`); + await this.page.getByLabel(/username/i).fill(e); + await this.page.getByRole("button", { name: /next/i }).click(); + await this.page.getByLabel(/password/i).fill(p); + await this.page.getByRole("button", { name: /sign in|verify/i }).click(); + await this.page.waitForURL(/\/admin\/dashboard/, { timeout: 20_000 }); + } + + // ── SAML App management ─────────────────────────────────────────────────── + + async goToApplications() { + await this.page.goto(`${this.adminBase}/apps/active`); + } + + /** Create a new SAML 2.0 application. Returns when on the app config page. */ + async createSamlApp(name: string): Promise { + await this.goToApplications(); + await this.page + .getByRole("button", { name: /create app integration/i }) + .click(); + await this.page.getByLabel(/saml 2\.0/i).click(); + await this.page.getByRole("button", { name: /next/i }).click(); + await this.page.getByLabel(/app name/i).fill(name); + await this.page.getByRole("button", { name: /next/i }).click(); + } + + /** Configure SAML settings (on step 2 of app creation). */ + async configureSamlSettings(acsUrl: string, entityId: string): Promise { + await this.page.getByLabel(/single sign.?on url/i).fill(acsUrl); + await this.page.getByLabel(/audience uri|sp entity id/i).fill(entityId); + await this.page.getByRole("button", { name: /next/i }).click(); + await this.page.getByRole("button", { name: /finish/i }).click(); + } + + /** + * Returns the metadata URL for the current SAML app. + * Must be called from the app's "Sign On" tab after creation. + */ + async getMetadataUrl(): Promise { + await this.page.getByRole("tab", { name: /sign on/i }).click(); + const link = this.page.getByRole("link", { name: /identity provider metadata/i }); + const href = await link.getAttribute("href"); + return href ?? ""; + } + + // ── LDAP Interface ──────────────────────────────────────────────────────── + + async goToDirectoryIntegrations() { + await this.page.goto(`${this.adminBase}/directory/ldap-integration`); + } + + /** + * Enables the LDAP interface if not already enabled. + * Returns the LDAP host and base DN for use in the wizard. + */ + async enableLdapInterface(): Promise<{ host: string; baseDn: string }> { + await this.goToDirectoryIntegrations(); + + const enableBtn = this.page.getByRole("button", { name: /enable/i }); + if (await enableBtn.isVisible().catch(() => false)) { + await enableBtn.click(); + } + + // Read the LDAP host and base DN from the settings page + const hostEl = this.page.getByLabel(/ldap host/i).or( + this.page.locator("[data-testid='ldap-host']") + ); + const baseDnEl = this.page.getByLabel(/base dn/i).or( + this.page.locator("[data-testid='base-dn']") + ); + + const host = (await hostEl.inputValue().catch(() => "")) || + (await hostEl.textContent().catch(() => "")) || + ""; + const baseDn = (await baseDnEl.inputValue().catch(() => "")) || + (await baseDnEl.textContent().catch(() => "")) || + ""; + + return { host: host.trim(), baseDn: baseDn.trim() }; + } +} diff --git a/apps/wizard-v2/e2e/external-providers/external-provider.spec.ts b/apps/wizard-v2/e2e/external-providers/external-provider.spec.ts new file mode 100644 index 00000000..d7c7a5de --- /dev/null +++ b/apps/wizard-v2/e2e/external-providers/external-provider.spec.ts @@ -0,0 +1,252 @@ +import { test, expect } from "../fixtures/test"; +import { Auth0Page } from "./Auth0Page"; +import { OktaPage } from "./OktaPage"; + +/** + * External provider end-to-end tests. + * + * These tests drive the full setup loop: configure the external provider (Auth0, + * Okta) in its own admin UI, then complete the wizard in our app using the + * values produced by the provider. + * + * !! THESE TESTS REQUIRE REAL CREDENTIALS AND LIVE PROVIDER ACCOUNTS !! + * + * Environment variables required (set in .env.local or CI secrets): + * + * Auth0: + * AUTH0_DOMAIN your-tenant.auth0.com + * AUTH0_EMAIL dashboard login email + * AUTH0_PASSWORD dashboard login password + * + * Okta: + * OKTA_DOMAIN your-org.okta.com + * OKTA_EMAIL admin email + * OKTA_PASSWORD admin password + * + * Running: + * PLAYWRIGHT_INTEGRATION=true AUTH0_EMAIL=... AUTH0_PASSWORD=... AUTH0_DOMAIN=... + * pnpm test:e2e --project=chromium e2e/external-providers/ + * + * CAUTION: These tests create real applications and IDPs in your provider + * accounts. Clean up manually afterward, or add afterAll teardown below. + */ + +const hasAuth0Creds = + !!process.env["AUTH0_EMAIL"] && + !!process.env["AUTH0_PASSWORD"] && + !!process.env["AUTH0_DOMAIN"]; + +const hasOktaCreds = + !!process.env["OKTA_EMAIL"] && + !!process.env["OKTA_PASSWORD"] && + !!process.env["OKTA_DOMAIN"]; + +// ── Auth0 OIDC ─────────────────────────────────────────────────────────────── + +test.describe("Auth0 OIDC — full loop", () => { + test.skip(!hasAuth0Creds, "AUTH0_* env vars not set"); + + /** + * Flow: + * 1. Log into Auth0 dashboard, create a Regular Web App + * 2. Copy the Client ID, Client Secret, and domain + * 3. Open the wizard (/wizard/auth0/oidc) + * 4. Fill in domain + credentials → verify + * 5. Add the redirect URI back in Auth0 + * 6. Complete the wizard + */ + test("creates Auth0 OIDC IDP from real credentials", async ({ page, wizard }) => { + const auth0 = new Auth0Page(page); + const appName = `playwright-test-${Date.now()}`; + + // Step A: Set up in Auth0 + await auth0.login(); + await auth0.createRegularWebApp(appName); + const { clientId, clientSecret } = await auth0.getOidcCredentials(); + const domain = process.env["AUTH0_DOMAIN"]!; + expect(clientId).toBeTruthy(); + expect(clientSecret).toBeTruthy(); + + // Step B: Complete wizard + // Mock IDP creation so we don't actually write to Keycloak in this test + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: { id: "test-idp" } }) + ); + await page.goto("/wizard/auth0/oidc"); + await wizard.waitForStep(/Create an Application/i); + await wizard.clickNext(); + + await wizard.waitForStep(/Domain & Credentials/i); + await wizard.fillTextField(/Auth0 Domain/i, domain); + await wizard.fillTextField(/Client ID/i, clientId); + await wizard.fillTextField(/Client Secret/i, clientSecret); + await wizard.submitForm(/Verify & Save/i); + await expect(page.getByText(/verified/i)).toBeVisible({ timeout: 10_000 }); + await wizard.clickNext(); + + // Step C: Copy redirect URI and add it back in Auth0 + await wizard.waitForStep(/Configure Redirect URI/i); + const redirectUriEl = page.locator("[data-copy-value]").first(); + const redirectUri = (await redirectUriEl.getAttribute("data-copy-value")) ?? ""; + if (redirectUri) { + // Open Auth0 in a second page to avoid losing wizard state + const auth0Page2 = await page.context().newPage(); + const auth02 = new Auth0Page(auth0Page2); + await auth02.addCallbackUrl(redirectUri); + await auth0Page2.close(); + } + await wizard.clickNext(); + + // Step D: Confirm + await wizard.waitForStep(/Confirmation/i); + await wizard.confirm(/Create.*Identity Provider/i); + await wizard.waitForSuccess(); + }); +}); + +// ── Auth0 SAML ─────────────────────────────────────────────────────────────── + +test.describe("Auth0 SAML — full loop", () => { + test.skip(!hasAuth0Creds, "AUTH0_* env vars not set"); + + /** + * Flow: + * 1. Log into Auth0 dashboard, create a SAML app with ACS URL + Entity ID + * 2. Download the metadata file + * 3. Upload it in the wizard + * 4. Complete the wizard + */ + test("creates Auth0 SAML IDP from real metadata", async ({ page, wizard }) => { + const auth0 = new Auth0Page(page); + const appName = `playwright-saml-${Date.now()}`; + + // Step A: Get SP values from wizard (we need ACS URL and Entity ID first) + // Navigate to step 1 to read the copy blocks + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ json: {} }) + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: { id: "test-idp" } }) + ); + + await page.goto("/wizard/auth0/saml"); + await wizard.waitForStep(/Create a SAML Application/i); + + // Read the ACS URL and Entity ID from the wizard + const acsUrl = + (await page.locator("[data-copy-label='ACS URL']").textContent()) ?? ""; + const entityId = + (await page.locator("[data-copy-label='Entity ID']").textContent()) ?? ""; + + // Step B: Create app in Auth0 and configure SAML with these values + await auth0.login(); + await auth0.createSamlApp(appName); + await auth0.configureSamlAddon(acsUrl.trim(), entityId.trim()); + + // Auth0 metadata download URL — use page.goto to download + const domain = process.env["AUTH0_DOMAIN"]!; + const metadataRes = await page.goto( + `https://${domain}/samlp/metadata/${appName}` + ); + const metadataXml = await metadataRes?.text(); + expect(metadataXml).toContain("EntityDescriptor"); + + // Write metadata to a temp file for upload + const { writeFileSync } = await import("fs"); + const { tmpdir } = await import("os"); + const { join } = await import("path"); + const tmpFile = join(tmpdir(), `auth0-metadata-${Date.now()}.xml`); + writeFileSync(tmpFile, metadataXml ?? ""); + + // Step C: Return to wizard and complete + await page.goto("/wizard/auth0/saml"); + await wizard.waitForStep(/Create a SAML Application/i); + await wizard.clickNext(); + + await wizard.waitForStep(/Upload Identity Provider Metadata/i); + await wizard.uploadFile(/Metadata File/i, tmpFile); + await wizard.submitForm(/Validate File/i); + await wizard.clickNext(); + + await wizard.waitForStep(/Configure Attribute Mapping/i); + await wizard.clickNext(); + await wizard.waitForStep(/Configure User Access/i); + await wizard.clickNext(); + await wizard.waitForStep(/Confirmation/i); + await wizard.confirm(/Create SAML Identity Provider/i); + await wizard.waitForSuccess(); + }); +}); + +// ── Okta SAML ──────────────────────────────────────────────────────────────── + +test.describe("Okta SAML — full loop", () => { + test.skip(!hasOktaCreds, "OKTA_* env vars not set"); + + test("creates Okta SAML IDP from real metadata URL", async ({ + page, + wizard, + }) => { + const okta = new OktaPage(page); + const appName = `playwright-saml-${Date.now()}`; + + // Mock final IDP creation in Keycloak + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ json: { entityId: "https://test" } }) + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: { id: "test-idp" } }) + ); + + // Get SP values from wizard step 1 + await page.goto("/wizard/okta/saml"); + await wizard.waitForStep(/.+/); + const acsUrl = + (await page.locator("[data-copy-label='ACS URL']").textContent())?.trim() ?? ""; + const entityId = + (await page.locator("[data-copy-label='Entity ID']").textContent())?.trim() ?? ""; + + // Set up app in Okta + await okta.login(); + await okta.createSamlApp(appName); + await okta.configureSamlSettings(acsUrl, entityId); + const metadataUrl = await okta.getMetadataUrl(); + expect(metadataUrl).toContain("metadata"); + + // Return to wizard — use metadata URL input if available, otherwise file + await page.goto("/wizard/okta/saml"); + await wizard.waitForStep(/.+/); + await wizard.clickNext(); + + // Try to use URL input first + const urlInput = page.getByLabel(/metadata url/i); + if (await urlInput.isVisible().catch(() => false)) { + await urlInput.fill(metadataUrl); + await wizard.submitForm(/validate url/i); + } else { + // Fall back to file upload — download metadata first + const metaRes = await page.request.get(metadataUrl); + const xml = await metaRes.text(); + const { writeFileSync } = await import("fs"); + const { tmpdir } = await import("os"); + const { join } = await import("path"); + const tmp = join(tmpdir(), `okta-metadata-${Date.now()}.xml`); + writeFileSync(tmp, xml); + await wizard.uploadFile(/metadata/i, tmp); + await wizard.submitForm(/validate/i); + } + + await wizard.clickNext(); + // Navigate remaining steps to confirmation + for (let i = 0; i < 3; i++) { + const done = await page + .getByRole("button", { name: /Create.*Identity Provider/i }) + .isVisible() + .catch(() => false); + if (done) break; + await wizard.clickNext().catch(() => {}); + } + await wizard.confirm(/Create.*Identity Provider/i); + await wizard.waitForSuccess(); + }); +}); diff --git a/apps/wizard-v2/e2e/fixtures/test-saml-metadata.xml b/apps/wizard-v2/e2e/fixtures/test-saml-metadata.xml new file mode 100644 index 00000000..6b232d61 --- /dev/null +++ b/apps/wizard-v2/e2e/fixtures/test-saml-metadata.xml @@ -0,0 +1,33 @@ + + + + + + MIIDuTCCAqGgAwIBAgIUG0ly/uVWaiPYldLsLTaf2gZNvicwDQYJKoZIhvcNAQEL +BQAwbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM +DU1vdW50YWluIFZpZXcxETAPBgNVBAoMCFRlc3QgSWRQMR0wGwYDVQQDDBR0ZXN0 +LWlkcC5leGFtcGxlLmNvbTAeFw0yNjA0MTQwNDMxMDJaFw0zNjA0MTEwNDMxMDJa +MGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1N +b3VudGFpbiBWaWV3MREwDwYDVQQKDAhUZXN0IElkUDEdMBsGA1UEAwwUdGVzdC1p +ZHAuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0 +47wu35l99IEN343NpOfrIQxSgrrt2HAcTgnnBLWpem0ZAFkQvbpf4D8c80xjxNPu +I5zpL1D0PKzV6Sy3JTSts7GlMRvClD4U36ryi3EwRTTvyk++5jFTHL7aHyGn0kCr +b8ieczvTNE4EbYQUTGOemECDXsewqsRJYXJ8cQ9vCAyYCVeXCk8/snmVF7g+VKSN +tjiDJU47I92jyHLtAYb5oOTqT53EsYOIxgGtXsPwoM+TfcLTr7Rhx/Rx/foD6THn +NK0yA1AqfT9sy+AaNi4lJUZ2szQAbD2e/gUrrKlF6WidXKctLAF/S5soSK57BbZ5 +ir9n0pD/L3T84YOG0itdAgMBAAGjUzBRMB0GA1UdDgQWBBRQ4B/iMjQ17oVoWM9v +5EQ7f30WkzAfBgNVHSMEGDAWgBRQ4B/iMjQ17oVoWM9v5EQ7f30WkzAPBgNVHRMB +Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAZJmHCcSWd01SVdrpel2xkIGOZ +xfqJD4vZ0VDL7z3iyBMUTOkFlmQhiVxdrn+lLrSlb0iui+RouAKskvcOmJTjYfPL +IXFdtRqx3bCgoTxhcw97nSqQJivZpYN5VhGg2OQxITI7sxYwAnVYljBjYEHXHwHr +gPFcurveB+P00/VZgojYCpGofW7encmO6JSj5JCU3I7obgYzAuU4P6yC8qIEz60w +qzT8SzyQU1tytZe+114kN5lMKPqITThf/60eNoxkzMV+zk6gtz+Y2nIJzA3BMXJ4 +GB2XP9o5WHs9+Nk115YSTD/iNT6oyiHKiKxbUJA9U5Yk0+1xyya81p+1ltty + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + + + + diff --git a/apps/wizard-v2/e2e/fixtures/test.ts b/apps/wizard-v2/e2e/fixtures/test.ts new file mode 100644 index 00000000..d9af18b6 --- /dev/null +++ b/apps/wizard-v2/e2e/fixtures/test.ts @@ -0,0 +1,95 @@ +import { test as base } from "@playwright/test"; +import { ProviderSelectorPage } from "../pages/ProviderSelectorPage"; +import { WizardPage } from "../pages/WizardPage"; +import { KeycloakLoginPage } from "../pages/KeycloakLoginPage"; + +/** + * Extended test fixture that provides typed page object models. + * + * Fixtures: + * providerSelector — landing page (provider list, search, help dialog) + * wizard — wizard runner + protocol picker + * keycloakLogin — Keycloak login page (integration tests only) + * kcToken — real Keycloak access token via direct grant (requires KC running) + * withRealKcAuth — intercepts KC admin API requests and injects a real token; + * lets the request through to the real Keycloak instead of mocking. + * Use this in tests that need real API responses. + */ + +const KC_BASE = process.env.KC_BASE_URL ?? "http://localhost:8080/auth"; +const KC_REALM = "wizard"; +const KC_CLIENT_ID = process.env.VITE_OIDC_CLIENT_ID ?? "wizard-v2-dev"; +const KC_USERNAME = process.env.KC_WIZARD_USER ?? "wizard"; +const KC_PASSWORD = process.env.KC_WIZARD_PASS ?? "password"; + +/** Fetch a real Keycloak access token for the wizard user via direct grant. */ +async function fetchKcToken(): Promise { + const res = await fetch( + `${KC_BASE}/realms/${KC_REALM}/protocol/openid-connect/token`, + { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: new URLSearchParams({ + grant_type: "password", + client_id: KC_CLIENT_ID, + username: KC_USERNAME, + password: KC_PASSWORD, + }), + } + ); + if (!res.ok) { + throw new Error( + `Failed to fetch Keycloak token: ${res.status} ${await res.text()}` + ); + } + const { access_token } = (await res.json()) as { access_token: string }; + return access_token; +} + +type Fixtures = { + providerSelector: ProviderSelectorPage; + wizard: WizardPage; + keycloakLogin: KeycloakLoginPage; + /** Real KC access token obtained via direct grant. Requires Keycloak to be running. */ + kcToken: string; + /** + * Installs a route handler that intercepts Keycloak admin API calls and + * replaces the Authorization header with a real token, then forwards the + * request to Keycloak. Use this instead of page.route() response mocks when + * you want real API responses. + */ + withRealKcAuth: void; +}; + +export const test = base.extend({ + providerSelector: async ({ page }, use) => { + await use(new ProviderSelectorPage(page)); + }, + wizard: async ({ page }, use) => { + await use(new WizardPage(page)); + }, + keycloakLogin: async ({ page }, use) => { + await use(new KeycloakLoginPage(page)); + }, + + kcToken: async ({}, use) => { + const token = await fetchKcToken(); + await use(token); + }, + + withRealKcAuth: async ({ page, kcToken }, use) => { + // Intercept all requests to the Keycloak admin API and replace the + // Authorization header with the real token, then continue to the real server. + await page.route(`${KC_BASE}/admin/**`, async (route) => { + await route.continue({ + headers: { + ...route.request().headers(), + Authorization: `Bearer ${kcToken}`, + }, + }); + }); + await use(); + }, +}); + +export { expect } from "@playwright/test"; diff --git a/apps/wizard-v2/e2e/global-setup.ts b/apps/wizard-v2/e2e/global-setup.ts new file mode 100644 index 00000000..1abd5bef --- /dev/null +++ b/apps/wizard-v2/e2e/global-setup.ts @@ -0,0 +1,195 @@ +import type { FullConfig } from "@playwright/test"; + +/** + * Global setup — runs once before all integration tests (after auth:setup). + * + * Creates test organizations in the wizard realm via the Phase Two Orgs API and + * assigns test users to them. These organizations are used by the organizations + * spec and by wizard-completion tests that test the org-scoped (cloud) flow. + * + * Organizations created: + * - test-org-alpha → org-admin as admin, org-member as member + * - test-org-beta → no members (used for isolation tests) + * + * The org IDs are written to process.env so tests can reference them without + * hardcoding. Playwright passes env through to workers automatically. + * + * Only runs when PLAYWRIGHT_INTEGRATION=true (see playwright.config.ts). + */ + +const KC_BASE = process.env.KC_BASE_URL ?? "http://localhost:8080/auth"; +const REALM = "wizard"; +const ADMIN_USER = process.env.KC_ADMIN_USER ?? "admin"; +const ADMIN_PASS = process.env.KC_ADMIN_PASS ?? "admin"; + +async function getAdminToken(): Promise { + const res = await fetch( + `${KC_BASE}/realms/master/protocol/openid-connect/token`, + { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: new URLSearchParams({ + client_id: "admin-cli", + username: ADMIN_USER, + password: ADMIN_PASS, + grant_type: "password", + }), + } + ); + if (!res.ok) { + throw new Error(`Failed to get admin token: ${res.status} ${await res.text()}`); + } + const json = (await res.json()) as { access_token: string }; + return json.access_token; +} + +async function getUserId(token: string, username: string): Promise { + const res = await fetch( + `${KC_BASE}/admin/realms/${REALM}/users?username=${encodeURIComponent(username)}&exact=true`, + { headers: { Authorization: `Bearer ${token}` } } + ); + if (!res.ok) return null; + const users = (await res.json()) as Array<{ id: string; username: string }>; + return users[0]?.id ?? null; +} + +async function createOrg( + token: string, + name: string, + displayName: string +): Promise { + // Check if org already exists + const listRes = await fetch( + `${KC_BASE}/realms/${REALM}/orgs?search=${encodeURIComponent(name)}`, + { headers: { Authorization: `Bearer ${token}` } } + ); + if (listRes.ok) { + const existing = (await listRes.json()) as Array<{ id: string; name: string }>; + const match = existing.find((o) => o.name === name); + if (match) { + console.log(`[global-setup] org "${name}" already exists (${match.id})`); + return match.id; + } + } + + const res = await fetch(`${KC_BASE}/realms/${REALM}/orgs`, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ name, displayName }), + }); + + if (!res.ok) { + console.warn(`[global-setup] failed to create org "${name}": ${res.status} ${await res.text()}`); + return null; + } + + // Phase Two returns the created org in the Location header or body + const location = res.headers.get("location"); + if (location) { + const id = location.split("/").pop() ?? null; + console.log(`[global-setup] created org "${name}" → ${id}`); + return id; + } + + // Fallback: re-fetch to get the id + const refetch = await fetch( + `${KC_BASE}/realms/${REALM}/orgs?search=${encodeURIComponent(name)}`, + { headers: { Authorization: `Bearer ${token}` } } + ); + if (refetch.ok) { + const orgs = (await refetch.json()) as Array<{ id: string; name: string }>; + return orgs.find((o) => o.name === name)?.id ?? null; + } + return null; +} + +async function addOrgMember(token: string, orgId: string, userId: string) { + const res = await fetch( + `${KC_BASE}/realms/${REALM}/orgs/${orgId}/members/${userId}`, + { + method: "PUT", + headers: { Authorization: `Bearer ${token}` }, + } + ); + if (!res.ok && res.status !== 409) { + console.warn( + `[global-setup] failed to add member ${userId} to org ${orgId}: ${res.status}` + ); + } +} + +async function grantOrgRole( + token: string, + orgId: string, + userId: string, + roleName: string +) { + // Get the org role id + const rolesRes = await fetch( + `${KC_BASE}/realms/${REALM}/orgs/${orgId}/roles`, + { headers: { Authorization: `Bearer ${token}` } } + ); + if (!rolesRes.ok) return; + + const roles = (await rolesRes.json()) as Array<{ id: string; name: string }>; + const role = roles.find((r) => r.name === roleName); + if (!role) return; + + await fetch( + `${KC_BASE}/realms/${REALM}/orgs/${orgId}/members/${userId}/roles`, + { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify([{ id: role.id, name: role.name }]), + } + ); +} + +export default async function globalSetup(_config: FullConfig) { + console.log("[global-setup] starting organization setup..."); + + const token = await getAdminToken(); + + const [orgAdminId, orgMemberId] = await Promise.all([ + getUserId(token, "org-admin"), + getUserId(token, "org-member"), + ]); + + if (!orgAdminId) { + console.warn("[global-setup] org-admin user not found — skipping org setup"); + return; + } + + // Create test organizations + const [alphaId, betaId] = await Promise.all([ + createOrg(token, "test-org-alpha", "Alpha Test Organization"), + createOrg(token, "test-org-beta", "Beta Test Organization"), + ]); + + if (alphaId) { + // Assign org-admin as member + admin of alpha org + await addOrgMember(token, alphaId, orgAdminId); + await grantOrgRole(token, alphaId, orgAdminId, "admin"); + + if (orgMemberId) { + await addOrgMember(token, alphaId, orgMemberId); + } + + // Expose org IDs to tests via env + process.env.TEST_ORG_ALPHA_ID = alphaId; + console.log(`[global-setup] test-org-alpha ready: ${alphaId}`); + } + + if (betaId) { + process.env.TEST_ORG_BETA_ID = betaId; + console.log(`[global-setup] test-org-beta ready: ${betaId}`); + } + + console.log("[global-setup] done"); +} diff --git a/apps/wizard-v2/e2e/organizations.spec.ts b/apps/wizard-v2/e2e/organizations.spec.ts new file mode 100644 index 00000000..46b243d0 --- /dev/null +++ b/apps/wizard-v2/e2e/organizations.spec.ts @@ -0,0 +1,188 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import { test, expect } from "./fixtures/test"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** + * Organization tests — integration mode only. + * + * These tests require a running Keycloak instance with the Phase Two extension. + * Run with: PLAYWRIGHT_INTEGRATION=true pnpm test:e2e + * + * The test organizations (test-org-alpha, test-org-beta) are created by + * e2e/global-setup.ts before this suite runs. Their IDs are available as + * process.env.TEST_ORG_ALPHA_ID and TEST_ORG_BETA_ID. + * + * Covered scenarios: + * - Wizard launches with ?org_id= param (cloud/org-scoped mode) + * - Org-scoped API endpoints are used instead of admin API + * - Org admin can complete a wizard for their organization + */ + +const KC_BASE = process.env.KC_BASE_URL ?? "http://localhost:8180/auth"; +const REALM = "wizard"; + +// ── Helpers ────────────────────────────────────────────────────────────────── + +async function getToken(username: string, password: string): Promise { + const res = await fetch( + `${KC_BASE}/realms/${REALM}/protocol/openid-connect/token`, + { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: new URLSearchParams({ + client_id: "wizard-v2-dev", + username, + password, + grant_type: "password", + }), + }, + ); + if (!res.ok) { + throw new Error(`Failed to get token for ${username}: ${res.status}`); + } + const json = (await res.json()) as { access_token: string }; + return json.access_token; +} + +// ── Organization listing ────────────────────────────────────────────────────── + +test.describe("organization listing", () => { + test("test organizations exist in the realm", async () => { + const token = await getToken("wizard", "password"); + const res = await fetch(`${KC_BASE}/realms/${REALM}/orgs`, { + headers: { Authorization: `Bearer ${token}` }, + }); + expect(res.ok).toBe(true); + + const orgs = (await res.json()) as Array<{ name: string }>; + const names = orgs.map((o) => o.name); + expect(names).toContain("test-org-alpha"); + expect(names).toContain("test-org-beta"); + }); + + test("org-admin is a member of test-org-alpha", async () => { + const adminToken = await getToken("wizard", "password"); + const orgId = process.env.TEST_ORG_ALPHA_ID; + expect(orgId).toBeTruthy(); + + const res = await fetch( + `${KC_BASE}/realms/${REALM}/orgs/${orgId}/members`, + { headers: { Authorization: `Bearer ${adminToken}` } }, + ); + expect(res.ok).toBe(true); + + const members = (await res.json()) as Array<{ username: string }>; + expect(members.map((m) => m.username)).toContain("org-admin"); + }); +}); + +// ── Wizard in org context ──────────────────────────────────────────────────── + +test.describe("wizard with org context", () => { + test("wizard URL with ?org_id renders in cloud mode", async ({ page }) => { + const orgId = process.env.TEST_ORG_ALPHA_ID ?? "unknown"; + await page.goto(`/?org_id=${orgId}`); + + // Provider selector should be visible and pass the org_id forward + await expect(page.getByPlaceholder("Search providers...")).toBeVisible(); + + // Navigate to a wizard — org_id should be forwarded + await page.getByRole("button", { name: /ADFS/i }).click(); + await expect(page).toHaveURL(new RegExp(`org_id=${orgId}`)); + }); + + test("wizard uses orgs API endpoints in cloud mode", async ({ page }) => { + const orgId = process.env.TEST_ORG_ALPHA_ID ?? "unknown"; + + // Intercept to verify the org-scoped endpoint is called + const orgApiCalls: string[] = []; + await page.route(`**/${REALM}/orgs/**`, (route) => { + orgApiCalls.push(route.request().url()); + route.fulfill({ json: {} }); + }); + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ + json: { + entityId: "https://test-idp.example.com", + singleSignOnServiceUrl: "https://test-idp.example.com/sso/saml", + }, + }), + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: { id: "mock-id" } }), + ); + + await page.goto(`/wizard/adfs/saml?org_id=${orgId}`); + await page.waitForURL(`/wizard/adfs/saml?org_id=${orgId}`); + + // The page should display org context — the wizard runner uses orgsClient + // when org_id is present; verify via URL param persistence + expect(page.url()).toContain(`org_id=${orgId}`); + }); +}); + +// ── Org-scoped wizard completion ────────────────────────────────────────────── + +test.describe("org-scoped SAML wizard completion", () => { + test("org admin can complete the ADFS SAML wizard for their org", async ({ + page, + wizard, + }) => { + const orgId = process.env.TEST_ORG_ALPHA_ID ?? "unknown"; + + // Mock org-scoped API endpoints + await page.route(`**/${REALM}/orgs/${orgId}/idps/import-config`, (route) => + route.fulfill({ json: { entityId: "https://test-idp.example.com" } }), + ); + await page.route(`**/${REALM}/orgs/${orgId}/idps`, (route) => + route.fulfill({ status: 201, json: { id: "mock-idp" } }), + ); + await page.route(`**/${REALM}/orgs/${orgId}/idps/*/mappers`, (route) => + route.fulfill({ status: 201, json: {} }), + ); + // Also mock the onprem fallback + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ json: { entityId: "https://test-idp.example.com" } }), + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: { id: "mock-idp" } }), + ); + await page.route("**/identity-provider/instances/*/mappers", (route) => + route.fulfill({ status: 201, json: {} }), + ); + + await page.goto(`/wizard/adfs/saml?org_id=${orgId}`); + await wizard.waitForStep(/.+/); + + // ADFS SAML Step 1 — copy blocks + await wizard.clickNext(); + + // ADFS SAML Step 2 — metadata upload + const metadataFile = path.join( + __dirname, + "fixtures", + "test-saml-metadata.xml", + ); + await wizard.uploadFile(/Metadata/i, metadataFile); + await wizard.submitForm(/Validate/i); + await wizard.clickNext(); + + // Remaining steps — skip to confirmation + // (ADFS wizard may have varying step counts — advance until confirm step) + let attempts = 0; + while (attempts < 5) { + const isConfirm = await page + .getByRole("button", { name: /Create.*Identity Provider/i }) + .isVisible() + .catch(() => false); + if (isConfirm) break; + await wizard.clickNext().catch(() => {}); + attempts++; + } + + await wizard.confirm(/Create.*Identity Provider/i); + await wizard.waitForSuccess(); + }); +}); diff --git a/apps/wizard-v2/e2e/pages/KeycloakLoginPage.ts b/apps/wizard-v2/e2e/pages/KeycloakLoginPage.ts new file mode 100644 index 00000000..561bc3fc --- /dev/null +++ b/apps/wizard-v2/e2e/pages/KeycloakLoginPage.ts @@ -0,0 +1,32 @@ +import { type Page } from "@playwright/test"; + +/** + * Page object for the Keycloak login screen. + * + * Works with both the default Keycloak theme and Phase Two's phasetwo.v2 theme. + * Uses attribute selectors (name=) rather than IDs so it survives theme changes. + */ +export class KeycloakLoginPage { + readonly page: Page; + + constructor(page: Page) { + this.page = page; + } + + /** Wait until the Keycloak login page is visible. */ + async waitForReady() { + await this.page.waitForURL(/localhost:8080/, { timeout: 15_000 }); + await this.page + .locator("input[name='username'], #username") + .waitFor({ timeout: 10_000 }); + } + + async login(username: string, password: string) { + await this.waitForReady(); + await this.page.locator("input[name='username'], #username").fill(username); + await this.page.locator("input[name='password'], #password").fill(password); + await this.page.locator("[type='submit'], #kc-login").click(); + // Wait for redirect back to the app + await this.page.waitForURL("http://localhost:5173/**", { timeout: 15_000 }); + } +} diff --git a/apps/wizard-v2/e2e/pages/ProviderSelectorPage.ts b/apps/wizard-v2/e2e/pages/ProviderSelectorPage.ts new file mode 100644 index 00000000..756a67a3 --- /dev/null +++ b/apps/wizard-v2/e2e/pages/ProviderSelectorPage.ts @@ -0,0 +1,41 @@ +import { type Page, type Locator } from "@playwright/test"; + +/** + * Page object model for the provider selector (index route). + * Encapsulates all selectors and interactions for the landing page. + */ +export class ProviderSelectorPage { + readonly page: Page; + readonly searchInput: Locator; + readonly providerList: Locator; + readonly helpTrigger: Locator; + readonly helpDialog: Locator; + + constructor(page: Page) { + this.page = page; + this.searchInput = page.getByPlaceholder("Search providers..."); + this.providerList = page.getByRole("main"); + this.helpTrigger = page.getByRole("button", { name: /where to start/i }); + this.helpDialog = page.getByRole("dialog"); + } + + async goto() { + await this.page.goto("/"); + } + + async search(query: string) { + await this.searchInput.fill(query); + } + + async clearSearch() { + await this.searchInput.clear(); + } + + async selectProvider(name: string) { + await this.page.getByRole("button", { name }).click(); + } + + async openHelp() { + await this.helpTrigger.click(); + } +} diff --git a/apps/wizard-v2/e2e/pages/WizardPage.ts b/apps/wizard-v2/e2e/pages/WizardPage.ts new file mode 100644 index 00000000..6a4b193a --- /dev/null +++ b/apps/wizard-v2/e2e/pages/WizardPage.ts @@ -0,0 +1,101 @@ +import { type Page, type Locator, expect } from "@playwright/test"; + +/** + * Page object model for wizard runner and protocol picker views. + * + * Covers: + * - Protocol picker (multi-protocol providers) + * - Wizard runner — step navigation, form interactions, confirmation + */ +export class WizardPage { + readonly page: Page; + readonly homeLink: Locator; + + // Step navigation + readonly nextButton: Locator; + readonly backButton: Locator; + readonly stepIndicator: Locator; + + constructor(page: Page) { + this.page = page; + this.homeLink = page.getByRole("link", { name: "Providers" }); + this.nextButton = page.getByRole("button", { name: /continue/i }); + this.backButton = page.getByRole("button", { name: /back/i }); + this.stepIndicator = page.locator("[data-step-indicator]"); + } + + async goHome() { + await this.homeLink.click(); + } + + /** Returns the current URL pathname. */ + pathname() { + return new URL(this.page.url()).pathname; + } + + // ── Protocol picker ───────────────────────────────────────────────────── + + /** Select a protocol from the protocol picker page. */ + async selectProtocol(protocol: "saml" | "oidc" | "ldap") { + await this.page.getByRole("button", { name: new RegExp(protocol, "i") }).click(); + } + + // ── Step navigation ────────────────────────────────────────────────────── + + async clickNext() { + await this.nextButton.click(); + } + + async clickBack() { + await this.backButton.click(); + } + + /** Wait for the wizard to display a specific step (by step title text). */ + async waitForStep(titleText: string | RegExp) { + await expect( + this.page.getByRole("heading", { name: titleText }) + ).toBeVisible({ timeout: 5_000 }); + } + + // ── Copy blocks ────────────────────────────────────────────────────────── + + /** Returns the visible text of a copy block by its label. */ + async getCopyBlockValue(label: string): Promise { + const block = this.page.locator(`[data-copy-label="${label}"]`); + return (await block.textContent()) ?? ""; + } + + // ── Forms ──────────────────────────────────────────────────────────────── + + async fillTextField(fieldLabel: string | RegExp, value: string) { + await this.page.getByLabel(fieldLabel).fill(value); + } + + async uploadFile(_fieldLabel: string | RegExp, filePath: string) { + await this.page.locator('input[type="file"]').setInputFiles(filePath); + } + + /** Click the submit button inside a form by its label text. */ + async submitForm(buttonLabel: string | RegExp) { + await this.page.getByRole("button", { name: buttonLabel }).click(); + } + + // ── Confirmation step ──────────────────────────────────────────────────── + + /** Click the final "Create …" action button on the confirmation step. */ + async confirm(buttonLabel: string | RegExp = /create/i) { + await this.page.getByRole("button", { name: buttonLabel }).click(); + } + + /** Wait for the success message after IDP/federation creation. */ + async waitForSuccess(messagePattern?: string | RegExp) { + const pattern = messagePattern ?? /created successfully/i; + await expect(this.page.getByText(pattern)).toBeVisible({ timeout: 10_000 }); + } + + /** Wait for an error message to appear. */ + async waitForError(messagePattern?: string | RegExp) { + const pattern = messagePattern ?? /error/i; + await expect(this.page.getByText(pattern)).toBeVisible({ timeout: 5_000 }); + } +} diff --git a/apps/wizard-v2/e2e/provider-selector.spec.ts b/apps/wizard-v2/e2e/provider-selector.spec.ts new file mode 100644 index 00000000..1fcd380d --- /dev/null +++ b/apps/wizard-v2/e2e/provider-selector.spec.ts @@ -0,0 +1,70 @@ +import { test, expect } from "./fixtures/test"; + +/** + * Provider selector smoke tests. + * These cover navigation and UI state only — no wizard step logic yet. + * Expand once the wizard configuration format is settled. + */ + +test.describe("provider selector", () => { + test.beforeEach(async ({ providerSelector }) => { + await providerSelector.goto(); + }); + + test("renders the provider list", async ({ providerSelector }) => { + await expect(providerSelector.searchInput).toBeVisible(); + // Placeholder — assert specific providers once list is stable + }); + + test("search filters the provider list", async ({ providerSelector }) => { + await providerSelector.search("okta"); + await expect(providerSelector.page.getByRole("button", { name: /okta/i })).toBeVisible(); + }); + + test("clearing search restores grouped view", async ({ providerSelector }) => { + await providerSelector.search("okta"); + await providerSelector.clearSearch(); + await expect(providerSelector.page.getByText("Providers")).toBeVisible(); + const genericHeading = providerSelector.page.getByText("Generic", { exact: true }); + await genericHeading.scrollIntoViewIfNeeded(); + await expect(genericHeading).toBeVisible(); + }); + + test("help dialog opens and closes", async ({ providerSelector }) => { + await providerSelector.openHelp(); + await expect(providerSelector.helpDialog).toBeVisible(); + await providerSelector.page.keyboard.press("Escape"); + await expect(providerSelector.helpDialog).not.toBeVisible(); + }); +}); + +test.describe("provider navigation", () => { + test.beforeEach(async ({ providerSelector }) => { + await providerSelector.goto(); + }); + + test("single-protocol provider navigates directly to wizard", async ({ + providerSelector, + wizard, + }) => { + await providerSelector.selectProvider("ADFS"); + await expect(providerSelector.page).toHaveURL(/\/wizard\/adfs\/saml/); + await expect(wizard.homeLink).toBeVisible(); + }); + + test("multi-protocol provider navigates to protocol picker", async ({ + providerSelector, + }) => { + await providerSelector.selectProvider("Okta"); + await expect(providerSelector.page).toHaveURL(/\/wizard\/okta$/); + }); + + test("home link returns to provider selector", async ({ + providerSelector, + wizard, + }) => { + await providerSelector.selectProvider("ADFS"); + await wizard.goHome(); + await expect(providerSelector.page).toHaveURL("/"); + }); +}); diff --git a/apps/wizard-v2/e2e/wizard-completion.spec.ts b/apps/wizard-v2/e2e/wizard-completion.spec.ts new file mode 100644 index 00000000..c2569b60 --- /dev/null +++ b/apps/wizard-v2/e2e/wizard-completion.spec.ts @@ -0,0 +1,281 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import { test, expect } from "./fixtures/test"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** + * Wizard completion tests. + * + * Tests the full UI flow for each wizard protocol (SAML/OIDC/LDAP) from the + * provider selector through to the final "created successfully" confirmation. + * + * These run in mock OIDC mode (no real Keycloak login required) but the Vite + * server is started with VITE_OIDC_ISSUER_URI so the wizard runner can resolve + * API URLs. All Keycloak API calls are intercepted with page.route() so the + * tests are hermetic and fast. + * + * Mocked endpoints: + * POST .../identity-provider/import-config -> validateMetadata + * POST .../identity-provider/instances -> createIdp + * POST .../identity-provider/instances/{id}/mappers -> addMappers + * POST .../components -> createComponent (LDAP) + * POST .../testLDAPConnection -> testLdapConnection + */ + +const SAML_METADATA_FILE = path.join( + __dirname, + "fixtures", + "test-saml-metadata.xml" +); + +// Mock response bodies +const MOCK_SAML_IMPORT_CONFIG = { + entityId: "https://test-idp.example.com", + singleSignOnServiceUrl: "https://test-idp.example.com/sso/saml", + singleSignOnServiceBinding: + "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + nameIDPolicyFormat: + "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + signingCertificate: "MIIBkTCB+wIJAJ==", +}; + +const MOCK_OIDC_IMPORT_CONFIG = { + issuer: "https://test.auth0.com/", + authorizationUrl: "https://test.auth0.com/authorize", + tokenUrl: "https://test.auth0.com/oauth/token", + userInfoUrl: "https://test.auth0.com/userinfo", + jwksUrl: "https://test.auth0.com/.well-known/jwks.json", +}; + +const MOCK_IDP_CREATED = { id: "mock-idp-id", alias: "test-alias" }; +const MOCK_MAPPER_CREATED = { id: "mock-mapper-id" }; +const MOCK_COMPONENT_CREATED = { id: "mock-component-id" }; +const MOCK_LDAP_CONNECTION_OK = { result: "Success" }; + +// ── SAML wizard ───────────────────────────────────────────────────────────── + +test.describe("SAML wizard — Auth0", () => { + test.beforeEach(async ({ page }) => { + // Intercept Keycloak admin API calls + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ json: MOCK_SAML_IMPORT_CONFIG }) + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: MOCK_IDP_CREATED }) + ); + await page.route("**/identity-provider/instances/*/mappers", (route) => + route.fulfill({ status: 201, json: MOCK_MAPPER_CREATED }) + ); + }); + + test("completes the full SAML flow", async ({ page, wizard }) => { + await page.goto("/wizard/auth0/saml"); + + // Step 1 — Create SAML Application (copy blocks, no user input needed) + await wizard.waitForStep(/Create a SAML Application/i); + await expect(page.getByText(/ACS URL/i)).toBeVisible(); + await expect(page.getByText("Entity ID", { exact: true })).toBeVisible(); + await wizard.clickNext(); + + // Step 2 — Upload Identity Provider Metadata + await wizard.waitForStep(/Upload Identity Provider Metadata/i); + await wizard.uploadFile(/Metadata File/i, SAML_METADATA_FILE); + await wizard.submitForm(/Validate File/i); + await expect(wizard.nextButton).toBeEnabled({ timeout: 5_000 }); + await wizard.clickNext(); + + // Step 3 — Configure Attribute Mapping (display-only) + await wizard.waitForStep(/Configure Attribute Mapping/i); + await expect(page.getByText(/username/i)).toBeVisible(); + await wizard.clickNext(); + + // Step 4 — Configure User Access (display-only) + await wizard.waitForStep(/Configure User Access/i); + await wizard.clickNext(); + + // Step 5 — Confirmation + await wizard.waitForStep(/Confirmation/i); + await wizard.confirm(/Create SAML Identity Provider/i); + await wizard.waitForSuccess(/SAML Identity Provider created successfully/i); + }); + + test("back navigation returns to previous step", async ({ page, wizard }) => { + await page.goto("/wizard/auth0/saml"); + await wizard.waitForStep(/Create a SAML Application/i); + await wizard.clickNext(); + await wizard.waitForStep(/Upload Identity Provider Metadata/i); + await wizard.clickBack(); + await wizard.waitForStep(/Create a SAML Application/i); + }); + + test("next is disabled until metadata is validated", async ({ + page, + wizard, + }) => { + await page.goto("/wizard/auth0/saml"); + await wizard.clickNext(); + await wizard.waitForStep(/Upload Identity Provider Metadata/i); + // Next should be disabled or absent before validation + await expect(wizard.nextButton).toBeDisabled(); + }); +}); + +// ── OIDC wizard ───────────────────────────────────────────────────────────── + +test.describe("OIDC wizard — Auth0", () => { + test.beforeEach(async ({ page }) => { + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ json: MOCK_OIDC_IMPORT_CONFIG }) + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: MOCK_IDP_CREATED }) + ); + }); + + test("completes the full OIDC flow", async ({ page, wizard }) => { + await page.goto("/wizard/auth0/oidc"); + + // Step 1 — Create Application (informational) + await wizard.waitForStep(/Create an Application/i); + await wizard.clickNext(); + + // Step 2 — Domain & Credentials + await wizard.waitForStep(/Domain & Credentials/i); + await wizard.fillTextField(/Auth0 Domain/i, "test.auth0.com"); + await wizard.fillTextField(/Client ID/i, "mock-client-id"); + await wizard.fillTextField(/Client Secret/i, "mock-client-secret"); + await wizard.submitForm(/Verify & Save/i); + await expect(wizard.nextButton).toBeEnabled({ timeout: 5_000 }); + await wizard.clickNext(); + + // Step 3 — Configure Redirect URI (copy block) + await wizard.waitForStep(/Configure Redirect URI/i); + await expect(page.getByText(/Redirect URI/i)).toBeVisible(); + await wizard.clickNext(); + + // Step 4 — Confirmation + await wizard.waitForStep(/Confirmation/i); + await wizard.confirm(/Create.*Identity Provider/i); + await wizard.waitForSuccess(/Identity Provider created successfully/i); + }); +}); + +// ── LDAP wizard ───────────────────────────────────────────────────────────── + +test.describe("LDAP wizard — Okta", () => { + test.beforeEach(async ({ page }) => { + await page.route("**/testLDAPConnection", (route) => + route.fulfill({ json: MOCK_LDAP_CONNECTION_OK }) + ); + await page.route("**/components", (route) => + route.fulfill({ status: 201, json: MOCK_COMPONENT_CREATED }) + ); + }); + + test("completes the full LDAP flow", async ({ page, wizard }) => { + await page.goto("/wizard/okta/ldap"); + + // Step 1 — LDAP Server Config + connection test + await wizard.waitForStep(/Enable LDAP Interface/i); + await wizard.fillTextField(/LDAP Host/i, "test-org.ldap.okta.com"); + await wizard.fillTextField(/SSL Port/i, "636"); + await wizard.fillTextField(/Base DN/i, "dc=test-org,dc=okta,dc=com"); + await wizard.fillTextField(/Users DN/i, "ou=users,dc=test-org,dc=okta,dc=com"); + await wizard.submitForm(/Test Connection/i); + await expect(wizard.nextButton).toBeEnabled({ timeout: 5_000 }); + await wizard.clickNext(); + + // Step 2 — Bind Credentials + auth test + await wizard.waitForStep(/LDAP Authentication/i); + await wizard.fillTextField(/Bind DN/i, "uid=admin,dc=test-org,dc=okta,dc=com"); + await wizard.fillTextField(/Bind Password/i, "mock-password"); + await wizard.submitForm(/Test Authentication/i); + await expect(wizard.nextButton).toBeEnabled({ timeout: 5_000 }); + await wizard.clickNext(); + + // Step 3 — Confirmation + await wizard.waitForStep(/Confirmation/i); + await wizard.confirm(/Create LDAP User Federation/i); + await wizard.waitForSuccess(/LDAP User Federation created successfully/i); + }); +}); + +// ── Generic SAML wizard ────────────────────────────────────────────────────── + +test.describe("Generic SAML wizard", () => { + test.beforeEach(async ({ page }) => { + await page.route("**/identity-provider/import-config", (route) => + route.fulfill({ json: MOCK_SAML_IMPORT_CONFIG }) + ); + await page.route("**/identity-provider/instances", (route) => + route.fulfill({ status: 201, json: MOCK_IDP_CREATED }) + ); + await page.route("**/identity-provider/instances/*/mappers", (route) => + route.fulfill({ status: 201, json: MOCK_MAPPER_CREATED }) + ); + }); + + test("navigates to generic SAML from provider selector", async ({ + providerSelector, + wizard, + page, + }) => { + await providerSelector.goto(); + await providerSelector.selectProvider("Generic SAML"); + await expect(page).toHaveURL(/\/wizard\/saml\/saml/); + await wizard.waitForStep(/.+/); // any step title = wizard rendered + }); +}); + +// ── Provider selector -> wizard navigation ─────────────────────────────────── + +test.describe("all providers load their wizards", () => { + const singleProtocolProviders: Array<{ id: string; protocol: string }> = [ + { id: "adfs", protocol: "saml" }, + { id: "aws", protocol: "saml" }, + { id: "cloudflare", protocol: "saml" }, + { id: "cyberark", protocol: "saml" }, + { id: "duo", protocol: "saml" }, + { id: "google", protocol: "saml" }, + { id: "jumpcloud", protocol: "saml" }, + { id: "lastpass", protocol: "saml" }, + { id: "entraid", protocol: "saml" }, + { id: "onelogin", protocol: "saml" }, + { id: "oracle", protocol: "saml" }, + { id: "pingone", protocol: "saml" }, + { id: "saml", protocol: "saml" }, + { id: "openid", protocol: "oidc" }, + { id: "ldap", protocol: "ldap" }, + ]; + + for (const { id, protocol } of singleProtocolProviders) { + test(`${id}/${protocol} wizard loads without error`, async ({ + page, + wizard, + }) => { + await page.goto(`/wizard/${id}/${protocol}`); + // The wizard runner should render a heading — any step title is enough + await wizard.waitForStep(/.+/); + // No uncaught errors (Playwright fails on uncaught exceptions by default) + }); + } + + const multiProtocolProviders = [ + { id: "auth0", protocols: ["saml", "oidc"] }, + { id: "okta", protocols: ["saml", "ldap"] }, + { id: "salesforce", protocols: ["saml", "oidc"] }, + ]; + + for (const { id, protocols } of multiProtocolProviders) { + for (const protocol of protocols) { + test(`${id}/${protocol} wizard loads without error`, async ({ + page, + wizard, + }) => { + await page.goto(`/wizard/${id}/${protocol}`); + await wizard.waitForStep(/.+/); + }); + } + } +}); diff --git a/apps/wizard-v2/eslint.config.js b/apps/wizard-v2/eslint.config.js new file mode 100644 index 00000000..5e6b472f --- /dev/null +++ b/apps/wizard-v2/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/apps/wizard-v2/index.html b/apps/wizard-v2/index.html new file mode 100644 index 00000000..49ebeede --- /dev/null +++ b/apps/wizard-v2/index.html @@ -0,0 +1,35 @@ + + + + + + + + Identity Provider Wizard + + + +
+ + + diff --git a/apps/wizard-v2/openapi-codegen/gen.ts b/apps/wizard-v2/openapi-codegen/gen.ts new file mode 100644 index 00000000..63aaedc0 --- /dev/null +++ b/apps/wizard-v2/openapi-codegen/gen.ts @@ -0,0 +1,42 @@ +/** + * Generates TypeScript types from OpenAPI specs into src/api/types/. + * Run with: pnpm gen-api + * + * Two specs: + * - Phase Two Orgs API → types/orgs.d.ts (org-scoped IDP endpoints) + * - Keycloak Admin API → types/admin.d.ts (realm-wide IDP endpoints) + */ +import { resolve, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import { exec } from "node:child_process"; +import { promisify } from "node:util"; + +const run = promisify(exec); + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outDir = resolve(__dirname, "../src/api/types"); + +const specs = [ + { + name: "orgs", + url: "https://raw.githubusercontent.com/p2-inc/phasetwo-docs/main/openapi.yaml", + out: `${outDir}/orgs.d.ts`, + }, + { + name: "admin", + url: "https://www.keycloak.org/docs-api/latest/rest-api/openapi.json", + out: `${outDir}/admin.d.ts`, + }, +]; + +for (const spec of specs) { + console.log(`Generating ${spec.name} types from ${spec.url}...`); + const { stdout, stderr } = await run( + `npx openapi-typescript "${spec.url}" -o "${spec.out}"`, + ); + if (stdout) console.log(stdout); + if (stderr && !stderr.includes("ExperimentalWarning")) console.error(stderr); + console.log(` ✓ ${spec.out}`); +} + +console.log("Done."); diff --git a/apps/wizard-v2/package.json b/apps/wizard-v2/package.json new file mode 100644 index 00000000..e4c834a4 --- /dev/null +++ b/apps/wizard-v2/package.json @@ -0,0 +1,62 @@ +{ + "name": "wizard-v2", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "gen-api": "tsx openapi-codegen/gen.ts", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:report": "playwright show-report", + "test:integration": "PLAYWRIGHT_INTEGRATION=true playwright test", + "test:integration:ui": "PLAYWRIGHT_INTEGRATION=true playwright test --ui", + "test:external": "PLAYWRIGHT_INTEGRATION=true playwright test e2e/external-providers/", + "capture:aws:saml": "tsx wizards/aws/playwright/saml-capture.ts", + "docker:up": "docker compose -f docker/docker-compose.yml up -d && until curl -sf http://localhost:8080/auth/realms/wizard > /dev/null; do sleep 2; done && open http://localhost:8080/auth/admin/master/console/#/wizard", + "docker:down": "docker compose -f docker/docker-compose.yml down", + "docker:logs": "docker compose -f docker/docker-compose.yml logs -f", + "docker:restart": "docker compose -f docker/docker-compose.yml restart", + "docker:reset": "docker compose -f docker/docker-compose.yml down -v" + }, + "dependencies": { + "@tailwindcss/vite": "^4.2.2", + "@tanstack/react-router": "^1.170.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "fuse.js": "^7.3.0", + "lucide-react": "^1.8.0", + "oidc-spa": "^10.2.1", + "openapi-fetch": "^0.17.0", + "radix-ui": "^1.4.3", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + "tailwindcss": "^4.2.2", + "tw-animate-css": "^1.4.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@playwright/test": "^1.59.1", + "@tanstack/router-devtools": "^1.167.0", + "@tanstack/router-plugin": "^1.168.6", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "openapi-typescript": "^7.13.0", + "tsx": "^4.21.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4", + "vite-tsconfig-paths": "^6.1.1" + } +} diff --git a/apps/wizard-v2/playwright.config.ts b/apps/wizard-v2/playwright.config.ts new file mode 100644 index 00000000..4d1a8a48 --- /dev/null +++ b/apps/wizard-v2/playwright.config.ts @@ -0,0 +1,81 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Playwright configuration for wizard-v2 E2E tests. + * + * TWO MODES: + * + * Default (mock): + * pnpm test:e2e + * Runs against Vite with OIDC in mock mode — no Keycloak required. + * Covers: provider-selector smoke tests, wizard-completion flow tests (API mocked via page.route). + * + * Integration (real Keycloak): + * PLAYWRIGHT_INTEGRATION=true pnpm test:e2e + * Requires: `cd docker && docker compose up -d` before running. + * Runs auth:setup first (browser OIDC login → saves storageState). + * Then runs global-setup.ts (creates test organizations via Phase Two API). + * Covers: organization management tests + all mock tests with real auth. + */ + +const isIntegration = !!process.env.PLAYWRIGHT_INTEGRATION; + +const KC_BASE = process.env.KC_BASE_URL ?? "http://localhost:8080/auth"; +const ISSUER_URI = `${KC_BASE}/realms/wizard`; + +export default defineConfig({ + testDir: "./e2e", + fullyParallel: !isIntegration, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: process.env.CI ? "github" : "html", + + globalSetup: isIntegration ? "./e2e/global-setup.ts" : undefined, + + use: { + baseURL: "http://localhost:5173", + trace: "on-first-retry", + screenshot: "only-on-failure", + }, + + projects: [ + // ── Auth setup (integration only) ───────────────────────────────────── + ...(isIntegration + ? [ + { + name: "auth:setup", + testMatch: /auth\.setup\.ts/, + use: { ...devices["Desktop Chrome"] }, + }, + ] + : []), + + // ── Mock tests (always run) ──────────────────────────────────────────── + // provider-selector smoke tests + wizard-completion tests (API mocked) + { + name: "chromium", + testIgnore: isIntegration + ? [/auth\.setup\.ts/] + : [/auth\.setup\.ts/, /organizations\.spec\.ts/], + use: { + ...devices["Desktop Chrome"], + ...(isIntegration + ? { storageState: "e2e/.auth/admin.json" } + : {}), + }, + dependencies: isIntegration ? ["auth:setup"] : [], + }, + ], + + webServer: { + // Always pass ISSUER_URI so wizard runner resolves API URLs correctly, + // even in mock mode where the API calls are intercepted by page.route(). + command: isIntegration + ? `VITE_OIDC_ISSUER_URI=${ISSUER_URI} VITE_OIDC_CLIENT_ID=wizard-v2-dev pnpm dev` + : `VITE_OIDC_USE_MOCK=true VITE_OIDC_ISSUER_URI=${ISSUER_URI} pnpm dev`, + url: "http://localhost:5173", + reuseExistingServer: !process.env.CI, + timeout: 30_000, + }, +}); diff --git a/apps/wizard-v2/public/favicons/android-chrome-192x192.png b/apps/wizard-v2/public/favicons/android-chrome-192x192.png new file mode 100644 index 00000000..62aec268 Binary files /dev/null and b/apps/wizard-v2/public/favicons/android-chrome-192x192.png differ diff --git a/apps/wizard-v2/public/favicons/android-chrome-512x512.png b/apps/wizard-v2/public/favicons/android-chrome-512x512.png new file mode 100644 index 00000000..6aa20c42 Binary files /dev/null and b/apps/wizard-v2/public/favicons/android-chrome-512x512.png differ diff --git a/apps/wizard-v2/public/favicons/apple-touch-icon.png b/apps/wizard-v2/public/favicons/apple-touch-icon.png new file mode 100644 index 00000000..583eba2a Binary files /dev/null and b/apps/wizard-v2/public/favicons/apple-touch-icon.png differ diff --git a/apps/wizard-v2/public/favicons/browserconfig.xml b/apps/wizard-v2/public/favicons/browserconfig.xml new file mode 100644 index 00000000..b3930d0f --- /dev/null +++ b/apps/wizard-v2/public/favicons/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/apps/wizard-v2/public/favicons/favicon-16x16.png b/apps/wizard-v2/public/favicons/favicon-16x16.png new file mode 100644 index 00000000..5588fb8d Binary files /dev/null and b/apps/wizard-v2/public/favicons/favicon-16x16.png differ diff --git a/apps/wizard-v2/public/favicons/favicon-32x32.png b/apps/wizard-v2/public/favicons/favicon-32x32.png new file mode 100644 index 00000000..9411676c Binary files /dev/null and b/apps/wizard-v2/public/favicons/favicon-32x32.png differ diff --git a/apps/wizard-v2/public/favicons/favicon.ico b/apps/wizard-v2/public/favicons/favicon.ico new file mode 100644 index 00000000..43e9b19a Binary files /dev/null and b/apps/wizard-v2/public/favicons/favicon.ico differ diff --git a/apps/wizard-v2/public/favicons/mstile-144x144.png b/apps/wizard-v2/public/favicons/mstile-144x144.png new file mode 100644 index 00000000..92e66f5d Binary files /dev/null and b/apps/wizard-v2/public/favicons/mstile-144x144.png differ diff --git a/apps/wizard-v2/public/favicons/mstile-150x150.png b/apps/wizard-v2/public/favicons/mstile-150x150.png new file mode 100644 index 00000000..ed784783 Binary files /dev/null and b/apps/wizard-v2/public/favicons/mstile-150x150.png differ diff --git a/apps/wizard-v2/public/favicons/mstile-310x150.png b/apps/wizard-v2/public/favicons/mstile-310x150.png new file mode 100644 index 00000000..c8ec2dd4 Binary files /dev/null and b/apps/wizard-v2/public/favicons/mstile-310x150.png differ diff --git a/apps/wizard-v2/public/favicons/mstile-310x310.png b/apps/wizard-v2/public/favicons/mstile-310x310.png new file mode 100644 index 00000000..0e207fc0 Binary files /dev/null and b/apps/wizard-v2/public/favicons/mstile-310x310.png differ diff --git a/apps/wizard-v2/public/favicons/mstile-70x70.png b/apps/wizard-v2/public/favicons/mstile-70x70.png new file mode 100644 index 00000000..f9b798a3 Binary files /dev/null and b/apps/wizard-v2/public/favicons/mstile-70x70.png differ diff --git a/apps/wizard-v2/public/favicons/safari-pinned-tab.svg b/apps/wizard-v2/public/favicons/safari-pinned-tab.svg new file mode 100644 index 00000000..4ef5bee6 --- /dev/null +++ b/apps/wizard-v2/public/favicons/safari-pinned-tab.svg @@ -0,0 +1,40 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + diff --git a/apps/wizard-v2/public/favicons/site.webmanifest b/apps/wizard-v2/public/favicons/site.webmanifest new file mode 100644 index 00000000..b20abb7c --- /dev/null +++ b/apps/wizard-v2/public/favicons/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/apps/wizard-v2/public/phasetwo-logos/dark/logo_phase_slash.svg b/apps/wizard-v2/public/phasetwo-logos/dark/logo_phase_slash.svg new file mode 100644 index 00000000..8a789aee --- /dev/null +++ b/apps/wizard-v2/public/phasetwo-logos/dark/logo_phase_slash.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/phasetwo-logos/light/logo_phase_slash.svg b/apps/wizard-v2/public/phasetwo-logos/light/logo_phase_slash.svg new file mode 100644 index 00000000..76f7536e --- /dev/null +++ b/apps/wizard-v2/public/phasetwo-logos/light/logo_phase_slash.svg @@ -0,0 +1,35 @@ + + + + Group 18 Copy 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/phasetwo-logos/phasetwo_logo_icon.svg b/apps/wizard-v2/public/phasetwo-logos/phasetwo_logo_icon.svg new file mode 100644 index 00000000..a1e510de --- /dev/null +++ b/apps/wizard-v2/public/phasetwo-logos/phasetwo_logo_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/access-people-hr.svg b/apps/wizard-v2/public/provider-logos/dark/access-people-hr.svg new file mode 100644 index 00000000..3017aa91 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/access-people-hr.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/active-directory.svg b/apps/wizard-v2/public/provider-logos/dark/active-directory.svg new file mode 100644 index 00000000..f795aecc --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/active-directory.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/adp.svg b/apps/wizard-v2/public/provider-logos/dark/adp.svg new file mode 100644 index 00000000..e7f93784 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/adp.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/apple.svg b/apps/wizard-v2/public/provider-logos/dark/apple.svg new file mode 100644 index 00000000..db0e790e --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/apple.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/auth0.svg b/apps/wizard-v2/public/provider-logos/dark/auth0.svg new file mode 100644 index 00000000..b28ce750 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/auth0.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/aws.svg b/apps/wizard-v2/public/provider-logos/dark/aws.svg new file mode 100644 index 00000000..aa1ded1c --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/aws.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/azure.svg b/apps/wizard-v2/public/provider-logos/dark/azure.svg new file mode 100644 index 00000000..d8b06aeb --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/azure.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/bamboo-hr.svg b/apps/wizard-v2/public/provider-logos/dark/bamboo-hr.svg new file mode 100644 index 00000000..6bf9713b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/bamboo-hr.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/bitbucket.svg b/apps/wizard-v2/public/provider-logos/dark/bitbucket.svg new file mode 100644 index 00000000..b8282707 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/bitbucket.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/breathe-hr.svg b/apps/wizard-v2/public/provider-logos/dark/breathe-hr.svg new file mode 100644 index 00000000..8c9eb5ac --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/breathe-hr.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/cas.svg b/apps/wizard-v2/public/provider-logos/dark/cas.svg new file mode 100644 index 00000000..92a6d972 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/cas.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/cezanne-hr.svg b/apps/wizard-v2/public/provider-logos/dark/cezanne-hr.svg new file mode 100644 index 00000000..ed13ccfa --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/cezanne-hr.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/classlink.svg b/apps/wizard-v2/public/provider-logos/dark/classlink.svg new file mode 100644 index 00000000..0db1efd4 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/classlink.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/clever.svg b/apps/wizard-v2/public/provider-logos/dark/clever.svg new file mode 100644 index 00000000..3e623bb7 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/clever.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/cloudflare.svg b/apps/wizard-v2/public/provider-logos/dark/cloudflare.svg new file mode 100644 index 00000000..92626d33 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/cloudflare.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/cyberark.svg b/apps/wizard-v2/public/provider-logos/dark/cyberark.svg new file mode 100644 index 00000000..7c1b7e9b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/cyberark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/datadog.svg b/apps/wizard-v2/public/provider-logos/dark/datadog.svg new file mode 100644 index 00000000..9e6c8ca8 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/datadog.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/discord.svg b/apps/wizard-v2/public/provider-logos/dark/discord.svg new file mode 100644 index 00000000..7b46a27e --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/discord.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/dark/duo.svg b/apps/wizard-v2/public/provider-logos/dark/duo.svg new file mode 100644 index 00000000..b214a65b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/duo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/firebase.svg b/apps/wizard-v2/public/provider-logos/dark/firebase.svg new file mode 100644 index 00000000..397680bf --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/firebase.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/fourth.svg b/apps/wizard-v2/public/provider-logos/dark/fourth.svg new file mode 100644 index 00000000..067d93e2 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/fourth.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/generic-oidc.svg b/apps/wizard-v2/public/provider-logos/dark/generic-oidc.svg new file mode 100644 index 00000000..afba082a --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/generic-oidc.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/dark/github.svg b/apps/wizard-v2/public/provider-logos/dark/github.svg new file mode 100644 index 00000000..2f91bdd5 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/gitlab.svg b/apps/wizard-v2/public/provider-logos/dark/gitlab.svg new file mode 100644 index 00000000..47967c2c --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/gitlab.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/godaddy.svg b/apps/wizard-v2/public/provider-logos/dark/godaddy.svg new file mode 100644 index 00000000..7dff35fc --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/godaddy.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/google-cloud.svg b/apps/wizard-v2/public/provider-logos/dark/google-cloud.svg new file mode 100644 index 00000000..7dc106bc --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/google-cloud.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/google.svg b/apps/wizard-v2/public/provider-logos/dark/google.svg new file mode 100644 index 00000000..568878f9 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/hibob.svg b/apps/wizard-v2/public/provider-logos/dark/hibob.svg new file mode 100644 index 00000000..f356d012 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/hibob.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/intuit.svg b/apps/wizard-v2/public/provider-logos/dark/intuit.svg new file mode 100644 index 00000000..f20ec6e4 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/intuit.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/jumpcloud.svg b/apps/wizard-v2/public/provider-logos/dark/jumpcloud.svg new file mode 100644 index 00000000..a8a5adb1 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/jumpcloud.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/keycloak.svg b/apps/wizard-v2/public/provider-logos/dark/keycloak.svg new file mode 100644 index 00000000..ae4e995b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/keycloak.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/lastpass.svg b/apps/wizard-v2/public/provider-logos/dark/lastpass.svg new file mode 100644 index 00000000..a3998c8d --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/lastpass.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/ldap.svg b/apps/wizard-v2/public/provider-logos/dark/ldap.svg new file mode 100644 index 00000000..c905b4de --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/ldap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/dark/linkedin.svg b/apps/wizard-v2/public/provider-logos/dark/linkedin.svg new file mode 100644 index 00000000..8ccee140 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/linkedin.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/login-gov.svg b/apps/wizard-v2/public/provider-logos/dark/login-gov.svg new file mode 100644 index 00000000..408ae984 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/login-gov.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/microsoft.svg b/apps/wizard-v2/public/provider-logos/dark/microsoft.svg new file mode 100644 index 00000000..0fa72c89 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/microsoft.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/miniorange.svg b/apps/wizard-v2/public/provider-logos/dark/miniorange.svg new file mode 100644 index 00000000..2a4bbb60 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/miniorange.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/net-iq.svg b/apps/wizard-v2/public/provider-logos/dark/net-iq.svg new file mode 100644 index 00000000..8f34e988 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/net-iq.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/okta.svg b/apps/wizard-v2/public/provider-logos/dark/okta.svg new file mode 100644 index 00000000..358a959c --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/okta.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/onelogin.svg b/apps/wizard-v2/public/provider-logos/dark/onelogin.svg new file mode 100644 index 00000000..e5687ce3 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/onelogin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/oracle.svg b/apps/wizard-v2/public/provider-logos/dark/oracle.svg new file mode 100644 index 00000000..67ffcd0e --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/oracle.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/personio.svg b/apps/wizard-v2/public/provider-logos/dark/personio.svg new file mode 100644 index 00000000..43198207 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/personio.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/ping-identity.svg b/apps/wizard-v2/public/provider-logos/dark/ping-identity.svg new file mode 100644 index 00000000..21d66857 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/ping-identity.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/react-native-expo.svg b/apps/wizard-v2/public/provider-logos/dark/react-native-expo.svg new file mode 100644 index 00000000..e66b2d6c --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/react-native-expo.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/rippling.svg b/apps/wizard-v2/public/provider-logos/dark/rippling.svg new file mode 100644 index 00000000..ec3d1326 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/rippling.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/sailpoint.svg b/apps/wizard-v2/public/provider-logos/dark/sailpoint.svg new file mode 100644 index 00000000..b3075ae0 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/sailpoint.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/salesforce.svg b/apps/wizard-v2/public/provider-logos/dark/salesforce.svg new file mode 100644 index 00000000..ca752255 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/salesforce.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/saml.svg b/apps/wizard-v2/public/provider-logos/dark/saml.svg new file mode 100644 index 00000000..31e567b3 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/saml.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/dark/shibboleth.svg b/apps/wizard-v2/public/provider-logos/dark/shibboleth.svg new file mode 100644 index 00000000..45a7a8a9 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/shibboleth.svg @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/simple-saml-php.svg b/apps/wizard-v2/public/provider-logos/dark/simple-saml-php.svg new file mode 100644 index 00000000..5b69e05b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/simple-saml-php.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/slack.svg b/apps/wizard-v2/public/provider-logos/dark/slack.svg new file mode 100644 index 00000000..6e45608d --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/slack.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/splunk.svg b/apps/wizard-v2/public/provider-logos/dark/splunk.svg new file mode 100644 index 00000000..cb6ea694 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/splunk.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/supabase.svg b/apps/wizard-v2/public/provider-logos/dark/supabase.svg new file mode 100644 index 00000000..e754ea81 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/supabase.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/vercel.svg b/apps/wizard-v2/public/provider-logos/dark/vercel.svg new file mode 100644 index 00000000..d2e2f65e --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/vercel.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/dark/vmware.svg b/apps/wizard-v2/public/provider-logos/dark/vmware.svg new file mode 100644 index 00000000..e1bc4744 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/vmware.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/workday.svg b/apps/wizard-v2/public/provider-logos/dark/workday.svg new file mode 100644 index 00000000..9448ea04 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/workday.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/dark/xero.svg b/apps/wizard-v2/public/provider-logos/dark/xero.svg new file mode 100644 index 00000000..c6c7930b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/dark/xero.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/access-people-hr.svg b/apps/wizard-v2/public/provider-logos/light/access-people-hr.svg new file mode 100644 index 00000000..3017aa91 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/access-people-hr.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/active-directory.svg b/apps/wizard-v2/public/provider-logos/light/active-directory.svg new file mode 100644 index 00000000..51c329f0 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/active-directory.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/adp.svg b/apps/wizard-v2/public/provider-logos/light/adp.svg new file mode 100644 index 00000000..4b3b3b99 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/adp.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/apple.svg b/apps/wizard-v2/public/provider-logos/light/apple.svg new file mode 100644 index 00000000..061ac22f --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/apple.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/auth0.svg b/apps/wizard-v2/public/provider-logos/light/auth0.svg new file mode 100644 index 00000000..f1b96424 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/auth0.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/aws.svg b/apps/wizard-v2/public/provider-logos/light/aws.svg new file mode 100644 index 00000000..4715937f --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/aws.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/azure.svg b/apps/wizard-v2/public/provider-logos/light/azure.svg new file mode 100644 index 00000000..692d9893 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/azure.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/bamboo-hr.svg b/apps/wizard-v2/public/provider-logos/light/bamboo-hr.svg new file mode 100644 index 00000000..6bf9713b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/bamboo-hr.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/bitbucket.svg b/apps/wizard-v2/public/provider-logos/light/bitbucket.svg new file mode 100644 index 00000000..714c6ff5 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/bitbucket.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/breathe-hr.svg b/apps/wizard-v2/public/provider-logos/light/breathe-hr.svg new file mode 100644 index 00000000..6ba2b819 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/breathe-hr.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/cas.svg b/apps/wizard-v2/public/provider-logos/light/cas.svg new file mode 100644 index 00000000..5e427bb6 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/cas.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/cezanne-hr.svg b/apps/wizard-v2/public/provider-logos/light/cezanne-hr.svg new file mode 100644 index 00000000..d45e5157 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/cezanne-hr.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/classlink.svg b/apps/wizard-v2/public/provider-logos/light/classlink.svg new file mode 100644 index 00000000..0487ccdf --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/classlink.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/clever.svg b/apps/wizard-v2/public/provider-logos/light/clever.svg new file mode 100644 index 00000000..7c4bc56d --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/clever.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/cloudflare.svg b/apps/wizard-v2/public/provider-logos/light/cloudflare.svg new file mode 100644 index 00000000..b6694025 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/cloudflare.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/cyberark.svg b/apps/wizard-v2/public/provider-logos/light/cyberark.svg new file mode 100644 index 00000000..f586874a --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/cyberark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/datadog.svg b/apps/wizard-v2/public/provider-logos/light/datadog.svg new file mode 100644 index 00000000..355ee0db --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/datadog.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/discord.svg b/apps/wizard-v2/public/provider-logos/light/discord.svg new file mode 100644 index 00000000..fbce9f25 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/discord.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/light/duo.svg b/apps/wizard-v2/public/provider-logos/light/duo.svg new file mode 100644 index 00000000..b214a65b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/duo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/firebase.svg b/apps/wizard-v2/public/provider-logos/light/firebase.svg new file mode 100644 index 00000000..2da09ff4 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/firebase.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/fourth.svg b/apps/wizard-v2/public/provider-logos/light/fourth.svg new file mode 100644 index 00000000..8f44d7c4 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/fourth.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/generic-oidc.svg b/apps/wizard-v2/public/provider-logos/light/generic-oidc.svg new file mode 100644 index 00000000..1efee1f6 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/generic-oidc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/github.svg b/apps/wizard-v2/public/provider-logos/light/github.svg new file mode 100644 index 00000000..0607d489 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/gitlab.svg b/apps/wizard-v2/public/provider-logos/light/gitlab.svg new file mode 100644 index 00000000..47967c2c --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/gitlab.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/godaddy.svg b/apps/wizard-v2/public/provider-logos/light/godaddy.svg new file mode 100644 index 00000000..7dff35fc --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/godaddy.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/google-cloud.svg b/apps/wizard-v2/public/provider-logos/light/google-cloud.svg new file mode 100644 index 00000000..1e7c75b7 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/google-cloud.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/google.svg b/apps/wizard-v2/public/provider-logos/light/google.svg new file mode 100644 index 00000000..b1d2db55 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/hibob.svg b/apps/wizard-v2/public/provider-logos/light/hibob.svg new file mode 100644 index 00000000..94809725 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/hibob.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/intuit.svg b/apps/wizard-v2/public/provider-logos/light/intuit.svg new file mode 100644 index 00000000..4caa8d3a --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/intuit.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/jumpcloud.svg b/apps/wizard-v2/public/provider-logos/light/jumpcloud.svg new file mode 100644 index 00000000..d409a748 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/jumpcloud.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/keycloak.svg b/apps/wizard-v2/public/provider-logos/light/keycloak.svg new file mode 100644 index 00000000..c0c53ef9 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/keycloak.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/lastpass.svg b/apps/wizard-v2/public/provider-logos/light/lastpass.svg new file mode 100644 index 00000000..a3998c8d --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/lastpass.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/ldap.svg b/apps/wizard-v2/public/provider-logos/light/ldap.svg new file mode 100644 index 00000000..d8f16ae3 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/ldap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/light/linkedin.svg b/apps/wizard-v2/public/provider-logos/light/linkedin.svg new file mode 100644 index 00000000..330b32ca --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/linkedin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/login-gov.svg b/apps/wizard-v2/public/provider-logos/light/login-gov.svg new file mode 100644 index 00000000..5d816f2d --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/login-gov.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/microsoft.svg b/apps/wizard-v2/public/provider-logos/light/microsoft.svg new file mode 100644 index 00000000..ef8650c6 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/microsoft.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/miniorange.svg b/apps/wizard-v2/public/provider-logos/light/miniorange.svg new file mode 100644 index 00000000..2dd8f210 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/miniorange.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/net-iq.svg b/apps/wizard-v2/public/provider-logos/light/net-iq.svg new file mode 100644 index 00000000..2d0a97c3 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/net-iq.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/okta.svg b/apps/wizard-v2/public/provider-logos/light/okta.svg new file mode 100644 index 00000000..6249303a --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/okta.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/onelogin.svg b/apps/wizard-v2/public/provider-logos/light/onelogin.svg new file mode 100644 index 00000000..2103997e --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/onelogin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/oracle.svg b/apps/wizard-v2/public/provider-logos/light/oracle.svg new file mode 100644 index 00000000..b6c0e0ef --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/oracle.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/personio.svg b/apps/wizard-v2/public/provider-logos/light/personio.svg new file mode 100644 index 00000000..a946424c --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/personio.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/ping-identity.svg b/apps/wizard-v2/public/provider-logos/light/ping-identity.svg new file mode 100644 index 00000000..21d66857 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/ping-identity.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/react-native-expo.svg b/apps/wizard-v2/public/provider-logos/light/react-native-expo.svg new file mode 100644 index 00000000..3bc1e92b --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/react-native-expo.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/rippling.svg b/apps/wizard-v2/public/provider-logos/light/rippling.svg new file mode 100644 index 00000000..e6f5b64f --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/rippling.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/sailpoint.svg b/apps/wizard-v2/public/provider-logos/light/sailpoint.svg new file mode 100644 index 00000000..e78ac9c2 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/sailpoint.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/salesforce.svg b/apps/wizard-v2/public/provider-logos/light/salesforce.svg new file mode 100644 index 00000000..f9f8edbc --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/salesforce.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/saml.svg b/apps/wizard-v2/public/provider-logos/light/saml.svg new file mode 100644 index 00000000..313a6e0e --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/saml.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/light/shibboleth.svg b/apps/wizard-v2/public/provider-logos/light/shibboleth.svg new file mode 100644 index 00000000..9ea719a7 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/shibboleth.svg @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/simple-saml-php.svg b/apps/wizard-v2/public/provider-logos/light/simple-saml-php.svg new file mode 100644 index 00000000..5bf4e117 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/simple-saml-php.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/slack.svg b/apps/wizard-v2/public/provider-logos/light/slack.svg new file mode 100644 index 00000000..5297dea9 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/slack.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/splunk.svg b/apps/wizard-v2/public/provider-logos/light/splunk.svg new file mode 100644 index 00000000..8365b58d --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/splunk.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/provider-logos/light/supabase.svg b/apps/wizard-v2/public/provider-logos/light/supabase.svg new file mode 100644 index 00000000..ea836286 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/supabase.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/vercel.svg b/apps/wizard-v2/public/provider-logos/light/vercel.svg new file mode 100644 index 00000000..69fe4c11 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/vercel.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/apps/wizard-v2/public/provider-logos/light/vmware.svg b/apps/wizard-v2/public/provider-logos/light/vmware.svg new file mode 100644 index 00000000..268959a7 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/vmware.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/workday.svg b/apps/wizard-v2/public/provider-logos/light/workday.svg new file mode 100644 index 00000000..3b9c1a48 --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/workday.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/wizard-v2/public/provider-logos/light/xero.svg b/apps/wizard-v2/public/provider-logos/light/xero.svg new file mode 100644 index 00000000..f94741bc --- /dev/null +++ b/apps/wizard-v2/public/provider-logos/light/xero.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/wizard-v2/public/wizards/adfs/index.ts b/apps/wizard-v2/public/wizards/adfs/index.ts new file mode 100644 index 00000000..466fc73c --- /dev/null +++ b/apps/wizard-v2/public/wizards/adfs/index.ts @@ -0,0 +1 @@ +export * from "./saml"; diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_0.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_0.png new file mode 100644 index 00000000..13bd2568 Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_1.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_1.png new file mode 100644 index 00000000..21d2478a Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_10.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_10.png new file mode 100644 index 00000000..27555cca Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_10.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_11.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_11.png new file mode 100644 index 00000000..942500bb Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_11.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_12.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_12.png new file mode 100644 index 00000000..79386570 Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_12.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_13.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_13.png new file mode 100644 index 00000000..31e4e35b Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_13.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_2.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_2.png new file mode 100644 index 00000000..ab4972ff Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_3.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_3.png new file mode 100644 index 00000000..79f059e3 Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_4.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_4.png new file mode 100644 index 00000000..1692a3ef Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_5.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_5.png new file mode 100644 index 00000000..245c83ab Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_6.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_6.png new file mode 100644 index 00000000..7c00ae99 Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_7.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_7.png new file mode 100644 index 00000000..5550ee33 Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_8.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_8.png new file mode 100644 index 00000000..fac3fe31 Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_9.png b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_9.png new file mode 100644 index 00000000..905567dc Binary files /dev/null and b/apps/wizard-v2/public/wizards/adfs/saml/adfs_saml_9.png differ diff --git a/apps/wizard-v2/public/wizards/adfs/saml/index.ts b/apps/wizard-v2/public/wizards/adfs/saml/index.ts new file mode 100644 index 00000000..d9f8e4da --- /dev/null +++ b/apps/wizard-v2/public/wizards/adfs/saml/index.ts @@ -0,0 +1,31 @@ +import ADFS_SAML_0 from "./adfs_saml_0.png"; +import ADFS_SAML_1 from "./adfs_saml_1.png"; +import ADFS_SAML_2 from "./adfs_saml_2.png"; +import ADFS_SAML_3 from "./adfs_saml_3.png"; +import ADFS_SAML_4 from "./adfs_saml_4.png"; +import ADFS_SAML_5 from "./adfs_saml_5.png"; +import ADFS_SAML_6 from "./adfs_saml_6.png"; +import ADFS_SAML_7 from "./adfs_saml_7.png"; +import ADFS_SAML_8 from "./adfs_saml_8.png"; +import ADFS_SAML_9 from "./adfs_saml_9.png"; +import ADFS_SAML_10 from "./adfs_saml_10.png"; +import ADFS_SAML_11 from "./adfs_saml_11.png"; +import ADFS_SAML_12 from "./adfs_saml_12.png"; +import ADFS_SAML_13 from "./adfs_saml_13.png"; + +export { + ADFS_SAML_0, + ADFS_SAML_1, + ADFS_SAML_2, + ADFS_SAML_3, + ADFS_SAML_4, + ADFS_SAML_5, + ADFS_SAML_6, + ADFS_SAML_7, + ADFS_SAML_8, + ADFS_SAML_9, + ADFS_SAML_10, + ADFS_SAML_11, + ADFS_SAML_12, + ADFS_SAML_13, +}; diff --git a/apps/wizard-v2/public/wizards/auth0/COMMON/auth0-1.png b/apps/wizard-v2/public/wizards/auth0/COMMON/auth0-1.png new file mode 100644 index 00000000..7a494397 Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/COMMON/auth0-1.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/COMMON/auth0-2.png b/apps/wizard-v2/public/wizards/auth0/COMMON/auth0-2.png new file mode 100644 index 00000000..d2c13341 Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/COMMON/auth0-2.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/OIDC/auth0-3.png b/apps/wizard-v2/public/wizards/auth0/OIDC/auth0-3.png new file mode 100644 index 00000000..0f24c972 Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/OIDC/auth0-3.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/OIDC/auth0-4.png b/apps/wizard-v2/public/wizards/auth0/OIDC/auth0-4.png new file mode 100644 index 00000000..96da031b Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/OIDC/auth0-4.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/SAML/auth0-3SAML.png b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-3SAML.png new file mode 100644 index 00000000..08fa47df Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-3SAML.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/SAML/auth0-4SAML.png b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-4SAML.png new file mode 100644 index 00000000..b91cceb3 Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-4SAML.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/SAML/auth0-5SAML.png b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-5SAML.png new file mode 100644 index 00000000..20e6dd84 Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-5SAML.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/SAML/auth0-6SAML.png b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-6SAML.png new file mode 100644 index 00000000..41a7b2b4 Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/SAML/auth0-6SAML.png differ diff --git a/apps/wizard-v2/public/wizards/auth0/auth0-logo.png b/apps/wizard-v2/public/wizards/auth0/auth0-logo.png new file mode 100644 index 00000000..63c69d3b Binary files /dev/null and b/apps/wizard-v2/public/wizards/auth0/auth0-logo.png differ diff --git a/apps/wizard-v2/public/wizards/aws/aws-logo.svg b/apps/wizard-v2/public/wizards/aws/aws-logo.svg new file mode 100644 index 00000000..50b1fc00 --- /dev/null +++ b/apps/wizard-v2/public/wizards/aws/aws-logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/wizards/aws/index.ts b/apps/wizard-v2/public/wizards/aws/index.ts new file mode 100644 index 00000000..9a2e6b4c --- /dev/null +++ b/apps/wizard-v2/public/wizards/aws/index.ts @@ -0,0 +1,23 @@ +import AWS_LOGO from "./aws-logo.svg"; +import AWS_SSO_SAML_1 from "./awssso_saml_1.png"; +import AWS_SSO_SAML_2 from "./awssso_saml_2.png"; +import AWS_SSO_SAML_3 from "./awssso_saml_3.png"; +import AWS_SSO_SAML_4 from "./awssso_saml_4.png"; +import AWS_SSO_SAML_5_A from "./awssso_saml_5a.png"; +import AWS_SSO_SAML_5 from "./awssso_saml_5.png"; +import AWS_SSO_SAML_6 from "./awssso_saml_6.png"; +import AWS_SSO_SAML_7 from "./awssso_saml_7.png"; +import AWS_SSO_SAML_8 from "./awssso_saml_8.png"; + +export { + AWS_LOGO, + AWS_SSO_SAML_1, + AWS_SSO_SAML_2, + AWS_SSO_SAML_3, + AWS_SSO_SAML_4, + AWS_SSO_SAML_5, + AWS_SSO_SAML_5_A, + AWS_SSO_SAML_6, + AWS_SSO_SAML_7, + AWS_SSO_SAML_8, +}; diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-1.png b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-1.png new file mode 100644 index 00000000..50ef622c Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-1.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-2.png b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-2.png new file mode 100644 index 00000000..94442e81 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-2.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-3.png b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-3.png new file mode 100644 index 00000000..8d4840a4 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-3.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-4.png b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-4.png new file mode 100644 index 00000000..06cb7957 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-4.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-5.png b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-5.png new file mode 100644 index 00000000..bb0c324b Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-applications-step-5.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-attributes-step-1.png b/apps/wizard-v2/public/wizards/aws/saml/add-attributes-step-1.png new file mode 100644 index 00000000..e7e206cb Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-attributes-step-1.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/add-attributes-step-2.png b/apps/wizard-v2/public/wizards/aws/saml/add-attributes-step-2.png new file mode 100644 index 00000000..6049a159 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/add-attributes-step-2.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-1.png b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-1.png new file mode 100644 index 00000000..866462b8 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-1.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-2.png b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-2.png new file mode 100644 index 00000000..c9a89fee Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-2.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-3.png b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-3.png new file mode 100644 index 00000000..445babe8 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-3.png differ diff --git a/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-4.png b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-4.png new file mode 100644 index 00000000..678f8b83 Binary files /dev/null and b/apps/wizard-v2/public/wizards/aws/saml/assign-users-step-4.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/cloudflare-large.svg b/apps/wizard-v2/public/wizards/cloudflare/cloudflare-large.svg new file mode 100644 index 00000000..76559f1d --- /dev/null +++ b/apps/wizard-v2/public/wizards/cloudflare/cloudflare-large.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/wizard-v2/public/wizards/cloudflare/cloudflare.svg b/apps/wizard-v2/public/wizards/cloudflare/cloudflare.svg new file mode 100644 index 00000000..0f8d74e0 --- /dev/null +++ b/apps/wizard-v2/public/wizards/cloudflare/cloudflare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_0.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_0.png new file mode 100644 index 00000000..58c1fc81 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_1.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_1.png new file mode 100644 index 00000000..90827212 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_2.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_2.png new file mode 100644 index 00000000..f4efdbea Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_3.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_3.png new file mode 100644 index 00000000..84bda252 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_4.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_4.png new file mode 100644 index 00000000..da769be5 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_5.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_5.png new file mode 100644 index 00000000..c2c437d1 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_6.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_6.png new file mode 100644 index 00000000..8471ca0e Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_7.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_7.png new file mode 100644 index 00000000..fcbffc38 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_8.png b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_8.png new file mode 100644 index 00000000..149d426d Binary files /dev/null and b/apps/wizard-v2/public/wizards/cloudflare/saml/cloudflare_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/cloudflare/saml/index.ts b/apps/wizard-v2/public/wizards/cloudflare/saml/index.ts new file mode 100644 index 00000000..420c3580 --- /dev/null +++ b/apps/wizard-v2/public/wizards/cloudflare/saml/index.ts @@ -0,0 +1,21 @@ +import CloudflareSaml0 from "./cloudflare_saml_0.png"; +import CloudflareSaml1 from "./cloudflare_saml_1.png"; +import CloudflareSaml2 from "./cloudflare_saml_2.png"; +import CloudflareSaml3 from "./cloudflare_saml_3.png"; +import CloudflareSaml4 from "./cloudflare_saml_4.png"; +import CloudflareSaml5 from "./cloudflare_saml_5.png"; +import CloudflareSaml6 from "./cloudflare_saml_6.png"; +import CloudflareSaml7 from "./cloudflare_saml_7.png"; +import CloudflareSaml8 from "./cloudflare_saml_8.png"; + +export { + CloudflareSaml0, + CloudflareSaml1, + CloudflareSaml2, + CloudflareSaml3, + CloudflareSaml4, + CloudflareSaml5, + CloudflareSaml6, + CloudflareSaml7, + CloudflareSaml8, +}; diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_0.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_0.png new file mode 100644 index 00000000..25bbf139 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_1.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_1.png new file mode 100644 index 00000000..d5dbff31 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_2.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_2.png new file mode 100644 index 00000000..6014a272 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_3.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_3.png new file mode 100644 index 00000000..78baf7d6 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_4.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_4.png new file mode 100644 index 00000000..9a91fa4d Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_5.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_5.png new file mode 100644 index 00000000..1aed592e Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_6.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_6.png new file mode 100644 index 00000000..b11c7b96 Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_7.png b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_7.png new file mode 100644 index 00000000..17133f9f Binary files /dev/null and b/apps/wizard-v2/public/wizards/cyberark/SAML/cyberark_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/cyberark/SAML/index.ts b/apps/wizard-v2/public/wizards/cyberark/SAML/index.ts new file mode 100644 index 00000000..6d8768a9 --- /dev/null +++ b/apps/wizard-v2/public/wizards/cyberark/SAML/index.ts @@ -0,0 +1,19 @@ +import CyberArkSaml0 from './cyberark_saml_0.png'; +import CyberArkSaml1 from './cyberark_saml_1.png'; +import CyberArkSaml2 from './cyberark_saml_2.png'; +import CyberArkSaml3 from './cyberark_saml_3.png'; +import CyberArkSaml4 from './cyberark_saml_4.png'; +import CyberArkSaml5 from './cyberark_saml_5.png'; +import CyberArkSaml6 from './cyberark_saml_6.png'; +import CyberArkSaml7 from './cyberark_saml_7.png'; + +export { + CyberArkSaml0, + CyberArkSaml1, + CyberArkSaml2, + CyberArkSaml3, + CyberArkSaml4, + CyberArkSaml5, + CyberArkSaml6, + CyberArkSaml7, +}; diff --git a/apps/wizard-v2/public/wizards/duo/duo-large.svg b/apps/wizard-v2/public/wizards/duo/duo-large.svg new file mode 100644 index 00000000..6eb3be2a --- /dev/null +++ b/apps/wizard-v2/public/wizards/duo/duo-large.svg @@ -0,0 +1,55 @@ + +image/svg+xml diff --git a/apps/wizard-v2/public/wizards/duo/duo.svg b/apps/wizard-v2/public/wizards/duo/duo.svg new file mode 100644 index 00000000..78cdf85a --- /dev/null +++ b/apps/wizard-v2/public/wizards/duo/duo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/wizards/duo/saml/duo_saml_0.png b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_0.png new file mode 100644 index 00000000..36db8ffd Binary files /dev/null and b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/duo/saml/duo_saml_1.png b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_1.png new file mode 100644 index 00000000..9ae374b2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/duo/saml/duo_saml_2.png b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_2.png new file mode 100644 index 00000000..f8aa3d82 Binary files /dev/null and b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/duo/saml/duo_saml_3.png b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_3.png new file mode 100644 index 00000000..a3ed32d4 Binary files /dev/null and b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/duo/saml/duo_saml_4.png b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_4.png new file mode 100644 index 00000000..9bc81175 Binary files /dev/null and b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/duo/saml/duo_saml_5.png b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_5.png new file mode 100644 index 00000000..213fa014 Binary files /dev/null and b/apps/wizard-v2/public/wizards/duo/saml/duo_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/duo/saml/index.ts b/apps/wizard-v2/public/wizards/duo/saml/index.ts new file mode 100644 index 00000000..0c2256c5 --- /dev/null +++ b/apps/wizard-v2/public/wizards/duo/saml/index.ts @@ -0,0 +1,8 @@ +import DuoSaml0 from "./duo_saml_0.png"; +import DuoSaml1 from "./duo_saml_1.png"; +import DuoSaml2 from "./duo_saml_2.png"; +import DuoSaml3 from "./duo_saml_3.png"; +import DuoSaml4 from "./duo_saml_4.png"; +import DuoSaml5 from "./duo_saml_5.png"; + +export { DuoSaml0, DuoSaml1, DuoSaml2, DuoSaml3, DuoSaml4, DuoSaml5 }; diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_1.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_1.avif new file mode 100644 index 00000000..bf6c86d9 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_1.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_10.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_10.avif new file mode 100644 index 00000000..4721138c Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_10.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_11.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_11.avif new file mode 100644 index 00000000..ac5479d1 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_11.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_12.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_12.avif new file mode 100644 index 00000000..cb1b86cf Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_12.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_13.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_13.avif new file mode 100644 index 00000000..ce26eeb4 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_13.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_14.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_14.avif new file mode 100644 index 00000000..3446a1b6 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_14.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_15.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_15.avif new file mode 100644 index 00000000..16f0c4c5 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_15.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_16.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_16.avif new file mode 100644 index 00000000..9652f17e Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_16.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_17.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_17.avif new file mode 100644 index 00000000..a1303fbc Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_17.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_18.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_18.avif new file mode 100644 index 00000000..7b0f5f9b Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_18.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_2.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_2.avif new file mode 100644 index 00000000..15b141dd Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_2.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_3.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_3.avif new file mode 100644 index 00000000..b34072a9 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_3.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_4.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_4.avif new file mode 100644 index 00000000..f41899ef Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_4.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_5.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_5.avif new file mode 100644 index 00000000..21b5c524 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_5.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_6.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_6.avif new file mode 100644 index 00000000..4b58cd18 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_6.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_7.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_7.avif new file mode 100644 index 00000000..30358d50 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_7.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_8.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_8.avif new file mode 100644 index 00000000..cb436f5f Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_8.avif differ diff --git a/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_9.avif b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_9.avif new file mode 100644 index 00000000..efcd2213 Binary files /dev/null and b/apps/wizard-v2/public/wizards/entraid/scim/entraid_scim_9.avif differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_1a.png b/apps/wizard-v2/public/wizards/google/google_saml_1a.png new file mode 100644 index 00000000..028acb09 Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_1a.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_1b.png b/apps/wizard-v2/public/wizards/google/google_saml_1b.png new file mode 100644 index 00000000..9e574bf5 Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_1b.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_2.png b/apps/wizard-v2/public/wizards/google/google_saml_2.png new file mode 100644 index 00000000..bf44df27 Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_3.png b/apps/wizard-v2/public/wizards/google/google_saml_3.png new file mode 100644 index 00000000..8121865f Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_4.png b/apps/wizard-v2/public/wizards/google/google_saml_4.png new file mode 100644 index 00000000..a0cee8ef Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_5.png b/apps/wizard-v2/public/wizards/google/google_saml_5.png new file mode 100644 index 00000000..ef55cf83 Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_6a.png b/apps/wizard-v2/public/wizards/google/google_saml_6a.png new file mode 100644 index 00000000..44a63221 Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_6a.png differ diff --git a/apps/wizard-v2/public/wizards/google/google_saml_6b.png b/apps/wizard-v2/public/wizards/google/google_saml_6b.png new file mode 100644 index 00000000..b320bdb6 Binary files /dev/null and b/apps/wizard-v2/public/wizards/google/google_saml_6b.png differ diff --git a/apps/wizard-v2/public/wizards/google/index.ts b/apps/wizard-v2/public/wizards/google/index.ts new file mode 100644 index 00000000..7b712d62 --- /dev/null +++ b/apps/wizard-v2/public/wizards/google/index.ts @@ -0,0 +1,19 @@ +import GoogleSaml1A from "./google_saml_1a.png"; +import GoogleSaml1B from "./google_saml_1b.png"; +import GoogleSaml2 from "./google_saml_2.png"; +import GoogleSaml3 from "./google_saml_3.png"; +import GoogleSaml4 from "./google_saml_4.png"; +import GoogleSaml5 from "./google_saml_5.png"; +import GoogleSaml6A from "./google_saml_6a.png"; +import GoogleSaml6B from "./google_saml_6b.png"; + +export { + GoogleSaml1A, + GoogleSaml1B, + GoogleSaml2, + GoogleSaml3, + GoogleSaml4, + GoogleSaml5, + GoogleSaml6A, + GoogleSaml6B, +}; diff --git a/apps/wizard-v2/public/wizards/jumpcloud/index.ts b/apps/wizard-v2/public/wizards/jumpcloud/index.ts new file mode 100644 index 00000000..03cece28 --- /dev/null +++ b/apps/wizard-v2/public/wizards/jumpcloud/index.ts @@ -0,0 +1,27 @@ +import JumpCloud_SAML_1 from "./jumpcloud_saml_1.png"; +import JumpCloud_SAML_2 from "./jumpcloud_saml_2.png"; +import JumpCloud_SAML_3 from "./jumpcloud_saml_3.png"; +import JumpCloud_SAML_4 from "./jumpcloud_saml_4.png"; +import JumpCloud_SAML_5 from "./jumpcloud_saml_5.png"; +import JumpCloud_SAML_6 from "./jumpcloud_saml_6.png"; +import JumpCloud_SAML_7 from "./jumpcloud_saml_7.png"; +import JumpCloud_SAML_8 from "./jumpcloud_saml_8.png"; +import JumpCloud_SAML_9 from "./jumpcloud_saml_9.png"; +import JumpCloud_SAML_9a from "./jumpcloud_saml_9a.png"; +import JumpCloud_SAML_10 from "./jumpcloud_saml_10.png"; +import JumpCloudLogo from "./jumpcloud-logo.svg"; + +export { + JumpCloud_SAML_1, + JumpCloud_SAML_2, + JumpCloud_SAML_3, + JumpCloud_SAML_4, + JumpCloud_SAML_5, + JumpCloud_SAML_6, + JumpCloud_SAML_7, + JumpCloud_SAML_8, + JumpCloud_SAML_9, + JumpCloud_SAML_9a, + JumpCloud_SAML_10, + JumpCloudLogo, +}; diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud-logo.svg b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud-logo.svg new file mode 100644 index 00000000..c146726e --- /dev/null +++ b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_1.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_1.png new file mode 100644 index 00000000..b47cff1c Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_10.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_10.png new file mode 100644 index 00000000..cdbd5c01 Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_10.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_2.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_2.png new file mode 100644 index 00000000..c617518e Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_3.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_3.png new file mode 100644 index 00000000..c44d2078 Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_4.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_4.png new file mode 100644 index 00000000..1e6be8cf Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_5.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_5.png new file mode 100644 index 00000000..34eae688 Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_6.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_6.png new file mode 100644 index 00000000..2a11325f Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_7.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_7.png new file mode 100644 index 00000000..cc35cfa8 Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_8.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_8.png new file mode 100644 index 00000000..f2590be8 Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_9.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_9.png new file mode 100644 index 00000000..9fd99c6a Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_9.png differ diff --git a/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_9a.png b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_9a.png new file mode 100644 index 00000000..f14c94f2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/jumpcloud/jumpcloud_saml_9a.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/index.ts b/apps/wizard-v2/public/wizards/lastpass/index.ts new file mode 100644 index 00000000..e55107de --- /dev/null +++ b/apps/wizard-v2/public/wizards/lastpass/index.ts @@ -0,0 +1,21 @@ +import LastPassSaml0 from './lastpass_saml_0.png'; +import LastPassSaml1 from './lastpass_saml_1.png'; +import LastPassSaml2 from './lastpass_saml_2.png'; +import LastPassSaml3 from './lastpass_saml_3.png'; +import LastPassSaml4 from './lastpass_saml_4.png'; +import LastPassSaml5 from './lastpass_saml_5.png'; +import LastPassSaml6 from './lastpass_saml_6.png'; +import LastPassSaml7 from './lastpass_saml_7.png'; +import LastPassSaml8 from './lastpass_saml_8.png'; + +export { + LastPassSaml0, + LastPassSaml1, + LastPassSaml2, + LastPassSaml3, + LastPassSaml4, + LastPassSaml5, + LastPassSaml6, + LastPassSaml7, + LastPassSaml8, +}; diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass-logo.svg b/apps/wizard-v2/public/wizards/lastpass/lastpass-logo.svg new file mode 100644 index 00000000..a97f347c --- /dev/null +++ b/apps/wizard-v2/public/wizards/lastpass/lastpass-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_0.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_0.png new file mode 100644 index 00000000..fa15735b Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_1.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_1.png new file mode 100644 index 00000000..776cba5a Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_2.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_2.png new file mode 100644 index 00000000..03587170 Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_3.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_3.png new file mode 100644 index 00000000..6dd5c69e Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_4.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_4.png new file mode 100644 index 00000000..f3e0b03a Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_5.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_5.png new file mode 100644 index 00000000..9fb8f6ea Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_6.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_6.png new file mode 100644 index 00000000..48305341 Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_7.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_7.png new file mode 100644 index 00000000..018b781a Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_8.png b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_8.png new file mode 100644 index 00000000..fe12f20e Binary files /dev/null and b/apps/wizard-v2/public/wizards/lastpass/lastpass_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-1.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-1.png new file mode 100644 index 00000000..5f0540b6 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-1.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-10.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-10.png new file mode 100644 index 00000000..1bc2266a Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-10.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-11.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-11.png new file mode 100644 index 00000000..b7b1ce59 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-11.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-12.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-12.png new file mode 100644 index 00000000..9c6e7546 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-12.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-1a.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-1a.png new file mode 100644 index 00000000..744d058f Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-1a.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-2.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-2.png new file mode 100644 index 00000000..77daf2a5 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-2.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-3.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-3.png new file mode 100644 index 00000000..d03b3c76 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-3.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-3a.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-3a.png new file mode 100644 index 00000000..e18a677d Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-3a.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-4.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-4.png new file mode 100644 index 00000000..60e98f3a Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-4.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-5.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-5.png new file mode 100644 index 00000000..2f311587 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-5.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-5a.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-5a.png new file mode 100644 index 00000000..4446541c Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-5a.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-6.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-6.png new file mode 100644 index 00000000..6ba27fc2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-6.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-7.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-7.png new file mode 100644 index 00000000..f40991fb Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-7.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-8.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-8.png new file mode 100644 index 00000000..6359a0e3 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-8.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-9.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-9.png new file mode 100644 index 00000000..14da4175 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/azure-9.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/entraid-1.png b/apps/wizard-v2/public/wizards/msft_entra_id/saml/entraid-1.png new file mode 100644 index 00000000..90764c25 Binary files /dev/null and b/apps/wizard-v2/public/wizards/msft_entra_id/saml/entraid-1.png differ diff --git a/apps/wizard-v2/public/wizards/msft_entra_id/saml/index.ts b/apps/wizard-v2/public/wizards/msft_entra_id/saml/index.ts new file mode 100644 index 00000000..1aa24c3f --- /dev/null +++ b/apps/wizard-v2/public/wizards/msft_entra_id/saml/index.ts @@ -0,0 +1,35 @@ +import AzureSaml1 from "./azure-1.png"; +import AzureSaml1a from "./azure-1a.png"; +import AzureSaml2 from "./azure-2.png"; +import AzureSaml3 from "./azure-3.png"; +import AzureSaml3a from "./azure-3a.png"; +import AzureSaml4 from "./azure-4.png"; +import AzureSaml5 from "./azure-5.png"; +import AzureSaml5a from "./azure-5a.png"; +import AzureSaml6 from "./azure-6.png"; +import AzureSaml7 from "./azure-7.png"; +import AzureSaml8 from "./azure-8.png"; +import AzureSaml9 from "./azure-9.png"; +import AzureSaml10 from "./azure-10.png"; +import AzureSaml11 from "./azure-11.png"; +import AzureSaml12 from "./azure-12.png"; +import EntraId1 from "./entraid-1.png"; + +export { + AzureSaml1, + AzureSaml1a, + AzureSaml2, + AzureSaml3, + AzureSaml3a, + AzureSaml4, + AzureSaml5, + AzureSaml5a, + AzureSaml6, + AzureSaml7, + AzureSaml8, + AzureSaml9, + AzureSaml10, + AzureSaml11, + AzureSaml12, + EntraId1, +}; diff --git a/apps/wizard-v2/public/wizards/oidc/openid-logo.svg b/apps/wizard-v2/public/wizards/oidc/openid-logo.svg new file mode 100644 index 00000000..397ee180 --- /dev/null +++ b/apps/wizard-v2/public/wizards/oidc/openid-logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/wizard-v2/public/wizards/okta/okta-1.png b/apps/wizard-v2/public/wizards/okta/okta-1.png new file mode 100644 index 00000000..c8afc76a Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/okta-1.png differ diff --git a/apps/wizard-v2/public/wizards/okta/okta-2.png b/apps/wizard-v2/public/wizards/okta/okta-2.png new file mode 100644 index 00000000..991277a2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/okta-2.png differ diff --git a/apps/wizard-v2/public/wizards/okta/okta-3.png b/apps/wizard-v2/public/wizards/okta/okta-3.png new file mode 100644 index 00000000..eff48694 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/okta-3.png differ diff --git a/apps/wizard-v2/public/wizards/okta/okta-logo.png b/apps/wizard-v2/public/wizards/okta/okta-logo.png new file mode 100644 index 00000000..d1b55a5f Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/okta-logo.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/index.ts b/apps/wizard-v2/public/wizards/okta/saml/index.ts new file mode 100644 index 00000000..029a94d3 --- /dev/null +++ b/apps/wizard-v2/public/wizards/okta/saml/index.ts @@ -0,0 +1,23 @@ +import OktaSaml1 from "./okta_saml_1.png"; +import OktaSaml2 from "./okta_saml_2.png"; +import OktaSaml3 from "./okta_saml_3.png"; +import OktaSaml4 from "./okta_saml_4.png"; +import OktaSaml5 from "./okta_saml_5.png"; +import OktaSaml6 from "./okta_saml_6.png"; +import OktaSaml7 from "./okta_saml_7.png"; +import OktaSaml7A from "./okta_saml_7a.png"; +import OktaSaml8 from "./okta_saml_8.png"; +import OktaSaml9 from "./okta_saml_9.png"; + +export { + OktaSaml1, + OktaSaml2, + OktaSaml3, + OktaSaml4, + OktaSaml5, + OktaSaml6, + OktaSaml7, + OktaSaml7A, + OktaSaml8, + OktaSaml9, +}; diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_1.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_1.png new file mode 100644 index 00000000..0f964737 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_2.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_2.png new file mode 100644 index 00000000..4062a7c2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_3.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_3.png new file mode 100644 index 00000000..441f43a3 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_4.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_4.png new file mode 100644 index 00000000..479f4bc9 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_5.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_5.png new file mode 100644 index 00000000..9d4a8376 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_6.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_6.png new file mode 100644 index 00000000..aadb07b2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_7.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_7.png new file mode 100644 index 00000000..d7cac55d Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_7a.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_7a.png new file mode 100644 index 00000000..99021784 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_7a.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_8.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_8.png new file mode 100644 index 00000000..70bc2746 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/okta/saml/okta_saml_9.png b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_9.png new file mode 100644 index 00000000..cf4c4d27 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/saml/okta_saml_9.png differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_1.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_1.avif new file mode 100644 index 00000000..52c9f8fe Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_1.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_10.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_10.avif new file mode 100644 index 00000000..ff2d05a2 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_10.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_11.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_11.avif new file mode 100644 index 00000000..288eedc9 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_11.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_12.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_12.avif new file mode 100644 index 00000000..2b0fcb6d Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_12.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_13.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_13.avif new file mode 100644 index 00000000..4b4af92c Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_13.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_14.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_14.avif new file mode 100644 index 00000000..6f67aaf6 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_14.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_15.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_15.avif new file mode 100644 index 00000000..858a19b4 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_15.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_2.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_2.avif new file mode 100644 index 00000000..c093175a Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_2.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_3.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_3.avif new file mode 100644 index 00000000..5f9e0b5d Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_3.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_4.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_4.avif new file mode 100644 index 00000000..ef01c96d Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_4.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_5.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_5.avif new file mode 100644 index 00000000..e803d2cb Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_5.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_6.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_6.avif new file mode 100644 index 00000000..89a8cfef Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_6.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_7.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_7.avif new file mode 100644 index 00000000..2b1d381c Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_7.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_8.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_8.avif new file mode 100644 index 00000000..2e3edf64 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_8.avif differ diff --git a/apps/wizard-v2/public/wizards/okta/scim/okta_scim_9.avif b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_9.avif new file mode 100644 index 00000000..d98130f6 Binary files /dev/null and b/apps/wizard-v2/public/wizards/okta/scim/okta_scim_9.avif differ diff --git a/apps/wizard-v2/public/wizards/onelogin/index.ts b/apps/wizard-v2/public/wizards/onelogin/index.ts new file mode 100644 index 00000000..be6f0cb4 --- /dev/null +++ b/apps/wizard-v2/public/wizards/onelogin/index.ts @@ -0,0 +1,4 @@ +import OneLoginLogo from "./onelogin-logo.svg"; +export * from "./saml"; + +export { OneLoginLogo }; diff --git a/apps/wizard-v2/public/wizards/onelogin/onelogin-logo.svg b/apps/wizard-v2/public/wizards/onelogin/onelogin-logo.svg new file mode 100644 index 00000000..f722189f --- /dev/null +++ b/apps/wizard-v2/public/wizards/onelogin/onelogin-logo.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/index.ts b/apps/wizard-v2/public/wizards/onelogin/saml/index.ts new file mode 100644 index 00000000..36706bbf --- /dev/null +++ b/apps/wizard-v2/public/wizards/onelogin/saml/index.ts @@ -0,0 +1,19 @@ +import OneLogin_SAML_1 from "./onelogin_saml_1.png"; +import OneLogin_SAML_2 from "./onelogin_saml_2.png"; +import OneLogin_SAML_3 from "./onelogin_saml_3.png"; +import OneLogin_SAML_4 from "./onelogin_saml_4.png"; +import OneLogin_SAML_5 from "./onelogin_saml_5.png"; +import OneLogin_SAML_5A from "./onelogin_saml_5a.png"; +import OneLogin_SAML_6A from "./onelogin_saml_6a.png"; +import OneLogin_SAML_7 from "./onelogin_saml_7.png" + +export { + OneLogin_SAML_1, + OneLogin_SAML_2, + OneLogin_SAML_3, + OneLogin_SAML_4, + OneLogin_SAML_5, + OneLogin_SAML_5A, + OneLogin_SAML_6A, + OneLogin_SAML_7, +}; diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_1.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_1.png new file mode 100644 index 00000000..31e4e8fd Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_2.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_2.png new file mode 100644 index 00000000..671d3608 Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_3.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_3.png new file mode 100644 index 00000000..3b822590 Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_4.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_4.png new file mode 100644 index 00000000..4daa1687 Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_5.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_5.png new file mode 100644 index 00000000..8cab9491 Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_5a.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_5a.png new file mode 100644 index 00000000..70f5e114 Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_5a.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_6a.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_6a.png new file mode 100644 index 00000000..d796378b Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_6a.png differ diff --git a/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_7.png b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_7.png new file mode 100644 index 00000000..48a7b398 Binary files /dev/null and b/apps/wizard-v2/public/wizards/onelogin/saml/onelogin_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/index.ts b/apps/wizard-v2/public/wizards/oracle/SAML/index.ts new file mode 100644 index 00000000..06d45155 --- /dev/null +++ b/apps/wizard-v2/public/wizards/oracle/SAML/index.ts @@ -0,0 +1,27 @@ +import OracleSaml0 from './oracle_saml_0.png'; +import OracleSaml1 from './oracle_saml_1.png'; +import OracleSaml2 from './oracle_saml_2.png'; +import OracleSaml3 from './oracle_saml_3.png'; +import OracleSaml4 from './oracle_saml_4.png'; +import OracleSaml5 from './oracle_saml_5.png'; +import OracleSaml6 from './oracle_saml_6.png'; +import OracleSaml7 from './oracle_saml_7.png'; +import OracleSaml8 from './oracle_saml_8.png'; +import OracleSaml9 from './oracle_saml_9.png'; +import OracleSaml10 from './oracle_saml_10.png'; +import OracleSaml11 from './oracle_saml_11.png'; + +export { + OracleSaml0, + OracleSaml1, + OracleSaml2, + OracleSaml3, + OracleSaml4, + OracleSaml5, + OracleSaml6, + OracleSaml7, + OracleSaml8, + OracleSaml9, + OracleSaml10, + OracleSaml11, +}; diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_0.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_0.png new file mode 100644 index 00000000..5de50fa7 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_1.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_1.png new file mode 100644 index 00000000..539e0bde Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_10.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_10.png new file mode 100644 index 00000000..e3b54f5b Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_10.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_11.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_11.png new file mode 100644 index 00000000..6e71b6ea Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_11.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_2.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_2.png new file mode 100644 index 00000000..961a21f9 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_3.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_3.png new file mode 100644 index 00000000..7cd32078 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_4.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_4.png new file mode 100644 index 00000000..6116fadb Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_5.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_5.png new file mode 100644 index 00000000..73b3c6c5 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_6.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_6.png new file mode 100644 index 00000000..855f3905 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_7.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_7.png new file mode 100644 index 00000000..6a328970 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_8.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_8.png new file mode 100644 index 00000000..58024d68 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_9.png b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_9.png new file mode 100644 index 00000000..556eef72 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/SAML/oracle_saml_9.png differ diff --git a/apps/wizard-v2/public/wizards/oracle/oracle-logo.png b/apps/wizard-v2/public/wizards/oracle/oracle-logo.png new file mode 100644 index 00000000..84d0ff22 Binary files /dev/null and b/apps/wizard-v2/public/wizards/oracle/oracle-logo.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/index.ts b/apps/wizard-v2/public/wizards/pingone/index.ts new file mode 100644 index 00000000..bc67675d --- /dev/null +++ b/apps/wizard-v2/public/wizards/pingone/index.ts @@ -0,0 +1,23 @@ +import PINGONE_LOGO from "./pingone-logo.svg"; +import PINGONE_SAML_1 from "./pingone_saml_1.png"; +import PINGONE_SAML_2 from "./pingone_saml_2.png"; +import PINGONE_SAML_3 from "./pingone_saml_3.png"; +import PINGONE_SAML_4 from "./pingone_saml_4.png"; +import PINGONE_SAML_5 from "./pingone_saml_5.png"; +import PINGONE_SAML_6 from "./pingone_saml_6.png"; +import PINGONE_SAML_7 from "./pingone_saml_7.png"; +import PINGONE_SAML_8 from "./pingone_saml_8.png"; +import PINGONE_SAML_9 from "./pingone_saml_9.png"; + +export { + PINGONE_LOGO, + PINGONE_SAML_1, + PINGONE_SAML_2, + PINGONE_SAML_3, + PINGONE_SAML_4, + PINGONE_SAML_5, + PINGONE_SAML_6, + PINGONE_SAML_7, + PINGONE_SAML_8, + PINGONE_SAML_9, +}; diff --git a/apps/wizard-v2/public/wizards/pingone/pingone-logo.svg b/apps/wizard-v2/public/wizards/pingone/pingone-logo.svg new file mode 100644 index 00000000..2d333467 --- /dev/null +++ b/apps/wizard-v2/public/wizards/pingone/pingone-logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_1.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_1.png new file mode 100644 index 00000000..99bbf569 Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_2.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_2.png new file mode 100644 index 00000000..1460096c Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_3.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_3.png new file mode 100644 index 00000000..a06b7313 Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_4.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_4.png new file mode 100644 index 00000000..0e5a6063 Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_5.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_5.png new file mode 100644 index 00000000..4be63e2d Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_5.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_6.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_6.png new file mode 100644 index 00000000..1c455e49 Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_6.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_7.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_7.png new file mode 100644 index 00000000..4632c02f Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_7.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_8.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_8.png new file mode 100644 index 00000000..201af884 Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_8.png differ diff --git a/apps/wizard-v2/public/wizards/pingone/pingone_saml_9.png b/apps/wizard-v2/public/wizards/pingone/pingone_saml_9.png new file mode 100644 index 00000000..ac968662 Binary files /dev/null and b/apps/wizard-v2/public/wizards/pingone/pingone_saml_9.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-0.png b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-0.png new file mode 100644 index 00000000..ebb4e82a Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-0.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-1.png b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-1.png new file mode 100644 index 00000000..6b6534ad Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-1.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-2.png b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-2.png new file mode 100644 index 00000000..3394f7cb Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-2.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-3.png b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-3.png new file mode 100644 index 00000000..b72eca4a Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-3.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-4.png b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-4.png new file mode 100644 index 00000000..b070ac49 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-4.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-5.png b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-5.png new file mode 100644 index 00000000..1752ad3e Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/COMMON/salesforce-5.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_0.png b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_0.png new file mode 100644 index 00000000..42023239 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_0.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_1.png b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_1.png new file mode 100644 index 00000000..36aacd83 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_1.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_2.png b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_2.png new file mode 100644 index 00000000..2586a480 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_2.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_3.png b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_3.png new file mode 100644 index 00000000..d8a115cc Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_3.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_4.png b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_4.png new file mode 100644 index 00000000..b0e28b21 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/OIDC/salesforce_oidc_4.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_0.png b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_0.png new file mode 100644 index 00000000..c22f2f23 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_0.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_1.png b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_1.png new file mode 100644 index 00000000..f5c98f55 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_1.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_2.png b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_2.png new file mode 100644 index 00000000..22e8cc6a Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_2.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_3.png b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_3.png new file mode 100644 index 00000000..85b3f610 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_3.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_4.png b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_4.png new file mode 100644 index 00000000..fa1e731a Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/SAML/salesforce_saml_4.png differ diff --git a/apps/wizard-v2/public/wizards/salesforce/salesforce-logo.png b/apps/wizard-v2/public/wizards/salesforce/salesforce-logo.png new file mode 100644 index 00000000..6b0c1b19 Binary files /dev/null and b/apps/wizard-v2/public/wizards/salesforce/salesforce-logo.png differ diff --git a/apps/wizard-v2/src/api/clients.ts b/apps/wizard-v2/src/api/clients.ts new file mode 100644 index 00000000..cc9cc453 --- /dev/null +++ b/apps/wizard-v2/src/api/clients.ts @@ -0,0 +1,53 @@ +/** + * Typed API clients for wizard-v2. + * + * Two clients are available — which one is used depends on apiMode: + * + * cloud → orgsClient — Phase Two Orgs API, org-scoped IDP endpoints + * Base: {serverUrl} (paths: /{realm}/orgs/{orgId}/...) + * + * onprem → adminClient — Keycloak Admin API, realm-wide IDP endpoints + * Base: {serverUrl} (paths: /admin/realms/{realm}/...) + * + * Both clients automatically attach a Bearer token via the oidc-spa helper. + * Types are generated from the OpenAPI specs — run `pnpm gen-api` to refresh. + */ +import createClient, { type Middleware } from "openapi-fetch"; +import type { paths as OrgsPaths } from "./types/orgs.d.ts"; +import type { paths as AdminPaths } from "./types/admin.d.ts"; +import { getOidc } from "@/oidc"; + +/** Middleware that injects the OIDC Bearer token into every request. */ +const authMiddleware: Middleware = { + async onRequest({ request }) { + const oidc = await getOidc(); + if (oidc.isUserLoggedIn) { + const token = await oidc.getAccessToken(); + request.headers.set("Authorization", `Bearer ${token}`); + } + return request; + }, +}; + +/** + * Phase Two Orgs API client — use in cloud (org-scoped) mode. + * Paths match /{realm}/orgs/{orgId}/idps/... + */ +export function createOrgsClient(serverUrl: string) { + const client = createClient({ baseUrl: serverUrl }); + client.use(authMiddleware); + return client; +} + +/** + * Keycloak Admin API client — use in onprem (realm-wide) mode. + * Paths match /admin/realms/{realm}/identity-provider/... + */ +export function createAdminClient(serverUrl: string) { + const client = createClient({ baseUrl: serverUrl }); + client.use(authMiddleware); + return client; +} + +export type OrgsClient = ReturnType; +export type AdminClient = ReturnType; diff --git a/apps/wizard-v2/src/api/types/admin.d.ts b/apps/wizard-v2/src/api/types/admin.d.ts new file mode 100644 index 00000000..4c10d625 --- /dev/null +++ b/apps/wizard-v2/src/api/types/admin.d.ts @@ -0,0 +1,20116 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/admin/realms": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get accessible realms Returns a list of accessible realms. The list is filtered based on what realms the caller is allowed to view. */ + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RealmRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** + * Import a realm. Imports a realm from a full representation of that realm. + * @description Realm name must be unique. + */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get the top-level representation of the realm It will not include nested information like User and Client representations. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RealmRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** + * Update the top-level information of the realm Any user, roles or client information in the representation will be ignored. + * @description This will only update top-level attributes of the realm. + */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RealmRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the realm */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/admin-events": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get admin events Returns all admin events, or filters events based on URL query parameters listed here */ + get: { + parameters: { + query?: { + authClient?: string; + authIpAddress?: string; + authRealm?: string; + /** @description user id */ + authUser?: string; + /** @description From (inclusive) date (yyyy-MM-dd) or time in Epoch timestamp millis (number of milliseconds since January 1, 1970, 00:00:00 GMT) */ + dateFrom?: string; + /** @description To (inclusive) date (yyyy-MM-dd) or time in Epoch timestamp millis (number of milliseconds since January 1, 1970, 00:00:00 GMT) */ + dateTo?: string; + /** @description The direction to sort events by (asc or desc) */ + direction?: string; + first?: number; + /** @description Maximum results size (defaults to 100) */ + max?: number; + operationTypes?: string[]; + resourcePath?: string; + resourceTypes?: string[]; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AdminEventRepresentation"][]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + /** Delete all admin events */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/attack-detection/brute-force/users": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Clear any user login failures for all users This can release temporary disabled users */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/attack-detection/brute-force/users/{userId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get status of a username in brute force detection */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + }; + }; + put?: never; + post?: never; + /** Clear any user login failures for the user This can release temporary disabled user */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/authenticator-providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get authenticator providers Returns a stream of authenticator providers. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }[]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/client-authenticator-providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get client authenticator providers Returns a stream of client authenticator providers. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }[]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create new authenticator configuration + * @deprecated + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticatorConfigRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/config-description/{providerId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get authenticator provider's configuration description */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + providerId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticatorConfigInfoRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/config/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get authenticator configuration */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Configuration id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticatorConfigRepresentation"]; + }; + }; + }; + }; + /** Update authenticator configuration */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Configuration id */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticatorConfigRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete authenticator configuration */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Configuration id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/executions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Add new authentication execution */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticationExecutionRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/executions/{executionId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get Single Execution */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + executionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticationExecutionRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + /** Delete execution */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Execution id */ + executionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/executions/{executionId}/config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Update execution with new configuration */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Execution id */ + executionId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticatorConfigRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/executions/{executionId}/config/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get execution's configuration + * @deprecated + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Execution id */ + executionId: string; + /** @description Configuration id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticatorConfigRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/executions/{executionId}/lower-priority": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Lower execution's priority */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Execution id */ + executionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/executions/{executionId}/raise-priority": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Raise execution's priority */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Execution id */ + executionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/flows": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get authentication flows Returns a stream of authentication flows. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticationFlowRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a new authentication flow */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticationFlowRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/flows/{flowAlias}/copy": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Copy existing authentication flow under a new name The new name is given as 'newName' attribute of the passed JSON object */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description name of the existing authentication flow */ + flowAlias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/flows/{flowAlias}/executions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get authentication executions for a flow */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Flow alias */ + flowAlias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticationExecutionInfoRepresentation"][]; + }; + }; + }; + }; + /** Update authentication executions of a Flow */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Flow alias */ + flowAlias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticationExecutionInfoRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/flows/{flowAlias}/executions/execution": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Add new authentication execution to a flow */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of parent flow */ + flowAlias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/flows/{flowAlias}/executions/flow": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Add new flow with new execution to existing flow */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of parent authentication flow */ + flowAlias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/flows/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get authentication flow for id */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Flow id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthenticationFlowRepresentation"]; + }; + }; + }; + }; + /** Update an authentication flow */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["AuthenticationFlowRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete an authentication flow */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Flow id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/form-action-providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get form action providers Returns a stream of form action providers. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }[]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/form-providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get form providers Returns a stream of form providers. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }[]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/per-client-config-description": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get configuration descriptions for all clients */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: components["schemas"]["ConfigPropertyRepresentation"][]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/register-required-action": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Register a new required actions */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/required-actions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get required actions Returns a stream of required actions. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RequiredActionProviderRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/required-actions/{alias}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get required action for alias */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RequiredActionProviderRepresentation"]; + }; + }; + }; + }; + /** Update required action */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RequiredActionProviderRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete required action */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/required-actions/{alias}/config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get RequiredAction configuration */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RequiredActionConfigRepresentation"]; + }; + }; + }; + }; + /** Update RequiredAction configuration */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RequiredActionConfigRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete RequiredAction configuration */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/required-actions/{alias}/config-description": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get RequiredAction provider configuration description */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RequiredActionConfigInfoRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/required-actions/{alias}/lower-priority": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Lower required action's priority */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/required-actions/{alias}/raise-priority": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Raise required action's priority */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Alias of required action */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/authentication/unregistered-required-actions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get unregistered required actions Returns a stream of unregistered required actions. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }[]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-description-converter": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Base path for importing clients under this realm. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string; + "application/xml": string; + "text/plain": string; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-policies/policies": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + "include-global-policies"?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientPoliciesRepresentation"]; + }; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientPoliciesRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-policies/profiles": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + "include-global-profiles"?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientProfilesRepresentation"]; + }; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientProfilesRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-registration-policy/providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Base path for retrieve providers with the configProperties properly filled */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ComponentTypeRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get client scopes belonging to the realm Returns a list of client scopes belonging to the realm */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Create a new client scope Client Scope’s name must be unique! */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get representation of the client scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Update the client scope */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the client scope */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/protocol-mappers/add-models": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Create multiple mappers */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/protocol-mappers/models": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get mappers */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a mapper */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/protocol-mappers/models/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get mapper by id */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + }; + }; + /** Update the mapper */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the mapper */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/protocol-mappers/protocol/{protocol}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get mappers by name for a specific protocol */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + protocol: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** + * Get all scope mappings for the client + * @deprecated + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MappingsRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings/clients/{client}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + /** Get the roles associated with a client's scope Returns roles for the client. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add client-level roles to the client's scope */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove client-level roles from the client's scope. */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings/clients/{client}/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + /** The available client-level roles Returns the roles for the client that can be associated with the client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings/clients/{client}/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + /** Get effective client roles Returns the roles for the client that are associated with the client's scope. */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get realm-level roles associated with the client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add a set of realm-level roles to the client's scope */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove a set of realm-level roles from the client's scope */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings/realm/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get realm-level roles that are available to attach to this client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-scopes/{client-scope-id}/scope-mappings/realm/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** + * Get effective realm-level roles associated with the client’s scope What this does is recurse any composite roles associated with the client’s scope and adds the roles to this lists. + * @description The method is really to show a comprehensive total view of realm-level roles associated with the client. + */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-session-stats": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get client session stats Returns a JSON map. + * @description The key is the client id, the value is the number of sessions that currently are active with that client. Only clients that actually have a session associated with them will be in this map. + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }[]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get client scopes belonging to the realm Returns a list of client scopes belonging to the realm */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Create a new client scope Client Scope’s name must be unique! */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get representation of the client scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Update the client scope */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the client scope */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/protocol-mappers/add-models": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Create multiple mappers */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/protocol-mappers/models": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get mappers */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a mapper */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/protocol-mappers/models/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get mapper by id */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + }; + }; + /** Update the mapper */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the mapper */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/protocol-mappers/protocol/{protocol}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get mappers by name for a specific protocol */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + protocol: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** + * Get all scope mappings for the client + * @deprecated + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MappingsRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings/clients/{client}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + /** Get the roles associated with a client's scope Returns roles for the client. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add client-level roles to the client's scope */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove client-level roles from the client's scope. */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings/clients/{client}/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + /** The available client-level roles Returns the roles for the client that can be associated with the client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings/clients/{client}/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + /** Get effective client roles Returns the roles for the client that are associated with the client's scope. */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get realm-level roles associated with the client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add a set of realm-level roles to the client's scope */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove a set of realm-level roles from the client's scope */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings/realm/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** Get realm-level roles that are available to attach to this client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-templates/{client-scope-id}/scope-mappings/realm/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + /** + * Get effective realm-level roles associated with the client’s scope What this does is recurse any composite roles associated with the client’s scope and adds the roles to this lists. + * @description The method is really to show a comprehensive total view of realm-level roles associated with the client. + */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "client-scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/client-types": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * List all client types available in the current realm + * @description This endpoint returns a list of both global and realm level client types and the attributes they set + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientTypesRepresentation"]; + }; + }; + }; + }; + /** + * Update a client type + * @description This endpoint allows you to update a realm level client type + */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientTypesRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get clients belonging to the realm. + * @description If a client can’t be retrieved from the storage due to a problem with the underlying storage, it is silently removed from the returned list. This ensures that concurrent modifications to the list don’t prevent callers from retrieving this list. + */ + get: { + parameters: { + query?: { + /** @description filter by clientId */ + clientId?: string; + /** @description the first result */ + first?: number; + /** @description the max results to return */ + max?: number; + q?: string; + /** @description whether this is a search query or a getClientById query */ + search?: boolean; + /** @description filter clients that cannot be viewed in full by admin */ + viewableOnly?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a new client Client’s client_id must be unique! */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients-initial-access": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientInitialAccessPresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a new initial access token. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientInitialAccessCreatePresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientInitialAccessCreatePresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients-initial-access/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get representation of the client */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientRepresentation"]; + }; + }; + }; + }; + /** Update the client */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ClientRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the client */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceServerRepresentation"]; + }; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ResourceServerRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/import": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ResourceServerRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/permission": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + fields?: string; + first?: number; + max?: number; + name?: string; + owner?: string; + permission?: boolean; + policyId?: string; + resource?: string; + resourceType?: string; + scope?: string; + type?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AbstractPolicyRepresentation"][]; + }; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/permission/evaluate": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["PolicyEvaluationRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyEvaluationResponse"]; + }; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/permission/providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyProviderRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/permission/search": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + fields?: string; + name?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AbstractPolicyRepresentation"]; + }; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/policy": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + fields?: string; + first?: number; + max?: number; + name?: string; + owner?: string; + permission?: boolean; + policyId?: string; + resource?: string; + resourceType?: string; + scope?: string; + type?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AbstractPolicyRepresentation"][]; + }; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/policy/evaluate": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["PolicyEvaluationRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyEvaluationResponse"]; + }; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/policy/providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyProviderRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/policy/search": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + fields?: string; + name?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AbstractPolicyRepresentation"]; + }; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/resource": { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceRepresentation"][]; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ResourceRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceRepresentation"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/resource/search": { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceRepresentation"]; + }; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/resource/{resource-id}": { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceRepresentation"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ResourceRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/resource/{resource-id}/attributes": { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/resource/{resource-id}/permissions": { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyRepresentation"][]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/resource/{resource-id}/scopes": { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + _id?: string; + deep?: boolean; + exactName?: boolean; + first?: number; + matchingUri?: boolean; + max?: number; + name?: string; + owner?: string; + scope?: string; + type?: string; + uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ScopeRepresentation"][]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/scope": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + first?: number; + max?: number; + name?: string; + scopeId?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ScopeRepresentation"][]; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ScopeRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/scope/search": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + name?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ScopeRepresentation"][]; + }; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/scope/{scope-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ScopeRepresentation"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "scope-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ScopeRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/scope/{scope-id}/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyRepresentation"][]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/scope/{scope-id}/resources": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "scope-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceRepresentation"][]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/authz/resource-server/settings": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceServerRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/certificates/{attr}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + /** Get key info */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CertificateRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/certificates/{attr}/download": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Get a keystore file for the client, containing private key and public certificate */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["KeyStoreConfig"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/certificates/{attr}/generate": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Generate a new certificate with new key pair */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CertificateRepresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/certificates/{attr}/generate-and-download": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Generate a new keypair and certificate, and get the private key file + * + * Generates a keypair and certificate and serves the private key in a specified keystore format. + * Only generated public certificate is saved in Keycloak DB - the private key is not. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["KeyStoreConfig"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/certificates/{attr}/upload": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Upload certificate and eventually private key */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CertificateRepresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/certificates/{attr}/upload-certificate": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Upload only certificate, not private key */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + attr: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CertificateRepresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/client-secret": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get the client secret */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CredentialRepresentation"]; + }; + }; + }; + }; + put?: never; + /** Generate a new secret for the client */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CredentialRepresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/client-secret/rotated": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get the rotated client secret */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CredentialRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + /** Invalidate the rotated secret for the client */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/default-client-scopes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get default client scopes. Only name and ids are returned. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/default-client-scopes/{clientScopeId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/evaluate-scopes/generate-example-access-token": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Create JSON with payload of example access token */ + get: { + parameters: { + query?: { + audience?: string; + scope?: string; + userId?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AccessToken"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/evaluate-scopes/generate-example-id-token": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Create JSON with payload of example id token */ + get: { + parameters: { + query?: { + audience?: string; + scope?: string; + userId?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IDToken"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/evaluate-scopes/generate-example-userinfo": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Create JSON with payload of example user info */ + get: { + parameters: { + query?: { + scope?: string; + userId?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/evaluate-scopes/protocol-mappers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** + * Return list of all protocol mappers, which will be used when generating tokens issued for particular client. + * @description This means protocol mappers assigned to this client directly and protocol mappers assigned to all client scopes of this client. + */ + get: { + parameters: { + query?: { + scope?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperEvaluationRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/evaluate-scopes/scope-mappings/{roleContainerId}/granted": { + parameters: { + query?: { + scope?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description either realm name OR client UUID */ + roleContainerId: string; + }; + cookie?: never; + }; + /** + * Get effective scope mapping of all roles of particular role container, which this client is defacto allowed to have in the accessToken issued for him. + * @description This contains scope mappings, which this client has directly, as well as scope mappings, which are granted to all client scopes, which are linked with this client. + */ + get: { + parameters: { + query?: { + scope?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description either realm name OR client UUID */ + roleContainerId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/evaluate-scopes/scope-mappings/{roleContainerId}/not-granted": { + parameters: { + query?: { + scope?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description either realm name OR client UUID */ + roleContainerId: string; + }; + cookie?: never; + }; + /** + * Get roles, which this client doesn't have scope for and can't have them in the accessToken issued for him. + * @description Defacto all the other roles of particular role container, which are not in {@link #getGrantedScopeMappings()} + */ + get: { + parameters: { + query?: { + scope?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description either realm name OR client UUID */ + roleContainerId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/installation/providers/{providerId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + providerId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/management/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Return object stating whether client Authorization permissions have been initialized or not and a reference */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + }; + }; + /** Return object stating whether client Authorization permissions have been initialized or not and a reference */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/nodes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Register a cluster node with the client Manually register cluster node to this client - usually it’s not needed to call this directly as adapter should handle by sending registration request to Keycloak */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/nodes/{node}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Unregister a cluster node from the client */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + node: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/offline-session-count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get application offline session count Returns a number of offline user sessions associated with this client { "count": number } */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: number; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/offline-sessions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get offline sessions for client Returns a list of offline user sessions associated with this client */ + get: { + parameters: { + query?: { + /** @description Paging offset */ + first?: number; + /** @description Maximum results size (defaults to 100) */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserSessionRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/optional-client-scopes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get optional client scopes. Only name and ids are returned. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/optional-client-scopes/{clientScopeId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/protocol-mappers/add-models": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Create multiple mappers */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/protocol-mappers/models": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get mappers */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a mapper */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/protocol-mappers/models/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get mapper by id */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + }; + }; + /** Update the mapper */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the mapper */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/protocol-mappers/protocol/{protocol}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get mappers by name for a specific protocol */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + protocol: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProtocolMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/push-revocation": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Push the client's revocation policy to its admin URL If the client has an admin URL, push revocation policy to it. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GlobalRequestResult"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/registration-access-token": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Generate a new registration access token for the client */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientRepresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get all roles for the realm or client */ + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + first?: number; + max?: number; + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Create a new role for the realm or client */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get a role by name */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Update a role by name */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete a role by name */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}/composites": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get composites of the role */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Add a composite to the role */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove roles from the role's composite */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}/composites/clients/{targetClientUuid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get client-level roles for the client that are in the role's composite */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + targetClientUuid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}/composites/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get realm-level roles of the role's composite */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Returns a stream of groups that have the specified role name */ + get: { + parameters: { + query?: { + /** @description if false, return a full representation of the {@code GroupRepresentation} objects. */ + briefRepresentation?: boolean; + /** @description first result to return. Ignored if negative or {@code null}. */ + first?: number; + /** @description maximum number of results to return. Ignored if negative or {@code null}. */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description the role name. */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}/management/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Return object stating whether role Authorization permissions have been initialized or not and a reference */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Return object stating whether role Authorization permissions have been initialized or not and a reference */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/roles/{role-name}/users": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Returns a stream of users that have the specified role name. */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether brief representations are returned (default: false) */ + briefRepresentation?: boolean; + /** @description first result to return. Ignored if negative or {@code null}. */ + first?: number; + /** @description maximum number of results to return. Ignored if negative or {@code null}. */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + /** @description the role name. */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** + * Get all scope mappings for the client + * @deprecated + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MappingsRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings/clients/{client}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + /** Get the roles associated with a client's scope Returns roles for the client. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add client-level roles to the client's scope */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove client-level roles from the client's scope. */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings/clients/{client}/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + /** The available client-level roles Returns the roles for the client that can be associated with the client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings/clients/{client}/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + /** Get effective client roles Returns the roles for the client that are associated with the client's scope. */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get realm-level roles associated with the client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add a set of realm-level roles to the client's scope */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove a set of realm-level roles from the client's scope */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings/realm/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get realm-level roles that are available to attach to this client's scope */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/scope-mappings/realm/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** + * Get effective realm-level roles associated with the client’s scope What this does is recurse any composite roles associated with the client’s scope and adds the roles to this lists. + * @description The method is really to show a comprehensive total view of realm-level roles associated with the client. + */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/service-account-user": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get a user dedicated to the service account */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/session-count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get application session count Returns a number of user sessions associated with this client { "count": number } */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: number; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/test-nodes-available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Test if registered cluster nodes are available Tests availability by sending 'ping' request to all cluster nodes. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GlobalRequestResult"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/clients/{client-uuid}/user-sessions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + /** Get user sessions for client Returns a list of user sessions associated with this client */ + get: { + parameters: { + query?: { + /** @description Paging offset */ + first?: number; + /** @description Maximum results size (defaults to 100) */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of client (not client-id!) */ + "client-uuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserSessionRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/components": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + name?: string; + parent?: string; + providerId?: string; + type?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ComponentRepresentation"][]; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ComponentRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/components/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ComponentRepresentation"]; + }; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ComponentRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/components/{id}/sub-component-types": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** List of subcomponent types that are available to configure for a particular parent component. */ + get: { + parameters: { + query?: { + type?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ComponentTypeRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/credential-registrators": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": string[]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/default-default-client-scopes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get realm default client scopes. Only name and ids are returned. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/default-default-client-scopes/{clientScopeId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/default-groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get group hierarchy. Only name and ids are returned. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/default-groups/{groupId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/default-optional-client-scopes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get realm optional client scopes. Only name and ids are returned. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientScopeRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/default-optional-client-scopes/{clientScopeId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + clientScopeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/events": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get events Returns all events, or filters them based on URL query parameters listed here */ + get: { + parameters: { + query?: { + /** @description App or oauth client name */ + client?: string; + /** @description From (inclusive) date (yyyy-MM-dd) or time in Epoch timestamp millis (number of milliseconds since January 1, 1970, 00:00:00 GMT) */ + dateFrom?: string; + /** @description To (inclusive) date (yyyy-MM-dd) or time in Epoch timestamp millis (number of milliseconds since January 1, 1970, 00:00:00 GMT) */ + dateTo?: string; + /** @description The direction to sort events by (asc or desc) */ + direction?: string; + /** @description Paging offset */ + first?: number; + /** @description IP Address */ + ipAddress?: string; + /** @description Maximum results size (defaults to 100) */ + max?: number; + /** @description The types of events to return */ + type?: string[]; + /** @description User id */ + user?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["EventRepresentation"][]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + /** Delete all events */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/events/config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get the events provider configuration Returns JSON object with events provider configuration */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RealmEventsConfigRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** @description Update the events provider Change the events provider and/or its configuration */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RealmEventsConfigRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/group-by-path/{path}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + path: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get group hierarchy. Only `name` and `id` are returned. `subGroups` are only returned when using the `search` or `q` parameter. If none of these parameters is provided, the top-level groups are returned without `subGroups` being filled. */ + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + exact?: boolean; + first?: number; + max?: number; + populateHierarchy?: boolean; + q?: string; + search?: string; + /** @description Boolean which defines whether to return the count of subgroups for each group (default: true */ + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** + * create or add a top level realm groupSet or create child. + * @description This will update the group and set the parent if it exists. Create it and set the parent if the group doesn’t exist. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Returns the groups counts. */ + get: { + parameters: { + query?: { + search?: string; + top?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: number; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + }; + }; + /** Update group, ignores subgroups. */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/children": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Return a paginated list of subgroups that have a parent group corresponding to the group on the URL */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether brief groups representations are returned or not (default: false) */ + briefRepresentation?: boolean; + /** @description Boolean which defines whether the params "search" must match exactly or not */ + exact?: boolean; + /** @description The position of the first result to be returned (pagination offset). */ + first?: number; + /** @description The maximum number of results that are to be returned. Defaults to 10 */ + max?: number; + /** @description A String representing either an exact group name or a partial name, defaults to prefix search. */ + search?: string; + /** @description Boolean which defines whether to return the count of subgroups for each subgroup of this group (default: true) */ + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** + * Set or create child. + * @description This will just set the parent if it exists. Create it and set the parent if the group doesn’t exist. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/management/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Return object stating whether client Authorization permissions have been initialized or not and a reference */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + }; + }; + /** Return object stating whether client Authorization permissions have been initialized or not and a reference */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/members": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Get users Returns a stream of users, filtered according to query parameters */ + get: { + parameters: { + query?: { + /** @description Only return basic information (only guaranteed to return id, username, created, first and last name, email, enabled state, email verification state, federation link, and access. Note that it means that namely user attributes, required actions, and not before are not returned.) */ + briefRepresentation?: boolean; + /** @description Pagination offset */ + first?: number; + /** @description Maximum results size (defaults to 100) */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Get role mappings */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MappingsRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings/clients/{client-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + /** Get client-level role mappings for the user or group, and the app */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add client-level roles to the user or group role mapping */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Delete client-level roles from user or group role mapping */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings/clients/{client-id}/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + /** Get available client-level roles that can be mapped to the user or group */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings/clients/{client-id}/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + /** Get effective client-level role mappings This recurses any composite roles */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Get realm-level role mappings */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Add realm-level role mappings to the user */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Delete realm-level role mappings */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings/realm/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Get realm-level roles that can be mapped */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/groups/{group-id}/role-mappings/realm/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + /** Get effective realm-level role mappings This will recurse all composite roles to get the result. */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/import-config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Import identity provider from JSON body + * @description Import identity provider from uploaded JSON file + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** List identity providers */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether brief representations are returned (default: false) */ + briefRepresentation?: boolean; + /** @description Filter by identity providers capability */ + capability?: string; + /** @description Pagination offset */ + first?: number; + /** @description Maximum results size (defaults to 100) */ + max?: number; + /** @description Boolean which defines if only realm-level IDPs (not associated with orgs) should be returned (default: false) */ + realmOnly?: boolean; + /** @description Filter specific providers by name. Search can be prefix (name*), contains (*name*) or exact ("name"). Default prefixed. */ + search?: string; + /** @description Filter by identity providers type */ + type?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Create a new identity provider */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Get the identity provider */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + }; + }; + /** Update the identity provider */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the identity provider */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}/export": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Export public broker configuration for identity provider */ + get: { + parameters: { + query?: { + /** @description Format to use */ + format?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}/management/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Return object stating whether client Authorization permissions have been initialized or not and a reference */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + }; + }; + /** Return object stating whether client Authorization permissions have been initialized or not and a reference */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}/mapper-types": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Get mapper types for identity provider */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: components["schemas"]["IdentityProviderMapperTypeRepresentation"]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}/mappers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Get mappers for identity provider */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add a mapper to identity provider */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}/mappers/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Get mapper by id for the identity provider */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"]; + }; + }; + }; + }; + /** Update a mapper for the identity provider */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete a mapper for the identity provider */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/instances/{alias}/reload-keys": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + /** Reaload keys for the identity provider if the provider supports it, "true" is returned if reload was performed, "false" if not. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": boolean; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/providers/{provider_id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get the identity provider factory for that provider id */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description The provider id to get the factory */ + provider_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/identity-provider/upload-certificate": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Uploads a certificate, prepares the jwks or public key associated, and returns the certificate representation. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CertificateRepresentation"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/keys": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeysMetadataRepresentation"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/localization": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": string[]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/localization/{locale}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + /** @deprecated */ + useRealmDefaultLocaleFallback?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + locale: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Import localization from uploaded JSON file */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + locale: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + locale: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/localization/{locale}/{key}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + key: string; + locale: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "text/plain": string; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + key: string; + locale: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "text/plain": string; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + key: string; + locale: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/logout-all": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Removes all user sessions. + * @description Any client that has an admin url will also be told to invalidate any sessions they have. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GlobalRequestResult"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Returns a paginated list of organizations filtered according to the specified parameters */ + get: { + parameters: { + query?: { + /** @description if false, return the full representation. Otherwise, only the basic fields are returned. */ + briefRepresentation?: boolean; + /** @description Boolean which defines whether the param 'search' must match exactly or not */ + exact?: boolean; + /** @description The position of the first result to be processed (pagination offset) */ + first?: number; + /** @description The maximum number of results to be returned - defaults to 10 */ + max?: number; + /** @description A query to search for custom attributes, in the format 'key1:value2 key2:value2' */ + q?: string; + /** @description A String representing either an organization name or domain */ + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Creates a new organization */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["OrganizationRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Returns the organizations counts. */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether the param 'search' must match exactly or not */ + exact?: boolean; + /** @description A query to search for custom attributes, in the format 'key1:value2 key2:value2' */ + q?: string; + /** @description A String representing either an organization name or domain */ + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/members/{member-id}/organizations": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Returns the organizations associated with the user that has the specified id */ + get: { + parameters: { + query?: { + /** @description if false, return the full representation. Otherwise, only the basic fields are returned. */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "member-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"][]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Returns the organization representation */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"]; + }; + }; + }; + }; + /** Updates the organization */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["OrganizationRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Deletes the organization */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** + * Get organization groups + * @description Returns organization groups. When `search` parameter is provided, groups are searched by name. When `q` parameter is provided, groups are searched by attributes. If neither parameter is provided, top-level groups are returned. + */ + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + exact?: boolean; + first?: number; + max?: number; + populateHierarchy?: boolean; + q?: string; + search?: string; + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** + * Creates a new top-level group or moves an existing group to top-level + * @description Creates a new top-level group in the organization. If the group representation includes an ID, moves the existing organization group to be a top-level group. If no ID is provided, creates a new top-level group. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description No Content - Group moved to top-level */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found - Group does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/groups/group-by-path/{path}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** + * Get organization group by path + * @description Returns the organization group with the specified path + */ + get: { + parameters: { + query?: { + /** @description Whether to return the count of subgroups (default: false) */ + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + path: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/groups/{group-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + /** Get organization group representation */ + get: { + parameters: { + query?: { + /** @description Whether to return the count of subgroups (default: false) */ + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + }; + }; + /** + * Update organization group + * @description Updates the organization group's name, description, and attributes. Subgroups are not affected. + */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** + * Delete the organization group + * @description Deletes the organization group and all its subgroups + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/groups/{group-id}/children": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + /** + * Get subgroups of this organization group + * @description Returns a paginated stream of subgroups that belong to this organization group + */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether the params "search" must match exactly or not */ + exact?: boolean; + /** @description The position of the first result to be returned (pagination offset). */ + first?: number; + /** @description The maximum number of results that are to be returned. Defaults to 10 */ + max?: number; + /** @description A String representing either an exact group name or a partial name */ + search?: string; + /** @description Whether to return the count of subgroups (default: false) */ + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** + * Create or move a subgroup + * @description Creates a new subgroup under this organization group. If the group representation includes an ID, moves the existing group to be a child of this group. If no ID is provided, creates a new subgroup. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["GroupRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/groups/{group-id}/members": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + /** + * Get members of this organization group + * @description Returns a paginated list of organization members that belong to this group + */ + get: { + parameters: { + query?: { + /** @description Only return basic information (only guaranteed to return id, username, created, first and last name, email, enabled state, email verification state, federation link, and access. Note that it means that namely user attributes, required actions, and not before are not returned.) */ + briefRepresentation?: boolean; + /** @description Pagination offset */ + first?: number; + /** @description Maximum results size (defaults to 100) */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MemberRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/groups/{group-id}/members/{userId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + }; + cookie?: never; + }; + get?: never; + /** + * Add a user to this organization group + * @description Adds an organization member to this group. The user must be a member of the organization. + */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request - User is not a member of the organization */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found - User does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict - User is already a member of the group */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** + * Remove a user from this organization group + * @description Removes a user from this organization group. The user remains a member of the organization. + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "group-id": string; + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found - User does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/identity-providers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Returns all identity providers associated with the organization */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** + * Adds the identity provider with the specified id to the organization + * @description Adds, or associates, an existing identity provider with the organization. If no identity provider is found, or if it is already associated with the organization, an error response is returned + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** @description Payload should contain only id or alias of the identity provider to be associated with the organization (id or alias with or without quotes). Surrounding whitespace characters will be trimmed. */ + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/identity-providers/{alias}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** + * Returns the identity provider associated with the organization that has the specified alias + * @description Searches for an identity provider with the given alias. If one is found and is associated with the organization, it is returned. Otherwise, an error response with status NOT_FOUND is returned + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + /** + * Removes the identity provider with the specified alias from the organization + * @description Breaks the association between the identity provider and the organization. The provider itself is not deleted. If no provider is found, or if it is not currently associated with the org, an error response is returned + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/identity-providers/{alias}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** + * Returns organization groups for the identity provider + * @description Returns organization groups that can be used in identity provider mappers. Only returns groups if the identity provider is associated with the organization. + */ + get: { + parameters: { + query?: { + /** @description If true, return brief representation; otherwise return full representation */ + briefRepresentation?: boolean; + /** @description If true, perform exact match on the search parameter */ + exact?: boolean; + /** @description The position of the first result (pagination offset) */ + first?: number; + /** @description The maximum number of results to return */ + max?: number; + /** @description A query to search for group attributes, in the format 'key1:value1 key2:value2' */ + q?: string; + /** @description A string to search for in group names */ + search?: string; + /** @description If true, include subgroups count in the response */ + subGroupsCount?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + /** @description The alias of the identity provider */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/invitations": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Get invitations for the organization */ + get: { + parameters: { + query?: { + email?: string; + first?: number; + firstName?: string; + lastName?: string; + max?: number; + search?: string; + status?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationInvitationRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/invitations/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Get invitation by ID */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationInvitationRepresentation"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + /** Delete an invitation */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/invitations/{id}/resend": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Resend an invitation */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Returns a paginated list of organization members filtered according to the specified parameters */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether the param 'search' must match exactly or not */ + exact?: boolean; + /** @description The position of the first result to be processed (pagination offset) */ + first?: number; + /** @description The maximum number of results to be returned. Defaults to 10 */ + max?: number; + /** @description The membership type */ + membershipType?: string; + /** @description A String representing either a member's username, e-mail, first name, or last name. */ + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MemberRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** + * Adds the user with the specified id as a member of the organization + * @description Adds, or associates, an existing user with the organization. If no user is found, or if it is already associated with the organization, an error response is returned + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** @description Payload should contain only id of the user to be added to the organization (UUID with or without quotes). Surrounding whitespace characters will be trimmed. */ + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Returns number of members in the organization. */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members/invite-existing-user": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Invites an existing user to the organization, using the specified user id */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + id?: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members/invite-user": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Invites an existing user or sends a registration link to a new user, based on the provided e-mail address. + * @description If the user with the given e-mail address exists, it sends an invitation link, otherwise it sends a registration link. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + email?: string; + firstName?: string; + lastName?: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members/{member-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** + * Returns the member of the organization with the specified id + * @description Searches for auser with the given id. If one is found, and is currently a member of the organization, returns it. Otherwise,an error response with status NOT_FOUND is returned + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "member-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MemberRepresentation"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + /** + * Removes the user with the specified id from the organization + * @description Breaks the association between the user and organization. The user itself is deleted in case the membership is managed, otherwise the user is not deleted. If no user is found, or if they are not a member of the organization, an error response is returned + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "member-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members/{member-id}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** + * Returns the organization group memberships for a member with the specified id + * @description Searches for auser with the given id. If one is found, and is currently a member of the organization, returns the groups from the organizationwhere the user is member of. Otherwise, an error response with status NOT_FOUND is returned + */ + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + first?: number; + max?: number; + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "member-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/organizations/{org-id}/members/{member-id}/organizations": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + }; + cookie?: never; + }; + /** Returns the organizations associated with the user that has the specified id */ + get: { + parameters: { + query?: { + /** @description if false, return the full representation. Otherwise, only the basic fields are returned. */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "org-id": string; + "member-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"][]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/partial-export": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Partial export of existing realm into a JSON file. */ + post: { + parameters: { + query?: { + exportClients?: boolean; + exportGroupsAndRoles?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RealmRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/partialImport": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Partial import from a JSON file to an existing realm. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/push-revocation": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Push the realm's revocation policy to any client that has an admin url associated with it. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GlobalRequestResult"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get all roles for the realm or client */ + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + first?: number; + max?: number; + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Create a new role for the realm or client */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles-by-id/{role-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get a specific role's representation */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of role */ + "role-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Update the role */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of role */ + "role-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the role */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description id of role */ + "role-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles-by-id/{role-id}/composites": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get role's children Returns a set of role's children provided the role is a composite. */ + get: { + parameters: { + query?: { + first?: number; + max?: number; + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Make the role a composite role by associating some child roles */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove a set of roles from the role's composite */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Role id */ + "role-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles-by-id/{role-id}/composites/clients/{clientUuid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get client-level roles for the client that are in the role's composite */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + clientUuid: string; + "role-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles-by-id/{role-id}/composites/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get realm-level roles that are in the role's composite */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles-by-id/{role-id}/management/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Return object stating whether role Authorization permissions have been initialized or not and a reference */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Return object stating whether role Authorization permissions have been initialized or not and a reference */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get a role by name */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Update a role by name */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete a role by name */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}/composites": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get composites of the role */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Add a composite to the role */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove roles from the role's composite */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}/composites/clients/{targetClientUuid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get client-level roles for the client that are in the role's composite */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + targetClientUuid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}/composites/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Get realm-level roles of the role's composite */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description role's name (not id!) */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Returns a stream of groups that have the specified role name */ + get: { + parameters: { + query?: { + /** @description if false, return a full representation of the {@code GroupRepresentation} objects. */ + briefRepresentation?: boolean; + /** @description first result to return. Ignored if negative or {@code null}. */ + first?: number; + /** @description maximum number of results to return. Ignored if negative or {@code null}. */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description the role name. */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}/management/permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Return object stating whether role Authorization permissions have been initialized or not and a reference */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Return object stating whether role Authorization permissions have been initialized or not and a reference */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "role-name": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/roles/{role-name}/users": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** Returns a stream of users that have the specified role name. */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether brief representations are returned (default: false) */ + briefRepresentation?: boolean; + /** @description first result to return. Ignored if negative or {@code null}. */ + first?: number; + /** @description maximum number of results to return. Ignored if negative or {@code null}. */ + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description the role name. */ + "role-name": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/sessions/{session}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Remove a specific user session. + * @description Any client that has an admin url will also be told to invalidate this particular session. + */ + delete: { + parameters: { + query?: { + isOffline?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + session: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/testSMTPConnection": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Test SMTP connection with current logged in user + * @deprecated + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + [key: string]: string; + }; + "application/x-www-form-urlencoded": { + config?: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get users Returns a stream of users, filtered according to query parameters. + * @description Returns a stream of users. Note that the 'credentials' field in the returned UserRepresentation objects is typically not populated for performance reasons. If specific credential metadata is required, use the dedicated 'GET /admin/realms/{realm}/users/{user-id}/credentials' endpoint. + */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether brief representations are returned (default: false) */ + briefRepresentation?: boolean; + /** @description Only return users created after (inclusive) the given date, in ISO-8601 format (yyyy-MM-dd) or epoch milliseconds */ + createdAfter?: string; + /** @description Only return users created before (inclusive) the given date, in ISO-8601 format (yyyy-MM-dd) or epoch milliseconds */ + createdBefore?: string; + /** @description A String contained in email, or the complete email, if param "exact" is true */ + email?: string; + /** @description whether the email has been verified */ + emailVerified?: boolean; + /** @description Boolean representing if user is enabled or not */ + enabled?: boolean; + /** @description Boolean which defines whether the params "last", "first", "email" and "username" must match exactly */ + exact?: boolean; + /** @description Pagination offset */ + first?: number; + /** @description A String contained in firstName, or the complete firstName, if param "exact" is true */ + firstName?: string; + /** @description The alias of an Identity Provider linked to the user */ + idpAlias?: string; + /** @description The userId at an Identity Provider linked to the user */ + idpUserId?: string; + /** @description A String contained in lastName, or the complete lastName, if param "exact" is true */ + lastName?: string; + /** @description Maximum results size (defaults to 100) */ + max?: number; + /** @description A query to search for custom attributes, in the format 'key1:value2 key2:value2' */ + q?: string; + /** @description A String contained in username, first or last name, or email. Default search behavior is prefix-based (e.g., foo or foo*). Use *foo* for infix search and "foo" for exact search. */ + search?: string; + /** @description A String contained in username, or the complete username, if param "exact" is true */ + username?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Create a new user Username must be unique. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["UserRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users-management-permissions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ManagementPermissionReference"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Returns the number of users that match the given criteria. + * @description It can be called in three different ways. 1. Don’t specify any criteria and pass {@code null}. The number of all users within that realm will be returned.

2. If {@code search} is specified other criteria such as {@code last} will be ignored even though you set them. The {@code search} string will be matched against the first and last name, the username and the email of a user.

3. If {@code search} is unspecified but any of {@code last}, {@code first}, {@code email} or {@code username} those criteria are matched against their respective fields on a user entity. Combined with a logical and. + */ + get: { + parameters: { + query?: { + /** @description Only return users created after (inclusive) the given date, in ISO-8601 format (yyyy-MM-dd) or epoch milliseconds */ + createdAfter?: string; + /** @description Only return users created before (inclusive) the given date, in ISO-8601 format (yyyy-MM-dd) or epoch milliseconds */ + createdBefore?: string; + /** @description A String contained in email, or the complete email, if param "exact" is true */ + email?: string; + /** @description whether the email has been verified */ + emailVerified?: boolean; + /** @description Boolean representing if user is enabled or not */ + enabled?: boolean; + /** @description Boolean which defines whether the params "last", "first", "email" and "username" must match exactly */ + exact?: boolean; + /** @description A String contained in firstName, or the complete firstName, if param "exact" is true */ + firstName?: string; + /** @description The alias of an Identity Provider linked to the user */ + idpAlias?: string; + /** @description The userId at an Identity Provider linked to the user */ + idpUserId?: string; + /** @description A String contained in lastName, or the complete lastName, if param "exact" is true */ + lastName?: string; + /** @description A query to search for custom attributes, in the format 'key1:value2 key2:value2' */ + q?: string; + /** @description A String contained in username, first or last name, or email. Default search behavior is prefix-based (e.g., foo or foo*). Use *foo* for infix search and "foo" for exact search. */ + search?: string; + /** @description A String contained in username, or the complete username, if param "exact" is true */ + username?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/profile": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** @description Get the configuration for the user profile */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UPConfig"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** @description Set the configuration for the user profile */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["UPConfig"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UPConfig"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/profile/metadata": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** @description Get the UserProfileMetadata from the configuration */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserProfileMetadata"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get representation of the user */ + get: { + parameters: { + query?: { + /** @description Indicates if the user profile metadata should be added to the response */ + userProfileMetadata?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Update the user */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["UserRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** Delete the user */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/configured-user-storage-credential-types": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** + * Return credential types, which are provided by the user storage where user is stored. + * @description Returned values can contain for example "password", "otp" etc. This will always return empty list for "local" users, which are not backed by any user storage + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": string[]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/consents": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get consents granted by the user */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }[]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/consents/{client}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Revoke consent and offline tokens for particular client from user */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description Client id */ + client: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/credentials": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CredentialRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/credentials/{credentialId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Remove a credential for a user */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + credentialId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/credentials/{credentialId}/moveAfter/{newPreviousCredentialId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Move a credential to a position behind another credential */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description The credential to move */ + credentialId: string; + /** @description The credential that will be the previous element in the list. If set to null, the moved credential will be the first element in the list. */ + newPreviousCredentialId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/credentials/{credentialId}/moveToFirst": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Move a credential to a first position in the credentials list of the user */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description The credential to move */ + credentialId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/credentials/{credentialId}/userLabel": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + /** Update a credential label for a user */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + credentialId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "text/plain": string; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/disable-credential-types": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + /** Disable all credentials for a user of a specific type */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string[]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/execute-actions-email": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + /** + * Send an email to the user with a link they can click to execute particular actions. + * @description An email contains a link the user can click to perform a set of required actions. The redirectUri and clientId parameters are optional. If no redirect is given, then there will be no link back to click after actions have completed. Redirect uri must be a valid uri for the particular clientId. + */ + put: { + parameters: { + query?: { + /** @description Client id */ + client_id?: string; + /** @description Number of seconds after which the generated token expires */ + lifespan?: number; + /** @description Redirect uri */ + redirect_uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": string[]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/federated-identity": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get social logins associated with the user */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["FederatedIdentityRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/federated-identity/{provider}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Add a social login provider to the user */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description Social login provider id */ + provider: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["FederatedIdentityRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Remove a social login provider from user */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description Social login provider id */ + provider: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/groups": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + briefRepresentation?: boolean; + first?: number; + max?: number; + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GroupRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/groups/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: number; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/groups/{groupId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/impersonation": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Impersonate the user */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/logout": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Remove all user sessions associated with the user Also send notification to all clients that have an admin URL to invalidate the sessions for the particular user. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/offline-sessions/{clientUuid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get offline sessions associated with the user and client */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + clientUuid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserSessionRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/reset-password": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + /** Set up a new password for the user. */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["CredentialRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/reset-password-email": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + /** + * Send an email to the user with a link they can click to reset their password. + * @deprecated + * @description The redirectUri and clientId parameters are optional. The default for the redirect is the account client. This endpoint has been deprecated. Please use the execute-actions-email passing a list with UPDATE_PASSWORD within it. + */ + put: { + parameters: { + query?: { + /** @description client id */ + client_id?: string; + /** @description redirect uri */ + redirect_uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get role mappings */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MappingsRepresentation"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings/clients/{client-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + /** Get client-level role mappings for the user or group, and the app */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + /** Add client-level roles to the user or group role mapping */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Delete client-level roles from user or group role mapping */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings/clients/{client-id}/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + /** Get available client-level roles that can be mapped to the user or group */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings/clients/{client-id}/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + /** Get effective client-level role mappings This recurses any composite roles */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + /** @description client id (not clientId!) */ + "client-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings/realm": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get realm-level role mappings */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** Add realm-level role mappings to the user */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** Delete realm-level role mappings */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings/realm/available": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get realm-level roles that can be mapped */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/role-mappings/realm/composite": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get effective realm-level role mappings This will recurse all composite roles to get the result. */ + get: { + parameters: { + query?: { + /** @description if false, return roles with their attributes */ + briefRepresentation?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RoleRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/send-verify-email": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get?: never; + /** + * Send an email-verification email to the user An email contains a link the user can click to verify their email address. + * @description The redirectUri, clientId and lifespan parameters are optional. The default for the redirect is the account client. The default for the lifespan is 12 hours + */ + put: { + parameters: { + query?: { + /** @description Client id */ + client_id?: string; + /** @description Number of seconds after which the generated token expires */ + lifespan?: number; + /** @description Redirect uri */ + redirect_uri?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/sessions": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + /** Get sessions associated with the user */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserSessionRepresentation"][]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/users/{user-id}/unmanagedAttributes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + "user-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string[]; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/workflows": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * List workflows + * @description List workflows filtered by name and paginated using first and max parameters. + */ + get: { + parameters: { + query?: { + /** @description Boolean which defines whether the param 'search' must match exactly or not */ + exact?: boolean; + /** @description The position of the first result to be processed (pagination offset) */ + first?: number; + /** @description The maximum number of results to be returned - defaults to 10 */ + max?: number; + /** @description A String representing the workflow name - either partial or exact */ + search?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/yaml": components["schemas"]["WorkflowRepresentation"]; + "application/json": components["schemas"]["WorkflowRepresentation"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + /** + * Create workflow + * @description Create a new workflow from the provided representation. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/yaml": components["schemas"]["WorkflowRepresentation"]; + "application/json": components["schemas"]["WorkflowRepresentation"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/workflows/migrate": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Migrate scheduled resources from one step to another + * @description Migrate scheduled resources from one step to another step in the same or in a different workflow. + */ + post: { + parameters: { + query?: { + /** @description A String representing the id of the step to migrate from */ + from?: string; + /** @description A String representing the id of the step to migrate to */ + to?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/workflows/scheduled/{resource-id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * List scheduled workflows for resource + * @description Return workflows that have scheduled steps for the given resource identifier. + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Identifier of the resource associated with the scheduled workflows */ + "resource-id": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WorkflowRepresentation"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/workflows/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + }; + cookie?: never; + }; + /** + * Get workflow + * @description Get the workflow representation. Optionally exclude the workflow id from the response. + */ + get: { + parameters: { + query?: { + /** @description Indicates whether the workflow and step ids should be included in the representation or not - defaults to true */ + includeId?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/yaml": components["schemas"]["WorkflowRepresentation"]; + "application/json": components["schemas"]["WorkflowRepresentation"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + /** + * Update workflow + * @description Update the workflow configuration. This method does not update the workflow steps. + */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/yaml": components["schemas"]["WorkflowRepresentation"]; + "application/json": components["schemas"]["WorkflowRepresentation"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + post?: never; + /** + * Delete workflow + * @description Delete the workflow and its configuration. + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/workflows/{id}/activate/{type}/{resourceId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Activate workflow for resource + * @description Activate the workflow for the given resource type and identifier. Optionally schedule the first step using the notBefore parameter. + */ + post: { + parameters: { + query?: { + /** @description Optional value representing the time to schedule the first workflow step. The value is either an integer representing the seconds from now, an integer followed by 'ms' representing milliseconds from now, or an ISO-8601 date string. */ + notBefore?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + /** @description Resource identifier */ + resourceId: string; + /** @description Resource type */ + type: Record; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/realms/{realm}/workflows/{id}/deactivate/{type}/{resourceId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Deactivate workflow for resource + * @description Deactivate the workflow for the given resource type and identifier. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description Workflow identifier */ + id: string; + /** @description Resource identifier */ + resourceId: string; + /** @description Resource type */ + type: Record; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + AbstractPolicyRepresentation: { + id?: string; + name?: string; + description?: string; + type?: string; + policies?: string[]; + resources?: string[]; + scopes?: string[]; + logic?: components["schemas"]["Logic"]; + decisionStrategy?: components["schemas"]["DecisionStrategy"]; + owner?: string; + resourceType?: string; + resourcesData?: components["schemas"]["ResourceRepresentation"][]; + scopesData?: components["schemas"]["ScopeRepresentation"][]; + }; + Access: { + roles?: string[]; + verify_caller?: boolean; + }; + AccessToken: { + jti?: string; + /** Format: int64 */ + exp?: number; + /** Format: int64 */ + nbf?: number; + /** Format: int64 */ + iat?: number; + iss?: string; + sub?: string; + typ?: string; + azp?: string; + otherClaims?: { + [key: string]: unknown; + }; + nonce?: string; + /** Format: int64 */ + auth_time?: number; + sid?: string; + at_hash?: string; + c_hash?: string; + name?: string; + given_name?: string; + family_name?: string; + middle_name?: string; + nickname?: string; + preferred_username?: string; + profile?: string; + picture?: string; + website?: string; + email?: string; + email_verified?: boolean; + gender?: string; + birthdate?: string; + zoneinfo?: string; + locale?: string; + phone_number?: string; + phone_number_verified?: boolean; + /** Format: int64 */ + updated_at?: number; + claims_locales?: string; + acr?: string; + s_hash?: string; + "trusted-certs"?: string[]; + "allowed-origins"?: string[]; + realm_access?: components["schemas"]["Access"]; + resource_access?: { + [key: string]: components["schemas"]["Access"]; + }; + authorization?: components["schemas"]["Authorization"]; + cnf?: components["schemas"]["Confirmation"]; + scope?: string; + authorization_details?: components["schemas"]["AuthorizationDetailsJSONRepresentation"][]; + }; + AdminEventRepresentation: { + id?: string; + /** Format: int64 */ + time?: number; + realmId?: string; + authDetails?: components["schemas"]["AuthDetailsRepresentation"]; + operationType?: string; + resourceType?: string; + resourcePath?: string; + representation?: string; + error?: string; + details?: { + [key: string]: string; + }; + }; + /** @deprecated */ + ApplicationRepresentation: { + id?: string; + clientId?: string; + description?: string; + type?: string; + rootUrl?: string; + adminUrl?: string; + baseUrl?: string; + surrogateAuthRequired?: boolean; + enabled?: boolean; + alwaysDisplayInConsole?: boolean; + clientAuthenticatorType?: string; + secret?: string; + registrationAccessToken?: string; + /** @deprecated */ + defaultRoles?: string[]; + redirectUris?: string[]; + webOrigins?: string[]; + /** Format: int32 */ + notBefore?: number; + bearerOnly?: boolean; + consentRequired?: boolean; + standardFlowEnabled?: boolean; + implicitFlowEnabled?: boolean; + directAccessGrantsEnabled?: boolean; + serviceAccountsEnabled?: boolean; + authorizationServicesEnabled?: boolean; + /** @deprecated */ + directGrantsOnly?: boolean; + publicClient?: boolean; + frontchannelLogout?: boolean; + protocol?: string; + attributes?: { + [key: string]: string; + }; + authenticationFlowBindingOverrides?: { + [key: string]: string; + }; + fullScopeAllowed?: boolean; + /** Format: int32 */ + nodeReRegistrationTimeout?: number; + registeredNodes?: { + [key: string]: number; + }; + protocolMappers?: components["schemas"]["ProtocolMapperRepresentation"][]; + /** @deprecated */ + clientTemplate?: string; + /** @deprecated */ + useTemplateConfig?: boolean; + /** @deprecated */ + useTemplateScope?: boolean; + /** @deprecated */ + useTemplateMappers?: boolean; + defaultClientScopes?: string[]; + optionalClientScopes?: string[]; + authorizationSettings?: components["schemas"]["ResourceServerRepresentation"]; + access?: { + [key: string]: boolean; + }; + origin?: string; + name?: string; + /** @deprecated */ + claims?: components["schemas"]["ClaimRepresentation"]; + }; + AuthDetailsRepresentation: { + realmId?: string; + clientId?: string; + userId?: string; + ipAddress?: string; + }; + AuthenticationExecutionExportRepresentation: { + authenticatorConfig?: string; + authenticator?: string; + authenticatorFlow?: boolean; + requirement?: string; + /** Format: int32 */ + priority?: number; + /** @deprecated */ + autheticatorFlow?: boolean; + flowAlias?: string; + userSetupAllowed?: boolean; + }; + AuthenticationExecutionInfoRepresentation: { + id?: string; + requirement?: string; + displayName?: string; + alias?: string; + description?: string; + requirementChoices?: string[]; + configurable?: boolean; + authenticationFlow?: boolean; + providerId?: string; + authenticationConfig?: string; + flowId?: string; + /** Format: int32 */ + level?: number; + /** Format: int32 */ + index?: number; + /** Format: int32 */ + priority?: number; + }; + AuthenticationExecutionRepresentation: { + authenticatorConfig?: string; + authenticator?: string; + authenticatorFlow?: boolean; + requirement?: string; + /** Format: int32 */ + priority?: number; + /** @deprecated */ + autheticatorFlow?: boolean; + id?: string; + flowId?: string; + parentFlow?: string; + }; + AuthenticationFlowRepresentation: { + id?: string; + alias?: string; + description?: string; + providerId?: string; + topLevel?: boolean; + builtIn?: boolean; + authenticationExecutions?: components["schemas"]["AuthenticationExecutionExportRepresentation"][]; + }; + AuthenticatorConfigInfoRepresentation: { + name?: string; + providerId?: string; + helpText?: string; + properties?: components["schemas"]["ConfigPropertyRepresentation"][]; + }; + AuthenticatorConfigRepresentation: { + id?: string; + alias?: string; + config?: { + [key: string]: string; + }; + }; + Authorization: { + permissions?: components["schemas"]["Permission"][]; + }; + AuthorizationDetailsJSONRepresentation: { + type?: string; + locations?: string[]; + actions?: string[]; + datatypes?: string[]; + identifier?: string; + privileges?: string[]; + customData?: { + [key: string]: unknown; + }; + }; + AuthorizationSchema: { + resourceTypes?: { + [key: string]: components["schemas"]["ResourceType"]; + }; + }; + /** @enum {string} */ + BruteForceStrategy: "LINEAR" | "MULTIPLE"; + CertificateRepresentation: { + privateKey?: string; + publicKey?: string; + certificate?: string; + kid?: string; + jwks?: string; + }; + ClaimRepresentation: { + name?: boolean; + username?: boolean; + profile?: boolean; + picture?: boolean; + website?: boolean; + email?: boolean; + gender?: boolean; + locale?: boolean; + address?: boolean; + phone?: boolean; + }; + ClientInitialAccessCreatePresentation: { + /** Format: int32 */ + expiration?: number; + /** Format: int32 */ + count?: number; + webOrigins?: string[]; + }; + ClientInitialAccessPresentation: { + id?: string; + token?: string; + /** Format: int32 */ + timestamp?: number; + /** Format: int32 */ + expiration?: number; + /** Format: int32 */ + count?: number; + /** Format: int32 */ + remainingCount?: number; + }; + ClientMappingsRepresentation: { + id?: string; + client?: string; + mappings?: components["schemas"]["RoleRepresentation"][]; + }; + ClientPoliciesRepresentation: { + policies?: components["schemas"]["ClientPolicyRepresentation"][]; + globalPolicies?: components["schemas"]["ClientPolicyRepresentation"][]; + }; + ClientPolicyConditionRepresentation: { + condition?: string; + /** @description Configuration settings as a JSON object */ + configuration?: { + [key: string]: unknown; + }; + }; + ClientPolicyExecutorRepresentation: { + executor?: string; + /** @description Configuration settings as a JSON object */ + configuration?: { + [key: string]: unknown; + }; + }; + ClientPolicyRepresentation: { + name?: string; + description?: string; + enabled?: boolean; + conditions?: components["schemas"]["ClientPolicyConditionRepresentation"][]; + profiles?: string[]; + }; + ClientProfileRepresentation: { + name?: string; + description?: string; + executors?: components["schemas"]["ClientPolicyExecutorRepresentation"][]; + }; + ClientProfilesRepresentation: { + profiles?: components["schemas"]["ClientProfileRepresentation"][]; + globalProfiles?: components["schemas"]["ClientProfileRepresentation"][]; + }; + ClientRepresentation: { + id?: string; + clientId?: string; + name?: string; + description?: string; + type?: string; + rootUrl?: string; + adminUrl?: string; + baseUrl?: string; + surrogateAuthRequired?: boolean; + enabled?: boolean; + alwaysDisplayInConsole?: boolean; + clientAuthenticatorType?: string; + secret?: string; + registrationAccessToken?: string; + /** @deprecated */ + defaultRoles?: string[]; + redirectUris?: string[]; + webOrigins?: string[]; + /** Format: int32 */ + notBefore?: number; + bearerOnly?: boolean; + consentRequired?: boolean; + standardFlowEnabled?: boolean; + implicitFlowEnabled?: boolean; + directAccessGrantsEnabled?: boolean; + serviceAccountsEnabled?: boolean; + authorizationServicesEnabled?: boolean; + /** @deprecated */ + directGrantsOnly?: boolean; + publicClient?: boolean; + frontchannelLogout?: boolean; + protocol?: string; + attributes?: { + [key: string]: string; + }; + authenticationFlowBindingOverrides?: { + [key: string]: string; + }; + fullScopeAllowed?: boolean; + /** Format: int32 */ + nodeReRegistrationTimeout?: number; + registeredNodes?: { + [key: string]: number; + }; + protocolMappers?: components["schemas"]["ProtocolMapperRepresentation"][]; + /** @deprecated */ + clientTemplate?: string; + /** @deprecated */ + useTemplateConfig?: boolean; + /** @deprecated */ + useTemplateScope?: boolean; + /** @deprecated */ + useTemplateMappers?: boolean; + defaultClientScopes?: string[]; + optionalClientScopes?: string[]; + authorizationSettings?: components["schemas"]["ResourceServerRepresentation"]; + access?: { + [key: string]: boolean; + }; + origin?: string; + }; + ClientScopeRepresentation: { + id?: string; + name?: string; + description?: string; + protocol?: string; + attributes?: { + [key: string]: string; + }; + protocolMappers?: components["schemas"]["ProtocolMapperRepresentation"][]; + }; + /** @deprecated */ + ClientTemplateRepresentation: { + id?: string; + name?: string; + description?: string; + protocol?: string; + fullScopeAllowed?: boolean; + bearerOnly?: boolean; + consentRequired?: boolean; + standardFlowEnabled?: boolean; + implicitFlowEnabled?: boolean; + directAccessGrantsEnabled?: boolean; + serviceAccountsEnabled?: boolean; + publicClient?: boolean; + frontchannelLogout?: boolean; + attributes?: { + [key: string]: string; + }; + protocolMappers?: components["schemas"]["ProtocolMapperRepresentation"][]; + }; + ClientTypeRepresentation: { + name?: string; + provider?: string; + parent?: string; + config?: { + [key: string]: components["schemas"]["PropertyConfig"]; + }; + }; + ClientTypesRepresentation: { + "client-types"?: components["schemas"]["ClientTypeRepresentation"][]; + "global-client-types"?: components["schemas"]["ClientTypeRepresentation"][]; + }; + ComponentExportRepresentation: { + id?: string; + name?: string; + providerId?: string; + subType?: string; + subComponents?: components["schemas"]["MultivaluedHashMapStringComponentExportRepresentation"]; + config?: components["schemas"]["MultivaluedHashMapStringString"]; + }; + ComponentRepresentation: { + id?: string; + name?: string; + providerId?: string; + providerType?: string; + parentId?: string; + subType?: string; + config?: components["schemas"]["MultivaluedHashMapStringString"]; + }; + ComponentTypeRepresentation: { + id?: string; + helpText?: string; + properties?: components["schemas"]["ConfigPropertyRepresentation"][]; + clientProperties?: components["schemas"]["ConfigPropertyRepresentation"][]; + metadata?: { + [key: string]: unknown; + }; + }; + Composites: { + realm?: string[]; + client?: { + [key: string]: string[]; + }; + /** @deprecated */ + application?: { + [key: string]: string[]; + }; + }; + ConfigPropertyRepresentation: { + name?: string; + label?: string; + helpText?: string; + type?: string; + defaultValue?: unknown; + options?: string[]; + secret?: boolean; + required?: boolean; + readOnly?: boolean; + }; + Confirmation: { + "x5t#S256"?: string; + jkt?: string; + }; + CredentialRepresentation: { + id?: string; + type?: string; + userLabel?: string; + /** Format: int64 */ + createdDate?: number; + secretData?: string; + credentialData?: string; + /** Format: int32 */ + priority?: number; + value?: string; + temporary?: boolean; + /** @deprecated */ + device?: string; + /** @deprecated */ + hashedSaltedValue?: string; + /** @deprecated */ + salt?: string; + /** + * Format: int32 + * @deprecated + */ + hashIterations?: number; + /** + * Format: int32 + * @deprecated + */ + counter?: number; + /** @deprecated */ + algorithm?: string; + /** + * Format: int32 + * @deprecated + */ + digits?: number; + /** + * Format: int32 + * @deprecated + */ + period?: number; + /** @deprecated */ + config?: components["schemas"]["MultivaluedHashMapStringString"]; + federationLink?: string; + }; + /** @enum {string} */ + DecisionEffect: "PERMIT" | "DENY"; + /** @enum {string} */ + DecisionStrategy: "AFFIRMATIVE" | "UNANIMOUS" | "CONSENSUS"; + ErrorRepresentation: { + field?: string; + errorMessage?: string; + params?: unknown[]; + errors?: components["schemas"]["ErrorRepresentation"][]; + }; + EvaluationResultRepresentation: { + resource?: components["schemas"]["ResourceRepresentation"]; + scopes?: components["schemas"]["ScopeRepresentation"][]; + policies?: components["schemas"]["PolicyResultRepresentation"][]; + status?: components["schemas"]["DecisionEffect"]; + allowedScopes?: components["schemas"]["ScopeRepresentation"][]; + deniedScopes?: components["schemas"]["ScopeRepresentation"][]; + }; + EventRepresentation: { + id?: string; + /** Format: int64 */ + time?: number; + type?: string; + realmId?: string; + clientId?: string; + userId?: string; + sessionId?: string; + ipAddress?: string; + error?: string; + details?: { + [key: string]: string; + }; + }; + FederatedIdentityRepresentation: { + identityProvider?: string; + userId?: string; + userName?: string; + }; + GlobalRequestResult: { + successRequests?: string[]; + failedRequests?: string[]; + }; + GroupRepresentation: { + id?: string; + name?: string; + description?: string; + path?: string; + parentId?: string; + /** Format: int64 */ + subGroupCount?: number; + subGroups?: components["schemas"]["GroupRepresentation"][]; + attributes?: { + [key: string]: string[]; + }; + realmRoles?: string[]; + clientRoles?: { + [key: string]: string[]; + }; + access?: { + [key: string]: boolean; + }; + }; + IDToken: { + jti?: string; + /** Format: int64 */ + exp?: number; + /** Format: int64 */ + nbf?: number; + /** Format: int64 */ + iat?: number; + iss?: string; + sub?: string; + typ?: string; + azp?: string; + otherClaims?: { + [key: string]: unknown; + }; + nonce?: string; + /** Format: int64 */ + auth_time?: number; + sid?: string; + at_hash?: string; + c_hash?: string; + name?: string; + given_name?: string; + family_name?: string; + middle_name?: string; + nickname?: string; + preferred_username?: string; + profile?: string; + picture?: string; + website?: string; + email?: string; + email_verified?: boolean; + gender?: string; + birthdate?: string; + zoneinfo?: string; + locale?: string; + phone_number?: string; + phone_number_verified?: boolean; + /** Format: int64 */ + updated_at?: number; + claims_locales?: string; + acr?: string; + s_hash?: string; + }; + IdentityProviderMapperRepresentation: { + id?: string; + name?: string; + identityProviderAlias?: string; + identityProviderMapper?: string; + config?: { + [key: string]: string; + }; + }; + IdentityProviderMapperTypeRepresentation: { + id?: string; + name?: string; + category?: string; + helpText?: string; + properties?: components["schemas"]["ConfigPropertyRepresentation"][]; + }; + IdentityProviderRepresentation: { + alias?: string; + displayName?: string; + internalId?: string; + providerId?: string; + enabled?: boolean; + /** @deprecated */ + updateProfileFirstLoginMode?: string; + trustEmail?: boolean; + storeToken?: boolean; + addReadTokenRoleOnCreate?: boolean; + authenticateByDefault?: boolean; + linkOnly?: boolean; + hideOnLogin?: boolean; + firstBrokerLoginFlowAlias?: string; + postBrokerLoginFlowAlias?: string; + organizationId?: string; + config?: { + [key: string]: string; + }; + types?: string[]; + /** @deprecated */ + updateProfileFirstLogin?: boolean; + }; + KeyMetadataRepresentation: { + providerId?: string; + /** Format: int64 */ + providerPriority?: number; + kid?: string; + status?: string; + type?: string; + algorithm?: string; + publicKey?: string; + certificate?: string; + use?: components["schemas"]["KeyUse"]; + /** Format: int64 */ + validTo?: number; + }; + KeyStoreConfig: { + realmCertificate?: boolean; + storePassword?: string; + keyPassword?: string; + keyAlias?: string; + realmAlias?: string; + format?: string; + /** Format: int32 */ + keySize?: number; + /** Format: int32 */ + validity?: number; + }; + /** @enum {string} */ + KeyUse: "SIG" | "ENC" | "JWT_SVID"; + KeysMetadataRepresentation: { + active?: { + [key: string]: string; + }; + keys?: components["schemas"]["KeyMetadataRepresentation"][]; + }; + /** @enum {string} */ + Logic: "POSITIVE" | "NEGATIVE"; + ManagementPermissionReference: { + enabled?: boolean; + resource?: string; + scopePermissions?: { + [key: string]: string; + }; + }; + MappingsRepresentation: { + realmMappings?: components["schemas"]["RoleRepresentation"][]; + clientMappings?: { + [key: string]: components["schemas"]["ClientMappingsRepresentation"]; + }; + }; + MemberRepresentation: { + id?: string; + username?: string; + firstName?: string; + lastName?: string; + email?: string; + emailVerified?: boolean; + attributes?: { + [key: string]: string[]; + }; + userProfileMetadata?: components["schemas"]["UserProfileMetadata"]; + enabled?: boolean; + self?: string; + origin?: string; + /** Format: int64 */ + createdTimestamp?: number; + totp?: boolean; + federationLink?: string; + serviceAccountClientId?: string; + credentials?: components["schemas"]["CredentialRepresentation"][]; + disableableCredentialTypes?: string[]; + requiredActions?: string[]; + federatedIdentities?: components["schemas"]["FederatedIdentityRepresentation"][]; + realmRoles?: string[]; + clientRoles?: { + [key: string]: string[]; + }; + clientConsents?: components["schemas"]["UserConsentRepresentation"][]; + /** Format: int32 */ + notBefore?: number; + /** @deprecated */ + applicationRoles?: { + [key: string]: string[]; + }; + /** @deprecated */ + socialLinks?: components["schemas"]["SocialLinkRepresentation"][]; + groups?: string[]; + access?: { + [key: string]: boolean; + }; + membershipType?: components["schemas"]["MembershipType"]; + }; + /** @enum {string} */ + MembershipType: "UNMANAGED" | "MANAGED"; + MultivaluedHashMapStringComponentExportRepresentation: { + [key: string]: components["schemas"]["ComponentExportRepresentation"][]; + }; + MultivaluedHashMapStringString: { + [key: string]: string[]; + }; + /** @deprecated */ + OAuthClientRepresentation: { + id?: string; + clientId?: string; + description?: string; + type?: string; + rootUrl?: string; + adminUrl?: string; + baseUrl?: string; + surrogateAuthRequired?: boolean; + enabled?: boolean; + alwaysDisplayInConsole?: boolean; + clientAuthenticatorType?: string; + secret?: string; + registrationAccessToken?: string; + /** @deprecated */ + defaultRoles?: string[]; + redirectUris?: string[]; + webOrigins?: string[]; + /** Format: int32 */ + notBefore?: number; + bearerOnly?: boolean; + consentRequired?: boolean; + standardFlowEnabled?: boolean; + implicitFlowEnabled?: boolean; + directAccessGrantsEnabled?: boolean; + serviceAccountsEnabled?: boolean; + authorizationServicesEnabled?: boolean; + /** @deprecated */ + directGrantsOnly?: boolean; + publicClient?: boolean; + frontchannelLogout?: boolean; + protocol?: string; + attributes?: { + [key: string]: string; + }; + authenticationFlowBindingOverrides?: { + [key: string]: string; + }; + fullScopeAllowed?: boolean; + /** Format: int32 */ + nodeReRegistrationTimeout?: number; + registeredNodes?: { + [key: string]: number; + }; + protocolMappers?: components["schemas"]["ProtocolMapperRepresentation"][]; + /** @deprecated */ + clientTemplate?: string; + /** @deprecated */ + useTemplateConfig?: boolean; + /** @deprecated */ + useTemplateScope?: boolean; + /** @deprecated */ + useTemplateMappers?: boolean; + defaultClientScopes?: string[]; + optionalClientScopes?: string[]; + authorizationSettings?: components["schemas"]["ResourceServerRepresentation"]; + access?: { + [key: string]: boolean; + }; + origin?: string; + name?: string; + /** @deprecated */ + claims?: components["schemas"]["ClaimRepresentation"]; + }; + OrganizationDomainRepresentation: { + name?: string; + verified?: boolean; + }; + OrganizationInvitationRepresentation: { + id?: string; + organizationId?: string; + email?: string; + firstName?: string; + lastName?: string; + /** Format: int32 */ + sentDate?: number; + /** Format: int32 */ + expiresAt?: number; + status?: components["schemas"]["Status"]; + inviteLink?: string; + }; + OrganizationRepresentation: { + id?: string; + name?: string; + alias?: string; + enabled?: boolean; + description?: string; + redirectUrl?: string; + attributes?: { + [key: string]: string[]; + }; + domains?: components["schemas"]["OrganizationDomainRepresentation"][]; + members?: components["schemas"]["MemberRepresentation"][]; + identityProviders?: components["schemas"]["IdentityProviderRepresentation"][]; + groups?: components["schemas"]["GroupRepresentation"][]; + }; + Permission: { + rsid?: string; + rsname?: string; + scopes?: string[]; + claims?: { + [key: string]: string[]; + }; + }; + /** @enum {string} */ + PolicyEnforcementMode: "ENFORCING" | "PERMISSIVE" | "DISABLED"; + PolicyEvaluationRequest: { + context?: { + [key: string]: { + [key: string]: string; + }; + }; + resources?: components["schemas"]["ResourceRepresentation"][]; + resourceType?: string; + clientId?: string; + userId?: string; + roleIds?: string[]; + entitlements?: boolean; + }; + PolicyEvaluationResponse: { + results?: components["schemas"]["EvaluationResultRepresentation"][]; + entitlements?: boolean; + status?: components["schemas"]["DecisionEffect"]; + rpt?: components["schemas"]["AccessToken"]; + }; + PolicyProviderRepresentation: { + type?: string; + name?: string; + group?: string; + description?: string; + code?: string; + }; + PolicyRepresentation: { + id?: string; + name?: string; + description?: string; + type?: string; + policies?: string[]; + resources?: string[]; + scopes?: string[]; + logic?: components["schemas"]["Logic"]; + decisionStrategy?: components["schemas"]["DecisionStrategy"]; + owner?: string; + resourceType?: string; + resourcesData?: components["schemas"]["ResourceRepresentation"][]; + scopesData?: components["schemas"]["ScopeRepresentation"][]; + config?: { + [key: string]: string; + }; + }; + PolicyResultRepresentation: { + policy?: components["schemas"]["PolicyRepresentation"]; + status?: components["schemas"]["DecisionEffect"]; + associatedPolicies?: components["schemas"]["PolicyResultRepresentation"][]; + scopes?: string[]; + resourceType?: string; + }; + PropertyConfig: { + applicable?: boolean; + value?: unknown; + }; + ProtocolMapperEvaluationRepresentation: { + mapperId?: string; + mapperName?: string; + containerId?: string; + containerName?: string; + containerType?: string; + protocolMapper?: string; + }; + ProtocolMapperRepresentation: { + id?: string; + name?: string; + protocol?: string; + protocolMapper?: string; + /** @deprecated */ + consentRequired?: boolean; + /** @deprecated */ + consentText?: string; + config?: { + [key: string]: string; + }; + }; + PublishedRealmRepresentation: { + realm?: string; + public_key?: string; + "token-service"?: string; + "account-service"?: string; + /** Format: int32 */ + "tokens-not-before"?: number; + }; + RealmEventsConfigRepresentation: { + eventsEnabled?: boolean; + /** Format: int64 */ + eventsExpiration?: number; + eventsListeners?: string[]; + enabledEventTypes?: string[]; + adminEventsEnabled?: boolean; + adminEventsDetailsEnabled?: boolean; + }; + RealmRepresentation: { + id?: string; + realm?: string; + displayName?: string; + displayNameHtml?: string; + /** Format: int32 */ + notBefore?: number; + defaultSignatureAlgorithm?: string; + revokeRefreshToken?: boolean; + /** Format: int32 */ + refreshTokenMaxReuse?: number; + /** Format: int32 */ + accessTokenLifespan?: number; + /** Format: int32 */ + accessTokenLifespanForImplicitFlow?: number; + /** Format: int32 */ + ssoSessionIdleTimeout?: number; + /** Format: int32 */ + ssoSessionMaxLifespan?: number; + /** Format: int32 */ + ssoSessionIdleTimeoutRememberMe?: number; + /** Format: int32 */ + ssoSessionMaxLifespanRememberMe?: number; + /** Format: int32 */ + offlineSessionIdleTimeout?: number; + offlineSessionMaxLifespanEnabled?: boolean; + /** Format: int32 */ + offlineSessionMaxLifespan?: number; + /** Format: int32 */ + clientSessionIdleTimeout?: number; + /** Format: int32 */ + clientSessionMaxLifespan?: number; + /** Format: int32 */ + clientOfflineSessionIdleTimeout?: number; + /** Format: int32 */ + clientOfflineSessionMaxLifespan?: number; + /** Format: int32 */ + accessCodeLifespan?: number; + /** Format: int32 */ + accessCodeLifespanUserAction?: number; + /** Format: int32 */ + accessCodeLifespanLogin?: number; + /** Format: int32 */ + actionTokenGeneratedByAdminLifespan?: number; + /** Format: int32 */ + actionTokenGeneratedByUserLifespan?: number; + /** Format: int32 */ + oauth2DeviceCodeLifespan?: number; + /** Format: int32 */ + oauth2DevicePollingInterval?: number; + enabled?: boolean; + sslRequired?: string; + /** @deprecated */ + passwordCredentialGrantAllowed?: boolean; + registrationAllowed?: boolean; + registrationEmailAsUsername?: boolean; + rememberMe?: boolean; + verifyEmail?: boolean; + loginWithEmailAllowed?: boolean; + duplicateEmailsAllowed?: boolean; + resetPasswordAllowed?: boolean; + editUsernameAllowed?: boolean; + /** @deprecated */ + userCacheEnabled?: boolean; + /** @deprecated */ + realmCacheEnabled?: boolean; + bruteForceProtected?: boolean; + permanentLockout?: boolean; + /** Format: int32 */ + maxTemporaryLockouts?: number; + bruteForceStrategy?: components["schemas"]["BruteForceStrategy"]; + /** Format: int32 */ + maxFailureWaitSeconds?: number; + /** Format: int32 */ + minimumQuickLoginWaitSeconds?: number; + /** Format: int32 */ + waitIncrementSeconds?: number; + /** Format: int64 */ + quickLoginCheckMilliSeconds?: number; + /** Format: int32 */ + maxDeltaTimeSeconds?: number; + /** Format: int32 */ + failureFactor?: number; + /** Format: int32 */ + maxSecondaryAuthFailures?: number; + /** @deprecated */ + privateKey?: string; + /** @deprecated */ + publicKey?: string; + /** @deprecated */ + certificate?: string; + /** @deprecated */ + codeSecret?: string; + roles?: components["schemas"]["RolesRepresentation"]; + groups?: components["schemas"]["GroupRepresentation"][]; + /** @deprecated */ + defaultRoles?: string[]; + defaultRole?: components["schemas"]["RoleRepresentation"]; + adminPermissionsClient?: components["schemas"]["ClientRepresentation"]; + defaultGroups?: string[]; + /** @deprecated */ + requiredCredentials?: string[]; + passwordPolicy?: string; + otpPolicyType?: string; + otpPolicyAlgorithm?: string; + /** Format: int32 */ + otpPolicyInitialCounter?: number; + /** Format: int32 */ + otpPolicyDigits?: number; + /** Format: int32 */ + otpPolicyLookAheadWindow?: number; + /** Format: int32 */ + otpPolicyPeriod?: number; + otpPolicyCodeReusable?: boolean; + otpSupportedApplications?: string[]; + localizationTexts?: { + [key: string]: { + [key: string]: string; + }; + }; + webAuthnPolicyRpEntityName?: string; + webAuthnPolicySignatureAlgorithms?: string[]; + webAuthnPolicyRpId?: string; + webAuthnPolicyAttestationConveyancePreference?: string; + webAuthnPolicyAuthenticatorAttachment?: string; + webAuthnPolicyRequireResidentKey?: string; + webAuthnPolicyUserVerificationRequirement?: string; + /** Format: int32 */ + webAuthnPolicyCreateTimeout?: number; + webAuthnPolicyAvoidSameAuthenticatorRegister?: boolean; + webAuthnPolicyAcceptableAaguids?: string[]; + webAuthnPolicyExtraOrigins?: string[]; + webAuthnPolicyPasswordlessRpEntityName?: string; + webAuthnPolicyPasswordlessSignatureAlgorithms?: string[]; + webAuthnPolicyPasswordlessRpId?: string; + webAuthnPolicyPasswordlessAttestationConveyancePreference?: string; + webAuthnPolicyPasswordlessAuthenticatorAttachment?: string; + webAuthnPolicyPasswordlessRequireResidentKey?: string; + webAuthnPolicyPasswordlessUserVerificationRequirement?: string; + /** Format: int32 */ + webAuthnPolicyPasswordlessCreateTimeout?: number; + webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister?: boolean; + webAuthnPolicyPasswordlessAcceptableAaguids?: string[]; + webAuthnPolicyPasswordlessExtraOrigins?: string[]; + webAuthnPolicyPasswordlessPasskeysEnabled?: boolean; + clientProfiles?: components["schemas"]["ClientProfilesRepresentation"]; + clientPolicies?: components["schemas"]["ClientPoliciesRepresentation"]; + users?: components["schemas"]["UserRepresentation"][]; + federatedUsers?: components["schemas"]["UserRepresentation"][]; + scopeMappings?: components["schemas"]["ScopeMappingRepresentation"][]; + clientScopeMappings?: { + [key: string]: components["schemas"]["ScopeMappingRepresentation"][]; + }; + clients?: components["schemas"]["ClientRepresentation"][]; + clientScopes?: components["schemas"]["ClientScopeRepresentation"][]; + defaultDefaultClientScopes?: string[]; + defaultOptionalClientScopes?: string[]; + browserSecurityHeaders?: { + [key: string]: string; + }; + smtpServer?: { + [key: string]: string; + }; + userFederationProviders?: components["schemas"]["UserFederationProviderRepresentation"][]; + userFederationMappers?: components["schemas"]["UserFederationMapperRepresentation"][]; + loginTheme?: string; + accountTheme?: string; + adminTheme?: string; + emailTheme?: string; + eventsEnabled?: boolean; + /** Format: int64 */ + eventsExpiration?: number; + eventsListeners?: string[]; + enabledEventTypes?: string[]; + adminEventsEnabled?: boolean; + adminEventsDetailsEnabled?: boolean; + identityProviders?: components["schemas"]["IdentityProviderRepresentation"][]; + identityProviderMappers?: components["schemas"]["IdentityProviderMapperRepresentation"][]; + protocolMappers?: components["schemas"]["ProtocolMapperRepresentation"][]; + components?: components["schemas"]["MultivaluedHashMapStringComponentExportRepresentation"]; + internationalizationEnabled?: boolean; + supportedLocales?: string[]; + defaultLocale?: string; + authenticationFlows?: components["schemas"]["AuthenticationFlowRepresentation"][]; + authenticatorConfig?: components["schemas"]["AuthenticatorConfigRepresentation"][]; + requiredActions?: components["schemas"]["RequiredActionProviderRepresentation"][]; + browserFlow?: string; + registrationFlow?: string; + directGrantFlow?: string; + resetCredentialsFlow?: string; + clientAuthenticationFlow?: string; + dockerAuthenticationFlow?: string; + firstBrokerLoginFlow?: string; + attributes?: { + [key: string]: string; + }; + keycloakVersion?: string; + userManagedAccessAllowed?: boolean; + organizationsEnabled?: boolean; + organizations?: components["schemas"]["OrganizationRepresentation"][]; + verifiableCredentialsEnabled?: boolean; + adminPermissionsEnabled?: boolean; + /** @deprecated */ + social?: boolean; + /** @deprecated */ + updateProfileOnInitialSocialLogin?: boolean; + /** @deprecated */ + socialProviders?: { + [key: string]: string; + }; + /** @deprecated */ + applicationScopeMappings?: { + [key: string]: components["schemas"]["ScopeMappingRepresentation"][]; + }; + /** @deprecated */ + applications?: components["schemas"]["ApplicationRepresentation"][]; + /** @deprecated */ + oauthClients?: components["schemas"]["OAuthClientRepresentation"][]; + /** @deprecated */ + clientTemplates?: components["schemas"]["ClientTemplateRepresentation"][]; + scimApiEnabled?: boolean; + }; + RequiredActionConfigInfoRepresentation: { + properties?: components["schemas"]["ConfigPropertyRepresentation"][]; + }; + RequiredActionConfigRepresentation: { + config?: { + [key: string]: string; + }; + }; + RequiredActionProviderRepresentation: { + alias?: string; + name?: string; + providerId?: string; + enabled?: boolean; + defaultAction?: boolean; + /** Format: int32 */ + priority?: number; + config?: { + [key: string]: string; + }; + }; + ResourceOwnerRepresentation: { + id?: string; + name?: string; + }; + ResourceRepresentation: { + _id?: string; + name?: string; + uris?: string[]; + type?: string; + scopes?: components["schemas"]["ScopeRepresentation"][]; + icon_uri?: string; + readonly owner?: components["schemas"]["ResourceOwnerRepresentation"]; + ownerManagedAccess?: boolean; + displayName?: string; + attributes?: { + [key: string]: string[]; + }; + /** @deprecated */ + uri?: string; + scopesUma?: components["schemas"]["ScopeRepresentation"][]; + }; + ResourceServerRepresentation: { + id?: string; + clientId?: string; + name?: string; + allowRemoteResourceManagement?: boolean; + policyEnforcementMode?: components["schemas"]["PolicyEnforcementMode"]; + resources?: components["schemas"]["ResourceRepresentation"][]; + policies?: components["schemas"]["PolicyRepresentation"][]; + scopes?: components["schemas"]["ScopeRepresentation"][]; + decisionStrategy?: components["schemas"]["DecisionStrategy"]; + authorizationSchema?: components["schemas"]["AuthorizationSchema"]; + }; + ResourceType: { + type?: string; + scopes?: string[]; + scopeAliases?: { + [key: string]: string[]; + }; + groupType?: string; + }; + RoleRepresentation: { + id?: string; + name?: string; + description?: string; + /** @deprecated */ + scopeParamRequired?: boolean; + composite?: boolean; + composites?: components["schemas"]["Composites"]; + clientRole?: boolean; + containerId?: string; + attributes?: { + [key: string]: string[]; + }; + }; + RolesRepresentation: { + realm?: components["schemas"]["RoleRepresentation"][]; + client?: { + [key: string]: components["schemas"]["RoleRepresentation"][]; + }; + /** @deprecated */ + application?: { + [key: string]: components["schemas"]["RoleRepresentation"][]; + }; + }; + ScopeMappingRepresentation: { + self?: string; + client?: string; + /** @deprecated */ + clientTemplate?: string; + clientScope?: string; + roles?: string[]; + }; + ScopeRepresentation: { + id?: string; + name?: string; + iconUri?: string; + policies?: components["schemas"]["PolicyRepresentation"][]; + resources?: components["schemas"]["ResourceRepresentation"][]; + displayName?: string; + }; + SocialLinkRepresentation: { + socialProvider?: string; + socialUserId?: string; + socialUsername?: string; + }; + /** @enum {string} */ + Status: "PENDING" | "EXPIRED"; + /** @enum {string} */ + StepExecutionStatus: "COMPLETED" | "PENDING"; + UPAttribute: { + name?: string; + displayName?: string; + validations?: { + [key: string]: { + [key: string]: unknown; + }; + }; + annotations?: { + [key: string]: unknown; + }; + required?: components["schemas"]["UPAttributeRequired"]; + permissions?: components["schemas"]["UPAttributePermissions"]; + selector?: components["schemas"]["UPAttributeSelector"]; + group?: string; + multivalued?: boolean; + defaultValue?: string; + }; + UPAttributePermissions: { + view?: string[]; + edit?: string[]; + }; + UPAttributeRequired: { + roles?: string[]; + scopes?: string[]; + }; + UPAttributeSelector: { + scopes?: string[]; + }; + UPConfig: { + attributes?: components["schemas"]["UPAttribute"][]; + groups?: components["schemas"]["UPGroup"][]; + unmanagedAttributePolicy?: components["schemas"]["UnmanagedAttributePolicy"]; + }; + UPGroup: { + name?: string; + displayHeader?: string; + displayDescription?: string; + annotations?: { + [key: string]: unknown; + }; + }; + /** @enum {string} */ + UnmanagedAttributePolicy: "ENABLED" | "ADMIN_VIEW" | "ADMIN_EDIT"; + UserConsentRepresentation: { + clientId?: string; + grantedClientScopes?: string[]; + /** Format: int64 */ + createdDate?: number; + /** Format: int64 */ + lastUpdatedDate?: number; + /** @deprecated */ + grantedRealmRoles?: string[]; + }; + UserFederationMapperRepresentation: { + id?: string; + name?: string; + federationProviderDisplayName?: string; + federationMapperType?: string; + config?: { + [key: string]: string; + }; + }; + UserFederationProviderRepresentation: { + id?: string; + displayName?: string; + providerName?: string; + config?: { + [key: string]: string; + }; + /** Format: int32 */ + priority?: number; + /** Format: int32 */ + fullSyncPeriod?: number; + /** Format: int32 */ + changedSyncPeriod?: number; + /** Format: int32 */ + lastSync?: number; + }; + UserProfileAttributeGroupMetadata: { + name?: string; + displayHeader?: string; + displayDescription?: string; + annotations?: { + [key: string]: unknown; + }; + }; + UserProfileAttributeMetadata: { + name?: string; + displayName?: string; + required?: boolean; + readOnly?: boolean; + annotations?: { + [key: string]: unknown; + }; + validators?: { + [key: string]: { + [key: string]: unknown; + }; + }; + group?: string; + multivalued?: boolean; + defaultValue?: string; + }; + UserProfileMetadata: { + attributes?: components["schemas"]["UserProfileAttributeMetadata"][]; + groups?: components["schemas"]["UserProfileAttributeGroupMetadata"][]; + }; + UserRepresentation: { + id?: string; + username?: string; + firstName?: string; + lastName?: string; + email?: string; + emailVerified?: boolean; + attributes?: { + [key: string]: string[]; + }; + userProfileMetadata?: components["schemas"]["UserProfileMetadata"]; + enabled?: boolean; + self?: string; + origin?: string; + /** Format: int64 */ + createdTimestamp?: number; + totp?: boolean; + federationLink?: string; + serviceAccountClientId?: string; + credentials?: components["schemas"]["CredentialRepresentation"][]; + disableableCredentialTypes?: string[]; + requiredActions?: string[]; + federatedIdentities?: components["schemas"]["FederatedIdentityRepresentation"][]; + realmRoles?: string[]; + clientRoles?: { + [key: string]: string[]; + }; + clientConsents?: components["schemas"]["UserConsentRepresentation"][]; + /** Format: int32 */ + notBefore?: number; + /** @deprecated */ + applicationRoles?: { + [key: string]: string[]; + }; + /** @deprecated */ + socialLinks?: components["schemas"]["SocialLinkRepresentation"][]; + groups?: string[]; + access?: { + [key: string]: boolean; + }; + }; + UserSessionRepresentation: { + id?: string; + username?: string; + userId?: string; + ipAddress?: string; + /** Format: int64 */ + start?: number; + /** Format: int64 */ + lastAccess?: number; + rememberMe?: boolean; + clients?: { + [key: string]: string; + }; + transientUser?: boolean; + }; + WorkflowConcurrencyRepresentation: { + "cancel-in-progress"?: string; + "restart-in-progress"?: string; + }; + WorkflowRepresentation: { + id?: string; + name?: string; + enabled?: boolean; + on?: string; + schedule?: components["schemas"]["WorkflowScheduleRepresentation"]; + concurrency?: components["schemas"]["WorkflowConcurrencyRepresentation"]; + if?: string; + steps?: components["schemas"]["WorkflowStepRepresentation"][]; + state?: components["schemas"]["WorkflowStateRepresentation"]; + with?: components["schemas"]["MultivaluedHashMapStringString"]; + cancelInProgress?: string; + restartInProgress?: string; + }; + WorkflowScheduleRepresentation: { + after?: string; + /** Format: int32 */ + "batch-size"?: number; + }; + WorkflowStateRepresentation: { + errors?: string[]; + }; + WorkflowStepRepresentation: { + uses?: string; + after?: string; + /** Format: int64 */ + "scheduled-at"?: number; + status?: components["schemas"]["StepExecutionStatus"]; + id?: string; + config?: components["schemas"]["MultivaluedHashMapStringString"]; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record; diff --git a/apps/wizard-v2/src/api/types/orgs.d.ts b/apps/wizard-v2/src/api/types/orgs.d.ts new file mode 100644 index 00000000..ee0540b7 --- /dev/null +++ b/apps/wizard-v2/src/api/types/orgs.d.ts @@ -0,0 +1,4193 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/{realm}/orgs": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get organizations + * @description Get a paginated list of organizations using optional search query parameters. + */ + get: operations["getOrganizations"]; + put?: never; + /** Create a new organization */ + post: operations["createOrganization"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get organizations count + * @description Get a count of organizations using an optional search query. + */ + get: operations["getOrganizationsCount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/me": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get orgs and roles for authenticated user + * @description Get a list of all organizations that the user is a member and their roles in those organizations. Similar idea to /userinfo in OIDC. + */ + get: operations["getMe"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/me/invitations": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get invitations for authenticated user + * @description Get a list of all invitations for the user. + */ + get: operations["invitations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/me/invitations/{invitationId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description invitation UUID */ + invitationId: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Accept invitation for authenticated user + * @description Accept invitation for authenticated user. + */ + post: operations["acceptInvitation"]; + /** + * Reject invitation for authenticated user + * @description Reject invitation for authenticated user. + */ + delete: operations["rejectInvitation"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/export": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Export organizations + * @description Export all organizations and their configurations from this realm + */ + get: operations["exportOrganizations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/import": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Import organizations + * @description Import organizations and their configurations into this realm + */ + post: operations["importOrganizations"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** Get organization by id */ + get: operations["getOrganizationById"]; + /** Update this organization by id */ + put: operations["updateOrganization"]; + post?: never; + /** Delete the organization */ + delete: operations["deleteOrganization"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/portal-link": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create a link for the organization's IdP Wizard + * @description Create a link for this organization's IdP Wizard. This link encodes an action token on behalf of the organization's default admin user, or the user that is optionally specified in this request. The user specified must be a member of this organization, and have full organization admin roles. + */ + post: operations["createPortalLink"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get organization configuration + * @description Get the global organization configuration for this realm + */ + get: operations["getOrganizationConfig"]; + /** + * Update organization configuration + * @description Update the global organization configuration for this realm + */ + put: operations["updateOrganizationConfig"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/members": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** + * Get organization memberships + * @description Get a paginated list of users who are a member of the specified organization. + */ + get: operations["getOrganizationMemberships"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/members/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** + * Get organization members count + * @description Get total number of members of a given organization + */ + get: operations["getOrganizationMembershipsCount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/domains": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** Get details for all domains owned by an organization */ + get: operations["getOrganizationDomains"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/domains/{domainName}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description domain name */ + domainName: string; + }; + cookie?: never; + }; + /** Get details for a domain owned by an organization */ + get: operations["getOrganizationDomain"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/domains/{domainName}/verify": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description domain name */ + domainName: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Start domain verification + * @description Initiate a verification check for the domain name owned by this organization + */ + post: operations["verifyDomain"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/members/{userId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + /** Check if a user is a member of an organization */ + get: operations["checkOrganizationMembership"]; + /** + * Add an organization member + * @description Add the specified user to the specified organization as a member + */ + put: operations["addOrganizationMember"]; + post?: never; + /** + * Remove an organization member + * @description Remove the specified user from the specified organization as a member + */ + delete: operations["removeOrganizationMember"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/members/{userId}/attributes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + /** + * Get organization member attributes + * @description Get attributes for a specific member of an organization + */ + get: operations["getOrganizationMemberAttributes"]; + /** + * Add/update organization member attributes + * @description Add or update attributes for a specific member of an organization + */ + put: operations["addOrganizationMemberAttributes"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/invitations": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** + * Get organization invitations + * @description Get a paginated list of invitations to an organization, using an optional search query for email address. + */ + get: operations["getOrganizationInvitations"]; + put?: never; + /** + * Create an invitation to an organization + * @description Create an invitation to join the specified organization. Requires a user to register with the application (if they don't already have an account) before they can accept the invitation. Acceptance happens during login via a required action. + */ + post: operations["addOrganizationInvitation"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/invitations/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** + * Get organization invitation count + * @description Get a count of invitations to an organization + */ + get: operations["getOrganizationInvitationCount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/invitations/{invitationId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description invitation id */ + invitationId: string; + }; + cookie?: never; + }; + /** + * Get organization invitation by ID + * @description Get an invitation to an organization by its uuid. + */ + get: operations["getOrganizationInvitationById"]; + put?: never; + post?: never; + /** Remove a pending invitation */ + delete: operations["removeOrganizationInvitation"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/invitations/{invitationId}/resend-email": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description invitation id */ + invitationId: string; + }; + cookie?: never; + }; + get?: never; + /** + * Resend an Organization Invitation + * @description Resend the email for an existing Organization Invitation + */ + put: operations["resendOrganizationInvitation"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/roles": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** Get roles for this organization */ + get: operations["getOrganizationRoles"]; + /** Create new roles for this organization */ + put: operations["createOrganizationRoles"]; + /** Create a new role for this organization */ + post: operations["createOrganizationRole"]; + delete?: never; + options?: never; + head?: never; + /** Delete this organization roles */ + patch: operations["deleteOrganizationRoles"]; + trace?: never; + }; + "/{realm}/orgs/{orgId}/roles/{name}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + }; + cookie?: never; + }; + /** Get role for this organization by name */ + get: operations["getOrganizationRole"]; + /** Update role for this organization */ + put: operations["updateOrganizationRole"]; + post?: never; + /** Delete this organization role */ + delete: operations["deleteOrganizationRole"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/roles/{name}/users": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + }; + cookie?: never; + }; + /** Get users with this organization role */ + get: operations["getUserOrganizationRoles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/roles/{name}/users/{userId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + /** Check if a user has an organization role */ + get: operations["checkUserOrganizationRole"]; + /** + * Grant a user an organization role + * @description Grant the specified user to the specified organization role + */ + put: operations["grantUserOrganizationRole"]; + post?: never; + /** + * Revoke an organization role from a user + * @description Revoke the specified organization role from the specified user + */ + delete: operations["revokeUserOrganizationRole"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps/import-config": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Import identity provider from uploaded JSON file */ + post: operations["importIdpJson"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** Get identity providers for this organization */ + get: operations["getIdps"]; + put?: never; + /** Create a new identity provider for this organization */ + post: operations["createIdp"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps/link": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Link an existing identity provider to this organization */ + post: operations["linkIdp"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps/{alias}/unlink": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description idp alias */ + alias: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Unlink an existing and linked identity provider from this organization */ + post: operations["unlinkIdp"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps/{alias}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description Identity Provider alias */ + alias: string; + }; + cookie?: never; + }; + /** Get identity provider for this organization by alias */ + get: operations["getIdp"]; + /** Update identity provider for this organization by alias */ + put: operations["updateIdp"]; + post?: never; + /** Delete the identity provider */ + delete: operations["deleteIdp"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps/{alias}/mappers": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + }; + cookie?: never; + }; + /** Get mappers for identity provider */ + get: operations["getIdpMappers"]; + put?: never; + /** Add a mapper to identity provider */ + post: operations["addIdpMapper"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/idps/{alias}/mappers/{id}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + /** Get mapper by id for the identity provider */ + get: operations["getIdpMapper"]; + /** Update a mapper for the identity provider */ + put: operations["updateIdpMapper"]; + post?: never; + /** Delete a mapper for the identity provider */ + delete: operations["deleteIdpMapper"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/orgs/{orgId}/scim": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** + * Get the SCIM configuration for an organization + * @description Returns the SCIM 2.0 service-provider configuration for the + * organization. Requires `view-organizations` or + * `view-identity-providers` on the organization. Returns 404 if + * the realm-level SCIM flag (`scimEnabled` in the orgs config) is + * off, or if no configuration exists for the organization yet. + */ + get: operations["getOrganizationScimConfig"]; + /** + * Update the SCIM configuration for an organization + * @description Updates the SCIM 2.0 service-provider configuration for the + * organization. Requires `manage-organizations` or + * `manage-identity-providers` on the organization. Omit + * secret/password fields on `auth` to preserve the existing stored + * credential; supply a new value to rotate. + */ + put: operations["updateOrganizationScimConfig"]; + /** + * Create the SCIM configuration for an organization + * @description Creates the SCIM 2.0 service-provider configuration for the + * organization. Requires `manage-organizations` or + * `manage-identity-providers` on the organization. Returns 404 if + * the realm-level SCIM flag is off, and 409 if a configuration + * already exists for the organization. Cleartext secrets and basic + * passwords submitted here are hashed with Argon2id before + * persistence. + */ + post: operations["createOrganizationScimConfig"]; + /** + * Delete the SCIM configuration for an organization + * @description Removes the SCIM 2.0 service-provider configuration for the + * organization. Requires `manage-organizations` or + * `manage-identity-providers` on the organization. + */ + delete: operations["deleteOrganizationScimConfig"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/users/{userId}/orgs": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + /** List organizations for the given user */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"][]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/users/{userId}/orgs/{orgId}/roles": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description user id */ + userId: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** List organization roles for the given user and org */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description user id */ + userId: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"][]; + }; + }; + }; + }; + /** Grant a user organization roles */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description user id */ + userId: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"][]; + }; + }; + responses: { + /** @description Multi Status */ + 207: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BulkResponseItem"][]; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Revoke organization roles from a user */ + patch: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description user id */ + userId: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"][]; + }; + }; + responses: { + /** @description Multi Status */ + 207: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BulkResponseItem"][]; + }; + }; + }; + }; + trace?: never; + }; + "/{realm}/users/switch-organization": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + /** + * Switch active organization for authenticated user + * @description Switch the active organization context for the authenticated user + */ + put: operations["switchActiveOrganization"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/users/active-organization": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get active organization for authenticated user + * @description Get the currently active organization for the authenticated user + */ + get: operations["getActiveOrganization"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/events": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Create a new audit log event */ + post: operations["createEvent"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/attributes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get realm attributes + * @description Get a list of attributes for this realm + */ + get: operations["getRealmAttributes"]; + put?: never; + /** Create a new realm attribute */ + post: operations["createRealmAttribute"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/attributes/{attributeKey}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description attribute key */ + attributeKey: string; + }; + cookie?: never; + }; + /** Get realm attribute by key */ + get: operations["getRealmAttributeByKey"]; + /** Update realm attribute by key */ + put: operations["updateRealmAttributeByKey"]; + post?: never; + /** Delete the realm attribute */ + delete: operations["deleteRealmAttribute"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get webhooks + * @description Get a list of webhooks for this realm + */ + get: operations["getWebhooks"]; + put?: never; + /** Create a new webhook */ + post: operations["createWebhook"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/count": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** + * Get webhooks count + * @description Get a count of webhooks. + */ + get: operations["getWebhooksCount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/{webhookId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + /** Get webhook by id */ + get: operations["getWebhookById"]; + /** Update this webhook by id */ + put: operations["updateWebhook"]; + post?: never; + /** Delete the webhook */ + delete: operations["deleteWebhook"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/{webhookId}/secret": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + /** Get webhook secret by id */ + get: operations["getWebhookSecretById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/{webhookId}/sends": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + /** Get webhook sends */ + get: operations["getWebhookSends"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/{webhookId}/sends/{sendId}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + /** @description send id */ + sendId: string; + }; + cookie?: never; + }; + /** Get webhook send by id */ + get: operations["getWebhookSendById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/{webhookId}/sends/{sendId}/resend": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + /** @description send id */ + sendId: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Resend a webhook by send ID */ + post: operations["resendWebhookById"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/payload/{type}/{kid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description keycloak event type */ + type: string; + /** @description keycloak event id */ + kid: string; + }; + cookie?: never; + }; + /** Get a payload by Keycloak type and id */ + get: operations["getPayloadByKeycloakTypeAndId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/webhooks/sends/{type}/{kid}": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description keycloak event type */ + type: string; + /** @description keycloak event id */ + kid: string; + }; + cookie?: never; + }; + /** Get all webhook sends triggered by a Keycloak event */ + get: operations["getWebhookSendsByKeycloakTypeAndId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{realm}/magic-link": { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + get?: never; + put?: never; + /** Create a magic link to log in a user */ + post: operations["createMagicLink"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + BulkResponseItem: { + status?: number; + error?: string; + item?: Record; + }; + MyOrganizationsRepresentation: { + [key: string]: components["schemas"]["MyOrganizationRepresentation"]; + }; + MyOrganizationRepresentation: { + name?: string; + displayName?: string; + url?: string; + attributes?: { + [key: string]: string[]; + }; + roles?: string[]; + }; + IdentityProviderRepresentation: { + addReadTokenRoleOnCreate?: boolean; + alias?: string; + config?: { + [key: string]: unknown; + }; + displayName?: string; + enabled?: boolean; + firstBrokerLoginFlowAlias?: string; + internalId?: string; + linkOnly?: boolean; + postBrokerLoginFlowAlias?: string; + providerId?: string; + storeToken?: boolean; + trustEmail?: boolean; + }; + IdentityProviderMapperRepresentation: { + config?: { + [key: string]: unknown; + }; + id?: string; + identityProviderAlias?: string; + identityProviderMapper?: string; + name?: string; + }; + LinkIdentityProviderRepresentation: { + alias?: string; + post_broker_flow?: string; + sync_mode?: string; + }; + RealmAttributeRepresentation: { + name?: string; + value?: string; + realm?: string; + }; + KeyedRealmAttributeRepresentation: { + [key: string]: components["schemas"]["RealmAttributeRepresentation"]; + }; + OrganizationRepresentation: { + id?: string; + name?: string; + displayName?: string; + url?: string; + realm?: string; + domains?: string[]; + attributes?: { + [key: string]: string[]; + }; + }; + OrganizationConfigRepresentation: { + /** @description Whether to create a default admin user for new organizations */ + createAdminUser?: boolean; + /** @description Whether identity providers can be shared across organizations */ + sharedIdps?: boolean; + /** @description Whether admin events are enabled for organization operations */ + adminEventsEnabled?: boolean; + /** @description Whether user events are enabled for organization operations */ + eventsEnabled?: boolean; + /** @description Default post broker login flow for organization identity providers */ + defaultPostBrokerFlow?: string; + /** @description Default sync mode for organization identity providers */ + defaultSyncMode?: string; + /** @description Additional configuration attributes */ + attributes?: { + [key: string]: string[]; + }; + /** + * @description Realm-level feature flag that turns on per-organization SCIM 2.0 + * provisioning. When false (the default) the organization SCIM + * configuration endpoints under `/{realm}/orgs/{orgId}/scim` + * return 404 and the SCIM tab is hidden in the Admin UI. + */ + scimEnabled?: boolean; + }; + OrganizationsExportRepresentation: { + /** @description Export format version */ + version?: string; + /** @description Source realm name */ + realm?: string; + /** + * Format: date-time + * @description Export timestamp + */ + exportedAt?: string; + organizations?: components["schemas"]["OrganizationExportRepresentation"][]; + config?: components["schemas"]["OrganizationsConfigRepresentation"]; + }; + OrganizationExportRepresentation: components["schemas"]["OrganizationRepresentation"] & { + roles?: components["schemas"]["OrganizationRoleRepresentation"][]; + identityProviders?: components["schemas"]["IdentityProviderRepresentation"][]; + members?: { + userId?: string; + email?: string; + roles?: string[]; + }[]; + }; + OrganizationsImportRepresentation: { + /** @description Import format version */ + version?: string; + organizations?: components["schemas"]["OrganizationExportRepresentation"][]; + config?: components["schemas"]["OrganizationsConfigRepresentation"]; + }; + OrganizationsImportResultRepresentation: { + /** @description Number of organizations successfully imported */ + imported?: number; + /** @description Number of organizations updated */ + updated?: number; + /** @description Number of organizations skipped */ + skipped?: number; + errors?: { + organizationName?: string; + error?: string; + }[]; + }; + OrganizationsConfigRepresentation: { + /** @description Whether to create a default admin user for new organizations */ + createAdminUserEnabled?: boolean; + /** @description Whether identity providers can be shared across organizations */ + sharedIdpsEnabled?: boolean; + }; + SwitchOrganizationRepresentation: { + /** @description The ID of the organization to switch to */ + id?: string; + }; + ActiveOrganizationRepresentation: { + /** @description The ID of the active organization */ + organizationId?: string; + /** @description The name of the active organization */ + organizationName?: string; + /** @description The display name of the active organization */ + displayName?: string; + /** @description User's roles in the active organization */ + roles?: string[]; + /** + * Format: date-time + * @description When the organization was last switched to + */ + switchedAt?: string; + }; + OrganizationDomainRepresentation: { + domain_name: string; + verified: boolean; + record_key: string; + record_value: string; + }; + OrganizationRoleRepresentation: { + id?: string; + name?: string; + description?: string; + }; + OrganizationRoleMapRepresentation: { + [key: string]: components["schemas"]["OrganizationRoleRepresentation"][]; + }; + OrganizationMemberAttributeRepresentation: { + attributes?: { + [key: string]: string[]; + }; + }; + PortalLinkRepresentation: { + user?: string; + link?: string; + redirect?: string; + }; + InvitationRequestRepresentation: { + email?: string; + send?: boolean; + inviterId?: string; + redirectUri?: string; + roles?: string[]; + attributes?: { + [key: string]: string[]; + }; + }; + InvitationRepresentation: { + id?: string; + createdAt?: string; + email?: string; + inviterId?: string; + invitationUrl?: string; + organizationId?: string; + roles?: string[]; + attributes?: { + [key: string]: string[]; + }; + }; + UserRepresentation: { + attributes?: { + [key: string]: unknown; + }; + /** Format: int64 */ + createdTimestamp?: number; + email?: string; + emailVerified?: boolean; + enabled?: boolean; + firstName?: string; + groups?: string[]; + id?: string; + lastName?: string; + username?: string; + }; + UserBriefRepresentation: { + /** Format: int64 */ + createdTimestamp?: number; + email?: string; + emailVerified?: boolean; + enabled?: boolean; + firstName?: string; + groups?: string[]; + id?: string; + lastName?: string; + username?: string; + }; + UserWithOrgsRepresentation: components["schemas"]["UserRepresentation"] & { + organizations?: components["schemas"]["OrganizationRoleMapRepresentation"]; + }; + UserWithOrgsBriefRepresentation: components["schemas"]["UserBriefRepresentation"] & { + organizations?: components["schemas"]["OrganizationRoleMapRepresentation"]; + }; + AuthDetailsRepresentation: { + realmId?: string; + clientId?: string; + userId?: string; + ipAddress?: string; + username?: string; + sessionId?: string; + }; + EventRepresentation: { + id?: string; + uid?: string; + time?: number; + realmId?: string; + realmName?: string; + organizationId?: string; + type?: string; + representation?: string; + operationType?: string; + resourcePath?: string; + resourceType?: string; + error?: string; + authDetails?: components["schemas"]["AuthDetailsRepresentation"]; + details?: { + [key: string]: unknown; + }; + }; + CredentialRepresentation: { + type?: string; + value?: string; + }; + WebhookRepresentation: { + attributes?: Record; + id?: string; + enabled?: boolean; + url?: string; + secret?: string; + createdBy?: string; + /** Format: int64 */ + createdAt?: number; + realm?: string; + eventTypes?: string[]; + }; + WebhookSendRepresentation: { + id?: string; + type?: string; + status?: number; + status_message?: string; + retried?: number; + sent_at?: string; + event_id?: string; + keycloak_event_type?: string; + keycloak_event_id?: string; + webhook?: components["schemas"]["WebhookRepresentation"]; + payload?: string; + }; + /** + * @description Per-organization SCIM 2.0 service-provider configuration. One of these + * backs the SCIM endpoint at + * `{authServerUrl}/realms/{realm}/scim/v2/organizations/{orgId}/`. + */ + OrganizationScimRepresentation: { + /** + * @description Whether the organization's SCIM endpoint accepts inbound traffic. + * Turn this off to pause provisioning without losing the + * configuration. + */ + enabled?: boolean; + /** + * @description When true, the provisioned user's `username` mirrors their + * `email`, and subsequent SCIM update operations do not change + * the username. + */ + email_as_username?: boolean; + /** + * @description When true, provisioned users are federated with the + * organization's configured identity provider so they can sign in + * via the org's SSO immediately after provisioning. + */ + link_idp?: boolean; + auth?: components["schemas"]["OrganizationScimAuth"]; + }; + /** + * @description Polymorphic authentication configuration for the inbound SCIM + * endpoint. The `type` field discriminates the variant; the remaining + * fields depend on the variant chosen. + */ + OrganizationScimAuth: { + /** + * @description Authentication mode selector. + * @enum {string} + */ + type: "KEYCLOAK" | "EXTERNAL_JWT" | "EXTERNAL_SECRET" | "EXTERNAL_BASIC"; + } & (components["schemas"]["KeycloakScimAuth"] | components["schemas"]["ExternalJwtScimAuth"] | components["schemas"]["ExternalSecretScimAuth"] | components["schemas"]["ExternalBasicScimAuth"]); + /** + * @description Authenticates inbound SCIM calls with a Keycloak-issued access + * token (Bearer). The caller must hold the realm-management roles + * required to manage members of the organization. + */ + KeycloakScimAuth: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: "KEYCLOAK"; + }; + /** + * @description Validates an inbound JWT issued by an external IdP. The token's + * issuer and audience must match the configured values, and the + * signature is verified against keys fetched from the configured + * JWKS URI. + */ + ExternalJwtScimAuth: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: "EXTERNAL_JWT"; + /** @description Expected `iss` claim. Must exactly match the upstream IdP's issuer URL. */ + issuer?: string; + /** @description Expected `aud` claim. */ + audience?: string; + /** @description URL the server fetches to validate the JWT signature. */ + jwks_uri?: string; + }; + /** + * @description Bearer-style shared secret. The client sends + * `Authorization: Bearer `; the server compares the value + * against a stored Argon2id hash. + */ + ExternalSecretScimAuth: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: "EXTERNAL_SECRET"; + /** + * @description Random opaque value. Cleartext on submit; hashed at rest. Omit + * on update to keep the existing secret. + */ + shared_secret?: string; + }; + /** + * @description HTTP Basic auth. The password is hashed with Argon2id before + * storage. + */ + ExternalBasicScimAuth: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: "EXTERNAL_BASIC"; + /** @description Username for HTTP Basic auth. Stored in cleartext. */ + username?: string; + /** + * @description Password for HTTP Basic auth. Cleartext on submit; hashed at + * rest. Omit on update to keep the existing password. + */ + password?: string; + }; + MagicLinkRequest: { + email?: string; + client_id: string; + redirect_uri: string; + username?: string; + expiration_seconds?: number; + force_create?: boolean; + send_email?: boolean; + update_profile?: boolean; + update_password?: boolean; + scope?: string; + nonce?: string; + state?: string; + code_challenge?: string; + code_challenge_method?: string; + remember_me?: boolean; + reusable?: boolean; + response_mode?: string; + }; + MagicLinkResponse: { + user_id?: string; + link?: string; + sent?: boolean; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getOrganizations: { + parameters: { + query?: { + /** @description search by name */ + search?: string; + first?: number; + max?: number; + /** @description search by attributes using the format (space separated) `k1:v1 k2:v2` */ + q?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"][]; + }; + }; + }; + }; + createOrganization: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRepresentation"]; + }; + }; + responses: { + /** @description success */ + 201: { + headers: { + /** @description URI indicating the ID of the new resource. */ + Location?: string; + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationsCount: { + parameters: { + query?: { + search?: string; + /** @description search by attributes using the format (space separated) `k1:v1 k2:v2` */ + q?: string; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + }; + }; + getMe: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MyOrganizationsRepresentation"]; + }; + }; + }; + }; + invitations: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InvitationRepresentation"]; + }; + }; + }; + }; + acceptInvitation: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description invitation UUID */ + invitationId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + rejectInvitation: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description invitation UUID */ + invitationId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + exportOrganizations: { + parameters: { + query?: { + /** @description Include organization members in the export */ + includeMembers?: boolean; + /** @description Include organization roles in the export */ + includeRoles?: boolean; + /** @description Include identity providers in the export */ + includeIdps?: boolean; + /** @description Specific organization IDs to export (if not provided, exports all) */ + orgIds?: string[]; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationsExportRepresentation"]; + "application/octet-stream": string; + }; + }; + }; + }; + importOrganizations: { + parameters: { + query?: { + /** @description Skip organizations that already exist instead of updating them */ + skipExisting?: boolean; + /** @description Import organization members (requires existing users in realm) */ + importMembers?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationsImportRepresentation"]; + "multipart/form-data": { + /** + * Format: binary + * @description JSON file containing organizations export + */ + file?: string; + }; + }; + }; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationsImportResultRepresentation"]; + }; + }; + /** @description Invalid import data or format */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Conflicts with existing organizations */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRepresentation"]; + }; + }; + }; + }; + updateOrganization: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRepresentation"]; + }; + }; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteOrganization: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + createPortalLink: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + userId?: string; + }; + }; + }; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PortalLinkRepresentation"]; + }; + }; + }; + }; + getOrganizationConfig: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationConfigRepresentation"]; + }; + }; + }; + }; + updateOrganizationConfig: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationConfigRepresentation"]; + }; + }; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Invalid configuration */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationMemberships: { + parameters: { + query?: { + search?: string; + first?: number; + max?: number; + excludeAdminAccounts?: boolean; + includeOrgs?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserWithOrgsBriefRepresentation"][]; + }; + }; + }; + }; + getOrganizationMembershipsCount: { + parameters: { + query?: { + excludeAdminAccounts?: boolean; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + }; + }; + getOrganizationDomains: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationDomainRepresentation"][]; + }; + }; + }; + }; + getOrganizationDomain: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description domain name */ + domainName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationDomainRepresentation"]; + }; + }; + }; + }; + verifyDomain: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description domain name */ + domainName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + checkOrganizationMembership: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + addOrganizationMember: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + removeOrganizationMember: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationMemberAttributes: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string[]; + }; + }; + }; + /** @description User is not a member of the organization */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description User doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + addOrganizationMemberAttributes: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationMemberAttributeRepresentation"]; + }; + }; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string[]; + }; + }; + }; + /** @description User is not a member of the organization */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description User doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationInvitations: { + parameters: { + query?: { + search?: string; + first?: number; + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InvitationRepresentation"][]; + }; + }; + }; + }; + addOrganizationInvitation: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["InvitationRequestRepresentation"]; + }; + }; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description invitation already exists */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationInvitationCount: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + }; + }; + getOrganizationInvitationById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description invitation id */ + invitationId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InvitationRepresentation"]; + }; + }; + }; + }; + removeOrganizationInvitation: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description invitation id */ + invitationId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + resendOrganizationInvitation: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description invitation id */ + invitationId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationRoles: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"][]; + }; + }; + }; + }; + createOrganizationRoles: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"][]; + }; + }; + responses: { + /** @description Multi Status */ + 207: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BulkResponseItem"][]; + }; + }; + }; + }; + createOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"]; + }; + }; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteOrganizationRoles: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"][]; + }; + }; + responses: { + /** @description Multi Status */ + 207: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BulkResponseItem"][]; + }; + }; + }; + }; + getOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"]; + }; + }; + }; + }; + updateOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationRoleRepresentation"]; + }; + }; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserOrganizationRoles: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRepresentation"][]; + }; + }; + }; + }; + checkUserOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + grantUserOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + revokeUserOrganizationRole: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description organization role name */ + name: string; + /** @description user id */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + importIdpJson: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + }; + }; + getIdps: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"][]; + }; + }; + }; + }; + createIdp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** @description JSON body */ + requestBody: { + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + linkIdp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + /** @description JSON body */ + requestBody: { + content: { + "application/json": components["schemas"]["LinkIdentityProviderRepresentation"]; + }; + }; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unlinkIdp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description idp alias */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getIdp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description Identity Provider alias */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + }; + }; + updateIdp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description Identity Provider alias */ + alias: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["IdentityProviderRepresentation"]; + }; + }; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteIdp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + /** @description Identity Provider alias */ + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getIdpMappers: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"][]; + }; + }; + }; + }; + addIdpMapper: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"]; + }; + }; + responses: { + /** @description success */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getIdpMapper: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"]; + }; + }; + }; + }; + updateIdpMapper: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["IdentityProviderMapperRepresentation"]; + }; + }; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteIdpMapper: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + alias: string; + /** @description Mapper id */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getOrganizationScimConfig: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationScimRepresentation"]; + }; + }; + /** @description Insufficient permission */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description SCIM disabled at realm level, or no configuration exists for this organization */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateOrganizationScimConfig: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationScimRepresentation"]; + }; + }; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationScimRepresentation"]; + }; + }; + /** @description Insufficient permission */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description SCIM disabled at realm level, or no configuration exists for this organization */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + createOrganizationScimConfig: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OrganizationScimRepresentation"]; + }; + }; + responses: { + /** @description SCIM configuration created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OrganizationScimRepresentation"]; + }; + }; + /** @description Insufficient permission */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description SCIM disabled at realm level */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description SCIM configuration already exists for this organization */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteOrganizationScimConfig: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description organization id */ + orgId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description SCIM configuration deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Insufficient permission */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description SCIM disabled at realm level, or no configuration exists for this organization */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + switchActiveOrganization: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SwitchOrganizationRepresentation"]; + }; + }; + responses: { + /** @description Active organization switched successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Invalid organization or user is not a member */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description User does not have access to the organization */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Organization not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getActiveOrganization: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ActiveOrganizationRepresentation"]; + }; + }; + /** @description No active organization set */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + createEvent: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** @description JSON body */ + requestBody: { + content: { + "application/json": components["schemas"]["EventRepresentation"]; + }; + }; + responses: { + /** @description Event received */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Malformed event */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Rate limit exceeded */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Reserved event type */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRealmAttributes: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeyedRealmAttributeRepresentation"][]; + }; + }; + }; + }; + createRealmAttribute: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** @description JSON body */ + requestBody: { + content: { + "application/json": components["schemas"]["RealmAttributeRepresentation"]; + }; + }; + responses: { + /** @description Attribute created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Malformed attribute */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRealmAttributeByKey: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description attribute key */ + attributeKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RealmAttributeRepresentation"]; + }; + }; + /** @description Realm attribute doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateRealmAttributeByKey: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description attribute key */ + attributeKey: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RealmAttributeRepresentation"]; + }; + }; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Realm attribute doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteRealmAttribute: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description attribute key */ + attributeKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Realm attribute doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWebhooks: { + parameters: { + query?: { + first?: number; + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WebhookRepresentation"][]; + }; + }; + }; + }; + createWebhook: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** @description JSON body */ + requestBody: { + content: { + "application/json": components["schemas"]["WebhookRepresentation"]; + }; + }; + responses: { + /** @description Webhook created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Malformed webhook */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWebhooksCount: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": number; + }; + }; + }; + }; + getWebhookById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WebhookRepresentation"]; + }; + }; + /** @description Webhook doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateWebhook: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["WebhookRepresentation"]; + }; + }; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Webhook doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteWebhook: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Webhook doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWebhookSecretById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CredentialRepresentation"]; + }; + }; + /** @description Webhook doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWebhookSends: { + parameters: { + query?: { + first?: number; + max?: number; + }; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WebhookSendRepresentation"][]; + }; + }; + /** @description Webhook doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWebhookSendById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + /** @description send id */ + sendId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WebhookSendRepresentation"]; + }; + }; + /** @description Webhook or send doesn't exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + resendWebhookById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description webhook id */ + webhookId: string; + /** @description send id */ + sendId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPayloadByKeycloakTypeAndId: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description keycloak event type */ + type: string; + /** @description keycloak event id */ + kid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["EventRepresentation"]; + }; + }; + }; + }; + getWebhookSendsByKeycloakTypeAndId: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + /** @description keycloak event type */ + type: string; + /** @description keycloak event id */ + kid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description success */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WebhookSendRepresentation"][]; + }; + }; + }; + }; + createMagicLink: { + parameters: { + query?: never; + header?: never; + path: { + /** @description realm name (not id!) */ + realm: string; + }; + cookie?: never; + }; + /** @description JSON body */ + requestBody: { + content: { + "application/json": components["schemas"]["MagicLinkRequest"]; + }; + }; + responses: { + /** @description Magic Link created */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MagicLinkResponse"]; + }; + }; + /** @description Malformed request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description User or Client not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; +} diff --git a/apps/wizard-v2/src/components/theme-provider.tsx b/apps/wizard-v2/src/components/theme-provider.tsx new file mode 100644 index 00000000..31664b3f --- /dev/null +++ b/apps/wizard-v2/src/components/theme-provider.tsx @@ -0,0 +1,79 @@ +import { createContext, useContext, useEffect, useState } from "react"; + +export type Theme = "light" | "dark" | "system"; +export type ResolvedTheme = "light" | "dark"; + +type ThemeContextValue = { + theme: Theme; + resolvedTheme: ResolvedTheme; + setTheme: (theme: Theme) => void; +}; + +const ThemeContext = createContext(null); + +function getSystemTheme(): ResolvedTheme { + return typeof window !== "undefined" && + window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; +} + +function applyTheme(resolved: ResolvedTheme) { + const root = document.documentElement; + root.classList.toggle("dark", resolved === "dark"); + root.style.colorScheme = resolved; +} + +export function ThemeProvider({ + children, + defaultTheme = "system", + storageKey = "wizard-theme", +}: { + children: React.ReactNode; + defaultTheme?: Theme; + storageKey?: string; +}) { + const [theme, setThemeState] = useState(() => { + if (typeof window === "undefined") return defaultTheme; + return (localStorage.getItem(storageKey) as Theme) ?? defaultTheme; + }); + + const [resolvedTheme, setResolvedTheme] = useState(() => + theme === "system" ? getSystemTheme() : theme, + ); + + useEffect(() => { + const next = theme === "system" ? getSystemTheme() : theme; + setResolvedTheme(next); + applyTheme(next); + }, [theme]); + + useEffect(() => { + if (theme !== "system") return; + const mq = window.matchMedia("(prefers-color-scheme: dark)"); + const handler = () => { + const next = getSystemTheme(); + setResolvedTheme(next); + applyTheme(next); + }; + mq.addEventListener("change", handler); + return () => mq.removeEventListener("change", handler); + }, [theme]); + + const setTheme = (next: Theme) => { + localStorage.setItem(storageKey, next); + setThemeState(next); + }; + + return ( + + {children} + + ); +} + +export function useTheme() { + const ctx = useContext(ThemeContext); + if (!ctx) throw new Error("useTheme must be used inside ThemeProvider"); + return ctx; +} diff --git a/apps/wizard-v2/src/components/theme-toggle.tsx b/apps/wizard-v2/src/components/theme-toggle.tsx new file mode 100644 index 00000000..985ded42 --- /dev/null +++ b/apps/wizard-v2/src/components/theme-toggle.tsx @@ -0,0 +1,31 @@ +import { Monitor, Moon, Sun } from "lucide-react"; +import { useTheme, type Theme } from "@/components/theme-provider"; +import { cn } from "@/lib/utils"; + +const order: Theme[] = ["light", "dark", "system"]; +const labels: Record = { + light: "Light", + dark: "Dark", + system: "System", +}; + +export function ThemeToggle({ className }: { className?: string }) { + const { theme, setTheme } = useTheme(); + const next = order[(order.indexOf(theme) + 1) % order.length]; + const Icon = theme === "dark" ? Moon : theme === "light" ? Sun : Monitor; + + return ( + + ); +} diff --git a/apps/wizard-v2/src/components/ui/button.tsx b/apps/wizard-v2/src/components/ui/button.tsx new file mode 100644 index 00000000..4d38506c --- /dev/null +++ b/apps/wizard-v2/src/components/ui/button.tsx @@ -0,0 +1,64 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" +import { Slot } from "radix-ui" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3", + sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3", + "icon-sm": "size-8", + "icon-lg": "size-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant = "default", + size = "default", + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot.Root : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/apps/wizard-v2/src/components/ui/copy-field.tsx b/apps/wizard-v2/src/components/ui/copy-field.tsx new file mode 100644 index 00000000..4692f453 --- /dev/null +++ b/apps/wizard-v2/src/components/ui/copy-field.tsx @@ -0,0 +1,50 @@ +import { useState } from "react"; +import { Copy, Check } from "lucide-react"; +import { cn } from "@/lib/utils"; + +interface CopyFieldProps { + label?: string; + value: string; + hint?: string; + className?: string; +} + +export function CopyField({ label, value, hint, className }: CopyFieldProps) { + const [copied, setCopied] = useState(false); + + const handleCopy = async () => { + if (!value) return; + await navigator.clipboard.writeText(value); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + return ( +

+ {label && ( + {label} + )} +
+ {value || "—"} + +
+ {hint &&

{hint}

} +
+ ); +} diff --git a/apps/wizard-v2/src/components/ui/dialog.tsx b/apps/wizard-v2/src/components/ui/dialog.tsx new file mode 100644 index 00000000..e5f0a96d --- /dev/null +++ b/apps/wizard-v2/src/components/ui/dialog.tsx @@ -0,0 +1,156 @@ +import * as React from "react" +import { XIcon } from "lucide-react" +import { Dialog as DialogPrimitive } from "radix-ui" + +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" + +function Dialog({ + ...props +}: React.ComponentProps) { + return +} + +function DialogTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function DialogPortal({ + ...props +}: React.ComponentProps) { + return +} + +function DialogClose({ + ...props +}: React.ComponentProps) { + return +} + +function DialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogContent({ + className, + children, + showCloseButton = true, + ...props +}: React.ComponentProps & { + showCloseButton?: boolean +}) { + return ( + + + + {children} + {showCloseButton && ( + + + Close + + )} + + + ) +} + +function DialogHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function DialogFooter({ + className, + showCloseButton = false, + children, + ...props +}: React.ComponentProps<"div"> & { + showCloseButton?: boolean +}) { + return ( +
+ {children} + {showCloseButton && ( + + + + )} +
+ ) +} + +function DialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +} diff --git a/apps/wizard-v2/src/components/ui/file-input.tsx b/apps/wizard-v2/src/components/ui/file-input.tsx new file mode 100644 index 00000000..3d07051c --- /dev/null +++ b/apps/wizard-v2/src/components/ui/file-input.tsx @@ -0,0 +1,108 @@ +import { useRef, useState } from "react"; +import { Upload, X, FileText } from "lucide-react"; +import { cn } from "@/lib/utils"; + +interface FileInputProps { + label?: string; + accept?: string; + required?: boolean; + onChange: (file: File | null) => void; + value?: File | null; + className?: string; +} + +export function FileInput({ + label, + accept, + required, + onChange, + value, + className, +}: FileInputProps) { + const inputRef = useRef(null); + const [dragOver, setDragOver] = useState(false); + + const handleFile = (file: File | null) => { + onChange(file); + }; + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + setDragOver(false); + const file = e.dataTransfer.files[0] ?? null; + handleFile(file); + }; + + const handleInputChange = (e: React.ChangeEvent) => { + handleFile(e.target.files?.[0] ?? null); + }; + + const handleClear = (e: React.MouseEvent) => { + e.stopPropagation(); + onChange(null); + if (inputRef.current) inputRef.current.value = ""; + }; + + return ( +
+ {label && ( + + {label} + {required && *} + + )} +
!value && inputRef.current?.click()} + onDragOver={(e) => { e.preventDefault(); setDragOver(true); }} + onDragLeave={() => setDragOver(false)} + onDrop={handleDrop} + className={cn( + "border-border flex min-h-[80px] cursor-pointer items-center justify-center rounded-lg border-2 border-dashed transition-colors", + dragOver && "border-primary bg-primary/5", + value ? "cursor-default border-solid bg-muted/40" : "hover:border-muted-foreground/50 hover:bg-muted/20", + )} + > + {value ? ( +
+ + + {value.name} + + + {(value.size / 1024).toFixed(1)} KB + + +
+ ) : ( +
+ +

+ Drop a file here or{" "} + + browse + +

+ {accept && ( +

{accept}

+ )} +
+ )} +
+ +
+ ); +} diff --git a/apps/wizard-v2/src/components/ui/input.tsx b/apps/wizard-v2/src/components/ui/input.tsx new file mode 100644 index 00000000..c1b36b77 --- /dev/null +++ b/apps/wizard-v2/src/components/ui/input.tsx @@ -0,0 +1,21 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Input({ className, type, ...props }: React.ComponentProps<"input">) { + return ( + + ) +} + +export { Input } diff --git a/apps/wizard-v2/src/components/ui/table.tsx b/apps/wizard-v2/src/components/ui/table.tsx new file mode 100644 index 00000000..02f35cac --- /dev/null +++ b/apps/wizard-v2/src/components/ui/table.tsx @@ -0,0 +1,91 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Table({ + className, + ...props +}: React.ComponentProps<"table">) { + return ( +
+ + + ) +} + +function TableHeader({ + className, + ...props +}: React.ComponentProps<"thead">) { + return ( + + ) +} + +function TableBody({ + className, + ...props +}: React.ComponentProps<"tbody">) { + return ( + + ) +} + +function TableRow({ + className, + ...props +}: React.ComponentProps<"tr">) { + return ( + + ) +} + +function TableHead({ + className, + ...props +}: React.ComponentProps<"th">) { + return ( +
+ ) +} + +function TableCell({ + className, + ...props +}: React.ComponentProps<"td">) { + return ( + + ) +} + +export { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } diff --git a/apps/wizard-v2/src/components/ui/tabs.tsx b/apps/wizard-v2/src/components/ui/tabs.tsx new file mode 100644 index 00000000..7f2c4f20 --- /dev/null +++ b/apps/wizard-v2/src/components/ui/tabs.tsx @@ -0,0 +1,89 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" +import { Tabs as TabsPrimitive } from "radix-ui" + +import { cn } from "@/lib/utils" + +function Tabs({ + className, + orientation = "horizontal", + ...props +}: React.ComponentProps) { + return ( + + ) +} + +const tabsListVariants = cva( + "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", + { + variants: { + variant: { + default: "bg-muted", + line: "gap-1 bg-transparent", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function TabsList({ + className, + variant = "default", + ...props +}: React.ComponentProps & + VariantProps) { + return ( + + ) +} + +function TabsTrigger({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants } diff --git a/apps/wizard-v2/src/components/wizard/ImageZoom.tsx b/apps/wizard-v2/src/components/wizard/ImageZoom.tsx new file mode 100644 index 00000000..dbb952ee --- /dev/null +++ b/apps/wizard-v2/src/components/wizard/ImageZoom.tsx @@ -0,0 +1,80 @@ +import { useState } from "react"; +import { X, ZoomIn } from "lucide-react"; +import { cn } from "@/lib/utils"; + +interface ImageZoomProps { + src: string; + alt?: string; + caption?: string; + className?: string; + fullWidth?: boolean; +} + +export function ImageZoom({ + src, + alt = "", + caption, + className, + fullWidth = false, +}: ImageZoomProps) { + const [open, setOpen] = useState(false); + + return ( + <> +
+ + {caption && ( +
+ {caption} +
+ )} +
+ + {open && ( +
setOpen(false)} + > + + {alt} e.stopPropagation()} + className="max-h-[90vh] max-w-[90vw] rounded-lg object-contain shadow-2xl" + /> + {caption && ( +

+ {caption} +

+ )} +
+ )} + + ); +} diff --git a/apps/wizard-v2/src/components/wizard/WizardRunner.tsx b/apps/wizard-v2/src/components/wizard/WizardRunner.tsx new file mode 100644 index 00000000..c7ce5354 --- /dev/null +++ b/apps/wizard-v2/src/components/wizard/WizardRunner.tsx @@ -0,0 +1,371 @@ +/** + * WizardRunner — loads a wizard JSON definition and renders the current step. + * + * Layout: + * ┌─────────────────────────────────────────────────────┐ + * │ [← Providers] [Provider logo + name] │ ← _authenticated.tsx header + * ├───────────────────┬─────────────────────────────────┤ + * │ Step 1 │ Step content │ + * │ Step 2 ←sidebar │ │ + * │ Step 3 │ │ + * │ │ │ + * │ [P2 logo] │ [Back] [Continue] │ + * └───────────────────┴─────────────────────────────────┘ + */ +import { useState, useEffect } from "react"; +import { ChevronRight, ChevronLeft, Construction } from "lucide-react"; +import { Link } from "@tanstack/react-router"; +import { useWizardContext, isWizardDirty } from "@/context/WizardContext"; +import { useUnsavedChangesGuard } from "@/hooks/useUnsavedChangesGuard"; +import { clearAlias } from "@/lib/alias"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { useWizardConfig } from "@/hooks/useWizardConfig"; +import { useProviderLogo } from "@/hooks/useProviderLogo"; +import { useAppLogo } from "@/hooks/useAppLogo"; +import { WizardStep } from "./WizardStep"; +import { executeAction } from "./executeAction"; +import type { WizardDefinition } from "./types"; +import type { Provider } from "@/data/providers"; +import { cn } from "@/lib/utils"; + +interface Props { + providerId: string; + protocol: string; + provider: Provider; +} + + +export function WizardRunner({ providerId, protocol, provider }: Props) { + const ctx = useWizardContext(); + const { + state, + dispatch, + api, + orgsClient, + adminClient, + apiMode, + realm, + orgId, + } = ctx; + const { config } = useWizardConfig(); + + const [definition, setDefinition] = useState(null); + const [loadError, setLoadError] = useState(null); + const { src: sidebarLogo, fallback: fallbackLogo } = useAppLogo(); + const providerLogo = useProviderLogo(provider.logo); + + const dirty = isWizardDirty(state); + const guard = useUnsavedChangesGuard(dirty); + const handleConfirmLeave = () => { + if (definition) clearAlias(definition.alias.sessionKey); + guard.confirm(); + }; + + // --------------------------------------------------------------------------- + // Load the wizard JSON definition + // --------------------------------------------------------------------------- + useEffect(() => { + const modules = import.meta.glob("../../../wizards/**/*.json"); + const providerKey = `../../../wizards/${providerId}/${protocol}.json`; + const loader = modules[providerKey]; + + if (!loader) { + setLoadError("not-found"); + return; + } + + loader() + .then((mod) => + setDefinition((mod as { default: WizardDefinition }).default), + ) + .catch(() => setLoadError("not-found")); + }, [providerId, protocol]); + + // --------------------------------------------------------------------------- + // Action handler + // --------------------------------------------------------------------------- + const handleAction = async ( + actionKey: string, + formValues?: Record, + ): Promise => { + if (!definition) return false; + const action = definition.actions[actionKey]; + if (!action) { + console.warn(`WizardRunner: unknown action key "${actionKey}"`); + return false; + } + + dispatch({ type: "SUBMIT_START" }); + + const result = await executeAction({ + actionKey, + action, + allActions: definition.actions, + state, + dispatch, + orgsClient, + adminClient, + apiMode, + realm, + orgId, + api, + formValues, + aliasSessionKey: definition.alias.sessionKey, + config, + idpProviderId: definition.idpConfig.providerId, + }); + + // Ensure submitting is cleared if the action didn't dispatch SUBMIT_SUCCESS + // or SUBMIT_ERROR (e.g. intermediate steps that only dispatch METADATA_VALIDATED). + if (result.ok) dispatch({ type: "RESET_SUBMITTING" }); + + return result.ok; + }; + + // --------------------------------------------------------------------------- + // Error state + // --------------------------------------------------------------------------- + if (loadError) { + return ( +
+ +

Wizard not yet available

+

+ A guided setup for this provider and protocol hasn't been built yet. + Check back soon or configure it manually in the Keycloak admin + console. +

+
+ ); + } + + if (!definition) { + return ( +
+ Loading wizard… +
+ ); + } + + const currentStep = definition.steps.find((s) => s.id === state.currentStep); + if (!currentStep) return null; + + const isLastStep = + state.currentStep === definition.steps[definition.steps.length - 1].id; + const canAdvance = currentStep.enableNextWhen + ? evaluateExpression(currentStep.enableNextWhen, state) + : true; + + + return ( +
+ !o && guard.cancel()}> + + + Leave this wizard? + + Your progress will be lost. You will need to restart the wizard + from step 1. + + + + + + + + + {/* ------------------------------------------------------------------ */} + {/* Left sidebar */} + {/* ------------------------------------------------------------------ */} + + + {/* ------------------------------------------------------------------ */} + {/* Main content area */} + {/* ------------------------------------------------------------------ */} +
+ {/* Step content */} +
+ + + {/* Navigation buttons */} +
+ {state.currentStep > 1 && !isLastStep && ( + + )} + {!isLastStep && ( + + )} +
+
+
+
+ ); +} + +// --------------------------------------------------------------------------- +// Expression evaluator for enableNextWhen +// --------------------------------------------------------------------------- +function evaluateExpression( + expression: string, + state: import("@/context/WizardContext").WizardState, +): boolean { + const trimmed = expression.trim(); + + const stateMatch = trimmed.match(/^state\.(\w+)$/); + if (stateMatch) { + const field = stateMatch[1] as keyof typeof state; + return Boolean(state[field]); + } + + console.warn( + `WizardRunner: unknown enableNextWhen expression: "${expression}"`, + ); + return true; +} diff --git a/apps/wizard-v2/src/components/wizard/WizardStep.tsx b/apps/wizard-v2/src/components/wizard/WizardStep.tsx new file mode 100644 index 00000000..7c6bb05e --- /dev/null +++ b/apps/wizard-v2/src/components/wizard/WizardStep.tsx @@ -0,0 +1,624 @@ +/** + * WizardStep — renders a single step from a wizard JSON definition. + * + * Iterates over the step's `blocks` array and delegates each block to the + * appropriate block renderer. This component is stateless — all state lives + * in WizardContext. + */ +import { useState } from "react"; +import { CheckCircle2, Copy, Check } from "lucide-react"; +import type { + WizardStep as WizardStepDef, + WizardBlock, + WizardForm, + FormField, +} from "./types"; +import { resolveTemplate, buildTemplateContext } from "./resolveTemplate"; +import { useWizardContext } from "@/context/WizardContext"; +import { CopyField } from "@/components/ui/copy-field"; +import { FileInput } from "@/components/ui/file-input"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { ImageZoom } from "./ImageZoom"; +import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; +import { cn } from "@/lib/utils"; + +interface Props { + step: WizardStepDef; + forms: Record; + onAction: (actionKey: string, formValues?: Record) => Promise; + idpProviderId?: string; +} + +export function WizardStep({ step, forms, onAction, idpProviderId }: Props) { + const { state, api } = useWizardContext(); + const ctx = buildTemplateContext({ alias: state.alias, api, state, idpProviderId }); + + return ( +
+

{step.title}

+ {step.blocks.map((block, i) => ( + + ))} +
+ ); +} + +// --------------------------------------------------------------------------- +// Block dispatcher +// --------------------------------------------------------------------------- + +interface BlockProps { + block: WizardBlock; + ctx: Record; + forms: Record; + onAction: ( + actionKey: string, + formValues?: Record, + ) => Promise; +} + +function BlockRenderer({ block, ctx, forms, onAction }: BlockProps) { + switch (block.type) { + case "text": + return ; + + case "copy": + return ( + + ); + + case "image": + return ( + + ); + + case "formGroup": + return ( + + ); + + case "attributeTable": + return ; + + case "confirm": + return ( + + ); + + case "secretReveal": + return ( + + ); + + default: + return null; + } +} + +// --------------------------------------------------------------------------- +// Block renderers +// --------------------------------------------------------------------------- + +function TextBlockRenderer({ content }: { content: string }) { + return ( +

{content}

+ ); +} + +/** + * Displays a one-time-visible secret in a destructive-color container. + * After the user copies the value once we dim the warning, but the value + * stays visible until the step changes — losing the clipboard mid-paste + * would otherwise leave the user stuck. + */ +function SecretRevealRenderer({ + label, + value, + warning, + hint, +}: { + label: string; + value: string; + warning: string; + hint?: string; +}) { + const [copied, setCopied] = useState(false); + const [hasCopiedOnce, setHasCopiedOnce] = useState(false); + + const handleCopy = async () => { + if (!value) return; + await navigator.clipboard.writeText(value); + setCopied(true); + setHasCopiedOnce(true); + setTimeout(() => setCopied(false), 2000); + }; + + return ( +
+
+ {label} + +
+ + {value || "—"} + +

+ {warning} +

+ {hint &&

{hint}

} +
+ ); +} + +function FormGroupRenderer({ + block, + forms, + onAction, +}: { + block: import("./types").FormGroupBlock; + forms: Record; + onAction: ( + actionKey: string, + formValues?: Record, + ) => Promise; +}) { + const validForms = block.forms.filter((k) => forms[k]); + + if (block.exclusive && validForms.length > 1) { + return ( + + + {validForms.map((formKey) => ( + + {forms[formKey].title} + + ))} + + {validForms.map((formKey) => ( + + + + ))} + + ); + } + + return ( +
+ {validForms.map((formKey) => ( + + ))} +
+ ); +} + +// --------------------------------------------------------------------------- +// FormRenderer — controlled form with real inputs +// --------------------------------------------------------------------------- + +function FormRenderer({ + formKey, + form, + onAction, +}: { + formKey: string; + form: WizardForm; + onAction: ( + actionKey: string, + formValues?: Record, + ) => Promise; +}) { + const { state, dispatch } = useWizardContext(); + + const savedValues = form.fields.reduce>((acc, f) => { + if (f.id in state.formValues) acc[f.id] = state.formValues[f.id]; + return acc; + }, {}); + + const [values, setValues] = useState>(savedValues); + const [errors, setErrors] = useState>({}); + const [submitting, setSubmitting] = useState(false); + const [succeeded, setSucceeded] = useState(() => Boolean(state.succeededForms[formKey])); + + const setValue = (id: string, v: unknown) => { + setSucceeded(false); + setValues((prev) => ({ ...prev, [id]: v })); + }; + + const validate = (): boolean => { + const next: Record = {}; + for (const field of form.fields) { + const v = values[field.id]; + if (field.required && (v === undefined || v === null || v === "")) { + next[field.id] = `${field.label} is required.`; + } + } + setErrors(next); + return Object.keys(next).length === 0; + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!validate()) return; + setSubmitting(true); + setSucceeded(false); + try { + const ok = await onAction(form.submit.action, values); + if (ok) { + setSucceeded(true); + dispatch({ type: "SAVE_FORM_VALUES", values }); + dispatch({ type: "FORM_SUCCEEDED", formKey }); + } + } finally { + setSubmitting(false); + } + }; + + return ( +
+ {form.description && ( +

{form.description}

+ )} +
+ {form.fields.map((field) => ( + { + setValue(field.id, v); + if (errors[field.id]) + setErrors((prev) => { + const n = { ...prev }; + delete n[field.id]; + return n; + }); + }} + /> + ))} + + {state.error && ( +

+ {state.error} +

+ )} + + {succeeded ? ( +
+ + Validated +
+ ) : ( + + )} + +
+ ); + + // suppress unused var — formKey is used by the parent for tab keys + void formKey; +} + +// --------------------------------------------------------------------------- +// FieldRenderer — dispatches to the right input type +// --------------------------------------------------------------------------- + +function FieldRenderer({ + field, + value, + error, + onChange, +}: { + field: FormField; + value: unknown; + error?: string; + onChange: (v: unknown) => void; +}) { + const baseInput = cn( + "border-border w-full rounded-md border bg-card px-3 py-2 text-base outline-none transition-colors", + "placeholder:text-muted-foreground", + "focus:ring-2 focus:ring-ring focus:ring-offset-1", + error && "border-destructive focus:ring-destructive", + ); + + return ( +
+ + + {field.type === "file" ? ( + + ) : field.type === "textarea" ? ( +