everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
111 lines (109 loc) • 3.11 kB
JavaScript
import process from "node:process";
import * as p from "@clack/prompts";
//#region src/cli/prompts.ts
function parseExtendsRef(ref) {
const match = (ref.startsWith("bos://") ? ref : `bos://${ref}`).match(/^bos:\/\/([^/]+)\/(.+)$/);
if (!match) return null;
return {
account: match[1],
gateway: match[2]
};
}
function deriveAccountFromExtends(domain, extendsAccount) {
const firstSegment = domain.split(".")[0];
if (!firstSegment) return "";
return `${firstSegment}.${extendsAccount.includes(".") ? extendsAccount.substring(extendsAccount.indexOf(".") + 1) : extendsAccount}`;
}
const OVERRIDE_OPTIONS = [
{
value: "ui",
label: "ui",
hint: "Override UI with local source"
},
{
value: "api",
label: "api",
hint: "Override API with local source"
},
{
value: "host",
label: "host",
hint: "Override host with local source"
},
{
value: "plugins",
label: "plugins",
hint: "Override selected plugins with local source"
}
];
async function promptInitBasic(input) {
p.intro("Let's build an app...");
const domain = input.domain ?? await p.text({
message: "Starting with a domain?",
placeholder: "no"
});
if (p.isCancel(domain)) process.exit(0);
let extendsAccount = "dev.everything.near";
let extendsGateway = "everything.dev";
const accountDefault = domain ? deriveAccountFromExtends(domain, extendsAccount) : "";
const account = input.account ?? await p.text({
message: "What NEAR account will you publish from?",
placeholder: accountDefault || "skip",
defaultValue: accountDefault
});
if (p.isCancel(account)) process.exit(0);
const resolvedAccount = account || accountDefault;
const extendsInput = input.extends ?? await p.text({
message: "Extending an existing app?",
placeholder: "bos://dev.everything.near/everything.dev"
});
if (p.isCancel(extendsInput)) process.exit(0);
if (extendsInput) {
const parsed = parseExtendsRef(extendsInput);
if (parsed) {
extendsAccount = parsed.account;
extendsGateway = parsed.gateway;
}
}
return {
extendsAccount,
extendsGateway,
domain: domain || "",
account: resolvedAccount || void 0
};
}
async function promptInitOverrides(input) {
const overrides = input.overrides ?? await p.multiselect({
message: "What do you want to customize?",
options: OVERRIDE_OPTIONS,
initialValues: ["ui", "api"],
required: false
});
if (p.isCancel(overrides)) process.exit(0);
let plugins = [];
if (overrides.includes("plugins")) {
const parentPlugins = input.parentPluginKeys ?? [];
const pluginOptions = parentPlugins.length > 0 ? parentPlugins.map((key) => ({
value: key,
label: key
})) : [];
plugins = input.plugins ?? (pluginOptions.length > 0 ? await p.multiselect({
message: "Select plugins to include:",
options: pluginOptions,
required: false
}) : []);
if (p.isCancel(plugins)) process.exit(0);
}
const go = await p.confirm({
message: "GO!",
initialValue: true
});
if (p.isCancel(go) || !go) process.exit(0);
return {
overrides,
plugins
};
}
//#endregion
export { promptInitBasic, promptInitOverrides };
//# sourceMappingURL=prompts.mjs.map