import type { WizardPrompter } from "../../wizard/prompts.js" ;
export type ChannelAccessPolicy = "allowlist" | "open" | "disabled" ;
export function parseAllowlistEntries(raw: string): string[] {
return raw
.split(/[\n,;]+/g)
.map((entry) => entry.trim())
.filter(Boolean );
}
export function formatAllowlistEntries(entries: string[]): string {
return entries
.map((entry) => entry.trim())
.filter(Boolean )
.join(", " );
}
export async function promptChannelAccessPolicy(params: {
prompter: WizardPrompter;
label: string;
currentPolicy?: ChannelAccessPolicy;
allowOpen?: boolean ;
allowDisabled?: boolean ;
}): Promise<ChannelAccessPolicy> {
const options: Array<{ value: ChannelAccessPolicy; label: string }> = [
{ value: "allowlist" , label: "Allowlist (recommended)" },
];
if (params.allowOpen !== false ) {
options.push({ value: "open" , label: "Open (allow all channels)" });
}
if (params.allowDisabled !== false ) {
options.push({ value: "disabled" , label: "Disabled (block all channels)" });
}
const initialValue = params.currentPolicy ?? "allowlist" ;
return await params.prompter.select({
message: `${params.label} access`,
options,
initialValue,
});
}
export async function promptChannelAllowlist(params: {
prompter: WizardPrompter;
label: string;
currentEntries?: string[];
placeholder?: string;
}): Promise<string[]> {
const initialValue =
params.currentEntries && params.currentEntries.length > 0
? formatAllowlistEntries(params.currentEntries)
: undefined;
const raw = await params.prompter.text({
message: `${params.label} allowlist (comma-separated)`,
placeholder: params.placeholder,
initialValue,
});
return parseAllowlistEntries(raw);
}
export async function promptChannelAccessConfig(params: {
prompter: WizardPrompter;
label: string;
currentPolicy?: ChannelAccessPolicy;
currentEntries?: string[];
placeholder?: string;
allowOpen?: boolean ;
allowDisabled?: boolean ;
skipAllowlistEntries?: boolean ;
defaultPrompt?: boolean ;
updatePrompt?: boolean ;
}): Promise<{ policy: ChannelAccessPolicy; entries: string[] } | null > {
const hasEntries = (params.currentEntries ?? []).length > 0 ;
const shouldPrompt = params.defaultPrompt ?? !hasEntries;
const wants = await params.prompter.confirm({
message: params.updatePrompt
? `Update ${params.label} access?`
: `Configure ${params.label} access?`,
initialValue: shouldPrompt,
});
if (!wants) {
return null ;
}
const policy = await promptChannelAccessPolicy({
prompter: params.prompter,
label: params.label,
currentPolicy: params.currentPolicy,
allowOpen: params.allowOpen,
allowDisabled: params.allowDisabled,
});
if (policy !== "allowlist" ) {
return { policy, entries: [] };
}
if (params.skipAllowlistEntries) {
return { policy, entries: [] };
}
const entries = await promptChannelAllowlist({
prompter: params.prompter,
label: params.label,
currentEntries: params.currentEntries,
placeholder: params.placeholder,
});
return { policy, entries };
}
Messung V0.5 in Prozent C=93 H=97 G=94
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland