
* web: Allow build errors to propagate. * web: Refactor MDX for client-side rendering. * Remove override Signed-off-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com> * revert css for links and tables Signed-off-by: Jens Langhammer <jens@goauthentik.io> * web: Move Markdown specific styles. --------- Signed-off-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com> Signed-off-by: Jens Langhammer <jens@goauthentik.io> Co-authored-by: Jens Langhammer <jens@goauthentik.io>
82 lines
1.9 KiB
JavaScript
82 lines
1.9 KiB
JavaScript
/**
|
|
* @import {
|
|
OnLoadArgs,
|
|
OnLoadResult,
|
|
Plugin,
|
|
PluginBuild
|
|
* } from 'esbuild'
|
|
*/
|
|
import * as fs from "node:fs/promises";
|
|
import * as path from "node:path";
|
|
|
|
/**
|
|
* @typedef {Omit<OnLoadArgs, 'pluginData'> & LoadDataFields} LoadData
|
|
* Data passed to `onload`.
|
|
*
|
|
* @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.
|
|
*/
|
|
|
|
const name = "mdx-plugin";
|
|
|
|
/**
|
|
* @typedef MDXPluginOptions
|
|
*
|
|
* @property {string} root Root directory.
|
|
*/
|
|
|
|
/**
|
|
* Bundle MDX into JSON modules.
|
|
*
|
|
* @param {MDXPluginOptions} options Options.
|
|
* @returns {Plugin} Plugin.
|
|
*/
|
|
export function mdxPlugin({ root }) {
|
|
return { name, setup };
|
|
|
|
/**
|
|
* @param {PluginBuild} build
|
|
* Build.
|
|
* @returns {undefined}
|
|
* Nothing.
|
|
*/
|
|
function setup(build) {
|
|
build.onLoad({ filter: /\.mdx?$/ }, onload);
|
|
|
|
/**
|
|
* @param {LoadData} data
|
|
* Data.
|
|
* @returns {Promise<OnLoadResult>}
|
|
* Result.
|
|
*/
|
|
async function onload(data) {
|
|
const content = String(
|
|
data.pluginData &&
|
|
data.pluginData.contents !== null &&
|
|
data.pluginData.contents !== undefined
|
|
? data.pluginData.contents
|
|
: await fs.readFile(data.path),
|
|
);
|
|
|
|
const publicPath = path.resolve(
|
|
"/",
|
|
path.relative(path.join(root, "website"), data.path),
|
|
);
|
|
const publicDirectory = path.dirname(publicPath);
|
|
|
|
return {
|
|
contents: JSON.stringify({ content, publicPath, publicDirectory }),
|
|
loader: "file",
|
|
};
|
|
}
|
|
}
|
|
}
|