diff --git a/packages/game/src/schema/condition.ts b/packages/game/src/schema/condition.ts index e69de29..5d055c2 100644 --- a/packages/game/src/schema/condition.ts +++ b/packages/game/src/schema/condition.ts @@ -0,0 +1,33 @@ +import { z } from 'zod' + +export const fileInputSchema = z.object({ + path: z.string(), + type: z.enum(['file', 'folder']), +}) + +export type IFileInput = z.infer + +export const fileExistenceInputSchema = fileInputSchema.extend({ + exists: z.boolean(), +}) + +export type IFileExistenceInput = z.infer + +const baseConditionSchema = z.object({ + command: z.string().optional(), + output: z.string().optional(), + error: z.string().optional(), + pwd: z.string().optional(), + files: z.array(fileExistenceInputSchema).optional(), +}) + +export type ICondition = z.infer & { + or?: ICondition[] + not?: ICondition +} + +export const conditionSchema: z.ZodType = + baseConditionSchema.extend({ + or: z.lazy(() => z.array(conditionSchema)).optional(), + not: z.lazy(() => conditionSchema).optional(), + }) diff --git a/packages/game/src/schema/index.ts b/packages/game/src/schema/index.ts index f21337b..777cf0a 100644 --- a/packages/game/src/schema/index.ts +++ b/packages/game/src/schema/index.ts @@ -1,54 +1,7 @@ -import { z } from 'zod' - -export const requirementsSchema = z.object({ - requirements: z.array(z.string()), -}) - -export type IRequirements = z.infer - -export const fileInputSchema = z.object({ - path: z.string(), - type: z.enum(['file', 'folder']), -}) - -export type IFileInput = z.infer - -export const fileExistenceInputSchema = fileInputSchema.extend({ - exists: z.boolean(), -}) - -export type IFileExistenceInput = z.infer - -const baseConditionSchema = z.object({ - command: z.string().optional(), - output: z.string().optional(), - error: z.string().optional(), - pwd: z.string().optional(), - files: z.array(fileExistenceInputSchema).optional(), -}) - -export type ICondition = z.infer & { - or?: ICondition[] - not?: ICondition -} - -export const conditionSchema: z.ZodType = - baseConditionSchema.extend({ - or: z.lazy(() => z.array(conditionSchema)).optional(), - not: z.lazy(() => conditionSchema).optional(), - }) - -export const responseSchema = z.object({ - type: z.enum(['narrative', 'dialogue']), - content: z.string(), -}) - -export const stageSchema = z.object({ - id: z.string().regex(/^[a-zA-Z0-9_-]+$/), - name: z.string().optional(), - requirements: z.array(z.string()), - condition: conditionSchema, - response: responseSchema, -}) - -export type IStage = z.infer +export { conditionSchema, ICondition } from './condition.js' +export { stageSchema, IStage } from './stage.js' +export { + requirementsSchema, + IRequirements, + responseSchema, +} from './requirements.js' diff --git a/packages/game/src/schema/requirements.ts b/packages/game/src/schema/requirements.ts index e69de29..3bbea7d 100644 --- a/packages/game/src/schema/requirements.ts +++ b/packages/game/src/schema/requirements.ts @@ -0,0 +1,12 @@ +import { z } from 'zod' + +export const requirementsSchema = z.object({ + requirements: z.array(z.string()), +}) + +export type IRequirements = z.infer + +export const responseSchema = z.object({ + type: z.enum(['narrative', 'dialogue']), + content: z.string(), +}) diff --git a/packages/game/src/schema/stage.ts b/packages/game/src/schema/stage.ts index e69de29..8f5a1cf 100644 --- a/packages/game/src/schema/stage.ts +++ b/packages/game/src/schema/stage.ts @@ -0,0 +1,12 @@ +import { z } from 'zod' +import { conditionSchema, responseSchema } from './index.js' + +export const stageSchema = z.object({ + id: z.string().regex(/^[a-zA-Z0-9_-]+$/), + name: z.string().optional(), + requirements: z.array(z.string()), + condition: conditionSchema, + response: responseSchema, +}) + +export type IStage = z.infer