 c28b65a3f2
			
		
	
	c28b65a3f2
	
	
	
		
			
			* web: Fix issues surrounding availability of controllers during init. web: Fix edgecase where flow does not have brand. * web: Fix import path. * web: Clean up mixin/controller paths. * web: Prepare for consistent import styling. - Prep for Storybook fixes. * web: Update MDX types. * web: Fix issues surrounding async imports, MDX typing, relative paths. * web: Format. Clarify. * web: Group module types.
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @file MDX plugin for ESBuild.
 | |
|  *
 | |
|  * @import {
 | |
|  *   OnLoadArgs,
 | |
|  *   OnLoadResult,
 | |
|  *   OnResolveArgs,
 | |
|  *   OnResolveResult,
 | |
|  *   Plugin,
 | |
|  *   PluginBuild
 | |
|  * } from "esbuild"
 | |
|  */
 | |
| import { MonoRepoRoot } from "@goauthentik/core/paths/node";
 | |
| 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 pluginName = "mdx-plugin";
 | |
| 
 | |
| /**
 | |
|  * @typedef MDXPluginOptions
 | |
|  *
 | |
|  * @property {string} root Root directory.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Bundle MDX into JSON modules.
 | |
|  *
 | |
|  * @param {MDXPluginOptions} options
 | |
|  * @returns {Plugin}
 | |
|  */
 | |
| export function mdxPlugin({ root }) {
 | |
|     // TODO: Replace with `resolvePackage` after NPM Workspaces support is added.
 | |
|     const docsPackageRoot = path.resolve(MonoRepoRoot, "website");
 | |
| 
 | |
|     /**
 | |
|      * @param {PluginBuild} build
 | |
|      */
 | |
|     function setup(build) {
 | |
|         /**
 | |
|          * @param {OnResolveArgs} args
 | |
|          * @returns {Promise<OnResolveResult>}
 | |
|          */
 | |
|         async function resolveListener(args) {
 | |
|             if (!args.path.startsWith("~")) return args;
 | |
| 
 | |
|             return {
 | |
|                 path: path.resolve(docsPackageRoot, args.path.slice(1)),
 | |
|                 pluginName,
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * @param {LoadData} data
 | |
|          * @returns {Promise<OnLoadResult>}
 | |
|          */
 | |
|         async function loadListener(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",
 | |
|                 pluginName,
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         build.onResolve({ filter: /\.mdx?$/ }, resolveListener);
 | |
|         build.onLoad({ filter: /\.mdx?$/ }, loadListener);
 | |
|     }
 | |
| 
 | |
|     return {
 | |
|         name: pluginName,
 | |
|         setup,
 | |
|     };
 | |
| }
 |