@withstudiocms/effect
Version:
Effect-TS Utilities for Astro
116 lines (115 loc) • 4.2 kB
JavaScript
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
};