Compare commits
4 Commits
lib/sync/d
...
workspace-
Author | SHA1 | Date | |
---|---|---|---|
783b1b0a79 | |||
7c69add264 | |||
248fcd5d7f | |||
2c64e3f9ba |
@ -3,13 +3,11 @@
|
|||||||
* @import { StorybookConfig } from "@storybook/web-components-vite";
|
* @import { StorybookConfig } from "@storybook/web-components-vite";
|
||||||
* @import { InlineConfig, Plugin } from "vite";
|
* @import { InlineConfig, Plugin } from "vite";
|
||||||
*/
|
*/
|
||||||
import { cwd } from "process";
|
import { createBundleDefinitions } from "@goauthentik/web/scripts/esbuild/environment";
|
||||||
import postcssLit from "rollup-plugin-postcss-lit";
|
import postcssLit from "rollup-plugin-postcss-lit";
|
||||||
import tsconfigPaths from "vite-tsconfig-paths";
|
import tsconfigPaths from "vite-tsconfig-paths";
|
||||||
|
|
||||||
const NODE_ENV = process.env.NODE_ENV || "development";
|
const CSSImportPattern = /import [\w$]+ from .+\.(css)/g;
|
||||||
|
|
||||||
const CSSImportPattern = /import [\w\$]+ from .+\.(css)/g;
|
|
||||||
const JavaScriptFilePattern = /\.m?(js|ts|tsx)$/;
|
const JavaScriptFilePattern = /\.m?(js|ts|tsx)$/;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,11 +52,7 @@ const config = {
|
|||||||
*/
|
*/
|
||||||
const mergedConfig = {
|
const mergedConfig = {
|
||||||
...config,
|
...config,
|
||||||
define: {
|
define: createBundleDefinitions(),
|
||||||
"process.env.NODE_ENV": JSON.stringify(NODE_ENV),
|
|
||||||
"process.env.CWD": JSON.stringify(cwd()),
|
|
||||||
"process.env.AK_API_BASE_PATH": JSON.stringify(process.env.AK_API_BASE_PATH || ""),
|
|
||||||
},
|
|
||||||
plugins: [inlineCSSPlugin, ...plugins, postcssLit(), tsconfigPaths()],
|
plugins: [inlineCSSPlugin, ...plugins, postcssLit(), tsconfigPaths()],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ const log = console.debug.bind(console, logPrefix);
|
|||||||
* ESBuild may tree-shake it out of production builds.
|
* ESBuild may tree-shake it out of production builds.
|
||||||
*
|
*
|
||||||
* ```ts
|
* ```ts
|
||||||
* if (process.env.NODE_ENV === "development") {
|
* if (import.meta.env.NODE_ENV=== "development") {
|
||||||
* await import("@goauthentik/esbuild-plugin-live-reload/client")
|
* await import("@goauthentik/esbuild-plugin-live-reload/client")
|
||||||
* .catch(() => console.warn("Failed to import watcher"))
|
* .catch(() => console.warn("Failed to import watcher"))
|
||||||
* }
|
* }
|
||||||
|
@ -4,15 +4,20 @@
|
|||||||
|
|
||||||
export {};
|
export {};
|
||||||
declare global {
|
declare global {
|
||||||
|
/**
|
||||||
|
* Environment variables injected by ESBuild.
|
||||||
|
*/
|
||||||
|
interface ImportMetaEnv {
|
||||||
|
/**
|
||||||
|
* The injected watcher URL for ESBuild.
|
||||||
|
* This is used for live reloading in development mode.
|
||||||
|
*
|
||||||
|
* @format url
|
||||||
|
*/
|
||||||
|
readonly ESBUILD_WATCHER_URL?: string;
|
||||||
|
}
|
||||||
|
|
||||||
interface ImportMeta {
|
interface ImportMeta {
|
||||||
readonly env: {
|
readonly env: ImportMetaEnv;
|
||||||
/**
|
|
||||||
* The injected watcher URL for ESBuild.
|
|
||||||
* This is used for live reloading in development mode.
|
|
||||||
*
|
|
||||||
* @format url
|
|
||||||
*/
|
|
||||||
ESBUILD_WATCHER_URL: string;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file Constants for JavaScript and TypeScript files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// <reference types="../../types/global.js" />
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The current Node.js environment, defaulting to "development" when not set.
|
|
||||||
*
|
|
||||||
* Note, this should only be used during the build process.
|
|
||||||
*
|
|
||||||
* If you need to check the environment at runtime, use `process.env.NODE_ENV` to
|
|
||||||
* ensure that module tree-shaking works correctly.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export const NodeEnvironment = process.env.NODE_ENV || "development";
|
|
@ -1,6 +1,20 @@
|
|||||||
/**
|
/**
|
||||||
* @file Utility functions for building and copying files.
|
* @file Utility functions for working with environment variables.
|
||||||
*/
|
*/
|
||||||
|
/// <reference types="./types/global.js" />
|
||||||
|
|
||||||
|
//#region Constants
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current Node.js environment, defaulting to "development" when not set.
|
||||||
|
*
|
||||||
|
* Note, this should only be used during the build process.
|
||||||
|
*
|
||||||
|
* If you need to check the environment at runtime, use `process.env.NODE_ENV` to
|
||||||
|
* ensure that module tree-shaking works correctly.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export const NodeEnvironment = process.env.NODE_ENV || "development";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A source environment variable, which can be a string, number, boolean, null, or undefined.
|
* A source environment variable, which can be a string, number, boolean, null, or undefined.
|
||||||
@ -14,19 +28,26 @@
|
|||||||
* @typedef {T extends string ? `"${T}"` : T} JSONify
|
* @typedef {T extends string ? `"${T}"` : T} JSONify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Utilities
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given an object of environment variables, returns a new object with the same keys and values, but
|
* Given an object of environment variables, returns a new object with the same keys and values, but
|
||||||
* with the values serialized as strings.
|
* with the values serialized as strings.
|
||||||
*
|
*
|
||||||
* @template {Record<string, EnvironmentVariable>} EnvRecord
|
* @template {Record<string, EnvironmentVariable>} EnvRecord
|
||||||
* @template {string} [Prefix='process.env.']
|
* @template {string} [Prefix='import.meta.env.']
|
||||||
*
|
*
|
||||||
* @param {EnvRecord} input
|
* @param {EnvRecord} input
|
||||||
* @param {Prefix} [prefix='process.env.']
|
* @param {Prefix} [prefix='import.meta.env.']
|
||||||
*
|
*
|
||||||
* @returns {{[K in keyof EnvRecord as `${Prefix}${K}`]: JSONify<EnvRecord[K]>}}
|
* @returns {{[K in keyof EnvRecord as `${Prefix}${K}`]: JSONify<EnvRecord[K]>}}
|
||||||
*/
|
*/
|
||||||
export function serializeEnvironmentVars(input, prefix = /** @type {Prefix} */ ("process.env.")) {
|
export function serializeEnvironmentVars(
|
||||||
|
input,
|
||||||
|
prefix = /** @type {Prefix} */ ("import.meta.env."),
|
||||||
|
) {
|
||||||
/**
|
/**
|
||||||
* @type {Record<string, string>}
|
* @type {Record<string, string>}
|
||||||
*/
|
*/
|
||||||
@ -40,3 +61,5 @@ export function serializeEnvironmentVars(input, prefix = /** @type {Prefix} */ (
|
|||||||
|
|
||||||
return /** @type {any} */ (env);
|
return /** @type {any} */ (env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#endregion
|
@ -1,7 +1,6 @@
|
|||||||
/// <reference types="./types/global.js" />
|
/// <reference types="./types/global.js" />
|
||||||
|
|
||||||
export * from "./paths.js";
|
export * from "./paths.js";
|
||||||
export * from "./constants.js";
|
export * from "./environment.js";
|
||||||
export * from "./build.js";
|
|
||||||
export * from "./version.js";
|
export * from "./version.js";
|
||||||
export * from "./scripting.js";
|
export * from "./scripting.js";
|
||||||
|
@ -1,17 +1,32 @@
|
|||||||
import { spawnSync } from "child_process";
|
/**
|
||||||
import fs from "fs";
|
* @file Lit Localize build script.
|
||||||
import path from "path";
|
*
|
||||||
import process from "process";
|
* @remarks
|
||||||
|
* Determines if all the Xliff translation source files are present and if the Typescript source files generated from those sources are up-to-date.
|
||||||
|
*
|
||||||
|
* If they are not, it runs the locale building script,
|
||||||
|
* intercepting the long spew of "this string is not translated" and replacing it with a
|
||||||
|
* summary of how many strings are missing with respect to the source locale.
|
||||||
|
*
|
||||||
|
* @import { ConfigFile } from "@lit/localize-tools/lib/types/config"
|
||||||
|
*/
|
||||||
|
import { PackageRoot } from "@goauthentik/web/paths";
|
||||||
|
import { spawnSync } from "node:child_process";
|
||||||
|
import { readFileSync, statSync } from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if all the Xliff translation source files are present and if the Typescript source
|
* @type {ConfigFile}
|
||||||
* files generated from those sources are up-to-date. If they are not, it runs the locale building
|
|
||||||
* script, intercepting the long spew of "this string is not translated" and replacing it with a
|
|
||||||
* summary of how many strings are missing with respect to the source locale.
|
|
||||||
*/
|
*/
|
||||||
|
const localizeRules = JSON.parse(
|
||||||
|
readFileSync(path.join(PackageRoot, "lit-localize.json"), "utf-8"),
|
||||||
|
);
|
||||||
|
|
||||||
const localizeRules = JSON.parse(fs.readFileSync("./lit-localize.json", "utf-8"));
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} loc
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
function generatedFileIsUpToDateWithXliffSource(loc) {
|
function generatedFileIsUpToDateWithXliffSource(loc) {
|
||||||
const xliff = path.join("./xliff", `${loc}.xlf`);
|
const xliff = path.join("./xliff", `${loc}.xlf`);
|
||||||
const gened = path.join("./src/locales", `${loc}.ts`);
|
const gened = path.join("./src/locales", `${loc}.ts`);
|
||||||
@ -22,7 +37,7 @@ function generatedFileIsUpToDateWithXliffSource(loc) {
|
|||||||
// generates a unique error message and halts the build.
|
// generates a unique error message and halts the build.
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var xlfStat = fs.statSync(xliff);
|
var xlfStat = statSync(xliff);
|
||||||
} catch (_error) {
|
} catch (_error) {
|
||||||
console.error(`lit-localize expected '${loc}.xlf', but XLF file is not present`);
|
console.error(`lit-localize expected '${loc}.xlf', but XLF file is not present`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@ -30,7 +45,7 @@ function generatedFileIsUpToDateWithXliffSource(loc) {
|
|||||||
|
|
||||||
// If the generated file doesn't exist, of course it's not up to date.
|
// If the generated file doesn't exist, of course it's not up to date.
|
||||||
try {
|
try {
|
||||||
var genedStat = fs.statSync(gened);
|
var genedStat = statSync(gened);
|
||||||
} catch (_error) {
|
} catch (_error) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
/// <reference types="../types/esbuild.js" />
|
||||||
/**
|
/**
|
||||||
* @file ESBuild script for building the authentik web UI.
|
* @file ESBuild script for building the authentik web UI.
|
||||||
*
|
*
|
||||||
@ -9,7 +10,6 @@ import {
|
|||||||
NodeEnvironment,
|
NodeEnvironment,
|
||||||
readBuildIdentifier,
|
readBuildIdentifier,
|
||||||
resolvePackage,
|
resolvePackage,
|
||||||
serializeEnvironmentVars,
|
|
||||||
} from "@goauthentik/monorepo";
|
} from "@goauthentik/monorepo";
|
||||||
import { DistDirectory, DistDirectoryName, EntryPoint, PackageRoot } from "@goauthentik/web/paths";
|
import { DistDirectory, DistDirectoryName, EntryPoint, PackageRoot } from "@goauthentik/web/paths";
|
||||||
import { deepmerge } from "deepmerge-ts";
|
import { deepmerge } from "deepmerge-ts";
|
||||||
@ -20,15 +20,10 @@ import * as fs from "node:fs/promises";
|
|||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
|
|
||||||
import { mdxPlugin } from "./esbuild/build-mdx-plugin.mjs";
|
import { mdxPlugin } from "./esbuild/build-mdx-plugin.mjs";
|
||||||
|
import { createBundleDefinitions } from "./esbuild/environment.mjs";
|
||||||
|
|
||||||
const logPrefix = "[Build]";
|
const logPrefix = "[Build]";
|
||||||
|
|
||||||
const definitions = serializeEnvironmentVars({
|
|
||||||
NODE_ENV: NodeEnvironment,
|
|
||||||
CWD: process.cwd(),
|
|
||||||
AK_API_BASE_PATH: process.env.AK_API_BASE_PATH,
|
|
||||||
});
|
|
||||||
|
|
||||||
const patternflyPath = resolvePackage("@patternfly/patternfly");
|
const patternflyPath = resolvePackage("@patternfly/patternfly");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,7 +81,7 @@ const BASE_ESBUILD_OPTIONS = {
|
|||||||
root: MonoRepoRoot,
|
root: MonoRepoRoot,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
define: definitions,
|
define: createBundleDefinitions(),
|
||||||
format: "esm",
|
format: "esm",
|
||||||
logOverride: {
|
logOverride: {
|
||||||
/**
|
/**
|
||||||
|
29
web/scripts/esbuild/environment.mjs
Normal file
29
web/scripts/esbuild/environment.mjs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* @file ESBuild environment utilities.
|
||||||
|
*/
|
||||||
|
import { AuthentikVersion, NodeEnvironment, serializeEnvironmentVars } from "@goauthentik/monorepo";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a mapping of environment variables to their respective runtime constants.
|
||||||
|
*/
|
||||||
|
export function createBundleDefinitions() {
|
||||||
|
const SerializedNodeEnvironment = /** @type {`"development"` | `"production"`} */ (
|
||||||
|
JSON.stringify(NodeEnvironment)
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @satisfies {Record<ESBuildImportEnvKey, string>}
|
||||||
|
*/
|
||||||
|
const envRecord = {
|
||||||
|
AK_VERSION: AuthentikVersion,
|
||||||
|
AK_API_BASE_PATH: process.env.AK_API_BASE_PATH ?? "",
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
...serializeEnvironmentVars(envRecord),
|
||||||
|
// We need to explicitly set this for NPM packages that use `process`
|
||||||
|
// to determine their environment.
|
||||||
|
"process.env.NODE_ENV": SerializedNodeEnvironment,
|
||||||
|
"import.meta.env.NODE_ENV": SerializedNodeEnvironment,
|
||||||
|
};
|
||||||
|
}
|
@ -35,6 +35,11 @@ const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|||||||
const projectRoot = path.join(__dirname, "..");
|
const projectRoot = path.join(__dirname, "..");
|
||||||
process.chdir(projectRoot);
|
process.chdir(projectRoot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string[]} flags
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
const hasFlag = (flags) => process.argv.length > 1 && flags.includes(process.argv[2]);
|
const hasFlag = (flags) => process.argv.length > 1 && flags.includes(process.argv[2]);
|
||||||
|
|
||||||
const [configFile, files] = hasFlag(["-n", "--nightmare"])
|
const [configFile, files] = hasFlag(["-n", "--nightmare"])
|
||||||
|
@ -1,22 +1,36 @@
|
|||||||
import { readFileSync } from "fs";
|
/**
|
||||||
import path from "path";
|
* @file Pseudo-localization script.
|
||||||
|
*
|
||||||
|
* @import { ConfigFile } from "@lit/localize-tools/lib/types/config.js"
|
||||||
|
* @import { Config } from '@lit/localize-tools/lib/types/config.js';
|
||||||
|
* @import { ProgramMessage } from "@lit/localize-tools/src/messages.js"
|
||||||
|
* @import { Locale } from "@lit/localize-tools/src/types/locale.js"
|
||||||
|
*/
|
||||||
|
import { PackageRoot } from "@goauthentik/web/paths";
|
||||||
|
import { readFileSync } from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
import pseudolocale from "pseudolocale";
|
import pseudolocale from "pseudolocale";
|
||||||
import { fileURLToPath } from "url";
|
|
||||||
|
|
||||||
import { makeFormatter } from "@lit/localize-tools/lib/formatters/index.js";
|
import { makeFormatter } from "@lit/localize-tools/lib/formatters/index.js";
|
||||||
import { sortProgramMessages } from "@lit/localize-tools/lib/messages.js";
|
import { sortProgramMessages } from "@lit/localize-tools/lib/messages.js";
|
||||||
import { TransformLitLocalizer } from "@lit/localize-tools/lib/modes/transform.js";
|
import { TransformLitLocalizer } from "@lit/localize-tools/lib/modes/transform.js";
|
||||||
|
|
||||||
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
const pseudoLocale = /** @type {Locale} */ ("pseudo-LOCALE");
|
||||||
const pseudoLocale = "pseudo-LOCALE";
|
|
||||||
const targetLocales = [pseudoLocale];
|
const targetLocales = [pseudoLocale];
|
||||||
const baseConfig = JSON.parse(readFileSync(path.join(__dirname, "../lit-localize.json"), "utf-8"));
|
|
||||||
|
/**
|
||||||
|
* @type {ConfigFile}
|
||||||
|
*/
|
||||||
|
const baseConfig = JSON.parse(readFileSync(path.join(PackageRoot, "lit-localize.json"), "utf-8"));
|
||||||
|
|
||||||
// Need to make some internal specifications to satisfy the transformer. It doesn't actually matter
|
// Need to make some internal specifications to satisfy the transformer. It doesn't actually matter
|
||||||
// which Localizer we use (transformer or runtime), because all of the functionality we care about
|
// which Localizer we use (transformer or runtime), because all of the functionality we care about
|
||||||
// is in their common parent class, but I had to pick one. Everything else here is just pure
|
// is in their common parent class, but I had to pick one. Everything else here is just pure
|
||||||
// exploitation of the lit/localize-tools internals.
|
// exploitation of the lit/localize-tools internals.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @satisfies {Config}
|
||||||
|
*/
|
||||||
const config = {
|
const config = {
|
||||||
...baseConfig,
|
...baseConfig,
|
||||||
baseDir: path.join(__dirname, ".."),
|
baseDir: path.join(__dirname, ".."),
|
||||||
@ -28,6 +42,11 @@ const config = {
|
|||||||
resolve: (path) => path,
|
resolve: (path) => path,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {ProgramMessage} message
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
const pseudoMessagify = (message) => ({
|
const pseudoMessagify = (message) => ({
|
||||||
name: message.name,
|
name: message.name,
|
||||||
contents: message.contents.map((content) =>
|
contents: message.contents.map((content) =>
|
||||||
@ -36,7 +55,7 @@ const pseudoMessagify = (message) => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const localizer = new TransformLitLocalizer(config);
|
const localizer = new TransformLitLocalizer(config);
|
||||||
const messages = localizer.extractSourceMessages().messages;
|
const { messages } = localizer.extractSourceMessages();
|
||||||
const translations = messages.map(pseudoMessagify);
|
const translations = messages.map(pseudoMessagify);
|
||||||
const sorted = sortProgramMessages([...messages]);
|
const sorted = sortProgramMessages([...messages]);
|
||||||
const formatter = makeFormatter(config);
|
const formatter = makeFormatter(config);
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { VERSION } from "@goauthentik/common/constants";
|
|
||||||
import { globalAK } from "@goauthentik/common/global";
|
import { globalAK } from "@goauthentik/common/global";
|
||||||
import { DefaultBrand } from "@goauthentik/common/ui/config";
|
import { DefaultBrand } from "@goauthentik/common/ui/config";
|
||||||
import "@goauthentik/elements/EmptyState";
|
import "@goauthentik/elements/EmptyState";
|
||||||
@ -45,7 +44,7 @@ export class AboutModal extends WithLicenseSummary(WithBrandConfig(ModalButton))
|
|||||||
}
|
}
|
||||||
return [
|
return [
|
||||||
[msg("Version"), version.versionCurrent],
|
[msg("Version"), version.versionCurrent],
|
||||||
[msg("UI Version"), VERSION],
|
[msg("UI Version"), import.meta.env.AK_VERSION],
|
||||||
[msg("Build"), build],
|
[msg("Build"), build],
|
||||||
[msg("Python version"), status.runtime.pythonVersion],
|
[msg("Python version"), status.runtime.pythonVersion],
|
||||||
[msg("Platform"), status.runtime.platform],
|
[msg("Platform"), status.runtime.platform],
|
||||||
|
@ -43,7 +43,7 @@ import {
|
|||||||
renderSidebarItems,
|
renderSidebarItems,
|
||||||
} from "./AdminSidebar.js";
|
} from "./AdminSidebar.js";
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (import.meta.env.NODE_ENV === "development") {
|
||||||
await import("@goauthentik/esbuild-plugin-live-reload/client");
|
await import("@goauthentik/esbuild-plugin-live-reload/client");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ import "@goauthentik/admin/admin-overview/cards/WorkerStatusCard";
|
|||||||
import "@goauthentik/admin/admin-overview/charts/AdminLoginAuthorizeChart";
|
import "@goauthentik/admin/admin-overview/charts/AdminLoginAuthorizeChart";
|
||||||
import "@goauthentik/admin/admin-overview/charts/OutpostStatusChart";
|
import "@goauthentik/admin/admin-overview/charts/OutpostStatusChart";
|
||||||
import "@goauthentik/admin/admin-overview/charts/SyncStatusChart";
|
import "@goauthentik/admin/admin-overview/charts/SyncStatusChart";
|
||||||
import { VERSION } from "@goauthentik/common/constants";
|
|
||||||
import { me } from "@goauthentik/common/users";
|
import { me } from "@goauthentik/common/users";
|
||||||
import { AKElement } from "@goauthentik/elements/Base";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider.js";
|
import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider.js";
|
||||||
@ -22,8 +21,6 @@ import { msg, str } from "@lit/localize";
|
|||||||
import { CSSResult, TemplateResult, css, html, nothing } from "lit";
|
import { CSSResult, TemplateResult, css, html, nothing } from "lit";
|
||||||
import { customElement, state } from "lit/decorators.js";
|
import { customElement, state } from "lit/decorators.js";
|
||||||
import { classMap } from "lit/directives/class-map.js";
|
import { classMap } from "lit/directives/class-map.js";
|
||||||
import { map } from "lit/directives/map.js";
|
|
||||||
import { when } from "lit/directives/when.js";
|
|
||||||
|
|
||||||
import PFContent from "@patternfly/patternfly/components/Content/content.css";
|
import PFContent from "@patternfly/patternfly/components/Content/content.css";
|
||||||
import PFDivider from "@patternfly/patternfly/components/Divider/divider.css";
|
import PFDivider from "@patternfly/patternfly/components/Divider/divider.css";
|
||||||
@ -33,21 +30,17 @@ import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
|||||||
|
|
||||||
import { SessionUser } from "@goauthentik/api";
|
import { SessionUser } from "@goauthentik/api";
|
||||||
|
|
||||||
export function versionFamily(): string {
|
function createReleaseNotesURL(semver: string): URL {
|
||||||
const parts = VERSION.split(".");
|
const segments = semver.split(".");
|
||||||
parts.pop();
|
const versionFamily = segments.slice(0, -1).join(".");
|
||||||
return parts.join(".");
|
|
||||||
|
const release = `${versionFamily}#fixed-in-${segments.join("")}`;
|
||||||
|
|
||||||
|
return new URL(`/docs/releases/${release}`, "https://goauthentik.io");
|
||||||
}
|
}
|
||||||
|
|
||||||
const RELEASE = `${VERSION.split(".").slice(0, -1).join(".")}#fixed-in-${VERSION.replaceAll(
|
|
||||||
".",
|
|
||||||
"",
|
|
||||||
)}`;
|
|
||||||
|
|
||||||
const AdminOverviewBase = WithLicenseSummary(AKElement);
|
const AdminOverviewBase = WithLicenseSummary(AKElement);
|
||||||
|
|
||||||
type Renderer = () => TemplateResult | typeof nothing;
|
|
||||||
|
|
||||||
@customElement("ak-admin-overview")
|
@customElement("ak-admin-overview")
|
||||||
export class AdminOverviewPage extends AdminOverviewBase {
|
export class AdminOverviewPage extends AdminOverviewBase {
|
||||||
static get styles(): CSSResult[] {
|
static get styles(): CSSResult[] {
|
||||||
@ -83,7 +76,11 @@ export class AdminOverviewPage extends AdminOverviewBase {
|
|||||||
[msg("Check the logs"), paramURL("/events/log")],
|
[msg("Check the logs"), paramURL("/events/log")],
|
||||||
[msg("Explore integrations"), "https://goauthentik.io/integrations/", true],
|
[msg("Explore integrations"), "https://goauthentik.io/integrations/", true],
|
||||||
[msg("Manage users"), paramURL("/identity/users")],
|
[msg("Manage users"), paramURL("/identity/users")],
|
||||||
[msg("Check the release notes"), `https://goauthentik.io/docs/releases/${RELEASE}`, true],
|
[
|
||||||
|
msg("Check the release notes"),
|
||||||
|
createReleaseNotesURL(import.meta.env.AK_VERSION).href,
|
||||||
|
true,
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
@state()
|
@state()
|
||||||
@ -193,45 +190,6 @@ export class AdminOverviewPage extends AdminOverviewBase {
|
|||||||
</div>`
|
</div>`
|
||||||
: nothing} `;
|
: nothing} `;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderActions() {
|
|
||||||
const release = `${versionFamily()}#fixed-in-${VERSION.replaceAll(".", "")}`;
|
|
||||||
|
|
||||||
const quickActions: [string, string][] = [
|
|
||||||
[msg("Create a new application"), paramURL("/core/applications", { createForm: true })],
|
|
||||||
[msg("Check the logs"), paramURL("/events/log")],
|
|
||||||
[msg("Explore integrations"), "https://goauthentik.io/integrations/"],
|
|
||||||
[msg("Manage users"), paramURL("/identity/users")],
|
|
||||||
[msg("Check the release notes"), `https://goauthentik.io/docs/releases/${release}`],
|
|
||||||
];
|
|
||||||
|
|
||||||
const action = ([label, url]: [string, string]) => {
|
|
||||||
const isExternal = url.startsWith("https://");
|
|
||||||
const ex = (truecase: Renderer, falsecase: Renderer) =>
|
|
||||||
when(isExternal, truecase, falsecase);
|
|
||||||
|
|
||||||
const content = html`${label}${ex(
|
|
||||||
() => html`<i class="fas fa-external-link-alt ak-external-link"></i>`,
|
|
||||||
() => nothing,
|
|
||||||
)}`;
|
|
||||||
|
|
||||||
return html`<li>
|
|
||||||
${ex(
|
|
||||||
() =>
|
|
||||||
html`<a
|
|
||||||
href="${url}"
|
|
||||||
class="pf-u-mb-xl"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
target="_blank"
|
|
||||||
>${content}</a
|
|
||||||
>`,
|
|
||||||
() => html`<a href="${url}" class="pf-u-mb-xl" )>${content}</a>`,
|
|
||||||
)}
|
|
||||||
</li>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
return html`${map(quickActions, action)}`;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
@ -3,7 +3,7 @@ import {
|
|||||||
EventMiddleware,
|
EventMiddleware,
|
||||||
LoggingMiddleware,
|
LoggingMiddleware,
|
||||||
} from "@goauthentik/common/api/middleware.js";
|
} from "@goauthentik/common/api/middleware.js";
|
||||||
import { EVENT_LOCALE_REQUEST, VERSION } from "@goauthentik/common/constants.js";
|
import { EVENT_LOCALE_REQUEST } from "@goauthentik/common/constants.js";
|
||||||
import { globalAK } from "@goauthentik/common/global.js";
|
import { globalAK } from "@goauthentik/common/global.js";
|
||||||
import { SentryMiddleware } from "@goauthentik/common/sentry";
|
import { SentryMiddleware } from "@goauthentik/common/sentry";
|
||||||
|
|
||||||
@ -79,4 +79,6 @@ export function AndNext(url: string): string {
|
|||||||
return `?next=${encodeURIComponent(url)}`;
|
return `?next=${encodeURIComponent(url)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.debug(`authentik(early): version ${VERSION}, apiBase ${DEFAULT_CONFIG.basePath}`);
|
console.debug(
|
||||||
|
`authentik(early): version ${import.meta.env.AK_VERSION}, apiBase ${DEFAULT_CONFIG.basePath}`,
|
||||||
|
);
|
||||||
|
@ -1,12 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* @file Global constants used throughout the application.
|
||||||
|
*
|
||||||
|
* @todo Much of this content can be moved to a specific file, element, or component.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// <reference types="../../types/esbuild.js" />
|
||||||
|
|
||||||
|
//#region Patternfly
|
||||||
|
|
||||||
export const SECONDARY_CLASS = "pf-m-secondary";
|
export const SECONDARY_CLASS = "pf-m-secondary";
|
||||||
export const SUCCESS_CLASS = "pf-m-success";
|
export const SUCCESS_CLASS = "pf-m-success";
|
||||||
export const ERROR_CLASS = "pf-m-danger";
|
export const ERROR_CLASS = "pf-m-danger";
|
||||||
export const PROGRESS_CLASS = "pf-m-in-progress";
|
export const PROGRESS_CLASS = "pf-m-in-progress";
|
||||||
export const CURRENT_CLASS = "pf-m-current";
|
export const CURRENT_CLASS = "pf-m-current";
|
||||||
export const VERSION = "2025.4.1";
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Application
|
||||||
|
|
||||||
export const TITLE_DEFAULT = "authentik";
|
export const TITLE_DEFAULT = "authentik";
|
||||||
|
/**
|
||||||
|
* The delimiter used to parse the URL for the current route.
|
||||||
|
*
|
||||||
|
* @todo Move this to the ak-router.
|
||||||
|
*/
|
||||||
export const ROUTE_SEPARATOR = ";";
|
export const ROUTE_SEPARATOR = ";";
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Events
|
||||||
|
|
||||||
export const EVENT_REFRESH = "ak-refresh";
|
export const EVENT_REFRESH = "ak-refresh";
|
||||||
export const EVENT_NOTIFICATION_DRAWER_TOGGLE = "ak-notification-toggle";
|
export const EVENT_NOTIFICATION_DRAWER_TOGGLE = "ak-notification-toggle";
|
||||||
export const EVENT_API_DRAWER_TOGGLE = "ak-api-drawer-toggle";
|
export const EVENT_API_DRAWER_TOGGLE = "ak-api-drawer-toggle";
|
||||||
@ -20,7 +43,17 @@ export const EVENT_MESSAGE = "ak-message";
|
|||||||
export const EVENT_THEME_CHANGE = "ak-theme-change";
|
export const EVENT_THEME_CHANGE = "ak-theme-change";
|
||||||
export const EVENT_REFRESH_ENTERPRISE = "ak-refresh-enterprise";
|
export const EVENT_REFRESH_ENTERPRISE = "ak-refresh-enterprise";
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region WebSocket
|
||||||
|
|
||||||
export const WS_MSG_TYPE_MESSAGE = "message";
|
export const WS_MSG_TYPE_MESSAGE = "message";
|
||||||
export const WS_MSG_TYPE_REFRESH = "refresh";
|
export const WS_MSG_TYPE_REFRESH = "refresh";
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region LocalStorage
|
||||||
|
|
||||||
export const LOCALSTORAGE_AUTHENTIK_KEY = "authentik-local-settings";
|
export const LOCALSTORAGE_AUTHENTIK_KEY = "authentik-local-settings";
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { VERSION } from "@goauthentik/common/constants";
|
|
||||||
import { SentryIgnoredError } from "@goauthentik/common/sentry";
|
import { SentryIgnoredError } from "@goauthentik/common/sentry";
|
||||||
|
|
||||||
export interface PlexPinResponse {
|
export interface PlexPinResponse {
|
||||||
@ -19,7 +18,7 @@ export const DEFAULT_HEADERS = {
|
|||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
"X-Plex-Product": "authentik",
|
"X-Plex-Product": "authentik",
|
||||||
"X-Plex-Version": VERSION,
|
"X-Plex-Version": import.meta.env.AK_VERSION,
|
||||||
"X-Plex-Device-Vendor": "goauthentik.io",
|
"X-Plex-Device-Vendor": "goauthentik.io",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { VERSION } from "@goauthentik/common/constants";
|
|
||||||
import { globalAK } from "@goauthentik/common/global";
|
import { globalAK } from "@goauthentik/common/global";
|
||||||
import { me } from "@goauthentik/common/users";
|
import { me } from "@goauthentik/common/users";
|
||||||
import { readInterfaceRouteParam } from "@goauthentik/elements/router/utils";
|
import { readInterfaceRouteParam } from "@goauthentik/elements/router/utils";
|
||||||
@ -50,7 +49,7 @@ export function configureSentry(canDoPpi = false) {
|
|||||||
/MutationObserver.observe/gi,
|
/MutationObserver.observe/gi,
|
||||||
/NS_ERROR_FAILURE/gi,
|
/NS_ERROR_FAILURE/gi,
|
||||||
],
|
],
|
||||||
release: `authentik@${VERSION}`,
|
release: `authentik@${import.meta.env.AK_VERSION}`,
|
||||||
integrations: [
|
integrations: [
|
||||||
browserTracingIntegration({
|
browserTracingIntegration({
|
||||||
// https://docs.sentry.io/platforms/javascript/tracing/instrumentation/automatic-instrumentation/#custom-routing
|
// https://docs.sentry.io/platforms/javascript/tracing/instrumentation/automatic-instrumentation/#custom-routing
|
||||||
|
@ -223,7 +223,7 @@ export function inspectStyleSheetTree(element: ReactiveElement): InspectedStyleS
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (import.meta.env.NODE_ENV === "development") {
|
||||||
Object.assign(window, {
|
Object.assign(window, {
|
||||||
inspectStyleSheetTree,
|
inspectStyleSheetTree,
|
||||||
serializeStyleSheet,
|
serializeStyleSheet,
|
||||||
|
@ -5,11 +5,11 @@ import {
|
|||||||
type StyleRoot,
|
type StyleRoot,
|
||||||
createStyleSheetUnsafe,
|
createStyleSheetUnsafe,
|
||||||
setAdoptedStyleSheets,
|
setAdoptedStyleSheets,
|
||||||
} from "@goauthentik/common/stylesheets.js";
|
} from "@goauthentik/web/common/stylesheets.js";
|
||||||
import { UIConfig } from "@goauthentik/common/ui/config.js";
|
import { UIConfig } from "@goauthentik/web/common/ui/config.js";
|
||||||
|
|
||||||
import AKBase from "@goauthentik/common/styles/authentik.css";
|
import AKBase from "@goauthentik/web/common/styles/authentik.css";
|
||||||
import AKBaseDark from "@goauthentik/common/styles/theme-dark.css";
|
import AKBaseDark from "@goauthentik/web/common/styles/theme-dark.css";
|
||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||||
|
|
||||||
import { Config, CurrentBrand, UiThemeEnum } from "@goauthentik/api";
|
import { Config, CurrentBrand, UiThemeEnum } from "@goauthentik/api";
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { VERSION } from "@goauthentik/common/constants";
|
|
||||||
import { PFSize } from "@goauthentik/common/enums.js";
|
import { PFSize } from "@goauthentik/common/enums.js";
|
||||||
import {
|
import {
|
||||||
EventContext,
|
EventContext,
|
||||||
@ -76,7 +75,7 @@ ${context.message as string}
|
|||||||
|
|
||||||
|
|
||||||
**Version and Deployment (please complete the following information):**
|
**Version and Deployment (please complete the following information):**
|
||||||
- authentik version: ${VERSION}
|
- authentik version: ${import.meta.env.AK_VERSION}
|
||||||
- Deployment: [e.g. docker-compose, helm]
|
- Deployment: [e.g. docker-compose, helm]
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { VERSION } from "@goauthentik/common/constants";
|
|
||||||
import { AKElement } from "@goauthentik/elements/Base";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
import { WithVersion } from "@goauthentik/elements/Interface/versionProvider";
|
import { WithVersion } from "@goauthentik/elements/Interface/versionProvider";
|
||||||
|
|
||||||
@ -10,20 +9,19 @@ import PFBanner from "@patternfly/patternfly/components/Banner/banner.css";
|
|||||||
|
|
||||||
@customElement("ak-version-banner")
|
@customElement("ak-version-banner")
|
||||||
export class VersionBanner extends WithVersion(AKElement) {
|
export class VersionBanner extends WithVersion(AKElement) {
|
||||||
static get styles() {
|
static styles = [PFBanner];
|
||||||
return [PFBanner];
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return this.version && this.version.versionCurrent !== VERSION
|
if (!this.version?.versionCurrent) return nothing;
|
||||||
? html`
|
if (this.version.versionCurrent === import.meta.env.AK_VERSION) return nothing;
|
||||||
<div class="pf-c-banner pf-m-sticky pf-m-gold">
|
|
||||||
${msg(
|
return html`
|
||||||
str`A newer version (${this.version.versionCurrent}) of the UI is available.`,
|
<div class="pf-c-banner pf-m-sticky pf-m-gold">
|
||||||
)}
|
${msg(
|
||||||
</div>
|
str`A newer version (${this.version.versionCurrent}) of the UI is available.`,
|
||||||
`
|
)}
|
||||||
: nothing;
|
</div>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,6 @@ import "@goauthentik/flow/stages/password/PasswordStage";
|
|||||||
|
|
||||||
// end of stage import
|
// end of stage import
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (import.meta.env.NODE_ENV === "development") {
|
||||||
await import("@goauthentik/esbuild-plugin-live-reload/client");
|
await import("@goauthentik/esbuild-plugin-live-reload/client");
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css";
|
|||||||
|
|
||||||
import { CurrentBrand, EventsApi, SessionUser } from "@goauthentik/api";
|
import { CurrentBrand, EventsApi, SessionUser } from "@goauthentik/api";
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (import.meta.env.NODE_ENV === "development") {
|
||||||
await import("@goauthentik/esbuild-plugin-live-reload/client");
|
await import("@goauthentik/esbuild-plugin-live-reload/client");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
{
|
{
|
||||||
"extends": "@goauthentik/tsconfig",
|
"extends": "@goauthentik/tsconfig",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"checkJs": true,
|
||||||
|
"allowJs": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"emitDeclarationOnly": true,
|
"emitDeclarationOnly": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
|
39
web/types/esbuild.d.ts
vendored
Normal file
39
web/types/esbuild.d.ts
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/**
|
||||||
|
* @file Import meta environment variables available via ESBuild.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export {};
|
||||||
|
declare global {
|
||||||
|
interface ESBuildImportEnv {
|
||||||
|
/**
|
||||||
|
* The authentik version injected by ESBuild during build time.
|
||||||
|
*
|
||||||
|
* @format semver
|
||||||
|
*/
|
||||||
|
readonly AK_VERSION: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @todo Determine where this is used and if it is needed,
|
||||||
|
* give it a better name.
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
readonly AK_API_BASE_PATH: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
type ESBuildImportEnvKey = keyof ESBuildImportEnv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Environment variables injected by ESBuild.
|
||||||
|
*/
|
||||||
|
interface ImportMetaEnv extends ESBuildImportEnv {
|
||||||
|
/**
|
||||||
|
* An environment variable used to determine
|
||||||
|
* whether Node.js is running in production mode.
|
||||||
|
*/
|
||||||
|
readonly NODE_ENV: "development" | "production";
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ImportMeta {
|
||||||
|
readonly env: ImportMetaEnv;
|
||||||
|
}
|
||||||
|
}
|
13
web/types/global.d.ts → web/types/node.d.ts
vendored
13
web/types/global.d.ts → web/types/node.d.ts
vendored
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @file Environment variables available via ESBuild.
|
* @file Global variables provided by Node.js
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare module "module" {
|
declare module "module" {
|
||||||
@ -14,8 +14,8 @@ declare module "module" {
|
|||||||
* const relativeDirname = dirname(fileURLToPath(import.meta.url));
|
* const relativeDirname = dirname(fileURLToPath(import.meta.url));
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line no-var
|
|
||||||
var __dirname: string;
|
const __dirname: string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,13 +23,16 @@ declare module "process" {
|
|||||||
global {
|
global {
|
||||||
namespace NodeJS {
|
namespace NodeJS {
|
||||||
interface ProcessEnv {
|
interface ProcessEnv {
|
||||||
CWD: string;
|
/**
|
||||||
|
* Node environment, if any.
|
||||||
|
*/
|
||||||
|
readonly NODE_ENV?: "development" | "production";
|
||||||
/**
|
/**
|
||||||
* @todo Determine where this is used and if it is needed,
|
* @todo Determine where this is used and if it is needed,
|
||||||
* give it a better name.
|
* give it a better name.
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
AK_API_BASE_PATH: string;
|
readonly AK_API_BASE_PATH?: string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,17 +1,15 @@
|
|||||||
import replace from "@rollup/plugin-replace";
|
/// <reference types="@wdio/browser-runner" />
|
||||||
import { browser } from "@wdio/globals";
|
import { browser } from "@wdio/globals";
|
||||||
import type { Options } from "@wdio/types";
|
import type { Options } from "@wdio/types";
|
||||||
import path from "path";
|
import path from "node:path";
|
||||||
import { cwd } from "process";
|
import { fileURLToPath } from "node:url";
|
||||||
import { fileURLToPath } from "url";
|
import { createBundleDefinitions } from "scripts/esbuild/environment.mjs";
|
||||||
import type { UserConfig } from "vite";
|
import type { InlineConfig } from "vite";
|
||||||
import litCss from "vite-plugin-lit-css";
|
import litCSS from "vite-plugin-lit-css";
|
||||||
import tsconfigPaths from "vite-tsconfig-paths";
|
import tsconfigPaths from "vite-tsconfig-paths";
|
||||||
|
|
||||||
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
||||||
|
|
||||||
const isProdBuild = process.env.NODE_ENV === "production";
|
|
||||||
const apiBasePath = process.env.AK_API_BASE_PATH || "";
|
|
||||||
const runHeadless = process.env.CI !== undefined;
|
const runHeadless = process.env.CI !== undefined;
|
||||||
|
|
||||||
const testSafari = process.env.WDIO_TEST_SAFARI !== undefined;
|
const testSafari = process.env.WDIO_TEST_SAFARI !== undefined;
|
||||||
@ -72,21 +70,9 @@ export const config: Options.Testrunner = {
|
|||||||
runner: [
|
runner: [
|
||||||
"browser",
|
"browser",
|
||||||
{
|
{
|
||||||
viteConfig: (userConfig: UserConfig = { plugins: [] }) => ({
|
viteConfig: {
|
||||||
...userConfig,
|
define: createBundleDefinitions(),
|
||||||
plugins: [
|
plugins: [litCSS(), tsconfigPaths()],
|
||||||
litCss(),
|
|
||||||
replace({
|
|
||||||
"process.env.NODE_ENV": JSON.stringify(
|
|
||||||
isProdBuild ? "production" : "development",
|
|
||||||
),
|
|
||||||
"process.env.CWD": JSON.stringify(cwd()),
|
|
||||||
"process.env.AK_API_BASE_PATH": JSON.stringify(apiBasePath),
|
|
||||||
"preventAssignment": true,
|
|
||||||
}),
|
|
||||||
...(userConfig?.plugins ?? []),
|
|
||||||
tsconfigPaths(),
|
|
||||||
],
|
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
"@goauthentik/admin": path.resolve(__dirname, "src/admin"),
|
"@goauthentik/admin": path.resolve(__dirname, "src/admin"),
|
||||||
@ -101,7 +87,7 @@ export const config: Options.Testrunner = {
|
|||||||
"@goauthentik/user": path.resolve(__dirname, "src/user"),
|
"@goauthentik/user": path.resolve(__dirname, "src/user"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}),
|
} satisfies InlineConfig,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user