From 6022a76e8cb0967f10b09b06521a8c1572d7970a Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Wed, 21 May 2025 15:48:52 +0200 Subject: [PATCH 1/8] web: Fix issues surrounding availability of controllers during init. web: Fix edgecase where flow does not have brand. --- web/src/admin/AdminInterface/AboutModal.ts | 8 +- .../admin/AdminInterface/index.entrypoint.ts | 16 ++-- web/src/admin/applications/ApplicationForm.ts | 9 +- .../admin/applications/ApplicationListPage.ts | 10 +- .../applications/wizard/ContextIdentity.ts | 2 +- web/src/admin/groups/RelatedUserList.ts | 2 +- web/src/admin/users/UserListPage.ts | 2 +- web/src/common/constants.ts | 1 - web/src/common/errors/network.ts | 24 ++++- web/src/common/theme.ts | 41 +++----- web/src/components/ak-page-navbar.ts | 9 +- .../components/ak-wizard/WizardContexts.ts | 2 +- web/src/elements/AuthenticatedInterface.ts | 12 +++ web/src/elements/AuthentikContexts.ts | 17 ---- web/src/elements/Base.ts | 16 +--- web/src/elements/Interface.ts | 33 +++++++ .../Interface/BrandContextController.ts | 86 ++++++++++------- .../Interface/ConfigContextController.ts | 88 +++++++++++------- .../Interface/EnterpriseContextController.ts | 85 +++++++++++------ web/src/elements/Interface/Interface.ts | 85 ----------------- .../Interface/VersionContextController.ts | 77 +++++++++------ .../Interface/authentikConfigProvider.ts | 17 +++- web/src/elements/Interface/brandProvider.ts | 56 ++++++++--- .../Interface/capabilitiesProvider.ts | 30 ++---- web/src/elements/Interface/index.ts | 4 - .../Interface/licenseSummaryProvider.ts | 11 ++- web/src/elements/Interface/versionProvider.ts | 72 +++++++++----- .../ak-locale-context/ak-locale-context.ts | 2 +- .../ModalOrchestrationController.ts | 93 +++++++++---------- web/src/elements/sidebar/SidebarVersion.ts | 5 +- web/src/elements/types.ts | 17 ++-- web/src/elements/utils/images.ts | 6 +- web/src/flow/FlowExecutor.ts | 58 ++++++------ web/src/rac/index.entrypoint.ts | 14 +-- .../api-browser/index.entrypoint.ts | 20 ++-- .../standalone/loading/index.entrypoint.ts | 16 +++- web/src/stories/interface.ts | 2 +- web/src/user/LibraryApplication/index.ts | 12 ++- web/src/user/LibraryPage/ak-library.ts | 7 +- web/src/user/index.entrypoint.ts | 51 +++++----- .../user/user-settings/UserSettingsPage.ts | 3 +- .../details/UserSettingsFlowExecutor.ts | 8 +- 42 files changed, 614 insertions(+), 515 deletions(-) create mode 100644 web/src/elements/AuthenticatedInterface.ts delete mode 100644 web/src/elements/AuthentikContexts.ts create mode 100644 web/src/elements/Interface.ts delete mode 100644 web/src/elements/Interface/Interface.ts delete mode 100644 web/src/elements/Interface/index.ts diff --git a/web/src/admin/AdminInterface/AboutModal.ts b/web/src/admin/AdminInterface/AboutModal.ts index d5b7e7e71a10..9f6a1434d917 100644 --- a/web/src/admin/AdminInterface/AboutModal.ts +++ b/web/src/admin/AdminInterface/AboutModal.ts @@ -1,9 +1,8 @@ +import { WithLicenseSummary } from "#elements/Interface/licenseSummaryProvider"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { globalAK } from "@goauthentik/common/global"; -import { DefaultBrand } from "@goauthentik/common/ui/config"; import "@goauthentik/elements/EmptyState"; import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; -import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider"; import { ModalButton } from "@goauthentik/elements/buttons/ModalButton"; import { msg } from "@lit/localize"; @@ -57,7 +56,8 @@ export class AboutModal extends WithLicenseSummary(WithBrandConfig(ModalButton)) } renderModal() { - let product = globalAK().brand.brandingTitle || DefaultBrand.brandingTitle; + let product = this.brandingTitle; + if (this.licenseSummary.status !== LicenseSummaryStatusEnum.Unlicensed) { product += ` ${msg("Enterprise")}`; } @@ -73,7 +73,7 @@ export class AboutModal extends WithLicenseSummary(WithBrandConfig(ModalButton))
${msg(
diff --git a/web/src/admin/AdminInterface/index.entrypoint.ts b/web/src/admin/AdminInterface/index.entrypoint.ts index a5196bb8967d..05772fd957c0 100644 --- a/web/src/admin/AdminInterface/index.entrypoint.ts +++ b/web/src/admin/AdminInterface/index.entrypoint.ts @@ -1,9 +1,13 @@ +import "#admin/AdminInterface/AboutModal"; +import type { AboutModal } from "#admin/AdminInterface/AboutModal"; +import { ROUTES } from "#admin/Routes"; import { EVENT_API_DRAWER_TOGGLE, EVENT_NOTIFICATION_DRAWER_TOGGLE } from "#common/constants"; import { configureSentry } from "#common/sentry/index"; import { me } from "#common/users"; import { WebsocketClient } from "#common/ws"; -import { AuthenticatedInterface } from "#elements/Interface/Interface"; -import { WithLicenseSummary } from "#elements/Interface/licenseSummaryProvider"; +import { SidebarToggleEventDetail } from "#components/ak-page-header"; +import { AuthenticatedInterface } from "#elements/AuthenticatedInterface"; +import { WithCapabilitiesConfig } from "#elements/Interface/capabilitiesProvider"; import "#elements/ak-locale-context/ak-locale-context"; import "#elements/banner/EnterpriseStatusBanner"; import "#elements/banner/EnterpriseStatusBanner"; @@ -17,10 +21,6 @@ import { getURLParam, updateURLParams } from "#elements/router/RouteMatch"; import "#elements/router/RouterOutlet"; import "#elements/sidebar/Sidebar"; import "#elements/sidebar/SidebarItem"; -import "@goauthentik/admin/AdminInterface/AboutModal"; -import type { AboutModal } from "@goauthentik/admin/AdminInterface/AboutModal"; -import { ROUTES } from "@goauthentik/admin/Routes"; -import { SidebarToggleEventDetail } from "@goauthentik/components/ak-page-header.js"; import { CSSResult, TemplateResult, css, html, nothing } from "lit"; import { customElement, eventOptions, property, query } from "lit/decorators.js"; @@ -45,7 +45,7 @@ if (process.env.NODE_ENV === "development") { } @customElement("ak-interface-admin") -export class AdminInterface extends WithLicenseSummary(AuthenticatedInterface) { +export class AdminInterface extends WithCapabilitiesConfig(AuthenticatedInterface) { //#region Properties @property({ type: Boolean }) @@ -202,7 +202,7 @@ export class AdminInterface extends WithLicenseSummary(AuthenticatedInterface) { ${renderSidebarItems(AdminSidebarEntries)} - ${this.config?.capabilities.includes(CapabilitiesEnum.IsEnterprise) + ${this.can(CapabilitiesEnum.IsEnterprise) ? renderSidebarItems(AdminSidebarEnterpriseEntries) : nothing} diff --git a/web/src/admin/applications/ApplicationForm.ts b/web/src/admin/applications/ApplicationForm.ts index 957fb4053e89..956e0020f142 100644 --- a/web/src/admin/applications/ApplicationForm.ts +++ b/web/src/admin/applications/ApplicationForm.ts @@ -1,3 +1,4 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/Interface/capabilitiesProvider"; import "@goauthentik/admin/applications/ProviderSelectModal"; import { iconHelperText } from "@goauthentik/admin/helperText"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; @@ -6,18 +7,14 @@ import "@goauthentik/components/ak-radio-input"; import "@goauthentik/components/ak-switch-input"; import "@goauthentik/components/ak-text-input"; import "@goauthentik/components/ak-textarea-input"; -import "@goauthentik/elements/Alert.js"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; +import "@goauthentik/elements/Alert"; import "@goauthentik/elements/forms/FormGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; import "@goauthentik/elements/forms/ModalForm"; import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; import "@goauthentik/elements/forms/ProxyForm"; import "@goauthentik/elements/forms/Radio"; -import "@goauthentik/elements/forms/SearchSelect"; +import "@goauthentik/elements/forms/SearchSelect/ak-search-select"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/applications/ApplicationListPage.ts b/web/src/admin/applications/ApplicationListPage.ts index da60282a18ac..38273c23dfcb 100644 --- a/web/src/admin/applications/ApplicationListPage.ts +++ b/web/src/admin/applications/ApplicationListPage.ts @@ -1,10 +1,10 @@ import "@goauthentik/admin/applications/ApplicationForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import MDApplication from "@goauthentik/docs/add-secure-apps/applications/index.md"; -import "@goauthentik/elements/AppIcon.js"; +import "@goauthentik/elements/AppIcon"; import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; -import "@goauthentik/elements/ak-mdx"; -import "@goauthentik/elements/buttons/SpinnerButton"; +import "@goauthentik/elements/ak-mdx/ak-mdx"; +import "@goauthentik/elements/buttons/SpinnerButton/ak-spinner-button"; import "@goauthentik/elements/forms/DeleteBulkForm"; import "@goauthentik/elements/forms/ModalForm"; import { getURLParam } from "@goauthentik/elements/router/RouteMatch"; @@ -22,7 +22,7 @@ import PFCard from "@patternfly/patternfly/components/Card/card.css"; import { Application, CoreApi, PoliciesApi } from "@goauthentik/api"; -import "./ApplicationWizardHint"; +import "./ApplicationWizardHint.js"; export const applicationListStyle = css` /* Fix alignment issues with images in tables */ @@ -50,7 +50,7 @@ export class ApplicationListPage extends WithBrandConfig(TablePage) } pageDescription(): string { return msg( - str`External applications that use ${this.brand?.brandingTitle ?? "authentik"} as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.`, + str`External applications that use ${this.brandingTitle} as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.`, ); } pageIcon(): string { diff --git a/web/src/admin/applications/wizard/ContextIdentity.ts b/web/src/admin/applications/wizard/ContextIdentity.ts index 260ea726f982..a32d7a83440e 100644 --- a/web/src/admin/applications/wizard/ContextIdentity.ts +++ b/web/src/admin/applications/wizard/ContextIdentity.ts @@ -3,5 +3,5 @@ import { createContext } from "@lit/context"; import { LocalTypeCreate } from "./steps/ProviderChoices.js"; export const applicationWizardProvidersContext = createContext( - Symbol("ak-application-wizard-providers-context"), + Symbol.for("ak-application-wizard-providers-context"), ); diff --git a/web/src/admin/groups/RelatedUserList.ts b/web/src/admin/groups/RelatedUserList.ts index 3942c7a98c4c..99867bdbb2af 100644 --- a/web/src/admin/groups/RelatedUserList.ts +++ b/web/src/admin/groups/RelatedUserList.ts @@ -295,7 +295,7 @@ export class RelatedUserList extends WithBrandConfig(WithCapabilitiesConfig(Tabl ${msg("Set password")} - ${this.brand?.flowRecovery + ${this.brand.flowRecovery ? html` [HTTPStatusCode.Forbidden]: GenericErrorFromJSON, } as const; +//#endregion + +//#region Type Predicates + /** - * Type guard to check if a response contains a JSON body. + * Type predicate to check if a response contains a JSON body. * * This is useful to guard against parsing errors when attempting to read the response body. */ @@ -35,6 +39,24 @@ export function isJSONResponse(response: Response): boolean { return Boolean(response.headers.get("content-type")?.includes("application/json")); } +/** + * An error originating from an aborted request. + * + * @see {@linkcode isAbortError} to check if an error originates from an aborted request. + */ +export interface AbortErrorLike extends DOMException { + name: "AbortError"; +} + +/** + * Type predicate to check if an error originates from an aborted request. + * + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort | MDN} + */ +export function isAbortError(error: unknown): error is AbortErrorLike { + return error instanceof DOMException && error.name === "AbortError"; +} + //#endregion //#region API diff --git a/web/src/common/theme.ts b/web/src/common/theme.ts index bb105f5d16ca..b2e0213f2a54 100644 --- a/web/src/common/theme.ts +++ b/web/src/common/theme.ts @@ -1,14 +1,17 @@ /** * @file Theme utilities. */ -import { type StyleRoot, createStyleSheetUnsafe, setAdoptedStyleSheets } from "#common/stylesheets"; -import { UIConfig } from "#common/ui/config"; +import { + type StyleRoot, + createStyleSheetUnsafe, + setAdoptedStyleSheets, +} from "@goauthentik/common/stylesheets"; import AKBase from "#common/styles/authentik.css"; import AKBaseDark from "#common/styles/theme-dark.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; -import { Config, CurrentBrand, UiThemeEnum } from "@goauthentik/api"; +import { UiThemeEnum } from "@goauthentik/api"; //#region Stylesheet Exports @@ -259,6 +262,8 @@ export function applyUITheme( export function applyDocumentTheme(hint: CSSColorSchemeValue | UIThemeHint = "auto"): void { const preferredColorScheme = formatColorScheme(hint); + if (document.documentElement.dataset.theme === preferredColorScheme) return; + const applyStyleSheets: UIThemeListener = (currentUITheme) => { console.debug(`authentik/theme (document): switching to ${currentUITheme} theme`); @@ -285,36 +290,20 @@ export function applyDocumentTheme(hint: CSSColorSchemeValue | UIThemeHint = "au applyStyleSheets(preferredColorScheme); } -/** - * An element that can be themed. - */ -export interface ThemedElement extends HTMLElement { - /** - * The brand information for the current theme. - */ - readonly brand?: CurrentBrand; - /** - * The UI configuration for the current theme, - * typically injected through a Lit Mixin. - * - * @see {@linkcode UIConfig} for details. - */ - readonly uiConfig?: UIConfig; - /** - * An authentik configuration initially provided by the server. - */ - readonly config?: Config; - activeTheme: ResolvedUITheme; -} - /** * Returns the root interface element of the page. * * @todo Can this be handled with a Lit Mixin? */ -export function rootInterface(): T | null { +export function rootInterface(): T { const element = document.body.querySelector("[data-ak-interface-root]"); + if (!element) { + throw new Error( + `Could not find root interface element. Was this element added before the parent interface element?`, + ); + } + return element; } diff --git a/web/src/components/ak-page-navbar.ts b/web/src/components/ak-page-navbar.ts index 63856fcfc373..140cb4548594 100644 --- a/web/src/components/ak-page-navbar.ts +++ b/web/src/components/ak-page-navbar.ts @@ -1,7 +1,6 @@ -import { EVENT_WS_MESSAGE, TITLE_DEFAULT } from "#common/constants"; +import { EVENT_WS_MESSAGE } from "#common/constants"; import { globalAK } from "#common/global"; import { UIConfig, UserDisplay, getConfigForUser } from "#common/ui/config"; -import { DefaultBrand } from "#common/ui/config"; import { me } from "#common/users"; import "#components/ak-nav-buttons"; import type { PageHeaderInit, SidebarToggleEventDetail } from "#components/ak-page-header"; @@ -290,7 +289,7 @@ export class AKPageNavbar //#region Private Methods #setTitle(header?: string) { - let title = this.brand?.brandingTitle || TITLE_DEFAULT; + let title = this.brandingTitle; if (isAdminRoute()) { title = `${msg("Admin")} - ${title}`; @@ -368,9 +367,7 @@ export class AKPageNavbar @@ -531,7 +527,7 @@ export class FlowExecutor extends Interface implements StageHost { diff --git a/web/src/rac/index.entrypoint.ts b/web/src/rac/index.entrypoint.ts index e8c297bbaa4d..252c85f3930b 100644 --- a/web/src/rac/index.entrypoint.ts +++ b/web/src/rac/index.entrypoint.ts @@ -1,13 +1,13 @@ -import { TITLE_DEFAULT } from "@goauthentik/common/constants"; -import { Interface } from "@goauthentik/elements/Interface"; -import "@goauthentik/elements/LoadingOverlay"; +import { Interface } from "#elements/Interface"; +import { WithBrandConfig } from "#elements/Interface/brandProvider"; +import "#elements/LoadingOverlay"; import Guacamole from "guacamole-common-js"; import { msg, str } from "@lit/localize"; import { CSSResult, TemplateResult, css, html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import AKGlobal from "@goauthentik/common/styles/authentik.css"; +import AKGlobal from "#common/styles/authentik.css"; import PFContent from "@patternfly/patternfly/components/Content/content.css"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; @@ -43,7 +43,7 @@ const RECONNECT_ATTEMPTS_INITIAL = 5; const RECONNECT_ATTEMPTS = 5; @customElement("ak-rac") -export class RacInterface extends Interface { +export class RacInterface extends WithBrandConfig(Interface) { static get styles(): CSSResult[] { return [ PFBase, @@ -231,10 +231,12 @@ export class RacInterface extends Interface { } updateTitle(): void { - let title = this.brand?.brandingTitle || TITLE_DEFAULT; + let title = this.brandingTitle; + if (this.endpointName) { title = `${this.endpointName} - ${title}`; } + document.title = `${title}`; } diff --git a/web/src/standalone/api-browser/index.entrypoint.ts b/web/src/standalone/api-browser/index.entrypoint.ts index 440a5fdc8b18..2d734cbf7cbe 100644 --- a/web/src/standalone/api-browser/index.entrypoint.ts +++ b/web/src/standalone/api-browser/index.entrypoint.ts @@ -1,13 +1,13 @@ // sort-imports-ignore import "rapidoc"; -import "@goauthentik/elements/ak-locale-context/index.js"; +import "#elements/ak-locale-context/index"; -import { CSRFHeaderName } from "@goauthentik/common/api/middleware.js"; -import { EVENT_THEME_CHANGE } from "@goauthentik/common/constants.js"; -import { getCookie } from "@goauthentik/common/utils.js"; -import { Interface } from "@goauthentik/elements/Interface/Interface.js"; -import { DefaultBrand } from "@goauthentik/common/ui/config.js"; -import { themeImage } from "@goauthentik/elements/utils/images.js"; +import { CSRFHeaderName } from "#common/api/middleware"; +import { EVENT_THEME_CHANGE } from "#common/constants"; +import { getCookie } from "#common/utils"; +import { Interface } from "#elements/Interface"; +import { WithBrandConfig } from "#elements/Interface/brandProvider"; +import { themeImage } from "#elements/utils/images"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, css, html } from "lit"; @@ -17,7 +17,7 @@ import { ifDefined } from "lit/directives/if-defined.js"; import { UiThemeEnum } from "@goauthentik/api"; @customElement("ak-api-browser") -export class APIBrowser extends Interface { +export class APIBrowser extends WithBrandConfig(Interface) { @property() schemaPath?: string; @@ -102,9 +102,7 @@ export class APIBrowser extends Interface { diff --git a/web/src/standalone/loading/index.entrypoint.ts b/web/src/standalone/loading/index.entrypoint.ts index 0748c5638c36..d5212826da9a 100644 --- a/web/src/standalone/loading/index.entrypoint.ts +++ b/web/src/standalone/loading/index.entrypoint.ts @@ -1,4 +1,6 @@ -import { LightInterface } from "@goauthentik/elements/Interface"; +import { globalAK } from "#common/global"; +import { applyDocumentTheme } from "#common/theme"; +import { AKElement } from "#elements/Base"; import { msg } from "@lit/localize"; import { TemplateResult, css, html } from "lit"; @@ -10,7 +12,7 @@ import PFSpinner from "@patternfly/patternfly/components/Spinner/spinner.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; @customElement("ak-loading") -export class Loading extends LightInterface { +export class Loading extends AKElement { static styles = [ PFBase, PFPage, @@ -23,6 +25,16 @@ export class Loading extends LightInterface { `, ]; + constructor() { + super(); + + applyDocumentTheme(globalAK().brand.uiTheme); + } + + public connectedCallback(): void { + this.dataset.akInterfaceRoot = this.tagName.toLowerCase(); + } + render(): TemplateResult { return html`
()?.me; + const { me, uiConfig } = rootInterface(); return html`
${application.metaPublisher}
${truncateWords(application.metaDescription || "", 10)} - ${rootInterface()?.uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser + ${uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser ? html`
`; } - const me = rootInterface()?.me; + const { me, uiConfig } = rootInterface(); + const expandable = - (rootInterface()?.uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser) || + (uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser) || this.application.metaPublisher !== "" || this.application.metaDescription !== ""; diff --git a/web/src/user/LibraryPage/ak-library.ts b/web/src/user/LibraryPage/ak-library.ts index 378826089d76..458d3cc731d8 100644 --- a/web/src/user/LibraryPage/ak-library.ts +++ b/web/src/user/LibraryPage/ak-library.ts @@ -1,7 +1,9 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { rootInterface } from "@goauthentik/common/theme"; import { me } from "@goauthentik/common/users"; -import { AKElement, rootInterface } from "@goauthentik/elements/Base"; +import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/EmptyState"; +import type { UserInterface } from "@goauthentik/user/index.entrypoint"; import { localized, msg } from "@lit/localize"; import { html } from "lit"; @@ -47,7 +49,8 @@ export class LibraryPage extends AKElement { constructor() { super(); - const uiConfig = rootInterface()?.uiConfig; + const { uiConfig } = rootInterface(); + if (!uiConfig) { throw new Error("Could not retrieve uiConfig. Reason: unknown. Check logs."); } diff --git a/web/src/user/index.entrypoint.ts b/web/src/user/index.entrypoint.ts index 5bc8721fe40a..3c6d0e0cb159 100644 --- a/web/src/user/index.entrypoint.ts +++ b/web/src/user/index.entrypoint.ts @@ -11,11 +11,12 @@ import { DefaultBrand } from "@goauthentik/common/ui/config"; import { me } from "@goauthentik/common/users"; import { WebsocketClient } from "@goauthentik/common/ws"; import "@goauthentik/components/ak-nav-buttons"; +import { AuthenticatedInterface } from "@goauthentik/elements/AuthenticatedInterface"; import { AKElement } from "@goauthentik/elements/Base"; -import { AuthenticatedInterface } from "@goauthentik/elements/Interface"; -import "@goauthentik/elements/ak-locale-context"; +import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; +import "@goauthentik/elements/ak-locale-context/ak-locale-context"; import "@goauthentik/elements/banner/EnterpriseStatusBanner"; -import "@goauthentik/elements/buttons/ActionButton"; +import "@goauthentik/elements/buttons/ActionButton/ak-action-button"; import "@goauthentik/elements/messages/MessageContainer"; import "@goauthentik/elements/notifications/APIDrawer"; import "@goauthentik/elements/notifications/NotificationDrawer"; @@ -41,7 +42,7 @@ import PFPage from "@patternfly/patternfly/components/Page/page.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css"; -import { CurrentBrand, EventsApi, SessionUser } from "@goauthentik/api"; +import { EventsApi, SessionUser } from "@goauthentik/api"; if (process.env.NODE_ENV === "development") { await import("@goauthentik/esbuild-plugin-live-reload/client"); @@ -117,21 +118,19 @@ const customStyles = css` @customElement("ak-interface-user-presentation") // @ts-ignore -class UserInterfacePresentation extends AKElement { - static get styles() { - return [ - PFBase, - PFDisplay, - PFBrand, - PFPage, - PFAvatar, - PFButton, - PFDrawer, - PFDropdown, - PFNotificationBadge, - customStyles, - ]; - } +class UserInterfacePresentation extends WithBrandConfig(AKElement) { + static styles = [ + PFBase, + PFDisplay, + PFBrand, + PFPage, + PFAvatar, + PFButton, + PFDrawer, + PFDropdown, + PFNotificationBadge, + customStyles, + ]; @property({ type: Object }) uiConfig!: UIConfig; @@ -148,9 +147,6 @@ class UserInterfacePresentation extends AKElement { @property({ type: Number }) notificationsCount = 0; - @property({ type: Object }) - brand!: CurrentBrand; - get canAccessAdmin() { return ( this.me.user.isSuperuser || @@ -206,8 +202,8 @@ class UserInterfacePresentation extends AKElement { ${this.brand.brandingTitle} @@ -265,7 +261,7 @@ class UserInterfacePresentation extends AKElement { // // @customElement("ak-interface-user") -export class UserInterface extends AuthenticatedInterface { +export class UserInterface extends WithBrandConfig(AuthenticatedInterface) { @property({ type: Boolean }) notificationDrawerOpen = getURLParam("notificationDrawerOpen", false); @@ -278,7 +274,10 @@ export class UserInterface extends AuthenticatedInterface { notificationsCount = 0; @state() - me?: SessionUser; + me: SessionUser | null = null; + + @state() + uiConfig: UIConfig | null = null; constructor() { configureSentry(true); diff --git a/web/src/user/user-settings/UserSettingsPage.ts b/web/src/user/user-settings/UserSettingsPage.ts index 038cfcf3b15b..126bbd23304f 100644 --- a/web/src/user/user-settings/UserSettingsPage.ts +++ b/web/src/user/user-settings/UserSettingsPage.ts @@ -1,6 +1,7 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; -import { AKElement, rootInterface } from "@goauthentik/elements/Base"; +import { rootInterface } from "@goauthentik/common/theme"; +import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/user/SessionList"; import "@goauthentik/elements/user/UserConsentList"; diff --git a/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts b/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts index c8bdbc6e40f6..78b8c3721537 100644 --- a/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts +++ b/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts @@ -92,10 +92,10 @@ export class UserSettingsFlowExecutor updated(changedProperties: PropertyValues): void { if (changedProperties.has("brand") && this.brand) { - this.flowSlug = this.brand?.flowUserSettings; - if (!this.flowSlug) { - return; - } + this.flowSlug = this.brand.flowUserSettings; + + if (!this.flowSlug) return; + this.nextChallenge(); } } From d9d9bbec36898d1641fd9119dcae2b27713c2427 Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Sat, 24 May 2025 20:22:12 +0200 Subject: [PATCH 2/8] web: Fix import path. --- web/src/common/theme.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/web/src/common/theme.ts b/web/src/common/theme.ts index b2e0213f2a54..1d9b66599adb 100644 --- a/web/src/common/theme.ts +++ b/web/src/common/theme.ts @@ -1,11 +1,7 @@ /** * @file Theme utilities. */ -import { - type StyleRoot, - createStyleSheetUnsafe, - setAdoptedStyleSheets, -} from "@goauthentik/common/stylesheets"; +import { type StyleRoot, createStyleSheetUnsafe, setAdoptedStyleSheets } from "#common/stylesheets"; import AKBase from "#common/styles/authentik.css"; import AKBaseDark from "#common/styles/theme-dark.css"; From f75e3d08a75f517819d9627a8e9b502a49abab4f Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Mon, 26 May 2025 12:16:11 +0200 Subject: [PATCH 3/8] web: Clean up mixin/controller paths. --- web/src/admin/AdminInterface/AboutModal.ts | 4 +- .../admin/AdminInterface/index.entrypoint.ts | 2 +- .../admin/admin-overview/AdminOverviewPage.ts | 2 +- web/src/admin/applications/ApplicationForm.ts | 2 +- .../admin/applications/ApplicationListPage.ts | 2 +- ...application-wizard-provider-choice-step.ts | 2 +- ...ak-application-wizard-provider-for-ldap.ts | 2 +- ...-application-wizard-provider-for-radius.ts | 2 +- web/src/admin/common/ak-license-notice.ts | 2 +- web/src/admin/flows/FlowForm.ts | 5 +- web/src/admin/groups/RelatedUserList.ts | 7 +-- .../admin/providers/ldap/LDAPProviderForm.ts | 2 +- .../providers/radius/RadiusProviderForm.ts | 2 +- .../sources/kerberos/KerberosSourceForm.ts | 5 +- .../admin/sources/oauth/OAuthSourceForm.ts | 5 +- web/src/admin/sources/plex/PlexSourceForm.ts | 5 +- web/src/admin/sources/saml/SAMLSourceForm.ts | 5 +- web/src/admin/users/UserListPage.ts | 7 +-- web/src/admin/users/UserViewPage.ts | 2 +- web/src/components/ak-page-navbar.ts | 2 +- web/src/elements/AuthenticatedInterface.ts | 4 +- web/src/elements/Interface.ts | 6 +-- .../ak-locale-context/ak-locale-context.ts | 2 +- .../elements/banner/EnterpriseStatusBanner.ts | 2 +- web/src/elements/banner/VersionBanner.ts | 2 +- .../BrandContextController.ts | 2 +- .../ConfigContextController.ts | 10 ++-- .../EnterpriseContextController.ts | 10 ++-- .../VersionContextController.ts | 13 +++-- .../brandProvider.ts => mixins/branding.ts} | 0 .../capabilities.ts} | 2 +- .../config.ts} | 0 .../license.ts} | 0 .../versionProvider.ts => mixins/version.ts} | 0 web/src/elements/sidebar/SidebarVersion.ts | 4 +- .../elements/wizard/TypeCreateWizardPage.ts | 2 +- web/src/flow/FlowExecutor.ts | 4 +- web/src/flow/stages/prompt/PromptStage.ts | 5 +- web/src/rac/index.entrypoint.ts | 2 +- .../api-browser/index.entrypoint.ts | 2 +- web/src/user/index.entrypoint.ts | 48 +++++++++---------- .../details/UserSettingsFlowExecutor.ts | 26 +++++----- 42 files changed, 92 insertions(+), 121 deletions(-) rename web/src/elements/{Interface => controllers}/BrandContextController.ts (96%) rename web/src/elements/{Interface => controllers}/ConfigContextController.ts (88%) rename web/src/elements/{Interface => controllers}/EnterpriseContextController.ts (86%) rename web/src/elements/{Interface => controllers}/VersionContextController.ts (82%) rename web/src/elements/{Interface/brandProvider.ts => mixins/branding.ts} (100%) rename web/src/elements/{Interface/capabilitiesProvider.ts => mixins/capabilities.ts} (95%) rename web/src/elements/{Interface/authentikConfigProvider.ts => mixins/config.ts} (100%) rename web/src/elements/{Interface/licenseSummaryProvider.ts => mixins/license.ts} (100%) rename web/src/elements/{Interface/versionProvider.ts => mixins/version.ts} (100%) diff --git a/web/src/admin/AdminInterface/AboutModal.ts b/web/src/admin/AdminInterface/AboutModal.ts index 9f6a1434d917..d9b783cf5eb5 100644 --- a/web/src/admin/AdminInterface/AboutModal.ts +++ b/web/src/admin/AdminInterface/AboutModal.ts @@ -1,8 +1,8 @@ -import { WithLicenseSummary } from "#elements/Interface/licenseSummaryProvider"; +import { WithBrandConfig } from "#elements/mixins/branding"; +import { WithLicenseSummary } from "#elements/mixins/license"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { globalAK } from "@goauthentik/common/global"; import "@goauthentik/elements/EmptyState"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; import { ModalButton } from "@goauthentik/elements/buttons/ModalButton"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/AdminInterface/index.entrypoint.ts b/web/src/admin/AdminInterface/index.entrypoint.ts index 05772fd957c0..f461a052300d 100644 --- a/web/src/admin/AdminInterface/index.entrypoint.ts +++ b/web/src/admin/AdminInterface/index.entrypoint.ts @@ -7,7 +7,6 @@ import { me } from "#common/users"; import { WebsocketClient } from "#common/ws"; import { SidebarToggleEventDetail } from "#components/ak-page-header"; import { AuthenticatedInterface } from "#elements/AuthenticatedInterface"; -import { WithCapabilitiesConfig } from "#elements/Interface/capabilitiesProvider"; import "#elements/ak-locale-context/ak-locale-context"; import "#elements/banner/EnterpriseStatusBanner"; import "#elements/banner/EnterpriseStatusBanner"; @@ -15,6 +14,7 @@ import "#elements/banner/VersionBanner"; import "#elements/banner/VersionBanner"; import "#elements/messages/MessageContainer"; import "#elements/messages/MessageContainer"; +import { WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "#elements/notifications/APIDrawer"; import "#elements/notifications/NotificationDrawer"; import { getURLParam, updateURLParams } from "#elements/router/RouteMatch"; diff --git a/web/src/admin/admin-overview/AdminOverviewPage.ts b/web/src/admin/admin-overview/AdminOverviewPage.ts index 5ba4ce6b9bb1..bb114d1aef0c 100644 --- a/web/src/admin/admin-overview/AdminOverviewPage.ts +++ b/web/src/admin/admin-overview/AdminOverviewPage.ts @@ -11,10 +11,10 @@ import "#admin/admin-overview/charts/SyncStatusChart"; import { me } from "#common/users"; import "#components/ak-page-header"; import { AKElement } from "#elements/Base"; -import { WithLicenseSummary } from "#elements/Interface/licenseSummaryProvider"; import "#elements/cards/AggregatePromiseCard"; import type { QuickAction } from "#elements/cards/QuickActionsCard"; import "#elements/cards/QuickActionsCard"; +import { WithLicenseSummary } from "#elements/mixins/license"; import { paramURL } from "#elements/router/RouterOutlet"; import { createReleaseNotesURL } from "@goauthentik/core/version"; diff --git a/web/src/admin/applications/ApplicationForm.ts b/web/src/admin/applications/ApplicationForm.ts index 956e0020f142..00d77fcf5891 100644 --- a/web/src/admin/applications/ApplicationForm.ts +++ b/web/src/admin/applications/ApplicationForm.ts @@ -1,4 +1,4 @@ -import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/Interface/capabilitiesProvider"; +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/admin/applications/ProviderSelectModal"; import { iconHelperText } from "@goauthentik/admin/helperText"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; diff --git a/web/src/admin/applications/ApplicationListPage.ts b/web/src/admin/applications/ApplicationListPage.ts index 38273c23dfcb..24495761bc52 100644 --- a/web/src/admin/applications/ApplicationListPage.ts +++ b/web/src/admin/applications/ApplicationListPage.ts @@ -1,8 +1,8 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; import "@goauthentik/admin/applications/ApplicationForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import MDApplication from "@goauthentik/docs/add-secure-apps/applications/index.md"; import "@goauthentik/elements/AppIcon"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; import "@goauthentik/elements/ak-mdx/ak-mdx"; import "@goauthentik/elements/buttons/SpinnerButton/ak-spinner-button"; import "@goauthentik/elements/forms/DeleteBulkForm"; diff --git a/web/src/admin/applications/wizard/steps/ak-application-wizard-provider-choice-step.ts b/web/src/admin/applications/wizard/steps/ak-application-wizard-provider-choice-step.ts index 140a0f9b969b..cec9695126c1 100644 --- a/web/src/admin/applications/wizard/steps/ak-application-wizard-provider-choice-step.ts +++ b/web/src/admin/applications/wizard/steps/ak-application-wizard-provider-choice-step.ts @@ -1,8 +1,8 @@ +import { WithLicenseSummary } from "#elements/mixins/license"; import { ApplicationWizardStep } from "@goauthentik/admin/applications/wizard/ApplicationWizardStep.js"; import "@goauthentik/admin/applications/wizard/ak-wizard-title.js"; import type { NavigableButton, WizardButton } from "@goauthentik/components/ak-wizard/types"; import "@goauthentik/elements/EmptyState.js"; -import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider.js"; import { bound } from "@goauthentik/elements/decorators/bound.js"; import "@goauthentik/elements/forms/FormGroup.js"; import "@goauthentik/elements/forms/HorizontalFormElement.js"; diff --git a/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-ldap.ts b/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-ldap.ts index b83c3ab3d7e6..fbde2a86cb9d 100644 --- a/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-ldap.ts +++ b/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-ldap.ts @@ -1,7 +1,7 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; import "@goauthentik/admin/applications/wizard/ak-wizard-title.js"; import { ValidationRecord } from "@goauthentik/admin/applications/wizard/types"; import { renderForm } from "@goauthentik/admin/providers/ldap/LDAPProviderFormForm.js"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider.js"; import { msg } from "@lit/localize"; import { html } from "lit"; diff --git a/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-radius.ts b/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-radius.ts index bac20f2f19b7..5c045a213202 100644 --- a/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-radius.ts +++ b/web/src/admin/applications/wizard/steps/providers/ak-application-wizard-provider-for-radius.ts @@ -1,7 +1,7 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; import "@goauthentik/admin/applications/wizard/ak-wizard-title.js"; import { ValidationRecord } from "@goauthentik/admin/applications/wizard/types"; import { renderForm } from "@goauthentik/admin/providers/radius/RadiusProviderFormForm.js"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; import { msg } from "@lit/localize"; import { customElement } from "@lit/reactive-element/decorators.js"; diff --git a/web/src/admin/common/ak-license-notice.ts b/web/src/admin/common/ak-license-notice.ts index 117d2852addd..2fbc15710a66 100644 --- a/web/src/admin/common/ak-license-notice.ts +++ b/web/src/admin/common/ak-license-notice.ts @@ -1,6 +1,6 @@ +import { WithLicenseSummary } from "#elements/mixins/license"; import "@goauthentik/elements/Alert"; import { AKElement } from "@goauthentik/elements/Base"; -import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider"; import { msg } from "@lit/localize"; import { html, nothing } from "lit"; diff --git a/web/src/admin/flows/FlowForm.ts b/web/src/admin/flows/FlowForm.ts index 1696f07cfe2c..35dac2554b7c 100644 --- a/web/src/admin/flows/FlowForm.ts +++ b/web/src/admin/flows/FlowForm.ts @@ -1,10 +1,7 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import { DesignationToLabel, LayoutToLabel } from "@goauthentik/admin/flows/utils"; import { AuthenticationEnum } from "@goauthentik/api/dist/models/AuthenticationEnum"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/forms/FormGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; diff --git a/web/src/admin/groups/RelatedUserList.ts b/web/src/admin/groups/RelatedUserList.ts index 99867bdbb2af..8c4b15162578 100644 --- a/web/src/admin/groups/RelatedUserList.ts +++ b/web/src/admin/groups/RelatedUserList.ts @@ -1,3 +1,5 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/admin/users/ServiceAccountForm"; import "@goauthentik/admin/users/UserActiveForm"; import "@goauthentik/admin/users/UserForm"; @@ -11,11 +13,6 @@ import { MessageLevel } from "@goauthentik/common/messages"; import { formatElapsedTime } from "@goauthentik/common/temporal"; import { me } from "@goauthentik/common/users"; import "@goauthentik/components/ak-status-label"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/Dropdown"; import "@goauthentik/elements/forms/DeleteBulkForm"; diff --git a/web/src/admin/providers/ldap/LDAPProviderForm.ts b/web/src/admin/providers/ldap/LDAPProviderForm.ts index e91d51ef9b3e..08bca515ccff 100644 --- a/web/src/admin/providers/ldap/LDAPProviderForm.ts +++ b/web/src/admin/providers/ldap/LDAPProviderForm.ts @@ -1,8 +1,8 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; import "@goauthentik/admin/common/ak-crypto-certificate-search"; import "@goauthentik/admin/common/ak-flow-search/ak-branded-flow-search"; import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; import { customElement } from "lit/decorators.js"; diff --git a/web/src/admin/providers/radius/RadiusProviderForm.ts b/web/src/admin/providers/radius/RadiusProviderForm.ts index 69fc12cdcc07..ea810602fef2 100644 --- a/web/src/admin/providers/radius/RadiusProviderForm.ts +++ b/web/src/admin/providers/radius/RadiusProviderForm.ts @@ -1,6 +1,6 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; import { customElement } from "lit/decorators.js"; diff --git a/web/src/admin/sources/kerberos/KerberosSourceForm.ts b/web/src/admin/sources/kerberos/KerberosSourceForm.ts index 4ec18ed670fa..2aeaeaead808 100644 --- a/web/src/admin/sources/kerberos/KerberosSourceForm.ts +++ b/web/src/admin/sources/kerberos/KerberosSourceForm.ts @@ -1,3 +1,4 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/admin/common/ak-flow-search/ak-source-flow-search"; import { iconHelperText, placeholderHelperText } from "@goauthentik/admin/helperText"; import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm"; @@ -9,10 +10,6 @@ import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config"; import "@goauthentik/components/ak-switch-input"; import "@goauthentik/components/ak-text-input"; import "@goauthentik/components/ak-textarea-input"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js"; import "@goauthentik/elements/forms/FormGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; diff --git a/web/src/admin/sources/oauth/OAuthSourceForm.ts b/web/src/admin/sources/oauth/OAuthSourceForm.ts index e1811c6840bd..6ac3b1824e8c 100644 --- a/web/src/admin/sources/oauth/OAuthSourceForm.ts +++ b/web/src/admin/sources/oauth/OAuthSourceForm.ts @@ -1,3 +1,4 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/admin/common/ak-flow-search/ak-source-flow-search"; import { iconHelperText, placeholderHelperText } from "@goauthentik/admin/helperText"; import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm"; @@ -9,10 +10,6 @@ import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config"; import "@goauthentik/components/ak-radio-input"; import "@goauthentik/elements/CodeMirror"; import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js"; import "@goauthentik/elements/forms/FormGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; diff --git a/web/src/admin/sources/plex/PlexSourceForm.ts b/web/src/admin/sources/plex/PlexSourceForm.ts index a74e991277f4..34bbbd54469a 100644 --- a/web/src/admin/sources/plex/PlexSourceForm.ts +++ b/web/src/admin/sources/plex/PlexSourceForm.ts @@ -1,3 +1,4 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/admin/common/ak-flow-search/ak-source-flow-search"; import { iconHelperText, placeholderHelperText } from "@goauthentik/admin/helperText"; import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm"; @@ -8,10 +9,6 @@ import { import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { PlexAPIClient, PlexResource, popupCenterScreen } from "@goauthentik/common/helpers/plex"; import { ascii_letters, digits, randomString } from "@goauthentik/common/utils"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-provider.js"; diff --git a/web/src/admin/sources/saml/SAMLSourceForm.ts b/web/src/admin/sources/saml/SAMLSourceForm.ts index 7ceccdddab75..e6f79372666c 100644 --- a/web/src/admin/sources/saml/SAMLSourceForm.ts +++ b/web/src/admin/sources/saml/SAMLSourceForm.ts @@ -1,3 +1,4 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/admin/common/ak-crypto-certificate-search"; import "@goauthentik/admin/common/ak-flow-search/ak-source-flow-search"; import { iconHelperText, placeholderHelperText } from "@goauthentik/admin/helperText"; @@ -7,10 +8,6 @@ import { UserMatchingModeToLabel, } from "@goauthentik/admin/sources/oauth/utils"; import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js"; import "@goauthentik/elements/forms/FormGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; diff --git a/web/src/admin/users/UserListPage.ts b/web/src/admin/users/UserListPage.ts index 9a9c26d9e90c..0d575226c54f 100644 --- a/web/src/admin/users/UserListPage.ts +++ b/web/src/admin/users/UserListPage.ts @@ -1,3 +1,5 @@ +import { WithBrandConfig } from "#elements/mixins/branding"; +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import type { AdminInterface } from "@goauthentik/admin/AdminInterface/index.entrypoint.js"; import "@goauthentik/admin/users/ServiceAccountForm"; import "@goauthentik/admin/users/UserActiveForm"; @@ -15,11 +17,6 @@ import { rootInterface } from "@goauthentik/common/theme"; import { DefaultUIConfig, uiConfig } from "@goauthentik/common/ui/config"; import { me } from "@goauthentik/common/users"; import "@goauthentik/components/ak-status-label"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import "@goauthentik/elements/TreeView"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/forms/DeleteBulkForm"; diff --git a/web/src/admin/users/UserViewPage.ts b/web/src/admin/users/UserViewPage.ts index 1629c34e1d3d..6eba148926d7 100644 --- a/web/src/admin/users/UserViewPage.ts +++ b/web/src/admin/users/UserViewPage.ts @@ -22,11 +22,11 @@ import "#components/events/ObjectChangelog"; import "#components/events/UserEvents"; import { AKElement } from "#elements/Base"; import "#elements/CodeMirror"; -import { WithCapabilitiesConfig } from "#elements/Interface/capabilitiesProvider"; import "#elements/Tabs"; import "#elements/buttons/ActionButton/ak-action-button"; import "#elements/buttons/SpinnerButton/ak-spinner-button"; import "#elements/forms/ModalForm"; +import { WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "#elements/oauth/UserAccessTokenList"; import "#elements/oauth/UserRefreshTokenList"; import "#elements/user/SessionList"; diff --git a/web/src/components/ak-page-navbar.ts b/web/src/components/ak-page-navbar.ts index 140cb4548594..99a519f8b504 100644 --- a/web/src/components/ak-page-navbar.ts +++ b/web/src/components/ak-page-navbar.ts @@ -5,7 +5,7 @@ import { me } from "#common/users"; import "#components/ak-nav-buttons"; import type { PageHeaderInit, SidebarToggleEventDetail } from "#components/ak-page-header"; import { AKElement } from "#elements/Base"; -import { WithBrandConfig } from "#elements/Interface/brandProvider"; +import { WithBrandConfig } from "#elements/mixins/branding"; import { isAdminRoute } from "#elements/router/utils"; import { themeImage } from "#elements/utils/images"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; diff --git a/web/src/elements/AuthenticatedInterface.ts b/web/src/elements/AuthenticatedInterface.ts index 6f73d28ff53c..3093b3d91c98 100644 --- a/web/src/elements/AuthenticatedInterface.ts +++ b/web/src/elements/AuthenticatedInterface.ts @@ -1,6 +1,6 @@ import { Interface } from "#elements/Interface"; -import { LicenseContextController } from "#elements/Interface/EnterpriseContextController"; -import { VersionContextController } from "#elements/Interface/VersionContextController"; +import { LicenseContextController } from "#elements/controllers/EnterpriseContextController"; +import { VersionContextController } from "#elements/controllers/VersionContextController"; export class AuthenticatedInterface extends Interface { constructor() { diff --git a/web/src/elements/Interface.ts b/web/src/elements/Interface.ts index 1e2717b98cdb..f9f8da6d86fd 100644 --- a/web/src/elements/Interface.ts +++ b/web/src/elements/Interface.ts @@ -1,10 +1,10 @@ import { globalAK } from "#common/global"; import { applyDocumentTheme } from "#common/theme"; import { AKElement } from "#elements/Base"; -import { BrandingContextController } from "#elements/Interface/BrandContextController"; -import { ConfigContextController } from "#elements/Interface/ConfigContextController"; -import { WithAuthentikConfig } from "#elements/Interface/authentikConfigProvider"; +import { BrandingContextController } from "#elements/controllers/BrandContextController"; +import { ConfigContextController } from "#elements/controllers/ConfigContextController"; import { ModalOrchestrationController } from "#elements/controllers/ModalOrchestrationController"; +import { WithAuthentikConfig } from "#elements/mixins/config"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; diff --git a/web/src/elements/ak-locale-context/ak-locale-context.ts b/web/src/elements/ak-locale-context/ak-locale-context.ts index 318eeba68b04..900ccd384137 100644 --- a/web/src/elements/ak-locale-context/ak-locale-context.ts +++ b/web/src/elements/ak-locale-context/ak-locale-context.ts @@ -5,7 +5,7 @@ import { customEvent } from "@goauthentik/elements/utils/customEvents"; import { html } from "lit"; import { customElement, property } from "lit/decorators.js"; -import { WithBrandConfig } from "../Interface/brandProvider"; +import { WithBrandConfig } from "../mixins/branding"; import { initializeLocalization } from "./configureLocale"; import type { LocaleGetter, LocaleSetter } from "./configureLocale"; import { DEFAULT_LOCALE, autoDetectLanguage, getBestMatchLocale } from "./helpers"; diff --git a/web/src/elements/banner/EnterpriseStatusBanner.ts b/web/src/elements/banner/EnterpriseStatusBanner.ts index 7a7d36208ac7..a8e037e5a1f3 100644 --- a/web/src/elements/banner/EnterpriseStatusBanner.ts +++ b/web/src/elements/banner/EnterpriseStatusBanner.ts @@ -1,6 +1,6 @@ +import { WithLicenseSummary } from "#elements/mixins/license"; import { globalAK } from "@goauthentik/common/global"; import { AKElement } from "@goauthentik/elements/Base"; -import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider"; import { msg } from "@lit/localize"; import { html, nothing } from "lit"; diff --git a/web/src/elements/banner/VersionBanner.ts b/web/src/elements/banner/VersionBanner.ts index a5cb651118e0..9dc79f43f469 100644 --- a/web/src/elements/banner/VersionBanner.ts +++ b/web/src/elements/banner/VersionBanner.ts @@ -1,5 +1,5 @@ +import { WithVersion } from "#elements/mixins/version"; import { AKElement } from "@goauthentik/elements/Base"; -import { WithVersion } from "@goauthentik/elements/Interface/versionProvider"; import { msg, str } from "@lit/localize"; import { html, nothing } from "lit"; diff --git a/web/src/elements/Interface/BrandContextController.ts b/web/src/elements/controllers/BrandContextController.ts similarity index 96% rename from web/src/elements/Interface/BrandContextController.ts rename to web/src/elements/controllers/BrandContextController.ts index 9933ec5f1e94..4a36758548ea 100644 --- a/web/src/elements/Interface/BrandContextController.ts +++ b/web/src/elements/controllers/BrandContextController.ts @@ -1,7 +1,7 @@ import { DEFAULT_CONFIG } from "#common/api/config"; import { EVENT_REFRESH } from "#common/constants"; import { isAbortError } from "#common/errors/network"; -import { BrandingContext, BrandingMixin } from "#elements/Interface/brandProvider"; +import { BrandingContext, BrandingMixin } from "#elements/mixins/branding"; import type { ReactiveElementHost } from "#elements/types"; import { Context, ContextProvider } from "@lit/context"; diff --git a/web/src/elements/Interface/ConfigContextController.ts b/web/src/elements/controllers/ConfigContextController.ts similarity index 88% rename from web/src/elements/Interface/ConfigContextController.ts rename to web/src/elements/controllers/ConfigContextController.ts index 107233094820..0f4539709707 100644 --- a/web/src/elements/Interface/ConfigContextController.ts +++ b/web/src/elements/controllers/ConfigContextController.ts @@ -1,8 +1,8 @@ -import { AKConfigMixin, AuthentikConfigContext } from "#elements/Interface/authentikConfigProvider"; -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { EVENT_REFRESH } from "@goauthentik/common/constants"; -import { isAbortError } from "@goauthentik/common/errors/network"; -import type { ReactiveElementHost } from "@goauthentik/elements/types"; +import { DEFAULT_CONFIG } from "#common/api/config"; +import { EVENT_REFRESH } from "#common/constants"; +import { isAbortError } from "#common/errors/network"; +import { AKConfigMixin, AuthentikConfigContext } from "#elements/mixins/config"; +import type { ReactiveElementHost } from "#elements/types"; import { Context, ContextProvider } from "@lit/context"; import type { ReactiveController } from "lit"; diff --git a/web/src/elements/Interface/EnterpriseContextController.ts b/web/src/elements/controllers/EnterpriseContextController.ts similarity index 86% rename from web/src/elements/Interface/EnterpriseContextController.ts rename to web/src/elements/controllers/EnterpriseContextController.ts index 513d36bb88dc..bc4ef9e08eb1 100644 --- a/web/src/elements/Interface/EnterpriseContextController.ts +++ b/web/src/elements/controllers/EnterpriseContextController.ts @@ -1,8 +1,8 @@ -import { LicenseContext, LicenseMixin } from "#elements/Interface/licenseSummaryProvider"; -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { EVENT_REFRESH_ENTERPRISE } from "@goauthentik/common/constants"; -import { isAbortError } from "@goauthentik/common/errors/network"; -import type { ReactiveElementHost } from "@goauthentik/elements/types"; +import { DEFAULT_CONFIG } from "#common/api/config"; +import { EVENT_REFRESH_ENTERPRISE } from "#common/constants"; +import { isAbortError } from "#common/errors/network"; +import { LicenseContext, LicenseMixin } from "#elements/mixins/license"; +import type { ReactiveElementHost } from "#elements/types"; import { Context, ContextProvider } from "@lit/context"; import type { ReactiveController } from "lit"; diff --git a/web/src/elements/Interface/VersionContextController.ts b/web/src/elements/controllers/VersionContextController.ts similarity index 82% rename from web/src/elements/Interface/VersionContextController.ts rename to web/src/elements/controllers/VersionContextController.ts index 09ae20a80e9c..6b1dc6a4727f 100644 --- a/web/src/elements/Interface/VersionContextController.ts +++ b/web/src/elements/controllers/VersionContextController.ts @@ -1,14 +1,13 @@ -import { VersionContext, VersionMixin } from "#elements/Interface/versionProvider"; -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { EVENT_REFRESH } from "@goauthentik/common/constants"; -import { isAbortError } from "@goauthentik/common/errors/network"; -import type { ReactiveElementHost } from "@goauthentik/elements/types"; +import { DEFAULT_CONFIG } from "#common/api/config"; +import { EVENT_REFRESH } from "#common/constants"; +import { isAbortError } from "#common/errors/network"; +import { VersionContext, VersionMixin } from "#elements/mixins/version"; +import type { ReactiveElementHost } from "#elements/types"; import { Context, ContextProvider } from "@lit/context"; import type { ReactiveController } from "lit"; -import type { Version } from "@goauthentik/api"; -import { AdminApi } from "@goauthentik/api"; +import { AdminApi, Version } from "@goauthentik/api"; export class VersionContextController implements ReactiveController { #log = console.debug.bind(console, `authentik/controller/version`); diff --git a/web/src/elements/Interface/brandProvider.ts b/web/src/elements/mixins/branding.ts similarity index 100% rename from web/src/elements/Interface/brandProvider.ts rename to web/src/elements/mixins/branding.ts diff --git a/web/src/elements/Interface/capabilitiesProvider.ts b/web/src/elements/mixins/capabilities.ts similarity index 95% rename from web/src/elements/Interface/capabilitiesProvider.ts rename to web/src/elements/mixins/capabilities.ts index 5ed32c33afca..fd7847139b11 100644 --- a/web/src/elements/Interface/capabilitiesProvider.ts +++ b/web/src/elements/mixins/capabilities.ts @@ -1,4 +1,4 @@ -import { AKConfigMixin } from "#elements/Interface/authentikConfigProvider"; +import { AKConfigMixin } from "#elements/mixins/config"; import { createMixin } from "@goauthentik/elements/types"; import { CapabilitiesEnum } from "@goauthentik/api"; diff --git a/web/src/elements/Interface/authentikConfigProvider.ts b/web/src/elements/mixins/config.ts similarity index 100% rename from web/src/elements/Interface/authentikConfigProvider.ts rename to web/src/elements/mixins/config.ts diff --git a/web/src/elements/Interface/licenseSummaryProvider.ts b/web/src/elements/mixins/license.ts similarity index 100% rename from web/src/elements/Interface/licenseSummaryProvider.ts rename to web/src/elements/mixins/license.ts diff --git a/web/src/elements/Interface/versionProvider.ts b/web/src/elements/mixins/version.ts similarity index 100% rename from web/src/elements/Interface/versionProvider.ts rename to web/src/elements/mixins/version.ts diff --git a/web/src/elements/sidebar/SidebarVersion.ts b/web/src/elements/sidebar/SidebarVersion.ts index 8cd0aeb3e8ae..565163a4f39b 100644 --- a/web/src/elements/sidebar/SidebarVersion.ts +++ b/web/src/elements/sidebar/SidebarVersion.ts @@ -1,10 +1,10 @@ +import { WithLicenseSummary } from "#elements/mixins/license"; +import { WithVersion } from "#elements/mixins/version"; import type { AdminInterface } from "@goauthentik/admin/AdminInterface/index.entrypoint"; import { globalAK } from "@goauthentik/common/global"; import { rootInterface } from "@goauthentik/common/theme"; import { DefaultBrand } from "@goauthentik/common/ui/config"; import { AKElement } from "@goauthentik/elements/Base"; -import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider"; -import { WithVersion } from "@goauthentik/elements/Interface/versionProvider"; import { msg, str } from "@lit/localize"; import { CSSResult, css, html, nothing } from "lit"; diff --git a/web/src/elements/wizard/TypeCreateWizardPage.ts b/web/src/elements/wizard/TypeCreateWizardPage.ts index 771104f4e576..d626d88734b1 100644 --- a/web/src/elements/wizard/TypeCreateWizardPage.ts +++ b/web/src/elements/wizard/TypeCreateWizardPage.ts @@ -1,5 +1,5 @@ +import { WithLicenseSummary } from "#elements/mixins/license"; import "@goauthentik/admin/common/ak-license-notice"; -import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider"; import { WizardPage } from "@goauthentik/elements/wizard/WizardPage"; import { msg, str } from "@lit/localize"; diff --git a/web/src/flow/FlowExecutor.ts b/web/src/flow/FlowExecutor.ts index 2982d9b6f333..3da324197ce2 100644 --- a/web/src/flow/FlowExecutor.ts +++ b/web/src/flow/FlowExecutor.ts @@ -4,10 +4,10 @@ import { globalAK } from "#common/global"; import { configureSentry } from "#common/sentry/index"; import { WebsocketClient } from "#common/ws"; import { Interface } from "#elements/Interface"; -import { WithBrandConfig } from "#elements/Interface/brandProvider"; -import { WithCapabilitiesConfig } from "#elements/Interface/capabilitiesProvider"; import "#elements/LoadingOverlay"; import "#elements/ak-locale-context/ak-locale-context"; +import { WithBrandConfig } from "#elements/mixins/branding"; +import { WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import { themeImage } from "#elements/utils/images"; import "#flow/components/ak-brand-footer"; import "#flow/sources/apple/AppleLoginInit"; diff --git a/web/src/flow/stages/prompt/PromptStage.ts b/web/src/flow/stages/prompt/PromptStage.ts index cef4997f6bb4..629b2c3d8bc4 100644 --- a/web/src/flow/stages/prompt/PromptStage.ts +++ b/web/src/flow/stages/prompt/PromptStage.ts @@ -1,9 +1,6 @@ +import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities"; import "@goauthentik/elements/Divider"; import "@goauthentik/elements/EmptyState"; -import { - CapabilitiesEnum, - WithCapabilitiesConfig, -} from "@goauthentik/elements/Interface/capabilitiesProvider"; import { LOCALES } from "@goauthentik/elements/ak-locale-context/definitions"; import "@goauthentik/elements/forms/FormElement"; import { BaseStage } from "@goauthentik/flow/stages/base"; diff --git a/web/src/rac/index.entrypoint.ts b/web/src/rac/index.entrypoint.ts index 252c85f3930b..161e5eafab03 100644 --- a/web/src/rac/index.entrypoint.ts +++ b/web/src/rac/index.entrypoint.ts @@ -1,6 +1,6 @@ import { Interface } from "#elements/Interface"; -import { WithBrandConfig } from "#elements/Interface/brandProvider"; import "#elements/LoadingOverlay"; +import { WithBrandConfig } from "#elements/mixins/branding"; import Guacamole from "guacamole-common-js"; import { msg, str } from "@lit/localize"; diff --git a/web/src/standalone/api-browser/index.entrypoint.ts b/web/src/standalone/api-browser/index.entrypoint.ts index 2d734cbf7cbe..4d8956a0db60 100644 --- a/web/src/standalone/api-browser/index.entrypoint.ts +++ b/web/src/standalone/api-browser/index.entrypoint.ts @@ -6,7 +6,7 @@ import { CSRFHeaderName } from "#common/api/middleware"; import { EVENT_THEME_CHANGE } from "#common/constants"; import { getCookie } from "#common/utils"; import { Interface } from "#elements/Interface"; -import { WithBrandConfig } from "#elements/Interface/brandProvider"; +import { WithBrandConfig } from "#elements/mixins/branding"; import { themeImage } from "#elements/utils/images"; import { msg } from "@lit/localize"; diff --git a/web/src/user/index.entrypoint.ts b/web/src/user/index.entrypoint.ts index 3c6d0e0cb159..29dd0ea10b8e 100644 --- a/web/src/user/index.entrypoint.ts +++ b/web/src/user/index.entrypoint.ts @@ -1,31 +1,31 @@ -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { DEFAULT_CONFIG } from "#common/api/config"; import { EVENT_API_DRAWER_TOGGLE, EVENT_NOTIFICATION_DRAWER_TOGGLE, EVENT_WS_MESSAGE, -} from "@goauthentik/common/constants"; -import { globalAK } from "@goauthentik/common/global"; -import { configureSentry } from "@goauthentik/common/sentry"; -import { UIConfig, getConfigForUser } from "@goauthentik/common/ui/config"; -import { DefaultBrand } from "@goauthentik/common/ui/config"; -import { me } from "@goauthentik/common/users"; -import { WebsocketClient } from "@goauthentik/common/ws"; -import "@goauthentik/components/ak-nav-buttons"; -import { AuthenticatedInterface } from "@goauthentik/elements/AuthenticatedInterface"; -import { AKElement } from "@goauthentik/elements/Base"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; -import "@goauthentik/elements/ak-locale-context/ak-locale-context"; -import "@goauthentik/elements/banner/EnterpriseStatusBanner"; -import "@goauthentik/elements/buttons/ActionButton/ak-action-button"; -import "@goauthentik/elements/messages/MessageContainer"; -import "@goauthentik/elements/notifications/APIDrawer"; -import "@goauthentik/elements/notifications/NotificationDrawer"; -import { getURLParam, updateURLParams } from "@goauthentik/elements/router/RouteMatch"; -import "@goauthentik/elements/router/RouterOutlet"; -import "@goauthentik/elements/sidebar/Sidebar"; -import "@goauthentik/elements/sidebar/SidebarItem"; -import { themeImage } from "@goauthentik/elements/utils/images"; -import { ROUTES } from "@goauthentik/user/Routes"; +} from "#common/constants"; +import { globalAK } from "#common/global"; +import { configureSentry } from "#common/sentry/index"; +import { UIConfig, getConfigForUser } from "#common/ui/config"; +import { DefaultBrand } from "#common/ui/config"; +import { me } from "#common/users"; +import { WebsocketClient } from "#common/ws"; +import "#components/ak-nav-buttons"; +import { AuthenticatedInterface } from "#elements/AuthenticatedInterface"; +import { AKElement } from "#elements/Base"; +import "#elements/ak-locale-context/ak-locale-context"; +import "#elements/banner/EnterpriseStatusBanner"; +import "#elements/buttons/ActionButton/ak-action-button"; +import "#elements/messages/MessageContainer"; +import { WithBrandConfig } from "#elements/mixins/branding"; +import "#elements/notifications/APIDrawer"; +import "#elements/notifications/NotificationDrawer"; +import { getURLParam, updateURLParams } from "#elements/router/RouteMatch"; +import "#elements/router/RouterOutlet"; +import "#elements/sidebar/Sidebar"; +import "#elements/sidebar/SidebarItem"; +import { themeImage } from "#elements/utils/images"; +import { ROUTES } from "#user/Routes"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; import { msg } from "@lit/localize"; diff --git a/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts b/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts index 78b8c3721537..9db2cbed4fa9 100644 --- a/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts +++ b/web/src/user/user-settings/details/UserSettingsFlowExecutor.ts @@ -1,18 +1,14 @@ -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { EVENT_REFRESH } from "@goauthentik/common/constants"; -import { - APIError, - parseAPIResponseError, - pluckErrorDetail, -} from "@goauthentik/common/errors/network"; -import { globalAK } from "@goauthentik/common/global"; -import { MessageLevel } from "@goauthentik/common/messages"; -import { refreshMe } from "@goauthentik/common/users"; -import { AKElement } from "@goauthentik/elements/Base"; -import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider"; -import { showMessage } from "@goauthentik/elements/messages/MessageContainer"; -import { StageHost } from "@goauthentik/flow/stages/base"; -import "@goauthentik/user/user-settings/details/stages/prompt/PromptStage"; +import { DEFAULT_CONFIG } from "#common/api/config"; +import { EVENT_REFRESH } from "#common/constants"; +import { APIError, parseAPIResponseError, pluckErrorDetail } from "#common/errors/network"; +import { globalAK } from "#common/global"; +import { MessageLevel } from "#common/messages"; +import { refreshMe } from "#common/users"; +import { AKElement } from "#elements/Base"; +import { showMessage } from "#elements/messages/MessageContainer"; +import { WithBrandConfig } from "#elements/mixins/branding"; +import { StageHost } from "#flow/stages/base"; +import "#user/user-settings/details/stages/prompt/PromptStage"; import { msg } from "@lit/localize"; import { CSSResult, PropertyValues, TemplateResult, html } from "lit"; From 35d4d0de1a2b079c59a72ecf4b5bce1def77e3d0 Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Sat, 24 May 2025 22:07:29 +0200 Subject: [PATCH 4/8] web: Prepare for consistent import styling. - Prep for Storybook fixes. --- packages/prettier-config/lib/constants.js | 29 ++++++++++++++++++++-- packages/prettier-config/package-lock.json | 4 +-- packages/prettier-config/package.json | 2 +- web/package.json | 1 + 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/prettier-config/lib/constants.js b/packages/prettier-config/lib/constants.js index 1f5f9fec1de8..30976e7d26c6 100644 --- a/packages/prettier-config/lib/constants.js +++ b/packages/prettier-config/lib/constants.js @@ -31,8 +31,33 @@ export const AuthentikPrettierConfig = { trailingComma: "all", useTabs: false, vueIndentScriptAndStyle: false, - plugins: ["prettier-plugin-packagejson", "@trivago/prettier-plugin-sort-imports"], - importOrder: ["^(@?)lit(.*)$", "\\.css$", "^@goauthentik/api$", "^[./]"], + plugins: [ + // --- + "prettier-plugin-packagejson", + "@trivago/prettier-plugin-sort-imports", + ], + importOrder: [ + // --- + + "^(@goauthentik/|#)common.+", + "^(@goauthentik/|#)elements.+", + "^(@goauthentik/|#)components.+", + "^(@goauthentik/|#)user.+", + "^(@goauthentik/|#)admin.+", + "^(@goauthentik/|#)flow.+", + "^(@goauthentik/|#)flow.+", + + "^#.+", + "^@goauthentik.+", + + "", + + "^(@?)lit(.*)$", + "\\.css$", + "^@goauthentik/api$", + "^[./]", + ], + importOrderSideEffects: false, importOrderSeparation: true, importOrderSortSpecifiers: true, importOrderParserPlugins: ["typescript", "jsx", "classProperties", "decorators-legacy"], diff --git a/packages/prettier-config/package-lock.json b/packages/prettier-config/package-lock.json index 36228a26475d..f908d13b9f9a 100644 --- a/packages/prettier-config/package-lock.json +++ b/packages/prettier-config/package-lock.json @@ -1,12 +1,12 @@ { "name": "@goauthentik/prettier-config", - "version": "1.0.5", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@goauthentik/prettier-config", - "version": "1.0.5", + "version": "2.0.0", "license": "MIT", "devDependencies": { "@goauthentik/tsconfig": "^1.0.1", diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index 3897f64acac9..f9557607d907 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -1,6 +1,6 @@ { "name": "@goauthentik/prettier-config", - "version": "1.0.5", + "version": "2.0.0", "description": "authentik's Prettier config", "license": "MIT", "scripts": { diff --git a/web/package.json b/web/package.json index 44ed2ffb860f..936ecb596e2a 100644 --- a/web/package.json +++ b/web/package.json @@ -67,6 +67,7 @@ "#admin/*": "./src/admin/*.js", "#flow/*.css": "./src/flow/*.css", "#flow/*": "./src/flow/*.js", + "#locales/*": "./src/locales/*.js", "#stories/*": "./src/stories/*.js", "#*/browser": { "types": "./out/*/browser.d.ts", From 4a6b41b453c8b1e856698b4ec1a7be359f2d4800 Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Wed, 21 May 2025 23:56:56 +0200 Subject: [PATCH 5/8] web: Update MDX types. From 12c41b96e90980476a2f168664e861c0fb6fa2be Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Fri, 23 May 2025 15:16:02 +0200 Subject: [PATCH 6/8] web: Fix issues surrounding async imports, MDX typing, relative paths. --- web/bundler/mdx-plugin/node.js | 33 ++++++++++++++--- web/paths/index.js | 19 ++++++++++ web/paths/node.js | 17 ++++++--- web/scripts/build-web.mjs | 5 ++- .../admin/applications/ApplicationListPage.ts | 24 ++++++------ .../oauth2/OAuth2ProviderViewPage.ts | 2 +- .../providers/proxy/ProxyProviderViewPage.ts | 16 ++++---- .../providers/scim/SCIMProviderViewPage.ts | 2 +- .../kerberos/KerberosSourceViewPage.ts | 2 +- web/src/elements/ak-mdx/ak-mdx.tsx | 37 +++++++++++-------- web/tsconfig.json | 1 - web/tsconfig.test.json | 1 - web/types/mdx.d.ts | 4 +- 13 files changed, 108 insertions(+), 55 deletions(-) create mode 100644 web/paths/index.js diff --git a/web/bundler/mdx-plugin/node.js b/web/bundler/mdx-plugin/node.js index 1e899298f868..78736dd2c380 100644 --- a/web/bundler/mdx-plugin/node.js +++ b/web/bundler/mdx-plugin/node.js @@ -4,10 +4,13 @@ * @import { * OnLoadArgs, * OnLoadResult, + OnResolveArgs, + OnResolveResult, * Plugin, * PluginBuild * } from "esbuild" */ +import { MonoRepoRoot } from "@goauthentik/core/paths/node"; import * as fs from "node:fs/promises"; import * as path from "node:path"; @@ -27,7 +30,7 @@ import * as path from "node:path"; * File contents. */ -const name = "mdx-plugin"; +const pluginName = "mdx-plugin"; /** * @typedef MDXPluginOptions @@ -42,16 +45,25 @@ const name = "mdx-plugin"; * @returns {Plugin} Plugin. */ export function mdxPlugin({ root }) { - return { name, setup }; + const docsPackageRoot = path.resolve(MonoRepoRoot, "website"); /** * @param {PluginBuild} build * Build. - * @returns {undefined} - * Nothing. */ function setup(build) { - build.onLoad({ filter: /\.mdx?$/ }, onload); + /** + * @param {OnResolveArgs} args + * @returns {Promise} + */ + async function resolveListener(args) { + if (!args.path.startsWith("~")) return args; + + return { + path: path.resolve(docsPackageRoot, args.path.slice(1)), + pluginName, + }; + } /** * @param {LoadData} data @@ -59,7 +71,7 @@ export function mdxPlugin({ root }) { * @returns {Promise} * Result. */ - async function onload(data) { + async function loadListener(data) { const content = String( data.pluginData && data.pluginData.contents !== null && @@ -77,7 +89,16 @@ export function mdxPlugin({ root }) { return { contents: JSON.stringify({ content, publicPath, publicDirectory }), loader: "file", + pluginName, }; } + + build.onResolve({ filter: /\.mdx?$/ }, resolveListener); + build.onLoad({ filter: /\.mdx?$/ }, loadListener); } + + return { + name: pluginName, + setup, + }; } diff --git a/web/paths/index.js b/web/paths/index.js new file mode 100644 index 000000000000..eb795a1d2f0d --- /dev/null +++ b/web/paths/index.js @@ -0,0 +1,19 @@ +/** + * @file Paths used by the web package. + * + * @runtime common + */ + +/** + * The name of the distribution directory. + * + * @runtime common + */ +export const DistDirectoryName = "dist"; + +/** + * The name of the static file directory. + * + * @runtime common + */ +export const StaticDirectoryName = "static"; diff --git a/web/paths/node.js b/web/paths/node.js index 7570231833ac..14eb449b98b7 100644 --- a/web/paths/node.js +++ b/web/paths/node.js @@ -1,3 +1,9 @@ +/** + * @file Paths used by the web package. + * + * @runtime node + */ +import { DistDirectoryName } from "#paths"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; @@ -11,18 +17,17 @@ const relativeDirname = dirname(fileURLToPath(import.meta.url)); /** * The root of the web package. + * + * @runtime node */ export const PackageRoot = /** @type {WebPackageIdentifier} */ (resolve(relativeDirname, "..")); -/** - * The name of the distribution directory. - */ -export const DistDirectoryName = "dist"; - /** * Path to the web package's distribution directory. * * This is where the built files are located after running the build process. + * + * @runtime node */ export const DistDirectory = /** @type {`${WebPackageIdentifier}/${DistDirectoryName}`} */ ( resolve(PackageRoot, DistDirectoryName) @@ -43,6 +48,8 @@ export const DistDirectory = /** @type {`${WebPackageIdentifier}/${DistDirectory * Entry points available for building. * * @satisfies {Record} + * + * @runtime node */ export const EntryPoint = /** @type {const} */ ({ Admin: { diff --git a/web/scripts/build-web.mjs b/web/scripts/build-web.mjs index 8ee5bff3d11a..2a768709f0ea 100644 --- a/web/scripts/build-web.mjs +++ b/web/scripts/build-web.mjs @@ -6,7 +6,8 @@ */ import { mdxPlugin } from "#bundler/mdx-plugin/node"; import { createBundleDefinitions } from "#bundler/utils/node"; -import { DistDirectory, DistDirectoryName, EntryPoint, PackageRoot } from "#paths/node"; +import { DistDirectoryName } from "#paths"; +import { DistDirectory, EntryPoint, PackageRoot } from "#paths/node"; import { NodeEnvironment } from "@goauthentik/core/environment/node"; import { MonoRepoRoot, resolvePackage } from "@goauthentik/core/paths/node"; import { readBuildIdentifier } from "@goauthentik/core/version/node"; @@ -26,7 +27,7 @@ const patternflyPath = resolvePackage("@patternfly/patternfly", import.meta); */ const BASE_ESBUILD_OPTIONS = { entryNames: `[dir]/[name]-${readBuildIdentifier()}`, - chunkNames: "[dir]/chunks/[name]-[hash]", + chunkNames: "[dir]/chunks/[hash]", assetNames: "assets/[dir]/[name]-[hash]", publicPath: path.join("/static", DistDirectoryName), outdir: DistDirectory, diff --git a/web/src/admin/applications/ApplicationListPage.ts b/web/src/admin/applications/ApplicationListPage.ts index 24495761bc52..5e5a70c2c0b6 100644 --- a/web/src/admin/applications/ApplicationListPage.ts +++ b/web/src/admin/applications/ApplicationListPage.ts @@ -1,17 +1,17 @@ +import "#admin/applications/ApplicationForm"; +import { DEFAULT_CONFIG } from "#common/api/config"; +import "#elements/AppIcon"; +import "#elements/ak-mdx/ak-mdx"; +import "#elements/buttons/SpinnerButton/ak-spinner-button"; +import "#elements/forms/DeleteBulkForm"; +import "#elements/forms/ModalForm"; import { WithBrandConfig } from "#elements/mixins/branding"; -import "@goauthentik/admin/applications/ApplicationForm"; -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import MDApplication from "@goauthentik/docs/add-secure-apps/applications/index.md"; -import "@goauthentik/elements/AppIcon"; -import "@goauthentik/elements/ak-mdx/ak-mdx"; -import "@goauthentik/elements/buttons/SpinnerButton/ak-spinner-button"; -import "@goauthentik/elements/forms/DeleteBulkForm"; -import "@goauthentik/elements/forms/ModalForm"; -import { getURLParam } from "@goauthentik/elements/router/RouteMatch"; -import { PaginatedResponse } from "@goauthentik/elements/table/Table"; -import { TableColumn } from "@goauthentik/elements/table/Table"; -import { TablePage } from "@goauthentik/elements/table/TablePage"; +import { getURLParam } from "#elements/router/RouteMatch"; +import { PaginatedResponse } from "#elements/table/Table"; +import { TableColumn } from "#elements/table/Table"; +import { TablePage } from "#elements/table/TablePage"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; +import MDApplication from "~docs/add-secure-apps/applications/index.md"; import { msg, str } from "@lit/localize"; import { CSSResult, TemplateResult, css, html } from "lit"; diff --git a/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts b/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts index 8cdc0fc60426..3d742362623e 100644 --- a/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts +++ b/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts @@ -4,7 +4,6 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import renderDescriptionList from "@goauthentik/components/DescriptionList"; import "@goauthentik/components/events/ObjectChangelog"; -import MDProviderOAuth2 from "@goauthentik/docs/add-secure-apps/providers/oauth2/index.mdx"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/EmptyState"; @@ -12,6 +11,7 @@ import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/ak-mdx"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; +import MDProviderOAuth2 from "~docs/add-secure-apps/providers/oauth2/index.mdx"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; diff --git a/web/src/admin/providers/proxy/ProxyProviderViewPage.ts b/web/src/admin/providers/proxy/ProxyProviderViewPage.ts index 3ca835594934..be26428c83cc 100644 --- a/web/src/admin/providers/proxy/ProxyProviderViewPage.ts +++ b/web/src/admin/providers/proxy/ProxyProviderViewPage.ts @@ -5,14 +5,6 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import "@goauthentik/components/ak-status-label"; import "@goauthentik/components/events/ObjectChangelog"; -import MDCaddyStandalone from "@goauthentik/docs/add-secure-apps/providers/proxy/_caddy_standalone.md"; -import MDNginxIngress from "@goauthentik/docs/add-secure-apps/providers/proxy/_nginx_ingress.md"; -import MDNginxPM from "@goauthentik/docs/add-secure-apps/providers/proxy/_nginx_proxy_manager.md"; -import MDNginxStandalone from "@goauthentik/docs/add-secure-apps/providers/proxy/_nginx_standalone.md"; -import MDTraefikCompose from "@goauthentik/docs/add-secure-apps/providers/proxy/_traefik_compose.md"; -import MDTraefikIngress from "@goauthentik/docs/add-secure-apps/providers/proxy/_traefik_ingress.md"; -import MDTraefikStandalone from "@goauthentik/docs/add-secure-apps/providers/proxy/_traefik_standalone.md"; -import MDHeaderAuthentication from "@goauthentik/docs/add-secure-apps/providers/proxy/header_authentication.mdx"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; @@ -22,6 +14,14 @@ import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; import { getURLParam } from "@goauthentik/elements/router/RouteMatch"; import { formatSlug } from "@goauthentik/elements/router/utils.js"; +import MDCaddyStandalone from "~docs/add-secure-apps/providers/proxy/_caddy_standalone.md"; +import MDNginxIngress from "~docs/add-secure-apps/providers/proxy/_nginx_ingress.md"; +import MDNginxPM from "~docs/add-secure-apps/providers/proxy/_nginx_proxy_manager.md"; +import MDNginxStandalone from "~docs/add-secure-apps/providers/proxy/_nginx_standalone.md"; +import MDTraefikCompose from "~docs/add-secure-apps/providers/proxy/_traefik_compose.md"; +import MDTraefikIngress from "~docs/add-secure-apps/providers/proxy/_traefik_ingress.md"; +import MDTraefikStandalone from "~docs/add-secure-apps/providers/proxy/_traefik_standalone.md"; +import MDHeaderAuthentication from "~docs/add-secure-apps/providers/proxy/header_authentication.mdx"; import { msg } from "@lit/localize"; import { CSSResult, PropertyValues, TemplateResult, css, html } from "lit"; diff --git a/web/src/admin/providers/scim/SCIMProviderViewPage.ts b/web/src/admin/providers/scim/SCIMProviderViewPage.ts index 2edfca60b825..550335bc2d73 100644 --- a/web/src/admin/providers/scim/SCIMProviderViewPage.ts +++ b/web/src/admin/providers/scim/SCIMProviderViewPage.ts @@ -7,13 +7,13 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import "@goauthentik/components/ak-status-label"; import "@goauthentik/components/events/ObjectChangelog"; -import MDSCIMProvider from "@goauthentik/docs/add-secure-apps/providers/scim/index.md"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/ak-mdx"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/sync/SyncStatusCard"; +import MDSCIMProvider from "~docs/add-secure-apps/providers/scim/index.md"; import { msg } from "@lit/localize"; import { CSSResult, PropertyValues, TemplateResult, html } from "lit"; diff --git a/web/src/admin/sources/kerberos/KerberosSourceViewPage.ts b/web/src/admin/sources/kerberos/KerberosSourceViewPage.ts index b2d8df5cfa53..8c0550c1c718 100644 --- a/web/src/admin/sources/kerberos/KerberosSourceViewPage.ts +++ b/web/src/admin/sources/kerberos/KerberosSourceViewPage.ts @@ -4,7 +4,6 @@ import "@goauthentik/admin/sources/kerberos/KerberosSourceForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import "@goauthentik/components/events/ObjectChangelog"; -import MDSourceKerberosBrowser from "@goauthentik/docs/users-sources/sources/protocols/kerberos/browser.md"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; @@ -13,6 +12,7 @@ import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/SpinnerButton"; import "@goauthentik/elements/forms/ModalForm"; import "@goauthentik/elements/sync/SyncStatusCard"; +import MDSourceKerberosBrowser from "~docs/users-sources/sources/protocols/kerberos/browser.md"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; diff --git a/web/src/elements/ak-mdx/ak-mdx.tsx b/web/src/elements/ak-mdx/ak-mdx.tsx index ef101e5cd1c5..9d5970fcfd16 100644 --- a/web/src/elements/ak-mdx/ak-mdx.tsx +++ b/web/src/elements/ak-mdx/ak-mdx.tsx @@ -1,15 +1,14 @@ -import "@goauthentik/elements/Alert"; -import { AKElement } from "@goauthentik/elements/Base"; -import { - MDXModule, - MDXModuleContext, - fetchMDXModule, -} from "@goauthentik/elements/ak-mdx/MDXModuleContext"; -import { MDXAnchor } from "@goauthentik/elements/ak-mdx/components/MDXAnchor"; -import { MDXWrapper } from "@goauthentik/elements/ak-mdx/components/MDXWrapper"; -import { remarkAdmonition } from "@goauthentik/elements/ak-mdx/remark/remark-admonition"; -import { remarkHeadings } from "@goauthentik/elements/ak-mdx/remark/remark-headings"; -import { remarkLists } from "@goauthentik/elements/ak-mdx/remark/remark-lists"; +import { globalAK } from "#common/global"; +import "#elements/Alert"; +import { AKElement } from "#elements/Base"; +import { MDXModule, MDXModuleContext, fetchMDXModule } from "#elements/ak-mdx/MDXModuleContext"; +import { MDXAnchor } from "#elements/ak-mdx/components/MDXAnchor"; +import { MDXWrapper } from "#elements/ak-mdx/components/MDXWrapper"; +import { remarkAdmonition } from "#elements/ak-mdx/remark/remark-admonition"; +import { remarkHeadings } from "#elements/ak-mdx/remark/remark-headings"; +import { remarkLists } from "#elements/ak-mdx/remark/remark-lists"; +import { WithAuthentikConfig } from "#elements/mixins/config"; +import { DistDirectoryName, StaticDirectoryName } from "#paths"; import { compile as compileMDX, run as runMDX } from "@mdx-js/mdx"; import apacheGrammar from "highlight.js/lib/languages/apache"; import diffGrammar from "highlight.js/lib/languages/diff"; @@ -30,7 +29,7 @@ import remarkParse from "remark-parse"; import { css } from "lit"; import { customElement, property } from "lit/decorators.js"; -import OneDark from "@goauthentik/common/styles/one-dark.css"; +import OneDark from "#common/styles/one-dark.css"; import PFContent from "@patternfly/patternfly/components/Content/content.css"; import PFList from "@patternfly/patternfly/components/List/list.css"; import PFTable from "@patternfly/patternfly/components/Table/table.css"; @@ -54,7 +53,7 @@ const highlightThemeOptions: HighlightOptions = { export type Replacer = (input: string) => string; @customElement("ak-mdx") -export class AKMDX extends AKElement { +export class AKMDX extends WithAuthentikConfig(AKElement) { @property({ reflect: true, }) @@ -166,9 +165,17 @@ export class AKMDX extends AKElement { this.#reactRoot = createRoot(this.shadowRoot!); let nextMDXModule: MDXModule | undefined; + const { relBase } = globalAK().api; if (this.url) { - nextMDXModule = await fetchMDXModule(this.url); + const pathname = + relBase + + StaticDirectoryName + + "/" + + DistDirectoryName + + this.url.slice(this.url.indexOf("/assets")); + + nextMDXModule = await fetchMDXModule(pathname); } else { nextMDXModule = { content: this.content, diff --git a/web/tsconfig.json b/web/tsconfig.json index 625791ce2682..7bfa564b86c1 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -21,7 +21,6 @@ "@goauthentik/admin/*": ["./src/admin/*"], "@goauthentik/common/*": ["./src/common/*"], "@goauthentik/components/*": ["./src/components/*"], - "@goauthentik/docs/*": ["../website/docs/*"], "@goauthentik/elements/*": ["./src/elements/*"], "@goauthentik/flow/*": ["./src/flow/*"], "@goauthentik/locales/*": ["./src/locales/*"], diff --git a/web/tsconfig.test.json b/web/tsconfig.test.json index 8ded1a98d401..f73716f89243 100644 --- a/web/tsconfig.test.json +++ b/web/tsconfig.test.json @@ -24,7 +24,6 @@ "@goauthentik/admin/*": ["./src/admin/*"], "@goauthentik/common/*": ["./src/common/*"], "@goauthentik/components/*": ["./src/components/*"], - "@goauthentik/docs/*": ["../website/docs/*"], "@goauthentik/elements/*": ["./src/elements/*"], "@goauthentik/flow/*": ["./src/flow/*"], "@goauthentik/locales/*": ["./src/locales/*"], diff --git a/web/types/mdx.d.ts b/web/types/mdx.d.ts index 42ecc3978163..206d9493772f 100644 --- a/web/types/mdx.d.ts +++ b/web/types/mdx.d.ts @@ -1,4 +1,4 @@ -declare module "*.md" { +declare module "~docs/*.md" { /** * The serialized JSON content of an MD file. */ @@ -6,7 +6,7 @@ declare module "*.md" { export default serializedJSON; } -declare module "*.mdx" { +declare module "~docs/*.mdx" { /** * The serialized JSON content of an MDX file. */ From d3a4c2b2ccacbe166535429e6f242c1588701209 Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Fri, 23 May 2025 15:39:03 +0200 Subject: [PATCH 7/8] web: Format. Clarify. --- web/bundler/mdx-plugin/node.js | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/web/bundler/mdx-plugin/node.js b/web/bundler/mdx-plugin/node.js index 78736dd2c380..d5ef33bec456 100644 --- a/web/bundler/mdx-plugin/node.js +++ b/web/bundler/mdx-plugin/node.js @@ -4,8 +4,8 @@ * @import { * OnLoadArgs, * OnLoadResult, - OnResolveArgs, - OnResolveResult, + * OnResolveArgs, + * OnResolveResult, * Plugin, * PluginBuild * } from "esbuild" @@ -15,19 +15,13 @@ import * as fs from "node:fs/promises"; import * as path from "node:path"; /** - * @typedef {Omit & LoadDataFields} LoadData - * Data passed to `onload`. + * @typedef {Omit & LoadDataFields} LoadData Data passed to `onload`. * - * @typedef LoadDataFields - * Extra fields given in `data` to `onload`. - * @property {PluginData | null | undefined} [pluginData] - * Plugin data. + * @typedef LoadDataFields Extra fields given in `data` to `onload`. + * @property {PluginData | null | undefined} [pluginData] Plugin data. * - * - * @typedef PluginData - * Extra data passed. - * @property {Buffer | string | null | undefined} [contents] - * File contents. + * @typedef PluginData Extra data passed. + * @property {Buffer | string | null | undefined} [contents] File contents. */ const pluginName = "mdx-plugin"; @@ -41,15 +35,15 @@ const pluginName = "mdx-plugin"; /** * Bundle MDX into JSON modules. * - * @param {MDXPluginOptions} options Options. - * @returns {Plugin} Plugin. + * @param {MDXPluginOptions} options + * @returns {Plugin} */ export function mdxPlugin({ root }) { + // TODO: Replace with `resolvePackage` after NPM Workspaces support is added. const docsPackageRoot = path.resolve(MonoRepoRoot, "website"); /** * @param {PluginBuild} build - * Build. */ function setup(build) { /** @@ -67,9 +61,7 @@ export function mdxPlugin({ root }) { /** * @param {LoadData} data - * Data. * @returns {Promise} - * Result. */ async function loadListener(data) { const content = String( From caf671d7865402666224fd7b55230c9947a01ee4 Mon Sep 17 00:00:00 2001 From: Teffen Ellis Date: Fri, 23 May 2025 15:52:23 +0200 Subject: [PATCH 8/8] web: Group module types. --- web/src/elements/ak-mdx/MDXModuleContext.ts | 19 +--------------- web/src/elements/ak-mdx/ak-mdx.tsx | 3 ++- web/types/mdx.d.ts | 24 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/web/src/elements/ak-mdx/MDXModuleContext.ts b/web/src/elements/ak-mdx/MDXModuleContext.ts index 1913b7faffee..dd38111ad34e 100644 --- a/web/src/elements/ak-mdx/MDXModuleContext.ts +++ b/web/src/elements/ak-mdx/MDXModuleContext.ts @@ -1,22 +1,5 @@ import { createContext, useContext } from "react"; - -/** - * A parsed JSON module containing MDX content and metadata from ESBuild. - */ -export interface MDXModule { - /** - * The Markdown content of the module. - */ - content: string; - /** - * The public path of the module, typically identical to the docs page path. - */ - publicPath?: string; - /** - * The public directory of the module, used to resolve relative links. - */ - publicDirectory?: string; -} +import type { MDXModule } from "~docs/types"; /** * Fetches an MDX module from a URL or ESBuild static asset. diff --git a/web/src/elements/ak-mdx/ak-mdx.tsx b/web/src/elements/ak-mdx/ak-mdx.tsx index 9d5970fcfd16..ad58f1c3141f 100644 --- a/web/src/elements/ak-mdx/ak-mdx.tsx +++ b/web/src/elements/ak-mdx/ak-mdx.tsx @@ -1,7 +1,7 @@ import { globalAK } from "#common/global"; import "#elements/Alert"; import { AKElement } from "#elements/Base"; -import { MDXModule, MDXModuleContext, fetchMDXModule } from "#elements/ak-mdx/MDXModuleContext"; +import { MDXModuleContext, fetchMDXModule } from "#elements/ak-mdx/MDXModuleContext"; import { MDXAnchor } from "#elements/ak-mdx/components/MDXAnchor"; import { MDXWrapper } from "#elements/ak-mdx/components/MDXWrapper"; import { remarkAdmonition } from "#elements/ak-mdx/remark/remark-admonition"; @@ -25,6 +25,7 @@ import remarkFrontmatter from "remark-frontmatter"; import remarkGFM from "remark-gfm"; import remarkMdxFrontmatter from "remark-mdx-frontmatter"; import remarkParse from "remark-parse"; +import type { MDXModule } from "~docs/types"; import { css } from "lit"; import { customElement, property } from "lit/decorators.js"; diff --git a/web/types/mdx.d.ts b/web/types/mdx.d.ts index 206d9493772f..f147e3b4cff7 100644 --- a/web/types/mdx.d.ts +++ b/web/types/mdx.d.ts @@ -1,3 +1,27 @@ +/** + * @file Provides types for ESBuild "virtual modules" generated from MDX files. + */ + +declare module "~docs/types" { + /** + * A parsed JSON module containing MDX content and metadata from ESBuild. + */ + export interface MDXModule { + /** + * The Markdown content of the module. + */ + content: string; + /** + * The public path of the module, typically identical to the docs page path. + */ + publicPath?: string; + /** + * The public directory of the module, used to resolve relative links. + */ + publicDirectory?: string; + } +} + declare module "~docs/*.md" { /** * The serialized JSON content of an MD file.