# Fortify Schema

[![npm version](https://badge.fury.io/js/fortify-schema.svg)](https://badge.fury.io/js/fortify-schema)
[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Build Status](https://github.com/Nehonix-Team/fortify-schema/workflows/CI/badge.svg)](https://github.com/Nehonix-Team/fortify-schema/actions)
[![Bundle Size](https://img.shields.io/bundlephobia/minzip/fortify-schema)](https://bundlephobia.com/package/fortify-schema)

<div align="center">
  <img src="https://sdk.nehonix.space/sdks/assets/fortify%20schema.jpg" alt="Fortify Schema Logo" width="400" />
</div>

**A TypeScript-first schema validation library with interface-like syntax that's intuitive, type-safe, and powerful.**

## Documentation Navigation

| Resource                                                     | Description                                                |
| ------------------------------------------------------------ | ---------------------------------------------------------- |
| **[Complete Documentation](./docs/README.md)**               | Full documentation index with organized sections           |
| **[Quick Reference](./docs/QUICK-REFERENCE.md)**             | Cheat sheet for common patterns and syntax                 |
| **[Field Types Reference](./docs/FIELD-TYPES.md)**           | Comprehensive guide to all available types and constraints |
| **[Real-World Examples](./docs/EXAMPLES.md)**                | Production-ready schemas for enterprise use                |
| **[Migration Guide](./docs/MIGRATION.md)**                   | Step-by-step migration from Zod, Joi, Yup                  |
| **[Quick Start](#quick-start-guide)**                        | Get up and running in 5 minutes                            |
| **[Schema Transformation](#schema-transformation-with-mod)** | Transform and combine schemas with Mod utilities           |

---

## Overview

Fortify Schema brings TypeScript interface syntax to runtime validation. Unlike traditional schema libraries that require complex APIs and verbose definitions, Fortify Schema allows you to define schemas that look and feel exactly like TypeScript interfaces while providing powerful runtime validation and perfect type inference.

### Key Features

- **Interface-like syntax** that TypeScript developers instantly understand
- **Perfect type inference** with no manual type definitions required
- **Compile-time safety** that prevents invalid properties before runtime
- **Exact union types** instead of generic string/number types
- **Intuitive constraint syntax** with function-like parameters
- **Zero learning curve** for TypeScript developers

---

## Library Comparison Overview

See why developers are migrating to Fortify Schema from traditional validation libraries:

### Code Comparison

| Traditional Libraries                | Fortify Schema       | Reduction         |
| ------------------------------------ | -------------------- | ----------------- |
| **Zod**                              | **Fortify Schema**   | **70% Less Code** |
| `z.number().int().positive()`        | `"positive"`         | 24 → 10 chars     |
| `z.string().min(2).max(50)`          | `"string(2,50)"`     | 25 → 15 chars     |
| `z.array(z.string()).min(1).max(10)` | `"string[](1,10)"`   | 33 → 17 chars     |
| `z.enum(["active", "inactive"])`     | `"active\|inactive"` | 31 → 17 chars     |
| `z.string().optional()`              | `"string?"`          | 21 → 9 chars      |

### Real-World Schema Comparison

**Traditional Approach (Zod):**

```typescript
import { z } from "zod";

const UserSchema = z.object({
  id: z.number().int().positive(),
  email: z.string().email(),
  name: z.string().min(2).max(50),
  age: z.number().int().min(18).max(120).optional(),
  tags: z.array(z.string()).min(1).max(10).optional(),
  status: z.enum(["active", "inactive", "pending"]),
  role: z.literal("admin"),
});
// 8 lines, 312 characters, complex method chaining
```

**Fortify Schema Approach:**

```typescript
import { Interface } from "fortify-schema";

const UserSchema = Interface({
  id: "positive",
  email: "email",
  name: "string(2,50)",
  age: "int(18,120)?",
  tags: "string[](1,10)?",
  status: "active|inactive|pending",
  role: "admin|user",
});
// 8 lines, 156 characters, TypeScript-like syntax
```

**Result: 50% fewer characters, zero learning curve, perfect type inference**

### Revolutionary Conditional Validation

**Problem with Existing Libraries:**

```typescript
// Zod - Requires complex workarounds
const schema = z
  .object({
    role: z.enum(["admin", "user"]),
    permissions: z.array(z.string()).optional(),
  })
  .refine(
    (data) => {
      if (data.role === "admin" && !data.permissions) {
        return false;
      }
      return true;
    },
    { message: "Admin users must have permissions" }
  );
```

**Fortify Schema Solution:**

```typescript
const schema = Interface({
  role: "admin|user",
  permissions: "when role=admin *? string[] : string[]?",
});
// Built-in conditional validation with perfect TypeScript inference
```

**[Complete Migration Guide](./docs/MIGRATION.md)** - Detailed comparisons and migration strategies

### Why Developers Choose Fortify Schema

**Dramatic Simplification**

- Up to 70% reduction in schema definition code
- TypeScript interface-like syntax developers already know
- Single import for most validation scenarios

**Superior Type Safety**

- Exact literal types instead of generic unions
- Revolutionary conditional validation with compile-time inference
- Perfect IDE integration with autocomplete and error detection

**Enterprise Performance**

- Optimized validation algorithms
- Tree-shakable architecture for minimal bundle impact
- Zero runtime type overhead

---

## The Fortify Schema Solution

### Clean, Intuitive Syntax

```typescript
import { Interface } from "fortify-schema";

const UserSchema = Interface({
  id: "number",
  email: "email",
  name: "string(2,50)", // Length constraints
  age: "number(18,120)?", // Range with optional
  tags: "string[](1,10)?", // Array constraints
  status: "active|inactive", // Union types - pure TypeScript syntax!
  role: "=admin", // Literal constants - use =value syntax
});
```

### Advanced Type Inference

```typescript
const result = UserSchema.safeParse(userData);

if (result.success && result.data) {
  // Perfect type inference - no manual definitions needed
  result.data.status; // "active" | "inactive" (exact union!)
  result.data.role; // "admin" (exact literal!)
  result.data.age; // number | undefined (perfect optionals!)
}

// Compile-time safety prevents runtime errors
UserSchema.safeParse({
  id: 1,
  name: "John",
  invalidProp: "error", // ❌ TypeScript ERROR caught at compile time
});
```

### Conditional Validation with Perfect Type Inference

**The world's first schema library with conditional validation that provides complete TypeScript inference support**

```typescript
const UserSchema = Interface({
  role: "admin|user|guest",
  accountType: "free|premium|enterprise",

  // Advanced conditional syntax - Crystal clear, no confusion
  permissions: "when role=admin *? string[] : string[]?",
  maxProjects: "when accountType=free *? int(1,3) : int(1,)",
  paymentMethod: "when accountType!=free *? string : string?",
  billingAddress: "when paymentMethod.exists *? string : string?",
});

// TypeScript knows the EXACT type based on conditions
const adminUser = {
  role: "=admin" as const,
  permissions: ["read", "write", "delete"], // ✅ TypeScript: string[]
  maxProjects: 100, // ✅ TypeScript: number
  paymentMethod: "credit_card", // ✅ TypeScript: string
};

const regularUser = {
  role: "=user" as const,
  accountType: "free" as const,
  maxProjects: 2, // ✅ TypeScript: number (1-3 range)
  // permissions not allowed for regular users
  // paymentMethod not required for free users
};

// TypeScript catches conditional type mismatches at compile time
const invalidUser = {
  role: "=user" as const,
  permissions: ["read", 2], // ❌ TypeScript ERROR: Type 'number' is not assignable to type 'string'
};
```

**Three Approaches Available:**

1. **Advanced Conditional Syntax** (Crystal clear + Perfect TypeScript inference)
2. **Parentheses Syntax** (Clear structure, runtime only)
3. **Import-based Syntax** (Fluent API, most powerful)

```typescript
import { When } from 'fortify-schema';

// Advanced conditional syntax (Recommended - Full TypeScript support)
permissions: "when role=admin *? string[] : string[]?",

// Parentheses syntax (Runtime validation only - limited TypeScript inference)
permissions: "when(role=admin) then(string[]) else(string[]?)",

// Import-based syntax (Full TypeScript support)
permissions: When.field("role").is("admin").then("string[]").else("string[]?")
```

**Why the conditional syntax is powerful:**

- **Crystal clear boundaries**: Easy to see where condition ends and logic begins
- **Perfect TypeScript inference**: Full compile-time type checking
- **No conflicts**: Doesn't interfere with optional `?` operator
- **Intuitive**: Reads like natural language
- **Professional**: Clean and elegant syntax

**Note**: The parentheses syntax works perfectly at runtime but has limited TypeScript inference due to nested parentheses in template literal types. Use the `*?` syntax for the best developer experience.

---

## Installation

```bash
npm install fortify-schema
```

**Requirements:**

- TypeScript 4.5+
- Node.js 14+

---

## Quick Start Guide

### Basic Schema Definition

```typescript
import { Interface } from "fortify-schema";

// Define your schema like a TypeScript interface
const UserSchema = Interface({
  id: "number",
  email: "email",
  name: "string",
  age: "number?", // Optional field
  isActive: "boolean?",
  tags: "string[]?", // Optional array
  status: "active|inactive|pending", // Union types - TypeScript syntax!
  role: "=user", // Literal constants - use =value syntax
});
```

### Schema Transformation

```typescript
import { Mod } from "fortify-schema";

// Create variations of your schema
const PublicUserSchema = Mod.omit(UserSchema, ["password"]);
const PartialUserSchema = Mod.partial(UserSchema);
const ExtendedSchema = Mod.extend(UserSchema, {
  createdAt: "date",
  lastLogin: "date?",
});
```

### Data Validation

```typescript
// Strict validation (recommended for application code)
const result = UserSchema.safeParse(userData);

if (result.success) {
  console.log("✅ Valid user:", result.data);
  // result.data is perfectly typed with exact inference
} else {
  console.log("❌ Validation errors:", result.errors);
}

// Flexible validation (for external/unknown data)
const unknownResult = UserSchema.safeParseUnknown(apiResponse);
```

---

## Core Concepts

### Field Types

> **[Complete Field Types Reference](./docs/FIELD-TYPES.md)** - Comprehensive guide to all available types and constraints

#### Basic Types

```typescript
{
  name: "string",           // String validation
  age: "number",            // Number validation
  active: "boolean",        // Boolean validation
  created: "date",          // Date validation
  data: "any"               // Any type (no validation)
}
```

#### Optional Fields

```typescript
{
  name: "string",           // Required field
  age: "number?",           // Optional field
  bio: "string?",
  tags: "string[]?"         // Optional array
}
```

#### Format Validation

```typescript
{
  email: "email",           // Email format validation
  website: "url",           // URL format validation
  id: "uuid",               // UUID format validation
  phone: "phone",           // Phone number format
  slug: "slug",             // URL slug format
  username: "username"      // Username format rules
}
```

#### Array Types

```typescript
{
  tags: "string[]",         // Array of strings
  scores: "number[]",       // Array of numbers
  flags: "boolean[]",       // Array of booleans
  emails: "email[]"         // Array of validated emails
}
```

### Advanced Type Definitions

#### Constants and Unions

```typescript
import { Make } from 'fortify-schema';

{
  // Safe constants (explicit and unambiguous)
  version: Make.const("1.0"),
  status: Make.const(200),

  // Union types (multiple allowed values)
  priority: Make.union("low", "medium", "high"),
  role: Make.unionOptional("user", "admin", "moderator")
}
```

**Why use `Make`?** It eliminates ambiguity between type specifications and constant values, making schemas more readable and maintainable.

### Conditional Validation

Fortify Schema provides the first conditional validation system with complete TypeScript inference:

#### Advanced Conditional Syntax (Recommended)

```typescript
{
  role: "admin|user|guest",

  // Advanced conditional syntax - Crystal clear
  permissions: "when role=admin *? string[] : string[]?",

  // Multiple conditions with different operators
  maxProjects: "when accountType=free *? int(1,3) : int(1,)",
  paymentMethod: "when accountType!=free *? string : string?",

  // Existence-based conditions
  billingAddress: "when paymentMethod.exists *? string : string?",

  // Numeric comparisons
  seniorDiscount: "when age>=65 *? number : number?",

  // Array inclusion checks
  adminFeatures: "when role.in(admin,moderator) *? string[] : string[]?"
}
```

#### Parentheses Syntax (Also Clear)

```typescript
{
  role: "admin|user|guest",
  permissions: "when(role=admin) then(string[]) else(string[]?)",
  maxProjects: "when(accountType=free) then(int(1,3)) else(int(1,))",
  paymentMethod: "when(accountType!=free) then(string) else(string?)"
}
```

#### Import-based Conditional Validation (Most Powerful)

```typescript
import { When } from 'fortify-schema';

{
  role: "admin|user|guest",
  permissions: When.field("role").is("admin").then("string[]").else("string[]?"),
  maxProjects: When.field("accountType").is("free").then("int(1,3)").else("int(1,)"),
  paymentMethod: When.field("accountType").isNot("free").then("string").else("string?")
}
```

#### Conditional Syntax Reference

| Syntax                                                  | Description          | Example                                             |
| ------------------------------------------------------- | -------------------- | --------------------------------------------------- |
| **Advanced Conditional Syntax**                         |                      |                                                     |
| `"when condition *? then : else"`                       | Crystal clear syntax | `"when role=admin *? string[] : string[]?"`         |
| `"when condition *? then"`                              | Only when condition  | `"when role=admin *? string[]"`                     |
| **Parentheses Syntax**                                  |                      |                                                     |
| `"when(condition) then(schema) else(schema)"`           | Explicit structure   | `"when(role=admin) then(string[]) else(string[]?)"` |
| **Legacy Syntax** (Still supported but not recommended) |                      |                                                     |
| `"when:field=value:then:else"`                          | Legacy format        | `"when:role=admin:string[]:string[]?"`              |

**Condition Operators:**

**Comparison Operators:**

- `=` - Equality: `"when role=admin *? ..."`
- `!=` - Not equal: `"when status!=pending *? ..."`
- `>`, `>=` - Greater than: `"when age>=18 *? ..."`
- `<`, `<=` - Less than: `"when score<50 *? ..."`

**Pattern Operators:**

- `~` - Regex match: `"when email~^admin *? ..."`
- `!~` - Negative regex: `"when email!~@temp *? ..."`

**Existence Operators:**

- `.exists` - Field exists: `"when email.exists *? ..."`
- `.!exists` - Field does not exist: `"when email.!exists *? ..."`

**State Operators:**

- `.empty` - Field is empty: `"when description.empty *? ..."`
- `.!empty` - Field is not empty: `"when tags.!empty *? ..."`
- `.null` - Field is null: `"when optional.null *? ..."`
- `.!null` - Field is not null: `"when required.!null *? ..."`

**Array Operators:**

- `.in(a,b,c)` - Value in array: `"when role.in(admin,mod) *? ..."`
- `.!in(a,b,c)` - Value not in array: `"when role.!in(guest) *? ..."`

**String Operators:**

- `.startsWith(value)` - String starts with: `"when filename.startsWith(temp_) *? ..."`
- `.endsWith(value)` - String ends with: `"when filename.endsWith(.tmp) *? ..."`
- `.contains(value)` - String contains: `"when path.contains(/secure/) *? ..."`
- `.!contains(value)` - String does not contain: `"when path.!contains(/temp/) *? ..."`

**Benefits of the `*?` syntax:**

- **No confusion** with optional `?` operator
- **Crystal clear** where condition ends and logic begins
- **Natural language** flow that's easy to read

**Complete TypeScript Integration:**

- ✅ Compile-time type checking for conditional fields
- ✅ Exact type inference based on conditions
- ✅ IDE autocomplete and error detection
- ✅ Runtime validation with full data context

---

## Constraint System

### String Constraints

```typescript
{
  username: "string(3,20)",        // 3-20 characters
  password: "string(8,)",          // Minimum 8 characters
  bio: "string(,500)?",            // Maximum 500 characters, optional
  title: "string(10,100)",         // Exactly 10-100 characters
}
```

### Number Constraints

```typescript
{
  age: "number(18,120)",           // Age range 18-120
  score: "number(0,100)",          // Score 0-100
  price: "number(0.01,999.99)",    // Price with decimal precision
  rating: "number(1,5)?",          // Rating 1-5, optional
}
```

### Array Constraints

```typescript
{
  tags: "string[](1,10)?",         // 1-10 string items, optional
  scores: "number[](3,5)",         // Exactly 3-5 number items
  items: "any[](1,)",              // At least 1 item
  emails: "email[](,20)",          // Maximum 20 email addresses
}
```

### Pattern Validation

```typescript
{
  slug: "string(/^[a-z0-9-]+$/)",           // URL slug pattern
  phone: "string(/^\\+?[1-9]\\d{1,14}$/)", // International phone
  code: "string(/^[A-Z]{2,4}$/)",          // Uppercase code pattern
  hexColor: "string(/^#[0-9a-fA-F]{6}$/)", // Hex color validation
}
```

### Constraint Reference Table

| Syntax              | Description            | Example                |
| ------------------- | ---------------------- | ---------------------- |
| `"string(min,max)"` | Length constraints     | `"string(3,20)"`       |
| `"string(min,)"`    | Minimum length only    | `"string(8,)"`         |
| `"string(,max)"`    | Maximum length only    | `"string(,100)"`       |
| `"string(/regex/)"` | Pattern validation     | `"string(/^[a-z]+$/)"` |
| `"number(min,max)"` | Value range            | `"number(0,100)"`      |
| `"type[](min,max)"` | Array size constraints | `"string[](1,10)"`     |
| `"type?"`           | Optional field         | `"string?"`            |

---

## Schema Transformation with Mod

The `Mod` utility provides powerful schema transformation capabilities:

### Combining Schemas

```typescript
const UserSchema = Interface({ id: "number", name: "string" });
const ProfileSchema = Interface({ bio: "string?", avatar: "url?" });

// Merge multiple schemas
const CompleteSchema = Mod.merge(UserSchema, ProfileSchema);
```

### Selecting Fields

```typescript
const UserSchema = Interface({
  id: "number",
  name: "string",
  email: "email",
  password: "string",
  createdAt: "date",
});

// Pick specific fields
const PublicSchema = Mod.pick(UserSchema, ["id", "name", "email"]);

// Omit sensitive fields
const SafeSchema = Mod.omit(UserSchema, ["password"]);
```

### Modifying Field Requirements

```typescript
// Make all fields optional
const PartialSchema = Mod.partial(UserSchema);

// Make all fields required
const RequiredSchema = Mod.required(OptionalSchema);

// Extend with new fields
const ExtendedSchema = Mod.extend(UserSchema, {
  lastLogin: "date?",
  isVerified: "boolean",
});
```

### Complex Transformations

```typescript
// Chain multiple transformations
const APIResponseSchema = Mod.extend(
  Mod.omit(Mod.merge(UserSchema, ProfileSchema), ["password", "internalId"]),
  {
    metadata: {
      version: Make.const("2.0"),
      timestamp: "date",
    },
  }
);
```

---

## Validation Modes

### Strict Mode (Default)

Fortify Schema is strict by default, respecting exactly what you specify:

```typescript
const schema = Interface({
  id: "number",
  name: "string",
});

// This fails - string "1" is not a number
const result = schema.safeParse({
  id: "1", // Type mismatch
  name: "John",
});
// result.success === false
```

### Loose Mode (Type Coercion)

Enable automatic type conversion when needed:

```typescript
const looseSchema = Interface({
  id: "number",
  active: "boolean",
}).loose();

// This succeeds with automatic conversion
const result = looseSchema.safeParse({
  id: "123", // Converted to number
  active: "true", // Converted to boolean
});

console.log(result.success); // true
console.log(result.data); // { id: 123, active: true }
console.log(result.warnings); // Conversion warnings
```

### Strict Object Mode

Prevent additional properties:

```typescript
const strictSchema = Interface({
  id: "number",
  name: "string",
}).strict();

// Fails due to extra property
const result = strictSchema.safeParse({
  id: 1,
  name: "John",
  age: 25, // Not allowed in strict mode
});
```

---

## Validation Methods

### Parse Methods

```typescript
// parse() - Throws on validation failure
try {
  const user = UserSchema.parse(userData);
  // user is fully typed and validated
} catch (error) {
  console.error("Validation failed:", error.message);
}

// safeParse() - Returns result object (recommended)
const result = UserSchema.safeParse(userData);
if (result.success) {
  console.log("Valid data:", result.data);
} else {
  console.log("Errors:", result.errors);
}

// safeParseUnknown() - For dynamic/unknown data
const unknownResult = UserSchema.safeParseUnknown(apiResponse);
```

### Result Structure

```typescript
// Success result
{
  success: true,
  data: T,           // Fully typed validated data
  errors: [],
  warnings: string[] // Type coercion warnings in loose mode
}

// Error result
{
  success: false,
  data: null,
  errors: string[],  // Detailed error messages
  warnings: string[]
}
```

---

## Real-World Examples

### User Management System

```typescript
const UserSchema = Interface({
  // Basic identification
  id: "uuid",
  email: "email",
  username: "string(3,20)",

  // Security
  password: "string(8,)", // Minimum 8 characters
  role: Make.union("user", "moderator", "admin"),
  status: Make.union("active", "inactive", "suspended"),

  // Profile information
  profile: {
    firstName: "string(1,50)",
    lastName: "string(1,50)",
    avatar: "url?",
    bio: "string(,500)?", // Optional bio, max 500 chars
    dateOfBirth: "date?",
  },

  // Constraints and metadata
  age: "number(13,120)?", // Age verification
  tags: "string[](1,10)?", // User tags, 1-10 items
  permissions: "string[](,20)?", // Max 20 permissions

  // Timestamps
  createdAt: "date",
  lastLogin: "date?",

  // Application-specific
  accountType: Make.const("standard"),
  preferences: {
    theme: Make.union("light", "dark", "auto"),
    notifications: "boolean",
    language: "string(/^[a-z]{2}$/)", // ISO language code
  },
});
```

### API Response Schema

```typescript
const APIResponseSchema = Interface({
  // Response metadata
  version: Make.const("2.0"),
  timestamp: "date",
  requestId: "uuid",

  // Response status
  status: Make.union("success", "error", "partial"),
  statusCode: "number(100,599)",

  // Dynamic content
  data: "any?",
  errors: "string[]?",
  warnings: "string[]?",

  // Pagination (for list responses)
  pagination: {
    page: "number(1,)",
    limit: "number(1,100)",
    total: "number(0,)",
    hasMore: "boolean"
  }?,

  // Environment context
  meta: {
    environment: Make.union("development", "staging", "production"),
    region: "string(/^[a-z]{2}-[a-z]+-\\d$/)", // AWS region format
    cached: "boolean?",
    ttl: "number(0,)?"
  }
});
```

### E-commerce Product Schema

```typescript
const ProductSchema = Interface({
  // Product identification
  id: "uuid",
  sku: "string(/^[A-Z0-9-]{6,20}$/)",
  name: "string(1,200)",
  slug: "string(/^[a-z0-9-]+$/)",

  // Categorization
  category: "string",
  subcategory: "string?",
  tags: "string[](,20)",

  // Pricing
  price: "number(0.01,99999.99)",
  originalPrice: "number(0.01,99999.99)?",
  currency: "string(/^[A-Z]{3}$/)",           // ISO currency code

  // Inventory
  stock: "number(0,)",
  stockStatus: Make.union("in-stock", "low-stock", "out-of-stock"),

  // Product details
  description: "string(,5000)",
  shortDescription: "string(,500)?",
  specifications: "any?",                      // Flexible spec object

  // Media
  images: "url[](1,10)",                      // 1-10 product images
  videos: "url[](,3)?",                       // Optional videos

  // Status and metadata
  status: Make.union("draft", "active", "archived"),
  featured: "boolean",
  createdAt: "date",
  updatedAt: "date",

  // SEO
  seo: {
    title: "string(,60)?",
    description: "string(,160)?",
    keywords: "string[](,10)?"
  }?
});
```

---

## Performance and Bundle Size

### Optimization Features

- **Tree-shakable**: Only import what you use
- **Minimal runtime**: Optimized validation algorithms
- **Type inference**: Zero runtime type overhead
- **Efficient parsing**: Fast validation with detailed error messages

### Bundle Impact

```typescript
// Import only what you need
import { Interface } from "fortify-schema"; // Core only
import { Interface, Make } from "fortify-schema"; // + Union types
import { Interface, Make, Mod } from "fortify-schema"; // + Transformations

// Advanced extensions (tree-shakable)
import {
  Smart,
  When,
  Live,
  Docs,
  Extensions,
  Quick,
  TypeScriptGenerator,
} from "fortify-schema";

// Individual extension imports for minimal bundle size
import { Smart } from "fortify-schema"; // Smart inference only
import { When } from "fortify-schema"; // Conditional validation only
import { Live } from "fortify-schema"; // Real-time validation only
import { Docs } from "fortify-schema"; // Documentation generation only
```

---

## Migration Guide

### From Zod

```typescript
// Zod
const zodSchema = z.object({
  name: z.string().min(2).max(50),
  age: z.number().int().positive().optional(),
  email: z.string().email(),
  role: z.enum(["user", "admin"]),
});

// Fortify Schema
const fortifySchema = Interface({
  name: "string(2,50)",
  age: "number(1,)?",
  email: "email",
  role: Make.union("user", "admin"),
});
```

### From Joi

```typescript
// Joi
const joiSchema = Joi.object({
  name: Joi.string().min(2).max(50).required(),
  age: Joi.number().integer().positive(),
  email: Joi.string().email(),
});

// Fortify Schema
const fortifySchema = Interface({
  name: "string(2,50)",
  age: "number(1,)",
  email: "email",
});
```

---

## TypeScript Integration

### Perfect Type Inference

Fortify Schema provides industry-leading TypeScript integration:

```typescript
const schema = Interface({
  id: "number",
  name: "string",
  tags: "string[]?",
  status: Make.union("active", "inactive"),
  role: Make.const("user"),
});

type InferredType = typeof schema._type;
// Equivalent to:
// {
//   id: number;
//   name: string;
//   tags?: string[];
//   status: "=active" | "inactive";
//   role: "=user";
// }
```

### Compile-Time Safety

```typescript
// TypeScript prevents invalid properties
const result = schema.safeParse({
  id: 1,
  name: "John",
  invalidProperty: "error", // ❌ TypeScript error
});

// For unknown data, use safeParseUnknown
const unknownResult = schema.safeParseUnknown(apiData);
```

### IDE Support

- **IntelliSense**: Full autocomplete for schema properties
- **Type checking**: Real-time validation of schema definitions
- **Error highlighting**: Immediate feedback on type mismatches
- **Hover information**: Detailed type information on hover

---

## API Reference

### Interface()

Create a schema from an interface-like definition.

```typescript
Interface(definition: SchemaDefinition): Schema<T>
```

### Make

Utility for creating complex types safely.

```typescript
Make.const(value); // Literal constant
Make.union(...values); // Union type
Make.unionOptional(...values); // Optional union type
```

### Mod

Schema transformation utilities.

```typescript
Mod.merge(schema1, schema2); // Combine schemas
Mod.pick(schema, keys); // Select specific fields
Mod.omit(schema, keys); // Remove specific fields
Mod.partial(schema); // Make all fields optional
Mod.required(schema); // Make all fields required
Mod.extend(schema, definition); // Add new fields
```

### Extensions

Advanced features for complex validation scenarios.

```typescript
// Smart inference - Generate schemas automatically
Smart.fromSample(data); // Generate schema from sample data
Smart.fromJsonSchema(jsonSchema); // Convert from JSON Schema
Smart.fromType<T>(); // Generate from TypeScript type

// Conditional validation - Dependent field validation
When.field("role").is("admin").then("string[]").else("string[]?");
When.custom((data) => data.age >= 18)
  .then("string")
  .else("string?");

// Real-time validation - Live validation system
Live.validator(schema); // Create live validator
Live.stream(schema); // Stream-based validation

// Documentation generation - Automatic docs
Docs.generate(schema); // Generate documentation
Docs.typescript(schema); // Generate TypeScript definitions
Docs.openapi(schema); // Generate OpenAPI specification

// Unified extensions access
Extensions.Smart.fromSample(data); // Access via Extensions object
Extensions.When.field("role"); // Organized by category
Extensions.Live.validator(schema); // Consistent API

// Quick shortcuts for common operations
Quick.fromSample(data); // Smart.fromSample shortcut
Quick.when("role").is("admin"); // When.field shortcut
Quick.live(schema); // Live.validator shortcut
Quick.docs(schema); // Docs.generate shortcut
```

### Schema Methods

```typescript
schema.parse(data); // Parse with exceptions
schema.safeParse(data); // Safe parse with known data
schema.safeParseUnknown(data); // Safe parse with unknown data
schema.loose(); // Enable type coercion
schema.strict(); // Prevent extra properties
```

---

## Contributing

We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.

### Development Setup

```bash
# Clone the repository
git clone https://github.com/Nehonix-Team/fortify-schema.git

# Install dependencies
npm install

# Run tests
npm test

# Build the project
npm run build
```

### Reporting Issues

Please use our [GitHub Issues](https://github.com/Nehonix-Team/fortify-schema/issues) to report bugs or request features.

---

## License

MIT © [Nehonix Team](https://github.com/Nehonix-Team)

---

## Support and Community

- **Documentation**: [GitHub Repository](https://github.com/Nehonix-Team/fortify-schema)
- **Issues**: [Bug Reports & Feature Requests](https://github.com/Nehonix-Team/fortify-schema/issues)
- **Discussions**: [Community Forum](https://github.com/Nehonix-Team/fortify-schema/discussions)
- **NPM Package**: [fortify-schema](https://www.npmjs.com/package/fortify-schema)

---

_Built with precision and care by the Nehonix Team_
