refactor(core): extract shared runtime and wizard schemas

This commit is contained in:
Peter Steinberger
2026-02-16 17:06:24 +00:00
parent c37f65a449
commit 8df83d1835
2 changed files with 32 additions and 46 deletions

View File

@@ -32,19 +32,16 @@ export const WizardNextParamsSchema = Type.Object(
{ additionalProperties: false },
);
export const WizardCancelParamsSchema = Type.Object(
const WizardSessionIdParamsSchema = Type.Object(
{
sessionId: NonEmptyString,
},
{ additionalProperties: false },
);
export const WizardStatusParamsSchema = Type.Object(
{
sessionId: NonEmptyString,
},
{ additionalProperties: false },
);
export const WizardCancelParamsSchema = WizardSessionIdParamsSchema;
export const WizardStatusParamsSchema = WizardSessionIdParamsSchema;
export const WizardStepOptionSchema = Type.Object(
{
@@ -78,35 +75,28 @@ export const WizardStepSchema = Type.Object(
{ additionalProperties: false },
);
export const WizardNextResultSchema = Type.Object(
{
done: Type.Boolean(),
step: Type.Optional(WizardStepSchema),
status: Type.Optional(WizardRunStatusSchema),
error: Type.Optional(Type.String()),
},
{ additionalProperties: false },
);
const WizardResultFields = {
done: Type.Boolean(),
step: Type.Optional(WizardStepSchema),
status: Type.Optional(WizardRunStatusSchema),
error: Type.Optional(Type.String()),
};
export const WizardNextResultSchema = Type.Object(WizardResultFields, {
additionalProperties: false,
});
export const WizardStartResultSchema = Type.Object(
{
sessionId: NonEmptyString,
done: Type.Boolean(),
step: Type.Optional(WizardStepSchema),
status: Type.Optional(WizardRunStatusSchema),
error: Type.Optional(Type.String()),
...WizardResultFields,
},
{ additionalProperties: false },
);
export const WizardStatusResultSchema = Type.Object(
{
status: Type.Union([
Type.Literal("running"),
Type.Literal("done"),
Type.Literal("cancelled"),
Type.Literal("error"),
]),
status: WizardRunStatusSchema,
error: Type.Optional(Type.String()),
},
{ additionalProperties: false },

View File

@@ -18,26 +18,7 @@ function shouldEmitRuntimeLog(env: NodeJS.ProcessEnv = process.env): boolean {
return typeof maybeMockedLog.mock === "object";
}
export const defaultRuntime: RuntimeEnv = {
log: (...args: Parameters<typeof console.log>) => {
if (!shouldEmitRuntimeLog()) {
return;
}
clearActiveProgressLine();
console.log(...args);
},
error: (...args: Parameters<typeof console.error>) => {
clearActiveProgressLine();
console.error(...args);
},
exit: (code) => {
restoreTerminalState("runtime exit", { resumeStdinIfPaused: false });
process.exit(code);
throw new Error("unreachable"); // satisfies tests when mocked
},
};
export function createNonExitingRuntime(): RuntimeEnv {
function createRuntimeIo(): Pick<RuntimeEnv, "log" | "error"> {
return {
log: (...args: Parameters<typeof console.log>) => {
if (!shouldEmitRuntimeLog()) {
@@ -50,6 +31,21 @@ export function createNonExitingRuntime(): RuntimeEnv {
clearActiveProgressLine();
console.error(...args);
},
};
}
export const defaultRuntime: RuntimeEnv = {
...createRuntimeIo(),
exit: (code) => {
restoreTerminalState("runtime exit", { resumeStdinIfPaused: false });
process.exit(code);
throw new Error("unreachable"); // satisfies tests when mocked
},
};
export function createNonExitingRuntime(): RuntimeEnv {
return {
...createRuntimeIo(),
exit: (code: number): never => {
throw new Error(`exit ${code}`);
},