{"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/messages.ts","../src/validator.ts","../src/parser.ts","../src/serializer.ts"],"sourcesContent":["/**\n * @quizerjs/dsl - Quiz DSL 类型定义\n *\n * 定义 Quiz DSL（领域特定语言）的 TypeScript 类型\n * 基于 RFC 0001: Quiz DSL 规范\n */\n\n/**\n * DSL 版本号\n */\nexport type DSLVersion = string;\n\n/**\n * 问题类型常量对象\n */\nexport const QuestionTypes = {\n  SINGLE_CHOICE: 'single_choice', // 单选题\n  MULTIPLE_CHOICE: 'multiple_choice', // 多选题\n  TEXT_INPUT: 'text_input', // 文本输入题\n  TRUE_FALSE: 'true_false', // 判断题\n} as const;\n\n/**\n * 问题类型联合类型（所有可能的问题类型）\n */\nexport type QuestionType = (typeof QuestionTypes)[keyof typeof QuestionTypes];\n\n/**\n * 各问题类型的类型别名（从常量推导，保持类型安全）\n */\nexport type SingleChoiceType = typeof QuestionTypes.SINGLE_CHOICE;\nexport type MultipleChoiceType = typeof QuestionTypes.MULTIPLE_CHOICE;\nexport type TextInputType = typeof QuestionTypes.TEXT_INPUT;\nexport type TrueFalseType = typeof QuestionTypes.TRUE_FALSE;\n\n/**\n * 难度级别\n */\nexport type Difficulty = 'easy' | 'medium' | 'hard';\n\n/**\n * 选项接口\n */\nexport interface Option {\n  /** 选项唯一标识 */\n  id: string;\n  /** 选项文本 */\n  text: string;\n  /** 是否为正确答案 */\n  isCorrect: boolean;\n}\n\n/**\n * 问题元数据\n */\nexport interface QuestionMetadata {\n  /** 难度级别 */\n  difficulty?: Difficulty;\n  /** 标签列表 */\n  tags?: string[];\n  /** 自定义元数据 */\n  [key: string]: unknown;\n}\n\n/**\n * 单选题问题\n */\nexport interface SingleChoiceQuestion {\n  /** 问题唯一标识 */\n  id: string;\n  /** 问题类型 */\n  type: SingleChoiceType;\n  /** 问题文本 */\n  text: string;\n  /** 问题描述 */\n  description?: string;\n  /** 选项列表 */\n  options: Option[];\n  /** 题目分值 */\n  points?: number;\n  /** 答案解析 */\n  explanation?: string;\n  /** 问题元数据 */\n  metadata?: QuestionMetadata;\n}\n\n/**\n * 多选题问题\n */\nexport interface MultipleChoiceQuestion {\n  /** 问题唯一标识 */\n  id: string;\n  /** 问题类型 */\n  type: MultipleChoiceType;\n  /** 问题文本 */\n  text: string;\n  /** 问题描述 */\n  description?: string;\n  /** 选项列表 */\n  options: Option[];\n  /** 题目分值 */\n  points?: number;\n  /** 答案解析 */\n  explanation?: string;\n  /** 问题元数据 */\n  metadata?: QuestionMetadata;\n}\n\n/**\n * 文本输入题问题\n */\nexport interface TextInputQuestion {\n  /** 问题唯一标识 */\n  id: string;\n  /** 问题类型 */\n  type: TextInputType;\n  /** 问题文本 */\n  text: string;\n  /** 问题描述 */\n  description?: string;\n  /** 正确答案（可以是字符串或字符串数组） */\n  correctAnswer: string | string[];\n  /** 是否区分大小写 */\n  caseSensitive?: boolean;\n  /** 题目分值 */\n  points?: number;\n  /** 答案解析 */\n  explanation?: string;\n  /** 问题元数据 */\n  metadata?: QuestionMetadata;\n}\n\n/**\n * 判断题问题\n */\nexport interface TrueFalseQuestion {\n  /** 问题唯一标识 */\n  id: string;\n  /** 问题类型 */\n  type: TrueFalseType;\n  /** 问题文本 */\n  text: string;\n  /** 问题描述 */\n  description?: string;\n  /** 正确答案 */\n  correctAnswer: boolean;\n  /** 题目分值 */\n  points?: number;\n  /** 答案解析 */\n  explanation?: string;\n  /** 问题元数据 */\n  metadata?: QuestionMetadata;\n}\n\n/**\n * 问题联合类型\n */\nexport type Question =\n  | SingleChoiceQuestion\n  | MultipleChoiceQuestion\n  | TextInputQuestion\n  | TrueFalseQuestion;\n\n/**\n * 测验元数据\n */\nexport interface QuizMetadata {\n  /** 作者 */\n  author?: string;\n  /** 创建时间（ISO 8601 格式） */\n  createdAt?: string;\n  /** 更新时间（ISO 8601 格式） */\n  updatedAt?: string;\n  /** 标签列表 */\n  tags?: string[];\n  /** 自定义元数据 */\n  [key: string]: unknown;\n}\n\n/**\n * 测验设置\n */\nexport interface QuizSettings {\n  /** 是否允许重试 */\n  allowRetry?: boolean;\n  /** 是否显示结果 */\n  showResults?: boolean;\n  /** 时间限制（秒） */\n  timeLimit?: number;\n  /** 是否随机排序问题 */\n  randomizeQuestions?: boolean;\n  /** 是否随机排序选项 */\n  randomizeOptions?: boolean;\n  /** 及格分数（百分比） */\n  passingScore?: number;\n}\n\n/**\n * 章节数据\n */\nexport interface Section {\n  /** 章节唯一标识 */\n  id: string;\n  /** 章节标题 */\n  title: string;\n  /** 章节描述 */\n  description?: string;\n  /** 章节中的问题列表 */\n  questions: Question[];\n}\n\n/**\n * 测验数据\n */\nexport interface Quiz {\n  /** 测验唯一标识 */\n  id: string;\n  /** 测验标题 */\n  title: string;\n  /** 测验描述 */\n  description?: string;\n  /** 测验元数据 */\n  metadata?: QuizMetadata;\n  /** 测验设置 */\n  settings?: QuizSettings;\n  /** 问题列表（向后兼容，如果存在 sections 则忽略） */\n  questions?: Question[];\n  /** 章节列表（可选，用于组织问题） */\n  sections?: Section[];\n}\n\n/**\n * Quiz DSL 根对象\n */\nexport interface QuizDSL {\n  /** DSL 版本号 */\n  version: DSLVersion;\n  /** 测验数据 */\n  quiz: Quiz;\n}\n\n/**\n * 答案值类型\n */\nexport type AnswerValue = string | string[] | number | boolean;\n\n/**\n * 问题评分结果\n */\nexport interface QuestionResult {\n  /** 问题 ID */\n  questionId: string;\n  /** 是否正确 */\n  correct: boolean;\n  /** 得分 */\n  score: number;\n  /** 最高分数 */\n  maxScore: number;\n  /** 用户答案 */\n  userAnswer: AnswerValue;\n  /** 正确答案 */\n  correctAnswer: AnswerValue;\n  /** 答题时间（毫秒，可选） */\n  timeSpent?: number;\n}\n\n/**\n * Result DSL 类型定义\n * 用于存储测验结果，包含完整的 Quiz DSL、用户答案和评分信息\n */\nexport interface ResultDSL {\n  /** Result DSL 版本号 */\n  version: string;\n  /** 结果元数据 */\n  metadata: {\n    /** 结果 ID（唯一标识） */\n    id: string;\n    /** 关联的 Quiz ID */\n    quizId: string;\n    /** 用户 ID（可选） */\n    userId?: string;\n    /** 开始时间（ISO 8601） */\n    startedAt: string;\n    /** 完成时间（ISO 8601） */\n    completedAt: string;\n    /** 答题时长（毫秒） */\n    duration: number;\n  };\n  /** 完整的 Quiz DSL（原始测验数据） */\n  quiz: QuizDSL;\n  /** 用户答案 key: questionId, value: 用户答案 */\n  answers: Record<string, AnswerValue>;\n  /** 评分结果 */\n  scoring: {\n    /** 总得分 */\n    totalScore: number;\n    /** 最高分数 */\n    maxScore: number;\n    /** 得分百分比 */\n    percentage: number;\n    /** 是否通过 */\n    passed: boolean;\n    /** 通过分数线 */\n    passingScore: number;\n    /** 每题评分详情 */\n    questionResults?: QuestionResult[];\n  };\n}\n","/**\n * @quizerjs/dsl - 验证错误代码和消息\n *\n * 使用错误代码系统，支持国际化和消息模板\n */\n\n/**\n * 验证错误代码枚举\n */\nexport enum ValidationErrorCode {\n  // DSL 级别错误 (1000-1099)\n  DSL_MUST_BE_OBJECT = 'E1000',\n  VERSION_MUST_BE_STRING = 'E1001',\n\n  // Quiz 级别错误 (1100-1199)\n  QUIZ_MUST_BE_OBJECT = 'E1100',\n  QUIZ_ID_MUST_BE_STRING = 'E1101',\n  QUIZ_TITLE_MUST_BE_STRING = 'E1102',\n  QUIZ_QUESTIONS_MUST_BE_ARRAY = 'E1103',\n  QUIZ_SECTIONS_AND_QUESTIONS_MUTUALLY_EXCLUSIVE = 'E1104',\n\n  // Question 级别错误 (1200-1299)\n  QUESTION_MUST_BE_OBJECT = 'E1200',\n  QUESTION_ID_MUST_BE_STRING = 'E1201',\n  QUESTION_ID_DUPLICATE = 'E1202',\n  QUESTION_TYPE_MUST_BE_VALID = 'E1203',\n  QUESTION_TYPE_UNKNOWN = 'E1204',\n  QUESTION_TEXT_MUST_BE_STRING = 'E1205',\n\n  // Single Choice Question 错误 (1300-1399)\n  SINGLE_CHOICE_OPTIONS_MIN = 'E1300',\n  SINGLE_CHOICE_MUST_HAVE_ONE_CORRECT = 'E1301',\n\n  // Multiple Choice Question 错误 (1400-1499)\n  MULTIPLE_CHOICE_OPTIONS_MIN = 'E1400',\n  MULTIPLE_CHOICE_MUST_HAVE_AT_LEAST_ONE_CORRECT = 'E1401',\n\n  // Option 错误 (1500-1599)\n  OPTION_MUST_BE_OBJECT = 'E1500',\n  OPTION_ID_MUST_BE_STRING = 'E1501',\n  OPTION_ID_DUPLICATE = 'E1502',\n  OPTION_TEXT_MUST_BE_STRING = 'E1503',\n  OPTION_IS_CORRECT_MUST_BE_BOOLEAN = 'E1504',\n\n  // Text Input Question 错误 (1600-1699)\n  TEXT_INPUT_CORRECT_ANSWER_REQUIRED = 'E1600',\n  TEXT_INPUT_CORRECT_ANSWER_ARRAY_EMPTY = 'E1601',\n\n  // True/False Question 错误 (1700-1799)\n  TRUE_FALSE_CORRECT_ANSWER_MUST_BE_BOOLEAN = 'E1700',\n}\n\n/**\n * 错误消息模板（支持参数化）\n */\nexport type MessageTemplate =\n  | string\n  | ((id: string) => string)\n  | ((type: string) => string)\n  | ((...args: unknown[]) => string);\n\n/**\n * 错误消息映射\n */\nexport const ValidationMessages: Record<ValidationErrorCode, MessageTemplate> = {\n  // DSL 级别错误\n  [ValidationErrorCode.DSL_MUST_BE_OBJECT]: 'DSL 必须是对象',\n  [ValidationErrorCode.VERSION_MUST_BE_STRING]: 'version 必须存在且为字符串',\n\n  // Quiz 级别错误\n  [ValidationErrorCode.QUIZ_MUST_BE_OBJECT]: 'quiz 必须存在且为对象',\n  [ValidationErrorCode.QUIZ_ID_MUST_BE_STRING]: 'quiz.id 必须存在且为字符串',\n  [ValidationErrorCode.QUIZ_TITLE_MUST_BE_STRING]: 'quiz.title 必须存在且为字符串',\n  [ValidationErrorCode.QUIZ_QUESTIONS_MUST_BE_ARRAY]: 'quiz.questions 必须存在且为数组',\n  [ValidationErrorCode.QUIZ_SECTIONS_AND_QUESTIONS_MUTUALLY_EXCLUSIVE]:\n    'quiz.sections 和 quiz.questions 不能同时存在，请只使用其中一个',\n\n  // Question 级别错误\n  [ValidationErrorCode.QUESTION_MUST_BE_OBJECT]: '问题必须是对象',\n  [ValidationErrorCode.QUESTION_ID_MUST_BE_STRING]: '问题 id 必须存在且为字符串',\n  [ValidationErrorCode.QUESTION_ID_DUPLICATE]: (id: string) => `问题 id \"${id}\" 重复`,\n  [ValidationErrorCode.QUESTION_TYPE_MUST_BE_VALID]: '问题 type 必须存在且为有效的类型',\n  [ValidationErrorCode.QUESTION_TYPE_UNKNOWN]: (type: string) => `未知的问题类型: ${type}`,\n  [ValidationErrorCode.QUESTION_TEXT_MUST_BE_STRING]: '问题 text 必须存在且为字符串',\n\n  // Single Choice Question 错误\n  [ValidationErrorCode.SINGLE_CHOICE_OPTIONS_MIN]: '单选题必须至少包含 2 个选项',\n  [ValidationErrorCode.SINGLE_CHOICE_MUST_HAVE_ONE_CORRECT]: '单选题必须恰好有一个正确答案',\n\n  // Multiple Choice Question 错误\n  [ValidationErrorCode.MULTIPLE_CHOICE_OPTIONS_MIN]: '多选题必须至少包含 2 个选项',\n  [ValidationErrorCode.MULTIPLE_CHOICE_MUST_HAVE_AT_LEAST_ONE_CORRECT]:\n    '多选题必须至少有一个正确答案',\n\n  // Option 错误\n  [ValidationErrorCode.OPTION_MUST_BE_OBJECT]: '选项必须是对象',\n  [ValidationErrorCode.OPTION_ID_MUST_BE_STRING]: '选项 id 必须存在且为字符串',\n  [ValidationErrorCode.OPTION_ID_DUPLICATE]: (id: string) => `选项 id \"${id}\" 重复`,\n  [ValidationErrorCode.OPTION_TEXT_MUST_BE_STRING]: '选项 text 必须存在且为字符串',\n  [ValidationErrorCode.OPTION_IS_CORRECT_MUST_BE_BOOLEAN]: '选项 isCorrect 必须为布尔值',\n\n  // Text Input Question 错误\n  [ValidationErrorCode.TEXT_INPUT_CORRECT_ANSWER_REQUIRED]:\n    '文本输入题必须包含 correctAnswer（字符串或字符串数组）',\n  [ValidationErrorCode.TEXT_INPUT_CORRECT_ANSWER_ARRAY_EMPTY]: 'correctAnswer 数组不能为空',\n\n  // True/False Question 错误\n  [ValidationErrorCode.TRUE_FALSE_CORRECT_ANSWER_MUST_BE_BOOLEAN]:\n    '判断题必须包含 correctAnswer（布尔值）',\n};\n\n/**\n * 根据错误代码和参数生成错误消息\n */\nexport function getErrorMessage(code: ValidationErrorCode, ...args: unknown[]): string {\n  const template = ValidationMessages[code];\n  if (typeof template === 'function') {\n    // 处理参数化消息\n    if (args.length === 1 && typeof args[0] === 'string') {\n      // 单参数字符串类型（如 id 或 type）\n      return (template as (arg: string) => string)(args[0]);\n    }\n    // 多参数或通用情况\n    return (template as (...args: unknown[]) => string)(...args);\n  }\n  return template;\n}\n","/**\n * @quizerjs/dsl - Quiz DSL 验证器\n *\n * 提供 DSL 数据验证功能，确保数据符合规范\n */\n\nimport { Question, QuestionType, QuestionTypes } from './types';\nimport { ValidationErrorCode, getErrorMessage } from './messages';\n\n/**\n * 类型守卫：检查是否为普通对象（非数组）\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * 类型守卫：检查是否为字符串\n */\nfunction isString(value: unknown): value is string {\n  return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * 类型守卫：检查是否为数组\n */\nfunction isArray<T>(value: unknown): value is T[] {\n  return Array.isArray(value);\n}\n\n/**\n * 类型守卫：检查是否为布尔值\n */\nfunction isBoolean(value: unknown): value is boolean {\n  return typeof value === 'boolean';\n}\n\n/**\n * 类型守卫：检查是否为有效的 QuestionType\n */\nfunction isQuestionType(value: unknown): value is QuestionType {\n  return isString(value) && Object.values(QuestionTypes).includes(value as QuestionType);\n}\n\n/**\n * 验证错误信息\n */\nexport interface ValidationError {\n  /** 错误代码 */\n  code: ValidationErrorCode;\n  /** 错误路径（如 \"quiz.id\"） */\n  path: string;\n  /** 错误消息 */\n  message: string;\n}\n\n/**\n * 验证结果\n */\nexport interface ValidationResult {\n  /** 是否有效 */\n  valid: boolean;\n  /** 错误列表 */\n  errors: ValidationError[];\n}\n\n/**\n * 验证 DSL 数据\n *\n * @param dsl - 要验证的 DSL 数据\n * @returns 验证结果\n */\nexport function validateQuizDSL(dsl: unknown): ValidationResult {\n  const errors: ValidationError[] = [];\n\n  // 检查是否为对象\n  if (!isPlainObject(dsl)) {\n    return {\n      valid: false,\n      errors: [\n        {\n          code: ValidationErrorCode.DSL_MUST_BE_OBJECT,\n          path: '',\n          message: getErrorMessage(ValidationErrorCode.DSL_MUST_BE_OBJECT),\n        },\n      ],\n    };\n  }\n\n  const dslObj = dsl;\n\n  // 验证 version\n  if (!isString(dslObj.version)) {\n    errors.push({\n      code: ValidationErrorCode.VERSION_MUST_BE_STRING,\n      path: 'version',\n      message: getErrorMessage(ValidationErrorCode.VERSION_MUST_BE_STRING),\n    });\n  }\n\n  // 验证 quiz\n  if (!isPlainObject(dslObj.quiz)) {\n    errors.push({\n      code: ValidationErrorCode.QUIZ_MUST_BE_OBJECT,\n      path: 'quiz',\n      message: getErrorMessage(ValidationErrorCode.QUIZ_MUST_BE_OBJECT),\n    });\n    return { valid: false, errors };\n  }\n\n  const quiz = dslObj.quiz;\n\n  // 验证 quiz.id\n  if (!isString(quiz.id)) {\n    errors.push({\n      code: ValidationErrorCode.QUIZ_ID_MUST_BE_STRING,\n      path: 'quiz.id',\n      message: getErrorMessage(ValidationErrorCode.QUIZ_ID_MUST_BE_STRING),\n    });\n  }\n\n  // 验证 quiz.title\n  if (!isString(quiz.title)) {\n    errors.push({\n      code: ValidationErrorCode.QUIZ_TITLE_MUST_BE_STRING,\n      path: 'quiz.title',\n      message: getErrorMessage(ValidationErrorCode.QUIZ_TITLE_MUST_BE_STRING),\n    });\n  }\n\n  // 验证 quiz.questions 或 quiz.sections\n  // 支持两种格式：questions（向后兼容）或 sections（新格式）\n  // 但不能同时存在两个属性\n  const hasSections = isArray<unknown>(quiz.sections);\n  const hasQuestions = isArray<unknown>(quiz.questions);\n\n  if (hasSections && hasQuestions) {\n    // 两个属性同时存在，明确拒绝\n    errors.push({\n      code: ValidationErrorCode.QUIZ_SECTIONS_AND_QUESTIONS_MUTUALLY_EXCLUSIVE,\n      path: 'quiz',\n      message: getErrorMessage(ValidationErrorCode.QUIZ_SECTIONS_AND_QUESTIONS_MUTUALLY_EXCLUSIVE),\n    });\n    // 继续验证 sections（优先使用），但标记为错误状态\n  }\n\n  if (hasSections) {\n    // 验证 sections 格式\n    const questionIds = new Set<string>();\n    (quiz.sections as unknown[]).forEach((section: unknown, sectionIndex: number) => {\n      const sectionPath = `quiz.sections[${sectionIndex}]`;\n\n      // 验证 section.id\n      if (!isPlainObject(section)) {\n        errors.push({\n          code: ValidationErrorCode.QUIZ_QUESTIONS_MUST_BE_ARRAY,\n          path: sectionPath,\n          message: `${sectionPath} 必须是对象`,\n        });\n        return;\n      }\n\n      const sectionObj = section as Record<string, unknown>;\n\n      // 验证 section.title\n      if (!isString(sectionObj.title)) {\n        errors.push({\n          code: ValidationErrorCode.QUIZ_TITLE_MUST_BE_STRING,\n          path: `${sectionPath}.title`,\n          message: `${sectionPath}.title 必须是字符串`,\n        });\n      }\n\n      // 验证 section.questions\n      if (!isArray(sectionObj.questions)) {\n        errors.push({\n          code: ValidationErrorCode.QUIZ_QUESTIONS_MUST_BE_ARRAY,\n          path: `${sectionPath}.questions`,\n          message: `${sectionPath}.questions 必须是数组`,\n        });\n      } else {\n        // 验证每个问题\n        sectionObj.questions.forEach((question, questionIndex) => {\n          const questionPath = `${sectionPath}.questions[${questionIndex}]`;\n          const questionErrors = validateQuestion(question as Question, questionPath, questionIds);\n          errors.push(...questionErrors);\n        });\n      }\n    });\n  } else if (isArray(quiz.questions)) {\n    // 验证 questions 格式（向后兼容）\n    const questionIds = new Set<string>();\n    quiz.questions.forEach((question, index) => {\n      const questionPath = `quiz.questions[${index}]`;\n      const questionErrors = validateQuestion(question as Question, questionPath, questionIds);\n      errors.push(...questionErrors);\n    });\n  } else {\n    // 既没有 sections 也没有 questions\n    errors.push({\n      code: ValidationErrorCode.QUIZ_QUESTIONS_MUST_BE_ARRAY,\n      path: 'quiz',\n      message: 'quiz.sections 或 quiz.questions 必须存在且为数组',\n    });\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * 验证单个问题\n *\n * @param question - 要验证的问题\n * @param path - 问题路径\n * @param questionIds - 已使用的问题 ID 集合（用于检查唯一性）\n * @returns 错误列表\n */\nfunction validateQuestion<T extends Question>(\n  question: T,\n  path: string,\n  questionIds: Set<string>\n): ValidationError[] {\n  const errors: ValidationError[] = [];\n\n  // 检查是否为对象\n  if (!isPlainObject(question)) {\n    errors.push({\n      code: ValidationErrorCode.QUESTION_MUST_BE_OBJECT,\n      path,\n      message: getErrorMessage(ValidationErrorCode.QUESTION_MUST_BE_OBJECT),\n    });\n    return errors;\n  }\n\n  const q = question as Record<string, unknown>;\n\n  // 验证 id\n  if (!isString(q.id)) {\n    errors.push({\n      code: ValidationErrorCode.QUESTION_ID_MUST_BE_STRING,\n      path: `${path}.id`,\n      message: getErrorMessage(ValidationErrorCode.QUESTION_ID_MUST_BE_STRING),\n    });\n  } else {\n    // 检查 ID 唯一性\n    if (questionIds.has(q.id)) {\n      errors.push({\n        code: ValidationErrorCode.QUESTION_ID_DUPLICATE,\n        path: `${path}.id`,\n        message: getErrorMessage(ValidationErrorCode.QUESTION_ID_DUPLICATE, q.id),\n      });\n    } else {\n      questionIds.add(q.id);\n    }\n  }\n\n  // 验证 type\n  if (!isQuestionType(q.type)) {\n    // 检查是否为字符串但无效的类型\n    if (typeof q.type === 'string') {\n      errors.push({\n        code: ValidationErrorCode.QUESTION_TYPE_UNKNOWN,\n        path: `${path}.type`,\n        message: getErrorMessage(ValidationErrorCode.QUESTION_TYPE_UNKNOWN, q.type),\n      });\n    } else {\n      errors.push({\n        code: ValidationErrorCode.QUESTION_TYPE_MUST_BE_VALID,\n        path: `${path}.type`,\n        message: getErrorMessage(ValidationErrorCode.QUESTION_TYPE_MUST_BE_VALID),\n      });\n    }\n    return errors; // 没有有效的 type 无法继续验证\n  }\n\n  const questionType = q.type;\n\n  // 验证 text\n  if (!isString(q.text)) {\n    errors.push({\n      code: ValidationErrorCode.QUESTION_TEXT_MUST_BE_STRING,\n      path: `${path}.text`,\n      message: getErrorMessage(ValidationErrorCode.QUESTION_TEXT_MUST_BE_STRING),\n    });\n  }\n\n  // 根据问题类型进行特定验证\n  switch (questionType) {\n    case QuestionTypes.SINGLE_CHOICE:\n      errors.push(...validateSingleChoiceQuestion(q, path));\n      break;\n    case QuestionTypes.MULTIPLE_CHOICE:\n      errors.push(...validateMultipleChoiceQuestion(q, path));\n      break;\n    case QuestionTypes.TEXT_INPUT:\n      errors.push(...validateTextInputQuestion(q, path));\n      break;\n    case QuestionTypes.TRUE_FALSE:\n      errors.push(...validateTrueFalseQuestion(q, path));\n      break;\n  }\n\n  return errors;\n}\n\n/**\n * 验证单选题\n */\nfunction validateSingleChoiceQuestion(\n  question: Record<string, unknown>,\n  path: string\n): ValidationError[] {\n  const errors: ValidationError[] = [];\n\n  if (!isArray(question.options) || question.options.length < 2) {\n    errors.push({\n      code: ValidationErrorCode.SINGLE_CHOICE_OPTIONS_MIN,\n      path: `${path}.options`,\n      message: getErrorMessage(ValidationErrorCode.SINGLE_CHOICE_OPTIONS_MIN),\n    });\n  } else {\n    const optionIds = new Set<string>();\n    let correctCount = 0;\n\n    question.options.forEach((option, index) => {\n      const optionPath = `${path}.options[${index}]`;\n\n      // 检查选项是否为对象\n      if (!isPlainObject(option)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_MUST_BE_OBJECT,\n          path: optionPath,\n          message: getErrorMessage(ValidationErrorCode.OPTION_MUST_BE_OBJECT),\n        });\n        return;\n      }\n\n      // 验证选项 id\n      if (!isString(option.id)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_ID_MUST_BE_STRING,\n          path: `${optionPath}.id`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_ID_MUST_BE_STRING),\n        });\n      } else if (optionIds.has(option.id)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_ID_DUPLICATE,\n          path: `${optionPath}.id`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_ID_DUPLICATE, option.id),\n        });\n      } else {\n        optionIds.add(option.id);\n      }\n\n      // 验证选项 text\n      if (!isString(option.text)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_TEXT_MUST_BE_STRING,\n          path: `${optionPath}.text`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_TEXT_MUST_BE_STRING),\n        });\n      }\n\n      // 验证 isCorrect\n      if (!isBoolean(option.isCorrect)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_IS_CORRECT_MUST_BE_BOOLEAN,\n          path: `${optionPath}.isCorrect`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_IS_CORRECT_MUST_BE_BOOLEAN),\n        });\n      } else if (option.isCorrect) {\n        correctCount++;\n      }\n    });\n\n    // 单选题必须恰好有一个正确答案\n    if (correctCount !== 1) {\n      errors.push({\n        code: ValidationErrorCode.SINGLE_CHOICE_MUST_HAVE_ONE_CORRECT,\n        path: `${path}.options`,\n        message: getErrorMessage(ValidationErrorCode.SINGLE_CHOICE_MUST_HAVE_ONE_CORRECT),\n      });\n    }\n  }\n\n  return errors;\n}\n\n/**\n * 验证多选题\n */\nfunction validateMultipleChoiceQuestion(\n  question: Record<string, unknown>,\n  path: string\n): ValidationError[] {\n  const errors: ValidationError[] = [];\n\n  if (!isArray(question.options) || question.options.length < 2) {\n    errors.push({\n      code: ValidationErrorCode.MULTIPLE_CHOICE_OPTIONS_MIN,\n      path: `${path}.options`,\n      message: getErrorMessage(ValidationErrorCode.MULTIPLE_CHOICE_OPTIONS_MIN),\n    });\n  } else {\n    const optionIds = new Set<string>();\n    let correctCount = 0;\n\n    question.options.forEach((option, index) => {\n      const optionPath = `${path}.options[${index}]`;\n\n      // 检查选项是否为对象\n      if (!isPlainObject(option)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_MUST_BE_OBJECT,\n          path: optionPath,\n          message: getErrorMessage(ValidationErrorCode.OPTION_MUST_BE_OBJECT),\n        });\n        return;\n      }\n\n      // 验证选项 id\n      if (!isString(option.id)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_ID_MUST_BE_STRING,\n          path: `${optionPath}.id`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_ID_MUST_BE_STRING),\n        });\n      } else if (optionIds.has(option.id)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_ID_DUPLICATE,\n          path: `${optionPath}.id`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_ID_DUPLICATE, option.id),\n        });\n      } else {\n        optionIds.add(option.id);\n      }\n\n      // 验证选项 text\n      if (!isString(option.text)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_TEXT_MUST_BE_STRING,\n          path: `${optionPath}.text`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_TEXT_MUST_BE_STRING),\n        });\n      }\n\n      // 验证 isCorrect\n      if (!isBoolean(option.isCorrect)) {\n        errors.push({\n          code: ValidationErrorCode.OPTION_IS_CORRECT_MUST_BE_BOOLEAN,\n          path: `${optionPath}.isCorrect`,\n          message: getErrorMessage(ValidationErrorCode.OPTION_IS_CORRECT_MUST_BE_BOOLEAN),\n        });\n      } else if (option.isCorrect) {\n        correctCount++;\n      }\n    });\n\n    // 多选题必须至少有一个正确答案\n    if (correctCount < 1) {\n      errors.push({\n        code: ValidationErrorCode.MULTIPLE_CHOICE_MUST_HAVE_AT_LEAST_ONE_CORRECT,\n        path: `${path}.options`,\n        message: getErrorMessage(\n          ValidationErrorCode.MULTIPLE_CHOICE_MUST_HAVE_AT_LEAST_ONE_CORRECT\n        ),\n      });\n    }\n  }\n\n  return errors;\n}\n\n/**\n * 验证文本输入题\n */\nfunction validateTextInputQuestion(\n  question: Record<string, unknown>,\n  path: string\n): ValidationError[] {\n  const errors: ValidationError[] = [];\n\n  const correctAnswer = question.correctAnswer;\n\n  if (\n    correctAnswer === undefined ||\n    correctAnswer === null ||\n    (!isString(correctAnswer) && !isArray<string>(correctAnswer))\n  ) {\n    errors.push({\n      code: ValidationErrorCode.TEXT_INPUT_CORRECT_ANSWER_REQUIRED,\n      path: `${path}.correctAnswer`,\n      message: getErrorMessage(ValidationErrorCode.TEXT_INPUT_CORRECT_ANSWER_REQUIRED),\n    });\n  } else if (isArray<string>(correctAnswer) && correctAnswer.length === 0) {\n    errors.push({\n      code: ValidationErrorCode.TEXT_INPUT_CORRECT_ANSWER_ARRAY_EMPTY,\n      path: `${path}.correctAnswer`,\n      message: getErrorMessage(ValidationErrorCode.TEXT_INPUT_CORRECT_ANSWER_ARRAY_EMPTY),\n    });\n  }\n\n  return errors;\n}\n\n/**\n * 验证判断题\n */\nfunction validateTrueFalseQuestion(\n  question: Record<string, unknown>,\n  path: string\n): ValidationError[] {\n  const errors: ValidationError[] = [];\n\n  if (!isBoolean(question.correctAnswer)) {\n    errors.push({\n      code: ValidationErrorCode.TRUE_FALSE_CORRECT_ANSWER_MUST_BE_BOOLEAN,\n      path: `${path}.correctAnswer`,\n      message: getErrorMessage(ValidationErrorCode.TRUE_FALSE_CORRECT_ANSWER_MUST_BE_BOOLEAN),\n    });\n  }\n\n  return errors;\n}\n","/**\n * @quizerjs/dsl - Quiz DSL 解析器\n *\n * 提供 DSL 数据的解析和转换功能\n */\n\nimport { QuizDSL } from './types';\nimport { validateQuizDSL, ValidationError } from './validator';\n\n/**\n * 解析选项\n */\nexport interface ParseOptions {\n  /** 是否在解析时进行验证（默认：true） */\n  validate?: boolean;\n  /** 是否严格模式（默认：false） */\n  strict?: boolean;\n}\n\n/**\n * 解析结果\n */\nexport interface ParseResult {\n  /** 解析后的 DSL 数据 */\n  dsl: QuizDSL | null;\n  /** 是否成功 */\n  success: boolean;\n  /** 错误信息 */\n  errors?: ValidationError[];\n  /** 原始错误（如果解析失败） */\n  error?: Error;\n}\n\n/**\n * 从 JSON 字符串解析 DSL\n *\n * @param jsonString - JSON 字符串\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport function parseQuizDSL(jsonString: string, options: ParseOptions = {}): ParseResult {\n  const { validate = true, strict = false } = options;\n\n  try {\n    // 解析 JSON\n    const data = JSON.parse(jsonString) as unknown;\n\n    // 验证数据\n    if (validate) {\n      const validationResult = validateQuizDSL(data);\n      if (!validationResult.valid) {\n        return {\n          dsl: null,\n          success: false,\n          errors: validationResult.errors,\n        };\n      }\n    }\n\n    // 类型转换（在严格模式下进行更严格的类型检查）\n    const dsl = strict ? strictParse(data) : (data as QuizDSL);\n\n    return {\n      dsl,\n      success: true,\n    };\n  } catch (error) {\n    return {\n      dsl: null,\n      success: false,\n      error: error instanceof Error ? error : new Error(String(error)),\n    };\n  }\n}\n\n/**\n * 从对象解析 DSL（不进行 JSON 解析）\n *\n * @param data - 数据对象\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport function parseQuizDSLFromObject(data: unknown, options: ParseOptions = {}): ParseResult {\n  const { validate = true, strict = false } = options;\n\n  try {\n    // 验证数据\n    if (validate) {\n      const validationResult = validateQuizDSL(data);\n      if (!validationResult.valid) {\n        return {\n          dsl: null,\n          success: false,\n          errors: validationResult.errors,\n        };\n      }\n    }\n\n    // 类型转换\n    const dsl = strict ? strictParse(data) : (data as QuizDSL);\n\n    return {\n      dsl,\n      success: true,\n    };\n  } catch (error) {\n    return {\n      dsl: null,\n      success: false,\n      error: error instanceof Error ? error : new Error(String(error)),\n    };\n  }\n}\n\n/**\n * 严格解析（进行更严格的类型检查）\n */\nfunction strictParse(data: unknown): QuizDSL {\n  // 这里可以进行更严格的类型检查和转换\n  // 目前先进行基本验证，后续可以扩展\n  if (!data || typeof data !== 'object' || Array.isArray(data)) {\n    throw new Error('DSL 必须是对象');\n  }\n\n  return data as QuizDSL;\n}\n","/**\n * @quizerjs/dsl - Quiz DSL 序列化器\n *\n * 提供 DSL 数据的序列化功能\n */\n\nimport { QuizDSL } from './types';\nimport { validateQuizDSL } from './validator';\n\n/**\n * 序列化选项\n */\nexport interface SerializeOptions {\n  /** 是否在序列化前进行验证（默认：true） */\n  validate?: boolean;\n  /** JSON 格式化选项 */\n  pretty?: boolean;\n  /** JSON 缩进空格数（默认：2） */\n  indent?: number;\n}\n\n/**\n * 序列化结果\n */\nexport interface SerializeResult {\n  /** 序列化后的 JSON 字符串 */\n  json: string | null;\n  /** 是否成功 */\n  success: boolean;\n  /** 错误信息 */\n  error?: Error;\n}\n\n/**\n * 将 DSL 序列化为 JSON 字符串\n *\n * @param dsl - DSL 数据\n * @param options - 序列化选项\n * @returns 序列化结果\n */\nexport function serializeQuizDSL(dsl: QuizDSL, options: SerializeOptions = {}): SerializeResult {\n  const { validate = true, pretty = false, indent = 2 } = options;\n\n  try {\n    // 验证数据\n    if (validate) {\n      const validationResult = validateQuizDSL(dsl);\n      if (!validationResult.valid) {\n        return {\n          json: null,\n          success: false,\n          error: new Error(\n            `DSL 验证失败: ${validationResult.errors.map(e => e.message).join('; ')}`\n          ),\n        };\n      }\n    }\n\n    // 序列化为 JSON\n    const json = pretty ? JSON.stringify(dsl, null, indent) : JSON.stringify(dsl);\n\n    return {\n      json,\n      success: true,\n    };\n  } catch (error) {\n    return {\n      json: null,\n      success: false,\n      error: error instanceof Error ? error : new Error(String(error)),\n    };\n  }\n}\n\n/**\n * 将 DSL 序列化为对象（不进行 JSON 序列化）\n *\n * @param dsl - DSL 数据\n * @param options - 序列化选项\n * @returns 序列化结果\n */\nexport function serializeQuizDSLToObject(\n  dsl: QuizDSL,\n  options: Omit<SerializeOptions, 'pretty' | 'indent'> = {}\n): { data: QuizDSL | null; success: boolean; error?: Error } {\n  const { validate = true } = options;\n\n  try {\n    // 验证数据\n    if (validate) {\n      const validationResult = validateQuizDSL(dsl);\n      if (!validationResult.valid) {\n        return {\n          data: null,\n          success: false,\n          error: new Error(\n            `DSL 验证失败: ${validationResult.errors.map(e => e.message).join('; ')}`\n          ),\n        };\n      }\n    }\n\n    // 返回深拷贝的对象\n    return {\n      data: JSON.parse(JSON.stringify(dsl)),\n      success: true,\n    };\n  } catch (error) {\n    return {\n      data: null,\n      success: false,\n      error: error instanceof Error ? error : new Error(String(error)),\n    };\n  }\n}\n"],"names":["ValidationErrorCode"],"mappings":"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"}