{"version":3,"file":"modeValidation.cjs","names":["DoomProtocolError","MINOR_MODE_ERROR_CODE"],"sources":["../../src/schemas/modeValidation.ts"],"sourcesContent":["import {\n  MINOR_MODE_ERROR_CODE,\n  type MinorModeActionDescriptor,\n  type MinorModeArguments,\n  type MinorModeDescriptor,\n  type MinorModeRecord,\n  type MinorModeRegistrationRef,\n  type MinorModeState,\n} from './mode.ts';\nimport { DoomProtocolError } from './protocol.ts';\n\nexport function minorModeKey(identity: Pick<MinorModeDescriptor, 'source' | 'id'>): string {\n  return `${identity.source}\\u0000${identity.id}`;\n}\n\nexport function minorModeRegistrationRef(record: MinorModeRecord): MinorModeRegistrationRef {\n  return {\n    source: record.descriptor.source,\n    id: record.descriptor.id,\n    ownerGeneration: record.ownerGeneration,\n    registrationId: record.registrationId,\n  };\n}\n\nfunction duplicateValue(values: readonly string[]): string | undefined {\n  const seen = new Set<string>();\n  for (const value of values) {\n    if (seen.has(value)) return value;\n    seen.add(value);\n  }\n  return undefined;\n}\n\nexport function validateMinorModeDefinition(\n  descriptor: MinorModeDescriptor,\n  state: MinorModeState,\n): string | undefined {\n  const duplicateAction = duplicateValue(descriptor.actions.map(({ id }) => id));\n  if (duplicateAction) return `Duplicate minor-mode action '${duplicateAction}'.`;\n  for (const action of descriptor.actions) {\n    const duplicateParameter = duplicateValue(action.parameters.map(({ name }) => name));\n    if (duplicateParameter) return `Duplicate parameter '${duplicateParameter}' for action '${action.id}'.`;\n    for (const parameter of action.parameters) {\n      if (\n        parameter.kind === 'string' &&\n        parameter.minLength !== undefined &&\n        parameter.maxLength !== undefined &&\n        parameter.minLength > parameter.maxLength\n      ) {\n        return `Parameter '${parameter.name}' has minLength greater than maxLength.`;\n      }\n      if (\n        parameter.kind === 'number' &&\n        parameter.minimum !== undefined &&\n        parameter.maximum !== undefined &&\n        parameter.minimum > parameter.maximum\n      ) {\n        return `Parameter '${parameter.name}' has minimum greater than maximum.`;\n      }\n      if (parameter.kind === 'enum') {\n        const duplicateChoice = duplicateValue(parameter.choices.map(({ value }) => value));\n        if (duplicateChoice) return `Parameter '${parameter.name}' has duplicate choice '${duplicateChoice}'.`;\n      }\n    }\n  }\n  const duplicateAvailability = duplicateValue(state.actions.map(({ id }) => id));\n  if (duplicateAvailability) return `Duplicate action availability '${duplicateAvailability}'.`;\n  const descriptors = new Set(descriptor.actions.map(({ id }) => id));\n  const available = new Set(state.actions.map(({ id }) => id));\n  if (descriptors.size !== available.size || [...descriptors].some((id) => !available.has(id))) {\n    return 'Minor-mode state must publish availability for every declared action.';\n  }\n  return undefined;\n}\n\nfunction invalidArguments(message: string): never {\n  throw new DoomProtocolError({ code: MINOR_MODE_ERROR_CODE.invalidArguments, message });\n}\n\nexport function validateMinorModeActionArguments(\n  action: MinorModeActionDescriptor,\n  argumentsValue: MinorModeArguments,\n): void {\n  const parameters = new Map(action.parameters.map((parameter) => [parameter.name, parameter]));\n  for (const name of Object.keys(argumentsValue)) {\n    if (!parameters.has(name)) invalidArguments(`Unknown argument '${name}' for action '${action.id}'.`);\n  }\n  for (const parameter of action.parameters) {\n    const value = argumentsValue[parameter.name];\n    if (value === undefined) {\n      if (parameter.required) invalidArguments(`Missing required argument '${parameter.name}'.`);\n      continue;\n    }\n    if (parameter.kind === 'string') {\n      if (typeof value !== 'string') invalidArguments(`Argument '${parameter.name}' must be a string.`);\n      if (parameter.minLength !== undefined && value.length < parameter.minLength) {\n        invalidArguments(`Argument '${parameter.name}' is shorter than ${parameter.minLength}.`);\n      }\n      if (parameter.maxLength !== undefined && value.length > parameter.maxLength) {\n        invalidArguments(`Argument '${parameter.name}' is longer than ${parameter.maxLength}.`);\n      }\n      continue;\n    }\n    if (parameter.kind === 'number') {\n      if (typeof value !== 'number' || !Number.isFinite(value)) {\n        invalidArguments(`Argument '${parameter.name}' must be a finite number.`);\n      }\n      if (parameter.integer && !Number.isInteger(value)) {\n        invalidArguments(`Argument '${parameter.name}' must be an integer.`);\n      }\n      if (parameter.minimum !== undefined && value < parameter.minimum) {\n        invalidArguments(`Argument '${parameter.name}' must be at least ${parameter.minimum}.`);\n      }\n      if (parameter.maximum !== undefined && value > parameter.maximum) {\n        invalidArguments(`Argument '${parameter.name}' must be at most ${parameter.maximum}.`);\n      }\n      continue;\n    }\n    if (parameter.kind === 'boolean') {\n      if (typeof value !== 'boolean') invalidArguments(`Argument '${parameter.name}' must be a boolean.`);\n      continue;\n    }\n    if (typeof value !== 'string' || !parameter.choices.some((choice) => choice.value === value)) {\n      invalidArguments(`Argument '${parameter.name}' must be one of the declared choices.`);\n    }\n  }\n}\n"],"mappings":"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"}