* web: Prep ESBuild plugin for publish. * prettier-config: Update deps. * eslint-config: Update deps. * docusaurus-config: Update deps. * docs: Update deps. * docs: Enable linter. * docs: Lint. * web/sfe: Clean up types. Prep for monorepo. * esbuild-plugin-live-reload: Update deps. * web: Tidy ESLint, script commands. * web: Fix logs. * web: Lint. * web: Split compile check from cached version.
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @file Remark plugin to transform `ak-support` directives into support level badges.
 | 
						|
 *
 | 
						|
 * @import { Root } from "mdast";
 | 
						|
 */
 | 
						|
import { h } from "hastscript";
 | 
						|
import { SKIP, visit } from "unist-util-visit";
 | 
						|
 | 
						|
/**
 | 
						|
 * Support levels for authentik.
 | 
						|
 * @typedef {"authentik" | "community" | "vendor" | "deprecated"} SupportLevel
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Mapping of support levels to badge classes.
 | 
						|
 *
 | 
						|
 * @satisfies {Record<SupportLevel, string>}
 | 
						|
 */
 | 
						|
export const SupportLevelToLabel = /** @type {const} */ ({
 | 
						|
    authentik: "authentik",
 | 
						|
    community: "Community",
 | 
						|
    vendor: "Vendor",
 | 
						|
    deprecated: "Deprecated",
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Type-predicate to determine if a string is a known support level.
 | 
						|
 *
 | 
						|
 * @param {string} input The string to check.
 | 
						|
 * @return {input is SupportLevel} True if the string is a known support level.
 | 
						|
 */
 | 
						|
export function isSupportLevel(input) {
 | 
						|
    return Object.hasOwn(SupportLevelToLabel, input);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * MDAST plugin to transform `ak-support` directives into preview badges.
 | 
						|
 */
 | 
						|
function remarkSupportDirective() {
 | 
						|
    /**
 | 
						|
     * @param {Root} tree The MDAST tree to transform.
 | 
						|
     */
 | 
						|
    return (tree) => {
 | 
						|
        visit(tree, "textDirective", (node) => {
 | 
						|
            if (node.name !== "ak-support") return SKIP;
 | 
						|
 | 
						|
            const firstChild = node.children[0];
 | 
						|
 | 
						|
            if (firstChild?.type !== "text") return SKIP;
 | 
						|
 | 
						|
            const level = firstChild.value.trim();
 | 
						|
 | 
						|
            if (!isSupportLevel(level)) {
 | 
						|
                throw new TypeError(`Invalid support level: ${level}`);
 | 
						|
            }
 | 
						|
 | 
						|
            const label = SupportLevelToLabel[level];
 | 
						|
 | 
						|
            const data = node.data || (node.data = {});
 | 
						|
 | 
						|
            const hast = h("span", {
 | 
						|
                ...node.attributes,
 | 
						|
                "className": `badge badge--support-${level}`,
 | 
						|
                "title": `This feature is supported at the ${label} level.`,
 | 
						|
                "aria-description": "Support level badge",
 | 
						|
                "role": "img",
 | 
						|
            });
 | 
						|
 | 
						|
            data.hName = hast.tagName;
 | 
						|
            data.hProperties = hast.properties;
 | 
						|
 | 
						|
            data.hChildren = [
 | 
						|
                {
 | 
						|
                    type: "text",
 | 
						|
                    value: `Support level: ${label}`,
 | 
						|
                },
 | 
						|
            ];
 | 
						|
 | 
						|
            node.children = [];
 | 
						|
 | 
						|
            return SKIP;
 | 
						|
        });
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
export default remarkSupportDirective;
 |