{"version":3,"sources":["../../../src/schema/validation/schema-validator.ts"],"sourcesContent":["import MemberDef from '../types/memberdef';\r\nimport Schema from '../schema';\r\nimport TypedefRegistry from '../typedef-registry';\r\n\r\nexport class ValidationResult {\r\n  constructor(\r\n    public readonly isValid: boolean,\r\n    public readonly errors: readonly string[]\r\n  ) {}\r\n\r\n  static success(): ValidationResult {\r\n    return new ValidationResult(true, []);\r\n  }\r\n\r\n  static failure(errors: string[]): ValidationResult {\r\n    return new ValidationResult(false, errors);\r\n  }\r\n}\r\n\r\nexport class SchemaValidator {\r\n  static validateMemberDef(memberDef: MemberDef): ValidationResult {\r\n    const errors: string[] = [];\r\n\r\n    if (!memberDef.type) {\r\n      errors.push('Member definition must have a type');\r\n    } else if (!TypedefRegistry.isRegisteredType(memberDef.type)) {\r\n      errors.push(`Unknown type: ${memberDef.type}`);\r\n    }\r\n\r\n    // Validate constraints based on type\r\n    if (memberDef.type === 'string') {\r\n  const hasMin = memberDef.minLength !== undefined;\r\n  const hasMax = memberDef.maxLength !== undefined;\r\n  if (hasMin && hasMax && (memberDef.minLength as number) > (memberDef.maxLength as number)) {\r\n        errors.push('minLength cannot be greater than maxLength');\r\n      }\r\n    }\r\n\r\n    if (memberDef.type === 'number') {\r\n  const hasMin = memberDef.min !== undefined;\r\n  const hasMax = memberDef.max !== undefined;\r\n  if (hasMin && hasMax && (memberDef.min as number) > (memberDef.max as number)) {\r\n        errors.push('min cannot be greater than max');\r\n      }\r\n    }\r\n\r\n    return new ValidationResult(errors.length === 0, errors);\r\n  }\r\n\r\n  static validateSchema(schema: Schema): ValidationResult {\r\n    const errors: string[] = [];\r\n\r\n    for (const name of schema.names) {\r\n      const memberDef = schema.get(name);\r\n      if (memberDef) {\r\n        const result = this.validateMemberDef(memberDef);\r\n        if (!result.isValid) {\r\n          errors.push(...result.errors.map(e => `${name}: ${e}`));\r\n        }\r\n      }\r\n    }\r\n\r\n    return new ValidationResult(errors.length === 0, errors);\r\n  }\r\n\r\n  static validateSchemaName(name: string): ValidationResult {\r\n    const errors: string[] = [];\r\n\r\n    if (typeof name !== 'string') {\r\n      errors.push('Schema name must be a non-empty string');\r\n    } else if (name.trim().length === 0) {\r\n      errors.push('Schema name cannot be empty or whitespace only');\r\n    } else if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(name)) {\r\n      errors.push('Schema name must start with a letter and contain only letters, numbers, and underscores');\r\n    }\r\n\r\n    return new ValidationResult(errors.length === 0, errors);\r\n  }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,8BAA4B;AAErB,MAAM,iBAAiB;AAAA,EAC5B,YACkB,SACA,QAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,OAAO,UAA4B;AACjC,WAAO,IAAI,iBAAiB,MAAM,CAAC,CAAC;AAAA,EACtC;AAAA,EAEA,OAAO,QAAQ,QAAoC;AACjD,WAAO,IAAI,iBAAiB,OAAO,MAAM;AAAA,EAC3C;AACF;AAEO,MAAM,gBAAgB;AAAA,EAC3B,OAAO,kBAAkB,WAAwC;AAC/D,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,UAAU,MAAM;AACnB,aAAO,KAAK,oCAAoC;AAAA,IAClD,WAAW,CAAC,wBAAAA,QAAgB,iBAAiB,UAAU,IAAI,GAAG;AAC5D,aAAO,KAAK,iBAAiB,UAAU,IAAI,EAAE;AAAA,IAC/C;AAGA,QAAI,UAAU,SAAS,UAAU;AACnC,YAAM,SAAS,UAAU,cAAc;AACvC,YAAM,SAAS,UAAU,cAAc;AACvC,UAAI,UAAU,UAAW,UAAU,YAAwB,UAAU,WAAsB;AACrF,eAAO,KAAK,4CAA4C;AAAA,MAC1D;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,UAAU;AACnC,YAAM,SAAS,UAAU,QAAQ;AACjC,YAAM,SAAS,UAAU,QAAQ;AACjC,UAAI,UAAU,UAAW,UAAU,MAAkB,UAAU,KAAgB;AACzE,eAAO,KAAK,gCAAgC;AAAA,MAC9C;AAAA,IACF;AAEA,WAAO,IAAI,iBAAiB,OAAO,WAAW,GAAG,MAAM;AAAA,EACzD;AAAA,EAEA,OAAO,eAAe,QAAkC;AACtD,UAAM,SAAmB,CAAC;AAE1B,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,YAAY,OAAO,IAAI,IAAI;AACjC,UAAI,WAAW;AACb,cAAM,SAAS,KAAK,kBAAkB,SAAS;AAC/C,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO,KAAK,GAAG,OAAO,OAAO,IAAI,OAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI,iBAAiB,OAAO,WAAW,GAAG,MAAM;AAAA,EACzD;AAAA,EAEA,OAAO,mBAAmB,MAAgC;AACxD,UAAM,SAAmB,CAAC;AAE1B,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,KAAK,wCAAwC;AAAA,IACtD,WAAW,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,aAAO,KAAK,gDAAgD;AAAA,IAC9D,WAAW,CAAC,0BAA0B,KAAK,IAAI,GAAG;AAChD,aAAO,KAAK,yFAAyF;AAAA,IACvG;AAEA,WAAO,IAAI,iBAAiB,OAAO,WAAW,GAAG,MAAM;AAAA,EACzD;AACF;","names":["TypedefRegistry"]}