Files
authentik/web/packages/core/version/node.js
Teffen Ellis 17da90df6c web: Fix docs links, a11y input descriptors (#16671)
* web: Clarify required marker when using screen reader.

* web: Mark helper text as input descriptor.

* web: Use next domain when in development.

* web: Clean up constants. Fix attribute mapping.

* web: use previous function name.

* web: Fix sort.

* web: Use constant.

* web: Use prefix.

* web: keep using current release for notes.
2025-09-18 00:34:15 +00:00

117 lines
3.1 KiB
JavaScript

/**
* @file Utility functions for working with semantic versions.
*
* @runtime node
*/
import { NodeEnvironment } from "#environment/node";
import { parse } from "semver";
// ts-import-sorter: disable
import PackageJSON from "../../../../package.json" with { type: "json" };
//#region Semantic Versioning
/**
* @typedef {`${number}.${number}.${number}${string}`} SemVerSource
*/
/**
* The current version of authentik in SemVer format.
*
* @runtime node
*/
export const AuthentikVersion = /** @type {SemVerSource} */ (PackageJSON.version);
/**
* A parsed SemVer object of the current version of authentik.
*
* @runtime node
*/
export const ParsedAuthentikVersion = parse(AuthentikVersion, true, true);
const { major, minor, patch } = ParsedAuthentikVersion;
//#endregion
//#region Build Identifiers
const { GIT_BUILD_HASH = "" } = process.env;
/**
* Whether the current build is a prerelease.
*
* Much of the criteria that determines whether a **build** is considered a prerelease
* is derived from environment variables -- not the SemVer version.
*
* Local development builds are also consider prerelease since they're not
* necessarily tied to a specific SemVer version.
*
* If you're developing locally and using a Dockerized development environment,
* Set the `GIT_BUILD_HASH` environment variable to `dev` to hint that the container should
* prefer pre-release versioning over its own.
*/
const prerelease = NodeEnvironment === "development" || !GIT_BUILD_HASH || GIT_BUILD_HASH === "dev";
/**
* An identifier representing the current version of authentik,
* optionally prefixed with Git commit hash.
*
* This must match the behavior defined in authentik's server-side `authentik_full_version` function.
*
* @runtime node
* @see {@link "authentik\_\_init\_\_.py"}
*/
export const BuildIdentifier = /** @type {SemVerSource | `${SemVerSource}+${string}`} */ (
GIT_BUILD_HASH ? [AuthentikVersion, GIT_BUILD_HASH].join("+") : AuthentikVersion
);
//#endregion
//#region Documentation URLs
/**
* The published subdomain for the current version of authentik.
*/
export const VersionSubdomain = /** @type {`version-${number}-${number}`} */ (
["version", major, minor].join("-")
);
/**
* The published path to the current version of authentik.
*/
export const VersionPath = /** @type {`${number}.${number}`} */ ([major, minor].join("."));
/**
* A URL to the latest pre-release documentation.
*/
export const PreReleaseDocsURL = new URL(
process.env.PRE_RELEASE_ORIGIN || "https://next.goauthentik.io",
);
export const CurrentReleaseDocsURL = prerelease
? PreReleaseDocsURL
: new URL(`https://${VersionSubdomain}.goauthentik.io`);
/**
* A URL to the latest release notes, if any are available.
*
* @type {URL}
*
* @runtime node
*/
let ReleaseNotesURL;
if (prerelease) {
ReleaseNotesURL = new URL("/releases", PreReleaseDocsURL);
} else {
ReleaseNotesURL = new URL(`releases/${VersionPath}`, CurrentReleaseDocsURL);
ReleaseNotesURL.hash = `fixed-in-${[major, minor, patch].join("")}`;
}
ReleaseNotesURL.searchParams.append("utm_source", "authentik");
export { ReleaseNotesURL };
//#endregion