@roots/bud-dashboard
Version:
bud.js core module
99 lines (98 loc) • 5.21 kB
JavaScript
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@roots/bud-support/jsx-runtime";
import { exit } from 'node:process';
import Footer from '@roots/bud-dashboard/components/footer';
import Compilation from '@roots/bud-dashboard/views/compilation';
import Debug from '@roots/bud-dashboard/views/debug';
import Server from '@roots/bud-dashboard/views/server';
import escapes from '@roots/bud-support/ansi-escapes';
import { render as renderError } from '@roots/bud-support/errors';
import { Box, Static, useApp, useInput, useState, useStdout, } from '@roots/bud-support/ink';
export const Application = ({ basedir, compact, compilations, debug, devUrl, displayAssets, displayEntrypoints, displayServerInfo, error, isolated = 0, mode, proxy, proxyUrl, publicDevUrl, publicProxyUrl, }) => {
const { stdout } = useStdout();
compilations = Array.isArray(compilations)
? (compilations?.filter(compilation => compilation.hash) ?? [])
: [];
if (error) {
renderError(error);
return null;
}
if (mode === `production`) {
return (_jsx(Box, { flexDirection: "column", gap: 1, children: _jsx(Static, { items: compilations, children: (compilation, id) => {
if (isolated > 0 && id + 1 !== isolated)
return null;
return (_jsx(RenderCompilation, { basedir: basedir, compact: compact, compilation: compilation, compilations: compilations, debug: debug, displayAssets: displayAssets, displayEntrypoints: displayEntrypoints, id: id, stdout: stdout }, `${compilation.name}-${compilation.hash}-${id}`));
} }) }));
}
return (_jsxs(_Fragment, { children: [compilations.map((compilation, id) => (_jsx(RenderCompilation, { basedir: basedir, compact: compact, compilation: compilation, compilations: compilations, debug: debug, displayAssets: displayAssets, displayEntrypoints: displayEntrypoints, id: id, stdout: stdout }, `${compilation.name}-${compilation.hash}-${id}`))), _jsx(Server, { devUrl: devUrl, displayServerInfo: displayServerInfo, mode: mode, proxy: proxy, proxyUrl: proxyUrl, publicDevUrl: publicDevUrl, publicProxyUrl: publicProxyUrl })] }));
};
export const RenderCompilation = ({ basedir, compact, compilation, compilations, debug, displayAssets, displayEntrypoints, id, stdout, }) => {
return (_jsxs(Box, { flexDirection: "column", gap: 1, width: stdout.columns - 2, children: [_jsx(Compilation, { basedir: basedir, compact: compact, compilation: compilation, debug: debug, displayAssets: displayAssets, displayEntrypoints: displayEntrypoints, id: id + 1, total: compilations?.length }), _jsx(Debug, { compilation: compilation, debug: debug })] }));
};
export const TeletypeApplication = ({ children, close, notifier, ...props }) => {
const onExit = useOnExit();
const stdout = useStdout();
const [compact, setCompact] = useState(props.compact);
const [debug, setDisplayDebug] = useState(props.debug);
const [displayAssets, setDisplayAssets] = useState(props.displayAssets);
const [displayEntrypoints, setDisplayEntrypoints] = useState(true);
const [displayServerInfo, setDisplayServerInfo] = useState(props.displayServerInfo);
const [help, setHelp] = useState(false);
const [isolated, setIsolated] = useState(0);
useInput((key, input) => {
switch (key) {
case `a`:
setDisplayAssets(!displayAssets);
break;
case `b`:
if (notifier?.openBrowser && props.devUrl) {
notifier.openBrowser(props.devUrl?.toString());
notifier.browserOpened = false;
}
break;
case `c`:
setCompact(!compact);
break;
case `d`:
setDisplayDebug(!debug);
break;
case `e`:
setDisplayEntrypoints(!displayEntrypoints);
break;
case `h`:
setHelp(!help);
break;
case `q`:
onExit();
break;
case `r`:
stdout.write(escapes.clearTerminal);
break;
case `s`:
setDisplayServerInfo(!displayServerInfo);
break;
case `0`:
setIsolated(0);
break;
}
new Array(9).fill(0).forEach((_, i) => {
if (!props.compilations)
return;
key === `${i + 1}` &&
isolated !== i + 1 &&
setIsolated(Math.min(i + 1, props.compilations.length));
});
if (input.escape)
onExit();
});
return (_jsxs(_Fragment, { children: [_jsx(Application, { ...props, compact: compact, debug: debug, displayAssets: displayAssets, displayEntrypoints: displayEntrypoints, displayServerInfo: displayServerInfo, isolated: isolated }), _jsx(Footer, { display: help })] }));
};
const useOnExit = () => {
const app = useApp();
return (error) => {
if (error)
app.exit(error);
else
app.exit();
exit(error ? 1 : 0);
};
};