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

View File

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