Schema Validation

Types persist into runtime — inspect, validate, and document at zero extra cost

/#
## Runtime Types

Every TJS function carries `__tjs` metadata with full type information.
This enables runtime validation, auto-generated docs, and introspection
— all from the same type annotations you already write.
#/

function createUser(
  name: 'anonymous',
  email: 'user@example.com',
  age: +0
): { name: 'anonymous', email: 'user@example.com', age: 0 } {
  return { name, email, age }
}

function transfer(
  from: '',
  to: '',
  amount: 0.0
): { from: '', to: '', amount: 0.0 } {
  return { from, to, amount }
}

test 'functions validate at runtime' {
  const user = createUser('Alice', 'alice@test.com', 30)
  expect(user.name).toBe('Alice')

  // Wrong type — returns error, no exception
  const err = createUser('Alice', 'alice@test.com', -1)
  expect(err instanceof Error).toBe(true)
}

test 'metadata is introspectable' {
  const meta = createUser.__tjs
  expect(meta.params.name.type.kind).toBe('string')
  expect(meta.params.age.type.kind).toBe('non-negative-integer')
  expect(meta.returns.type.kind).toBe('object')
}

// Inspect live metadata
console.log('createUser params:', createUser.__tjs.params)
console.log('transfer params:', transfer.__tjs.params)
console.log('transfer returns:', transfer.__tjs.returns)