Skip to content

ResourcefulStringType

The ResourcefulStringType class provides comprehensive string validation and schema generation for text-based fields. It supports length constraints, pattern matching, format specifications, and enumeration validation based on OpenAPI 3.0 specifications.

For complete API reference, see ResourcefulStringType.

Overview

ResourcefulStringType is the most versatile data type, supporting:

  • Length Validation: Configurable minimum and maximum length constraints
  • Pattern Matching: Regular expression validation for complex text patterns
  • Format Specification: OpenAPI format hints for specialized string types
  • Enumeration: Restrict values to a predefined set of valid strings
  • Type Safety: Full TypeScript support with validated configuration options

Basic Usage

Simple String Validation

typescript
import { ResourcefulStringType } from '@nhtio/lucid-resourceful/definitions'

// Basic string with length constraints
const nameType = ResourcefulStringType({
  minLength: 1,
  maxLength: 100
})

// String with pattern validation
const usernameType = ResourcefulStringType({
  minLength: 3,
  maxLength: 30,
  pattern: '^[a-zA-Z0-9_]+$'
})

With Decorators

typescript
import { resourcefulColumn } from '@nhtio/lucid-resourceful'

class User extends compose(BaseModel, withResourceful({ name: 'User' })) {
  @resourcefulColumn.string({
    type: ResourcefulStringType({ minLength: 2, maxLength: 50 }),
    nullable: false
  })
  declare name: string

  @resourcefulColumn.string({
    type: ResourcefulStringType({
      minLength: 5,
      maxLength: 100,
      pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
    }),
    nullable: false
  })
  declare email: string
}

Configuration Options

Required Options

minLength

  • Type: number
  • Required: Yes

Minimum number of characters required in the string value.

typescript
const shortStringType = ResourcefulStringType({
  minLength: 1,
  maxLength: 10
})

maxLength

  • Type: number
  • Required: Yes

Maximum number of characters allowed in the string value.

typescript
const limitedStringType = ResourcefulStringType({
  minLength: 0,
  maxLength: 255
})

Optional Configuration

pattern

  • Type: string
  • Optional: Yes

Regular expression pattern that the string value must match.

typescript
// Email pattern validation
const emailType = ResourcefulStringType({
  minLength: 5,
  maxLength: 100,
  pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
})

// Phone number pattern
const phoneType = ResourcefulStringType({
  minLength: 10,
  maxLength: 15,
  pattern: '^\\+?[1-9]\\d{1,14}$'
})

format

  • Type: ResourcefulStringFormat | string
  • Optional: Yes

OpenAPI format specification for the string. Supports predefined formats and custom format strings.

Predefined Formats:

  • 'password' - Password strings (typically hidden in UI)
  • 'byte' - Base64-encoded strings
typescript
// Password field
const passwordType = ResourcefulStringType({
  minLength: 8,
  maxLength: 128,
  format: 'password'
})

// Base64 encoded data
const encodedType = ResourcefulStringType({
  minLength: 1,
  maxLength: 1000,
  format: 'byte'
})

// Custom format
const customType = ResourcefulStringType({
  minLength: 1,
  maxLength: 50,
  format: 'custom-identifier'
})

enum

  • Type: string[]
  • Optional: Yes

Array of allowed string values for enumeration validation.

typescript
// Status enumeration
const statusType = ResourcefulStringType({
  minLength: 1,
  maxLength: 20,
  enum: ['draft', 'published', 'archived', 'deleted']
})

// Role enumeration
const roleType = ResourcefulStringType({
  minLength: 1,
  maxLength: 15,
  enum: ['admin', 'user', 'moderator']
})

Common Modifiers

All base interface modifiers are supported:

typescript
// Read-only string (like auto-generated IDs)
const readOnlyType = ResourcefulStringType({
  minLength: 1,
  maxLength: 36,
  readOnly: true
})

// Nullable string
const optionalType = ResourcefulStringType({
  minLength: 0,
  maxLength: 100,
  nullable: true
})

// Write-only string (like passwords)
const secretType = ResourcefulStringType({
  minLength: 8,
  maxLength: 128,
  writeOnly: true,
  format: 'password'
})

Common Patterns

Email Validation

typescript
const emailType = ResourcefulStringType({
  minLength: 5,
  maxLength: 254,
  pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
})

@resourcefulColumn.string({
  type: emailType,
  nullable: false
})
declare email: string

URL Validation

typescript
const urlType = ResourcefulStringType({
  minLength: 1,
  maxLength: 2000,
  pattern: '^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$'
})

@resourcefulColumn.string({
  type: urlType,
  nullable: true
})
declare website: string

Slug/Identifier Validation

typescript
const slugType = ResourcefulStringType({
  minLength: 1,
  maxLength: 100,
  pattern: '^[a-z0-9]+(?:-[a-z0-9]+)*$'
})

@resourcefulColumn.string({
  type: slugType,
  nullable: false
})
declare slug: string

UUID Validation

typescript
const uuidType = ResourcefulStringType({
  minLength: 36,
  maxLength: 36,
  pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$'
})

@resourcefulColumn.string({
  type: uuidType,
  nullable: false
})
declare uuid: string

Color Code Validation

typescript
const hexColorType = ResourcefulStringType({
  minLength: 4,
  maxLength: 7,
  pattern: '^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$'
})

@resourcefulColumn.string({
  type: hexColorType,
  nullable: true
})
declare color: string

Status Enumeration

typescript
const orderStatusType = ResourcefulStringType({
  minLength: 1,
  maxLength: 20,
  enum: [
    'pending',
    'confirmed', 
    'processing',
    'shipped',
    'delivered',
    'cancelled',
    'refunded'
  ]
})

@resourcefulColumn.string({
  type: orderStatusType,
  nullable: false
})
declare status: string

Password Fields

typescript
const passwordType = ResourcefulStringType({
  minLength: 8,
  maxLength: 128,
  format: 'password',
  writeOnly: true,
  pattern: '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+'
})

@resourcefulColumn.string({
  type: passwordType,
  nullable: false
})
declare password: string

Multi-language Content

typescript
const contentType = ResourcefulStringType({
  minLength: 0,
  maxLength: 10000,
  nullable: true
})

@resourcefulColumn.string({
  type: contentType,
  nullable: true
})
declare description: string

@resourcefulColumn.string({
  type: contentType,
  nullable: true
})
declare descriptionEs: string

Advanced Examples

Social Media Handles

typescript
const twitterHandleType = ResourcefulStringType({
  minLength: 1,
  maxLength: 15,
  pattern: '^[A-Za-z0-9_]{1,15}$'
})

const instagramHandleType = ResourcefulStringType({
  minLength: 1,
  maxLength: 30,
  pattern: '^[a-zA-Z0-9._]{1,30}$'
})

class SocialProfile extends compose(BaseModel, withResourceful({ name: 'SocialProfile' })) {
  @resourcefulColumn.string({
    type: twitterHandleType,
    nullable: true
  })
  declare twitterHandle: string

  @resourcefulColumn.string({
    type: instagramHandleType,
    nullable: true
  })
  declare instagramHandle: string
}

Product Codes and SKUs

typescript
const skuType = ResourcefulStringType({
  minLength: 3,
  maxLength: 20,
  pattern: '^[A-Z0-9-]+$'
})

const barcodeType = ResourcefulStringType({
  minLength: 8,
  maxLength: 13,
  pattern: '^[0-9]+$'
})

class Product extends compose(BaseModel, withResourceful({ name: 'Product' })) {
  @resourcefulColumn.string({
    type: skuType,
    nullable: false
  })
  declare sku: string

  @resourcefulColumn.string({
    type: barcodeType,
    nullable: true
  })
  declare barcode: string
}

Geographic Data

typescript
const countryCodeType = ResourcefulStringType({
  minLength: 2,
  maxLength: 2,
  pattern: '^[A-Z]{2}$',
  enum: ['US', 'CA', 'GB', 'DE', 'FR', 'AU', 'JP'] // Add more as needed
})

const timezoneType = ResourcefulStringType({
  minLength: 1,
  maxLength: 50,
  pattern: '^[A-Za-z]+\\/[A-Za-z_]+$'
})

class Location extends compose(BaseModel, withResourceful({ name: 'Location' })) {
  @resourcefulColumn.string({
    type: countryCodeType,
    nullable: false
  })
  declare countryCode: string

  @resourcefulColumn.string({
    type: timezoneType,
    nullable: true
  })
  declare timezone: string
}

Version Numbers

typescript
const semverType = ResourcefulStringType({
  minLength: 5,
  maxLength: 20,
  pattern: '^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$'
})

@resourcefulColumn.string({
  type: semverType,
  nullable: false
})
declare version: string

Validation Examples

Complex Text Validation

typescript
class Article extends compose(BaseModel, withResourceful({ name: 'Article' })) {
  // Title with reasonable constraints
  @resourcefulColumn.string({
    type: ResourcefulStringType({
      minLength: 1,
      maxLength: 200
    }),
    nullable: false
  })
  declare title: string

  // Content with large text support
  @resourcefulColumn.string({
    type: ResourcefulStringType({
      minLength: 0,
      maxLength: 100000
    }),
    nullable: true
  })
  declare content: string

  // Tags as comma-separated string
  @resourcefulColumn.string({
    type: ResourcefulStringType({
      minLength: 0,
      maxLength: 500,
      pattern: '^[a-zA-Z0-9, -]*$'
    }),
    nullable: true
  })
  declare tags: string

  // Publication status
  @resourcefulColumn.string({
    type: ResourcefulStringType({
      minLength: 1,
      maxLength: 15,
      enum: ['draft', 'review', 'published', 'archived']
    }),
    nullable: false
  })
  declare status: string
}

OpenAPI Schema Generation

ResourcefulStringType generates comprehensive OpenAPI 3.0 schemas:

typescript
const stringType = ResourcefulStringType({
  minLength: 1,
  maxLength: 100,
  pattern: '^[a-zA-Z0-9]+$',
  format: 'custom'
})

// Generated OpenAPI schema:
{
  "type": "string",
  "minLength": 1,
  "maxLength": 100,
  "pattern": "^[a-zA-Z0-9]+$",
  "format": "custom"
}

Best Practices

  1. Set reasonable length limits: Prevent abuse while allowing legitimate use cases
  2. Use specific patterns: Write clear, tested regular expressions for validation
  3. Validate patterns thoroughly: Test regex patterns with various inputs
  4. Use enums for fixed sets: Prefer enums over patterns for known value sets
  5. Consider database constraints: Align string lengths with database column limits
  6. Use appropriate formats: Leverage OpenAPI formats for better documentation
  7. Document complex patterns: Comment complex regular expressions for maintenance
  8. Handle internationalization: Consider Unicode and multi-byte characters
  9. Validate email carefully: Use established email validation patterns
  10. Security considerations: Sanitize and validate user input appropriately

Common Validation Patterns

Email Addresses

regex
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Phone Numbers (International)

regex
^\+?[1-9]\d{1,14}$

URLs (HTTP/HTTPS)

regex
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$

UUID v4

regex
^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$

Slug/URL-safe strings

regex
^[a-z0-9]+(?:-[a-z0-9]+)*$

Hex color codes

regex
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$