diff --git a/.prettierignore b/.prettierignore index e1206e8f75..129a5f75a0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,7 @@ # Prettier Ignorefile ## Static Files +CODEOWNERS **/LICENSE authentik/stages/**/* diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 7704f91467..11ab39939d 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -17,6 +17,6 @@ "ms-python.vscode-pylance", "redhat.vscode-yaml", "Tobermory.es6-string-html", - "unifiedjs.vscode-mdx", + "unifiedjs.vscode-mdx" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 9676ef0c1c..50cf769280 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -38,10 +38,10 @@ "!AtIndex scalar", "!ParseJSON scalar" ], - "typescript.preferences.importModuleSpecifier": "non-relative", - "typescript.preferences.importModuleSpecifierEnding": "index", - "typescript.tsdk": "./node_modules/typescript/lib", - "typescript.enablePromptUseWorkspaceTsdk": true, + "js/ts.preferences.importModuleSpecifier": "non-relative", + "js/ts.preferences.importModuleSpecifierEnding": "index", + "js/ts.tsdk.path": "./node_modules/typescript/lib", + "js/ts.tsdk.promptToUseWorkspaceVersion": true, "yaml.schemas": { "./blueprints/schema.json": "blueprints/**/*.yaml" }, @@ -59,9 +59,11 @@ }, "github-actions.workflows.pinned.workflows": [".github/workflows/ci-main.yml"], "search.exclude": { - "**/node_modules": true, - "**/bower_components": true, "**/*.code-search": true, - "packages/client-*": true, + "**/bower_components": true, + "**/node_modules": true, + "**/playwright-report/**": true, + "**/website/**/build": true, + "**/client-*": true } } diff --git a/CODEOWNERS b/CODEOWNERS index 988708a0d1..7434605024 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -32,6 +32,7 @@ packages/django-channels-postgres @goauthentik/backend packages/django-postgres-cache @goauthentik/backend packages/django-dramatiq-postgres @goauthentik/backend # Web packages +tsconfig.json @goauthentik/frontend package.json @goauthentik/frontend package-lock.json @goauthentik/frontend packages/package.json @goauthentik/frontend diff --git a/package-lock.json b/package-lock.json index 64c7a1cc3e..e5d71dace5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6813,7 +6813,7 @@ }, "packages/logger-js": { "name": "@goauthentik/logger-js", - "version": "1.1.0", + "version": "1.1.1", "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.3", @@ -6874,7 +6874,7 @@ }, "packages/tsconfig": { "name": "@goauthentik/tsconfig", - "version": "1.0.8", + "version": "1.0.9", "license": "MIT", "engines": { "node": ">=24", diff --git a/packages/client-ts/compose.yml b/packages/client-ts/compose.yml index 0545253be1..629eeb762f 100644 --- a/packages/client-ts/compose.yml +++ b/packages/client-ts/compose.yml @@ -1,7 +1,7 @@ --- services: gen: - image: docker.io/openapitools/openapi-generator-cli:v7.20.0 + image: docker.io/openapitools/openapi-generator-cli:v7.21.0 restart: never network_mode: none volumes: diff --git a/packages/client-ts/src/runtime.ts b/packages/client-ts/src/runtime.ts index d7efdac7f4..2c87853f66 100644 --- a/packages/client-ts/src/runtime.ts +++ b/packages/client-ts/src/runtime.ts @@ -261,6 +261,12 @@ export class ResponseError extends Error { override name: "ResponseError" = "ResponseError"; constructor(public response: Response, msg?: string) { super(msg); + + // restore prototype chain + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } } } @@ -268,6 +274,12 @@ export class FetchError extends Error { override name: "FetchError" = "FetchError"; constructor(public cause: Error, msg?: string) { super(msg); + + // restore prototype chain + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } } } @@ -275,6 +287,12 @@ export class RequiredError extends Error { override name: "RequiredError" = "RequiredError"; constructor(public field: string, msg?: string) { super(msg); + + // restore prototype chain + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } } } diff --git a/packages/client-ts/templates/tsconfig.mustache b/packages/client-ts/templates/tsconfig.mustache index 1226648c81..17aa9b7803 100644 --- a/packages/client-ts/templates/tsconfig.mustache +++ b/packages/client-ts/templates/tsconfig.mustache @@ -4,7 +4,6 @@ "composite": true, "isolatedModules": true, "incremental": true, - "baseUrl": ".", "rootDir": "src", "strict": true, "newLine": "lf", diff --git a/packages/client-ts/tsconfig.json b/packages/client-ts/tsconfig.json index 1226648c81..17aa9b7803 100644 --- a/packages/client-ts/tsconfig.json +++ b/packages/client-ts/tsconfig.json @@ -4,7 +4,6 @@ "composite": true, "isolatedModules": true, "incremental": true, - "baseUrl": ".", "rootDir": "src", "strict": true, "newLine": "lf", diff --git a/packages/esbuild-plugin-live-reload/.github/README.md b/packages/esbuild-plugin-live-reload/.github/README.md index e85d7b1440..3ff9e64014 100644 --- a/packages/esbuild-plugin-live-reload/.github/README.md +++ b/packages/esbuild-plugin-live-reload/.github/README.md @@ -43,7 +43,7 @@ Add the following import near the beginning of your application's entry point. ```js if (process.env.NODE_ENV === "development") { - await import("@goauthentik/esbuild-plugin-live-reload/client"); + await import("@goauthentik/esbuild-plugin-live-reload"); } ``` diff --git a/packages/esbuild-plugin-live-reload/client/index.js b/packages/esbuild-plugin-live-reload/client/index.js index 56571b7914..4013bb267d 100644 --- a/packages/esbuild-plugin-live-reload/client/index.js +++ b/packages/esbuild-plugin-live-reload/client/index.js @@ -33,7 +33,7 @@ const disposeSymbol = Symbol.dispose || Symbol.for("dispose"); * * ```ts * if (process.env.NODE_ENV === "development") { - * await import("@goauthentik/esbuild-plugin-live-reload/client") + * await import("@goauthentik/esbuild-plugin-live-reload") * .catch(() => console.warn("Failed to import watcher")) * } * ``` diff --git a/packages/esbuild-plugin-live-reload/package-lock.json b/packages/esbuild-plugin-live-reload/package-lock.json index daeb50eab3..98f874f64e 100644 --- a/packages/esbuild-plugin-live-reload/package-lock.json +++ b/packages/esbuild-plugin-live-reload/package-lock.json @@ -1,12 +1,12 @@ { "name": "@goauthentik/esbuild-plugin-live-reload", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@goauthentik/esbuild-plugin-live-reload", - "version": "2.0.0", + "version": "2.0.1", "license": "MIT", "dependencies": { "find-free-ports": "^3.1.1" @@ -59,7 +59,7 @@ "@goauthentik/prettier-config": "../prettier-config", "@goauthentik/tsconfig": "../tsconfig", "@types/eslint": "^9.6.1", - "@types/node": "^25.3.0", + "@types/node": "^25.5.0", "typescript": "^6.0.2", "typescript-eslint": "^8.57.2" }, @@ -84,19 +84,19 @@ }, "../logger-js": { "name": "@goauthentik/logger-js", - "version": "1.1.0", + "version": "1.1.1", "dev": true, "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.3", "@goauthentik/prettier-config": "../prettier-config", "@goauthentik/tsconfig": "../tsconfig", - "@types/node": "^25.3.0", + "@types/node": "^25.5.0", "eslint": "^9.39.3", "pino": "^10.3.1", "pino-pretty": "^13.1.2", "prettier": "^3.8.1", - "prettier-plugin-packagejson": "^3.0.0", + "prettier-plugin-packagejson": "^3.0.2", "typescript": "^6.0.2", "typescript-eslint": "^8.57.2" }, @@ -132,7 +132,7 @@ "@types/node": "^25.0.0", "eslint": "^9.39.3", "prettier": "^3.8.1", - "prettier-plugin-packagejson": "^3.0.0", + "prettier-plugin-packagejson": "^3.0.2", "typescript": "^6.0.2", "typescript-eslint": "^8.57.2" }, @@ -142,7 +142,7 @@ }, "peerDependencies": { "prettier": "^3.8.1", - "prettier-plugin-packagejson": "^3.0.0" + "prettier-plugin-packagejson": "^3.0.2" } }, "../tsconfig": { diff --git a/packages/esbuild-plugin-live-reload/package.json b/packages/esbuild-plugin-live-reload/package.json index 68cd16f747..ee89e7a56d 100644 --- a/packages/esbuild-plugin-live-reload/package.json +++ b/packages/esbuild-plugin-live-reload/package.json @@ -1,6 +1,6 @@ { "name": "@goauthentik/esbuild-plugin-live-reload", - "version": "2.0.0", + "version": "2.0.1", "description": "ESBuild + browser refresh. Build completes, page reloads.", "license": "MIT", "repository": { @@ -34,6 +34,7 @@ "types": "./out/client/index.d.ts", "import": "./client/index.js" }, + "./client/types": "./client/types.d.ts", "./plugin": { "types": "./out/plugin/index.d.ts", "import": "./plugin/index.js" diff --git a/packages/logger-js/package-lock.json b/packages/logger-js/package-lock.json index eb280577f2..9f41535c9b 100644 --- a/packages/logger-js/package-lock.json +++ b/packages/logger-js/package-lock.json @@ -1,12 +1,12 @@ { "name": "@goauthentik/logger-js", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@goauthentik/logger-js", - "version": "1.1.0", + "version": "1.1.1", "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.3", diff --git a/packages/logger-js/package.json b/packages/logger-js/package.json index 16969e8132..8f2184ab81 100644 --- a/packages/logger-js/package.json +++ b/packages/logger-js/package.json @@ -1,6 +1,6 @@ { "name": "@goauthentik/logger-js", - "version": "1.1.0", + "version": "1.1.1", "description": "Pino-based logger for authentik", "license": "MIT", "repository": { @@ -23,8 +23,8 @@ ".": { "types": "./out/index.d.ts", "node": "./lib/node.js", - "import": "./lib/index.js", - "browser": "./lib/index.js" + "browser": "./index.js", + "import": "./index.js" } }, "devDependencies": { diff --git a/packages/tsconfig/package-lock.json b/packages/tsconfig/package-lock.json index 8e842b2163..16114e11fa 100644 --- a/packages/tsconfig/package-lock.json +++ b/packages/tsconfig/package-lock.json @@ -1,12 +1,12 @@ { "name": "@goauthentik/tsconfig", - "version": "1.0.8", + "version": "1.0.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@goauthentik/tsconfig", - "version": "1.0.8", + "version": "1.0.9", "license": "MIT", "engines": { "node": ">=24", diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 0c56d0d1f2..ab822223a3 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "@goauthentik/tsconfig", - "version": "1.0.8", + "version": "1.0.9", "description": "authentik's base TypeScript configuration.", "license": "MIT", "repository": { diff --git a/tsconfig.json b/tsconfig.json index 3aa95fcf07..7e8419c429 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ { "extends": "@goauthentik/tsconfig", "compilerOptions": { - "baseUrl": "." + "ignoreDeprecations": "6.0" }, "watchOptions": { "excludeDirectories": [ diff --git a/web/package-lock.json b/web/package-lock.json index ac3bfbec6c..ccdc9c5039 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -78,7 +78,7 @@ "globals": "^17.4.0", "guacamole-common-js": "^1.5.0", "hastscript": "^9.0.1", - "knip": "^6.0.5", + "knip": "^6.0.6", "lex": "^2025.11.0", "lit": "^3.3.2", "lit-analyzer": "^2.0.3", @@ -114,7 +114,7 @@ "typescript": "^6.0.2", "typescript-eslint": "^8.57.2", "unist-util-visit": "^5.1.0", - "vite": "^8.0.2", + "vite": "^8.0.3", "vitest": "^4.1.1", "webcomponent-qr-code": "^1.3.0", "wireit": "^0.14.12", @@ -2905,9 +2905,9 @@ "license": "MIT" }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", "cpu": [ "arm64" ], @@ -2921,9 +2921,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "cpu": [ "arm64" ], @@ -2937,9 +2937,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", "cpu": [ "x64" ], @@ -2953,9 +2953,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", "cpu": [ "x64" ], @@ -2969,9 +2969,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz", - "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", "cpu": [ "arm" ], @@ -2985,9 +2985,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", "cpu": [ "arm64" ], @@ -3001,9 +3001,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", "cpu": [ "arm64" ], @@ -3017,9 +3017,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", "cpu": [ "ppc64" ], @@ -3033,9 +3033,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", "cpu": [ "s390x" ], @@ -3049,9 +3049,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", "cpu": [ "x64" ], @@ -3065,9 +3065,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", "cpu": [ "x64" ], @@ -3081,9 +3081,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", "cpu": [ "arm64" ], @@ -3097,9 +3097,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz", - "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", "cpu": [ "wasm32" ], @@ -3113,9 +3113,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", "cpu": [ "arm64" ], @@ -3129,9 +3129,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", "cpu": [ "x64" ], @@ -3145,9 +3145,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz", - "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "license": "MIT" }, "node_modules/@rollup/plugin-commonjs": { @@ -11449,9 +11449,9 @@ } }, "node_modules/knip": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/knip/-/knip-6.0.5.tgz", - "integrity": "sha512-+i9e/ZKuYlECB5iIK82NQwnYso4oNLBhzsTbXhSqCG1qfGi6D84GNtRENafmS3C0lABX8Wf3BKM434nPXi2AbQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/knip/-/knip-6.0.6.tgz", + "integrity": "sha512-PA+r1mTDLHH3eShlffn2ZDyH1hHvmgDj7JsTP3JKuhV/jZTyHbRkGcOd+uaSxfJZmcZyOE5zw3naP33WllTIlA==", "funding": [ { "type": "github", @@ -15559,13 +15559,13 @@ "license": "Unlicense" }, "node_modules/rolldown": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz", - "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "license": "MIT", "dependencies": { "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.11" + "@rolldown/pluginutils": "1.0.0-rc.12" }, "bin": { "rolldown": "bin/cli.mjs" @@ -15574,21 +15574,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-x64": "1.0.0-rc.11", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, "node_modules/rolldown/node_modules/@oxc-project/types": { @@ -17685,15 +17685,15 @@ } }, "node_modules/vite": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz", - "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.3", + "picomatch": "^4.0.4", "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.11", + "rolldown": "1.0.0-rc.12", "tinyglobby": "^0.2.15" }, "bin": { diff --git a/web/package.json b/web/package.json index 25b4e318b0..56734f0cb6 100644 --- a/web/package.json +++ b/web/package.json @@ -153,7 +153,7 @@ "globals": "^17.4.0", "guacamole-common-js": "^1.5.0", "hastscript": "^9.0.1", - "knip": "^6.0.5", + "knip": "^6.0.6", "lex": "^2025.11.0", "lit": "^3.3.2", "lit-analyzer": "^2.0.3", @@ -189,7 +189,7 @@ "typescript": "^6.0.2", "typescript-eslint": "^8.57.2", "unist-util-visit": "^5.1.0", - "vite": "^8.0.2", + "vite": "^8.0.3", "vitest": "^4.1.1", "webcomponent-qr-code": "^1.3.0", "wireit": "^0.14.12", diff --git a/web/paths/node.js b/web/paths/node.js index 0f43c069b8..dc168a20fb 100644 --- a/web/paths/node.js +++ b/web/paths/node.js @@ -55,7 +55,7 @@ export const DistDirectory = /** @type {`${WebPackageIdentifier}/${DistDirectory */ export const EntryPoint = /** @type {const} */ ({ Admin: { - in: resolve(PackageRoot, "src", "admin", "AdminInterface", "index.entrypoint.ts"), + in: resolve(PackageRoot, "src", "admin", "index.entrypoint.ts"), out: resolve(DistDirectory, "admin", "AdminInterface"), }, User: { diff --git a/web/scripts/knip.config.ts b/web/scripts/knip.config.ts index 4235c29595..564148d642 100644 --- a/web/scripts/knip.config.ts +++ b/web/scripts/knip.config.ts @@ -2,14 +2,16 @@ import { type KnipConfig } from "knip"; const config: KnipConfig = { entry: [ - "./src/admin/AdminInterface/AdminInterface.ts", - "./src/user/UserInterface.ts", - "./src/flow/FlowInterface.ts", - "./src/standalone/api-browser/index.ts", - "./src/rac/index.ts", - "./src/standalone/loading/index.ts", - "./src/polyfill/poly.ts", + "./src/admin/index.entrypoint.ts", + "./src/user/index.entrypoint.ts", + "./src/flow/index.entrypoint.ts", + "./src/standalone/api-browser/index.entrypoint.ts", + "./src/rac/index.entrypoint.ts", + "./src/standalone/loading/index.entrypoint.ts", + "./src/polyfill/index.entrypoint.ts", ], + ignore: ["packages/client-ts/**", "out/**/*"], + project: ["src/**/*.ts", "src/**/*.js", "./scripts/*.mjs", ".storybook/*.ts"], // "ignore": ["src/**/*.test.ts", "src/**/*.stories.ts"], // Prevent Knip from complaining about web components, which export their classes but also diff --git a/web/src/admin/Routes.ts b/web/src/admin/Routes.ts index 21bc532f9b..92f036ff96 100644 --- a/web/src/admin/Routes.ts +++ b/web/src/admin/Routes.ts @@ -188,7 +188,7 @@ export const ROUTES: Route[] = [ return html``; }), new Route(new RegExp("^/debug$"), async () => { - await import("#admin/DebugPage"); + await import("#admin/ak-admin-debug-page"); return html``; }), new Route(new RegExp("^/enterprise/licenses$"), async () => { diff --git a/web/src/admin/AdminInterface/AboutModal.ts b/web/src/admin/ak-about-modal.ts similarity index 100% rename from web/src/admin/AdminInterface/AboutModal.ts rename to web/src/admin/ak-about-modal.ts diff --git a/web/src/admin/DebugPage.ts b/web/src/admin/ak-admin-debug-page.ts similarity index 100% rename from web/src/admin/DebugPage.ts rename to web/src/admin/ak-admin-debug-page.ts diff --git a/web/src/admin/AdminInterface/index.entrypoint.css b/web/src/admin/ak-interface-admin.css similarity index 100% rename from web/src/admin/AdminInterface/index.entrypoint.css rename to web/src/admin/ak-interface-admin.css diff --git a/web/src/admin/AdminInterface/index.entrypoint.ts b/web/src/admin/ak-interface-admin.ts similarity index 97% rename from web/src/admin/AdminInterface/index.entrypoint.ts rename to web/src/admin/ak-interface-admin.ts index ca73f280f4..b4a0f1b524 100644 --- a/web/src/admin/AdminInterface/index.entrypoint.ts +++ b/web/src/admin/ak-interface-admin.ts @@ -1,17 +1,16 @@ import "#elements/banner/EnterpriseStatusBanner"; import "#elements/banner/VersionBanner"; -import "#elements/messages/MessageContainer"; -import "#elements/router/RouterOutlet"; import "#elements/sidebar/Sidebar"; import "#elements/sidebar/SidebarItem"; -import "#elements/commands/ak-command-palette-user-modal"; +import "#elements/router/RouterOutlet"; +import "#elements/commands/ak-command-palette"; import { createAdminSidebarEnterpriseEntries, createAdminSidebarEntries, renderSidebarItems, SidebarEntry, -} from "./AdminSidebar.js"; +} from "./navigation/sidebar.js"; import { isAPIResultReady } from "#common/api/responses"; import { configureSentry } from "#common/sentry/index"; @@ -38,7 +37,7 @@ import { } from "#elements/notifications/utils"; import { navigate } from "#elements/router/RouterOutlet"; -import Styles from "#admin/AdminInterface/index.entrypoint.css"; +import Styles from "#admin/ak-interface-admin.css"; import { ROUTES } from "#admin/Routes"; import { CapabilitiesEnum } from "@goauthentik/api"; @@ -54,10 +53,6 @@ import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css"; import PFNav from "@patternfly/patternfly/components/Nav/nav.css"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; -if (process.env.NODE_ENV === "development") { - await import("@goauthentik/esbuild-plugin-live-reload/client"); -} - @customElement("ak-interface-admin") export class AdminInterface extends WithCapabilitiesConfig( WithNotifications(WithSession(AuthenticatedInterface)), diff --git a/web/src/admin/index.entrypoint.ts b/web/src/admin/index.entrypoint.ts new file mode 100644 index 0000000000..f670e46b84 --- /dev/null +++ b/web/src/admin/index.entrypoint.ts @@ -0,0 +1,6 @@ +import "#elements/messages/MessageContainer"; +import "#admin/ak-interface-admin"; + +if (process.env.NODE_ENV === "development") { + await import("@goauthentik/esbuild-plugin-live-reload"); +} diff --git a/web/src/admin/AdminInterface/AdminSidebar.ts b/web/src/admin/navigation/sidebar.ts similarity index 100% rename from web/src/admin/AdminInterface/AdminSidebar.ts rename to web/src/admin/navigation/sidebar.ts diff --git a/web/src/elements/commands/shared.ts b/web/src/elements/commands/shared.ts index da3b791702..649c461cf0 100644 --- a/web/src/elements/commands/shared.ts +++ b/web/src/elements/commands/shared.ts @@ -2,7 +2,7 @@ import { AKCommandChangeEvent } from "#elements/commands/events"; import { AKModal } from "#elements/modals/ak-modal"; import { SlottedTemplateResult } from "#elements/types"; -import { AboutModal } from "#admin/AdminInterface/AboutModal"; +import { AboutModal } from "#admin/ak-about-modal"; import { msg, str } from "@lit/localize"; diff --git a/web/src/elements/sidebar/SidebarVersion.ts b/web/src/elements/sidebar/SidebarVersion.ts index 74314e7068..5b07041980 100644 --- a/web/src/elements/sidebar/SidebarVersion.ts +++ b/web/src/elements/sidebar/SidebarVersion.ts @@ -5,7 +5,7 @@ import { AKElement } from "#elements/Base"; import { WithLicenseSummary } from "#elements/mixins/license"; import { WithVersion } from "#elements/mixins/version"; -import { AboutModal } from "#admin/AdminInterface/AboutModal"; +import { AboutModal } from "#admin/ak-about-modal"; import { LicenseSummaryStatusEnum } from "@goauthentik/api"; diff --git a/web/src/flow/index.entrypoint.ts b/web/src/flow/index.entrypoint.ts index 9802030ccf..e7014785d2 100644 --- a/web/src/flow/index.entrypoint.ts +++ b/web/src/flow/index.entrypoint.ts @@ -15,5 +15,5 @@ import "#flow/stages/password/PasswordStage"; // end of stage import if (process.env.NODE_ENV === "development") { - await import("@goauthentik/esbuild-plugin-live-reload/client"); + await import("@goauthentik/esbuild-plugin-live-reload"); } diff --git a/web/src/user/index.entrypoint.css b/web/src/user/ak-interface-user.css similarity index 100% rename from web/src/user/index.entrypoint.css rename to web/src/user/ak-interface-user.css diff --git a/web/src/user/ak-interface-user.ts b/web/src/user/ak-interface-user.ts new file mode 100644 index 0000000000..f554c10c19 --- /dev/null +++ b/web/src/user/ak-interface-user.ts @@ -0,0 +1,192 @@ +import "#components/ak-nav-buttons"; +import "#elements/banner/EnterpriseStatusBanner"; +import "#elements/notifications/APIDrawer"; +import "#elements/notifications/NotificationDrawer"; +import "#elements/router/RouterOutlet"; + +import { globalAK } from "#common/global"; +import { configureSentry } from "#common/sentry/index"; +import { isGuest } from "#common/users"; +import { WebsocketClient } from "#common/ws/WebSocketClient"; + +import { AuthenticatedInterface } from "#elements/AuthenticatedInterface"; +import { listen } from "#elements/decorators/listen"; +import { WithBrandConfig } from "#elements/mixins/branding"; +import { canAccessAdmin, WithSession } from "#elements/mixins/session"; +import { AKDrawerChangeEvent } from "#elements/notifications/events"; +import { + DrawerState, + persistDrawerParams, + readDrawerParams, + renderNotificationDrawerPanel, +} from "#elements/notifications/utils"; +import { ifPresent } from "#elements/utils/attributes"; +import { ThemedImage } from "#elements/utils/images"; + +import Styles from "#user/ak-interface-user.css"; +import { ROUTES } from "#user/Routes"; + +import { ConsoleLogger } from "#logger/browser"; + +import { msg } from "@lit/localize"; +import { html, nothing } from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { guard } from "lit/directives/guard.js"; + +import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css"; +import PFBrand from "@patternfly/patternfly/components/Brand/brand.css"; +import PFButton from "@patternfly/patternfly/components/Button/button.css"; +import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css"; +import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css"; +import PFNotificationBadge from "@patternfly/patternfly/components/NotificationBadge/notification-badge.css"; +import PFPage from "@patternfly/patternfly/components/Page/page.css"; +import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css"; + +@customElement("ak-interface-user") +class UserInterface extends WithBrandConfig(WithSession(AuthenticatedInterface)) { + public static readonly styles = [ + PFDisplay, + PFBrand, + PFPage, + PFAvatar, + PFButton, + PFDrawer, + PFDropdown, + PFNotificationBadge, + Styles, + ]; + + #logger = ConsoleLogger.prefix("user-interface"); + + @property({ attribute: false, useDefault: true }) + public drawer: DrawerState = readDrawerParams(); + + @listen(AKDrawerChangeEvent) + protected drawerListener = (event: AKDrawerChangeEvent) => { + this.drawer = event.drawer; + persistDrawerParams(event.drawer); + }; + + //#region Lifecycle + + constructor() { + configureSentry(); + + super(); + + WebsocketClient.connect(); + } + + public override disconnectedCallback() { + super.disconnectedCallback(); + + WebsocketClient.close(); + } + + //#endregion + + //#region Rendering + + protected renderAdminInterfaceLink() { + return guard([this.currentUser], () => { + if (!canAccessAdmin(this.currentUser)) { + return nothing; + } + + const { base } = globalAK().api; + + return html` + ${msg("Admin interface")} + + + ${msg("Admin")} + `; + }); + } + + protected render() { + const { currentUser } = this; + + const guest = isGuest(currentUser); + + if (!currentUser || guest) { + this.#logger.debug("Waiting for user session", { + currentUser, + guest, + }); + + // TODO: There might be a hidden feature here. + // Allowing guest users to see some parts of the interface? + // Maybe redirect to a flow? + return html``; + } + + const backgroundStyles = this.uiConfig.theme.background; + + return html` +
+
+ ${!backgroundStyles + ? html`
` + : nothing} +
+ +
+
+
+
+
+ + +
+
+ ${renderNotificationDrawerPanel(this.drawer)} +
+
+
+
+ ${this.commandPalette}`; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ak-interface-user": UserInterface; + } +} diff --git a/web/src/user/index.entrypoint.ts b/web/src/user/index.entrypoint.ts index a5fa6e3164..d7d9cc14b3 100644 --- a/web/src/user/index.entrypoint.ts +++ b/web/src/user/index.entrypoint.ts @@ -1,199 +1,6 @@ -import "#components/ak-nav-buttons"; -import "#elements/banner/EnterpriseStatusBanner"; -import "#elements/buttons/ActionButton/ak-action-button"; import "#elements/messages/MessageContainer"; -import "#elements/notifications/APIDrawer"; -import "#elements/notifications/NotificationDrawer"; -import "#elements/router/RouterOutlet"; -import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; - -import { globalAK } from "#common/global"; -import { configureSentry } from "#common/sentry/index"; -import { isGuest } from "#common/users"; -import { WebsocketClient } from "#common/ws/WebSocketClient"; - -import { AuthenticatedInterface } from "#elements/AuthenticatedInterface"; -import { listen } from "#elements/decorators/listen"; -import { WithBrandConfig } from "#elements/mixins/branding"; -import { canAccessAdmin, WithSession } from "#elements/mixins/session"; -import { AKDrawerChangeEvent } from "#elements/notifications/events"; -import { - DrawerState, - persistDrawerParams, - readDrawerParams, - renderNotificationDrawerPanel, -} from "#elements/notifications/utils"; -import { ifPresent } from "#elements/utils/attributes"; -import { ThemedImage } from "#elements/utils/images"; - -import Styles from "#user/index.entrypoint.css"; -import { ROUTES } from "#user/Routes"; - -import { ConsoleLogger } from "#logger/browser"; - -import { msg } from "@lit/localize"; -import { html, nothing } from "lit"; -import { customElement, property } from "lit/decorators.js"; -import { guard } from "lit/directives/guard.js"; - -import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css"; -import PFBrand from "@patternfly/patternfly/components/Brand/brand.css"; -import PFButton from "@patternfly/patternfly/components/Button/button.css"; -import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css"; -import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css"; -import PFNotificationBadge from "@patternfly/patternfly/components/NotificationBadge/notification-badge.css"; -import PFPage from "@patternfly/patternfly/components/Page/page.css"; -import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css"; +import "#user/ak-interface-user"; if (process.env.NODE_ENV === "development") { - await import("@goauthentik/esbuild-plugin-live-reload/client"); -} - -@customElement("ak-interface-user") -class UserInterface extends WithBrandConfig(WithSession(AuthenticatedInterface)) { - public static readonly styles = [ - PFDisplay, - PFBrand, - PFPage, - PFAvatar, - PFButton, - PFDrawer, - PFDropdown, - PFNotificationBadge, - Styles, - ]; - - #logger = ConsoleLogger.prefix("user-interface"); - - @property({ attribute: false, useDefault: true }) - public drawer: DrawerState = readDrawerParams(); - - @listen(AKDrawerChangeEvent) - protected drawerListener = (event: AKDrawerChangeEvent) => { - this.drawer = event.drawer; - persistDrawerParams(event.drawer); - }; - - //#region Lifecycle - - constructor() { - configureSentry(); - - super(); - - WebsocketClient.connect(); - } - - public override disconnectedCallback() { - super.disconnectedCallback(); - - WebsocketClient.close(); - } - - //#endregion - - //#region Rendering - - protected renderAdminInterfaceLink() { - return guard([this.currentUser], () => { - if (!canAccessAdmin(this.currentUser)) { - return nothing; - } - - const { base } = globalAK().api; - - return html` - ${msg("Admin interface")} - - - ${msg("Admin")} - `; - }); - } - - protected render() { - const { currentUser } = this; - - const guest = isGuest(currentUser); - - if (!currentUser || guest) { - this.#logger.debug("Waiting for user session", { - currentUser, - guest, - }); - - // TODO: There might be a hidden feature here. - // Allowing guest users to see some parts of the interface? - // Maybe redirect to a flow? - return html``; - } - - const backgroundStyles = this.uiConfig.theme.background; - - return html` -
-
- ${!backgroundStyles - ? html`
` - : nothing} -
- -
-
-
-
-
- - -
-
- ${renderNotificationDrawerPanel(this.drawer)} -
-
-
-
- ${this.commandPalette}`; - } -} - -declare global { - interface HTMLElementTagNameMap { - "ak-interface-user": UserInterface; - } + await import("@goauthentik/esbuild-plugin-live-reload"); }