UNPKG

@withstudiocms/effect

Version:

Effect-TS Utilities for Astro

116 lines (115 loc) 4.2 kB
import * as ClackPrompts from "@clack/prompts"; import { deepmerge } from "./deepmerge.js"; import { Data, Effect } from "./effect.js"; class ClackError extends Data.TaggedError("ClackError") { } const useClackError = (_try) => Effect.try({ try: _try, catch: (cause) => new ClackError({ cause }) }); const useClackErrorPromise = (_try) => Effect.tryPromise({ try: _try, catch: (cause) => new ClackError({ cause }) }); const cancel = Effect.fn( (message) => useClackError(() => ClackPrompts.cancel(message)) ); const confirm = Effect.fn( (options) => useClackErrorPromise(() => ClackPrompts.confirm(options)) ); const group = (prompts, opts) => useClackErrorPromise(() => ClackPrompts.group(prompts, opts)); const groupMultiselect = (options) => useClackErrorPromise(() => ClackPrompts.groupMultiselect(options)); const intro = Effect.fn( (message) => useClackError(() => ClackPrompts.intro(message)) ); const isCancel = Effect.fn( (value) => useClackError(() => ClackPrompts.isCancel(value)) ); const multiselect = (options) => useClackErrorPromise(() => ClackPrompts.multiselect(options)); const note = Effect.fn( (message, title) => useClackError(() => ClackPrompts.note(message, title)) ); const outro = Effect.fn( (message) => useClackError(() => ClackPrompts.outro(message)) ); const password = (options) => useClackErrorPromise(() => ClackPrompts.password(options)); const select = (options) => useClackErrorPromise(() => ClackPrompts.select(options)); const selectKey = (options) => useClackErrorPromise(() => ClackPrompts.selectKey(options)); const tasks = (tasks2) => useClackErrorPromise(() => ClackPrompts.tasks(tasks2)); const text = (options) => useClackErrorPromise(() => ClackPrompts.text(options)); const updateSettings = (updates) => useClackError(() => ClackPrompts.updateSettings(updates)); const spinner = Effect.fn( (options = {}) => useClackError(() => { const s = ClackPrompts.spinner(options); return { start: (msg) => useClackError(() => s.start(msg)), stop: (msg, code) => useClackError(() => s.stop(msg, code)), message: (msg) => useClackError(() => s.message(msg)) }; }) ); const askToContinue = Effect.fn(function* (userOpts) { const defaultOpts = { message: "Continue?", initialValue: true }; const opts = yield* deepmerge((merge) => merge(defaultOpts, userOpts)); const response = yield* confirm(opts); if (yield* isCancel(response)) return false; return response; }); const log = { message: Effect.fn( (message, options) => useClackError(() => ClackPrompts.log.message(message, options)) ), success: Effect.fn((message) => useClackError(() => ClackPrompts.log.success(message))), step: Effect.fn((message) => useClackError(() => ClackPrompts.log.step(message))), warn: Effect.fn((message) => useClackError(() => ClackPrompts.log.warn(message))), warning: Effect.fn((message) => useClackError(() => ClackPrompts.log.warning(message))), error: Effect.fn((message) => useClackError(() => ClackPrompts.log.error(message))), info: Effect.fn((message) => useClackError(() => ClackPrompts.log.info(message))) }; const stream = { message: Effect.fn( (iterable, options) => useClackErrorPromise(() => ClackPrompts.stream.message(iterable, options)) ), info: Effect.fn( (iterable) => useClackErrorPromise(() => ClackPrompts.stream.info(iterable)) ), success: Effect.fn( (iterable) => useClackErrorPromise(() => ClackPrompts.stream.success(iterable)) ), step: Effect.fn( (iterable) => useClackErrorPromise(() => ClackPrompts.stream.step(iterable)) ), warn: Effect.fn( (iterable) => useClackErrorPromise(() => ClackPrompts.stream.warn(iterable)) ), warning: Effect.fn( (iterable) => useClackErrorPromise(() => ClackPrompts.stream.warning(iterable)) ), error: Effect.fn( (iterable) => useClackErrorPromise(() => ClackPrompts.stream.error(iterable)) ) }; export { ClackError, askToContinue, cancel, confirm, group, groupMultiselect, intro, isCancel, log, multiselect, note, outro, password, select, selectKey, spinner, stream, tasks, text, updateSettings, useClackError, useClackErrorPromise };