54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import type { RuntimeEnv } from "../runtime.js";
|
|
import type { WizardPrompter } from "../wizard/prompts.js";
|
|
|
|
type OAuthPrompt = { message: string; placeholder?: string };
|
|
|
|
const validateRequiredInput = (value: string) => (value.trim().length > 0 ? undefined : "Required");
|
|
|
|
export function createVpsAwareOAuthHandlers(params: {
|
|
isRemote: boolean;
|
|
prompter: WizardPrompter;
|
|
runtime: RuntimeEnv;
|
|
spin: ReturnType<WizardPrompter["progress"]>;
|
|
openUrl: (url: string) => Promise<unknown>;
|
|
localBrowserMessage: string;
|
|
manualPromptMessage?: string;
|
|
}): {
|
|
onAuth: (event: { url: string }) => Promise<void>;
|
|
onPrompt: (prompt: OAuthPrompt) => Promise<string>;
|
|
} {
|
|
const manualPromptMessage = params.manualPromptMessage ?? "Paste the redirect URL";
|
|
let manualCodePromise: Promise<string> | undefined;
|
|
|
|
return {
|
|
onAuth: async ({ url }) => {
|
|
if (params.isRemote) {
|
|
params.spin.stop("OAuth URL ready");
|
|
params.runtime.log(`\nOpen this URL in your LOCAL browser:\n\n${url}\n`);
|
|
manualCodePromise = params.prompter
|
|
.text({
|
|
message: manualPromptMessage,
|
|
validate: validateRequiredInput,
|
|
})
|
|
.then((value) => String(value));
|
|
return;
|
|
}
|
|
|
|
params.spin.update(params.localBrowserMessage);
|
|
await params.openUrl(url);
|
|
params.runtime.log(`Open: ${url}`);
|
|
},
|
|
onPrompt: async (prompt) => {
|
|
if (manualCodePromise) {
|
|
return manualCodePromise;
|
|
}
|
|
const code = await params.prompter.text({
|
|
message: prompt.message,
|
|
placeholder: prompt.placeholder,
|
|
validate: validateRequiredInput,
|
|
});
|
|
return String(code);
|
|
},
|
|
};
|
|
}
|