{"version":3,"sources":["../src/transformer.ts","../src/format-schema.ts"],"sourcesContent":["import Ajv, { ValidateFunction } from 'ajv';\nimport type { Transformer } from '@walkeros/core';\nimport { formatSchema } from './format-schema';\nimport type { ValidatorSettings, JsonSchema } from './types';\n\nexport const transformerValidator: Transformer.Init<\n  Transformer.Types<ValidatorSettings>\n> = (context) => {\n  const { config } = context;\n  const settings = config.settings || {};\n  const {\n    format = true,\n    events,\n    globals,\n    context: ctx,\n    custom,\n    user,\n    consent,\n  } = settings;\n\n  const ajv = new Ajv({ allErrors: true, strict: false });\n\n  // Pre-compile format validator\n  const formatValidator = format ? ajv.compile(formatSchema) : null;\n\n  // Pre-compile section validators (run on every event)\n  const sectionValidators: Array<{\n    name: string;\n    field: string;\n    validate: ValidateFunction;\n  }> = [];\n\n  const sectionSchemas = { globals, context: ctx, custom, user, consent };\n  for (const [name, schema] of Object.entries(sectionSchemas)) {\n    if (schema) {\n      sectionValidators.push({\n        name,\n        field: name,\n        validate: ajv.compile({ type: 'object', ...schema }),\n      });\n    }\n  }\n\n  // Lazy-compiled event validators\n  const eventValidators = new Map<string, ValidateFunction>();\n\n  function getEventValidator(\n    entity: string,\n    action: string,\n    schema: JsonSchema,\n  ) {\n    const key = `${entity}.${action}`;\n    if (!eventValidators.has(key)) {\n      eventValidators.set(key, ajv.compile({ type: 'object', ...schema }));\n    }\n    return eventValidators.get(key)!;\n  }\n\n  /**\n   * Find matching event schema using wildcard fallback.\n   * Checks: entity.action → entity.* → *.action → *.*\n   */\n  function findEventSchema(\n    entity: string,\n    action: string,\n  ): { schema: JsonSchema; key: string } | undefined {\n    if (!events) return undefined;\n\n    // Direct match\n    if (events[entity]?.[action]) {\n      return { schema: events[entity][action], key: `${entity} ${action}` };\n    }\n    // Entity wildcard\n    if (events[entity]?.['*']) {\n      return { schema: events[entity]['*'], key: `${entity} *` };\n    }\n    // Action wildcard\n    if (events['*']?.[action]) {\n      return { schema: events['*'][action], key: `* ${action}` };\n    }\n    // Global wildcard\n    if (events['*']?.['*']) {\n      return { schema: events['*']['*'], key: '* *' };\n    }\n    return undefined;\n  }\n\n  return {\n    type: 'validator',\n    config,\n\n    async push(event, context) {\n      const { logger } = context;\n\n      // 1. Format validation (pre-compiled, fast)\n      if (formatValidator && !formatValidator(event)) {\n        logger.error('Event format invalid', {\n          errors: ajv.errorsText(formatValidator.errors),\n        });\n        return false;\n      }\n\n      // 2. Section validation (pre-compiled, runs on every event)\n      for (const { name, field, validate } of sectionValidators) {\n        const value = (event as Record<string, unknown>)[field];\n        if (!validate(value)) {\n          logger.error(`${name} validation failed`, {\n            errors: ajv.errorsText(validate.errors),\n          });\n          return false;\n        }\n      }\n\n      // 3. Event validation (lazy compiled)\n      if (events && event.entity && event.action) {\n        const match = findEventSchema(event.entity, event.action);\n\n        if (match) {\n          const validator = getEventValidator(\n            event.entity,\n            event.action,\n            match.schema,\n          );\n\n          if (!validator(event)) {\n            logger.error('Contract validation failed', {\n              rule: match.key,\n              errors: ajv.errorsText(validator.errors),\n            });\n            return false;\n          }\n\n          logger.debug('Contract validation passed', { rule: match.key });\n        }\n      }\n\n      return { event };\n    },\n  };\n};\n","import type { JsonSchema } from './types';\n\n/**\n * Pre-compiled JSON Schema for WalkerOS.Event structure validation.\n * Validates that all required fields exist with correct types.\n */\nexport const formatSchema: JsonSchema = {\n  type: 'object',\n  required: [\n    'name',\n    'entity',\n    'action',\n    'data',\n    'globals',\n    'custom',\n    'user',\n    'consent',\n    'id',\n    'trigger',\n    'timestamp',\n    'timing',\n    'source',\n  ],\n  properties: {\n    name: { type: 'string', pattern: '^\\\\S+ \\\\S+$' }, // \"entity action\"\n    entity: { type: 'string' },\n    action: { type: 'string' },\n    data: { type: 'object' },\n    context: { type: 'object' },\n    globals: { type: 'object' },\n    custom: { type: 'object' },\n    user: { type: 'object' },\n    nested: { type: 'array' },\n    consent: { type: 'object' },\n    id: { type: 'string' },\n    trigger: { type: 'string' },\n    timestamp: { type: 'number' },\n    timing: { type: 'number' },\n    source: {\n      type: 'object',\n      required: ['type'],\n      properties: {\n        type: { type: 'string' },\n        platform: { type: 'string' },\n        url: { type: 'string' },\n        referrer: { type: 'string' },\n        schema: { type: 'string' },\n        version: { type: 'string' },\n        count: { type: 'number' },\n        trace: { type: 'string' },\n        tool: { type: 'string' },\n        command: { type: 'string' },\n      },\n    },\n  },\n};\n"],"mappings":"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","names":["context"]}