npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ai-props

v2.0.2

Published

AI-powered props primitives for intelligent component properties

Readme

ai-props

AI-powered props primitives for intelligent component properties.

Overview

ai-props provides utilities for automatically generating component props using AI based on schema definitions. It's designed to work seamlessly with React components, Next.js, and other frameworks.

Installation

npm install ai-props

Quick Start

import { AI, generateProps } from 'ai-props'

// Define an AI-powered component schema
const UserCard = AI({
  schema: {
    name: 'User name',
    bio: 'User biography',
    avatar: 'Avatar URL',
  },
  defaults: {
    avatar: '/default-avatar.png',
  },
})

// Generate props with AI
const props = await UserCard({ name: 'John' })
// { name: 'John', bio: 'AI-generated bio...', avatar: '/default-avatar.png' }

Core Features

AI() Wrapper

Create AI-powered component wrappers that automatically fill in missing props:

import { AI } from 'ai-props'

const ProductCard = AI({
  schema: {
    title: 'Product title',
    description: 'Product description',
    price: 'Price (number)',
  },
  required: ['price'],  // Required props won't be generated
  exclude: ['internal'], // Exclude props from generation
})

// Use the component
const props = await ProductCard({ price: 99 })

generateProps()

Low-level function for direct prop generation:

import { generateProps } from 'ai-props'

const result = await generateProps({
  schema: {
    title: 'SEO-optimized page title',
    description: 'Meta description',
    keywords: ['Relevant keywords'],
  },
  context: { topic: 'AI-powered applications' },
})

console.log(result.props)    // Generated props
console.log(result.cached)   // Whether result came from cache
console.log(result.metadata) // Model info, duration, etc.

createAIComponent()

Create typed AI components:

import { createAIComponent } from 'ai-props'

interface ProductProps {
  title: string
  price: number
  description: string
}

const ProductCard = createAIComponent<ProductProps>({
  schema: {
    title: 'Product title',
    price: 'Price (number)',
    description: 'Product description',
  },
})

const props = await ProductCard({})
// props is typed as ProductProps

createComponentFactory()

Create a factory for generating multiple instances:

import { createComponentFactory } from 'ai-props'

const factory = createComponentFactory({
  schema: {
    name: 'Product name',
    price: 'Price (number)',
  },
})

// Generate a single instance
const product = await factory.generate({ category: 'electronics' })

// Generate multiple instances
const products = await factory.generateMany([
  { category: 'electronics' },
  { category: 'clothing' },
])

// Generate with overrides
const custom = await factory.generateWith(
  { category: 'tech' },
  { price: 99 }
)

composeAIComponents()

Compose multiple schemas together:

import { composeAIComponents } from 'ai-props'

const FullProfile = composeAIComponents({
  user: {
    schema: { name: 'User name', bio: 'Biography' },
  },
  settings: {
    schema: { theme: 'Theme preference', notifications: 'Notification pref' },
  },
})

const profile = await FullProfile({
  user: { name: 'John' },
  settings: {},
})

HOC Utilities

createPropsEnhancer()

Create a props enhancer for any component system:

import { createPropsEnhancer } from 'ai-props'

const enhancer = createPropsEnhancer({
  schema: {
    title: 'Page title',
    description: 'Page description',
  },
  defaults: { title: 'Default Title' },
})

const props = await enhancer({ description: 'My page' })

createAsyncPropsProvider()

Create an async props provider for SSR:

import { createAsyncPropsProvider } from 'ai-props'

const getPageProps = createAsyncPropsProvider({
  schema: {
    title: 'SEO title',
    meta: { description: 'Meta description' },
  },
})

// In getStaticProps or getServerSideProps
export async function getStaticProps() {
  const props = await getPageProps.getProps({ slug: 'about' })
  return { props }
}

createBatchGenerator()

Generate props for multiple items efficiently:

import { createBatchGenerator } from 'ai-props'

const batch = createBatchGenerator({
  schema: { title: 'Item title', description: 'Description' },
  concurrency: 3,
})

const items = await batch.generate([
  { id: 1, category: 'tech' },
  { id: 2, category: 'science' },
])

Validation

validateProps()

Validate props against a schema:

import { validateProps } from 'ai-props'

const result = validateProps(
  { name: 'John', age: '25' },
  { name: 'Name', age: 'Age (number)' }
)

if (!result.valid) {
  console.log(result.errors)
  // [{ path: 'age', message: 'Expected number, got string' }]
}

assertValidProps()

Assert props are valid (throws on error):

import { assertValidProps } from 'ai-props'

assertValidProps(
  { name: 'John', age: 25 },
  { name: 'Name', age: 'Age (number)' }
)

Other Validation Utilities

import {
  hasRequiredProps,
  getMissingProps,
  isComplete,
  getMissingFromSchema,
  sanitizeProps,
  mergeWithDefaults,
  createValidator,
} from 'ai-props'

// Check required props
hasRequiredProps({ name: 'John' }, ['name', 'email']) // false

// Get missing props
getMissingProps({ name: 'John' }, ['name', 'email']) // ['email']

// Check schema completion
isComplete({ name: 'John' }, { name: 'Name', age: 'Age' }) // false

// Sanitize extra props
sanitizeProps({ name: 'John', extra: 'value' }, { name: 'Name' })
// { name: 'John' }

// Merge with defaults
mergeWithDefaults({ name: 'John' }, { age: 0 }, { name: 'Name', age: 'Age' })
// { name: 'John', age: 0 }

// Create reusable validator
const validate = createValidator({ name: 'Name', age: 'Age (number)' })
validate({ name: 'John', age: 25 }) // { valid: true, errors: [] }

Caching

Cache Configuration

import { configureAIProps, configureCache, clearCache } from 'ai-props'

// Configure global settings
configureAIProps({
  model: 'gpt-4',
  cache: true,
  cacheTTL: 5 * 60 * 1000, // 5 minutes
})

// Configure cache with custom TTL
configureCache(10 * 60 * 1000) // 10 minutes

// Clear all cached props
clearCache()

Cache Classes

import { MemoryPropsCache, LRUPropsCache } from 'ai-props'

// Simple memory cache
const memCache = new MemoryPropsCache(5 * 60 * 1000)

// LRU cache with max entries
const lruCache = new LRUPropsCache(100, 5 * 60 * 1000)

// Cache operations
lruCache.set('key', { name: 'John' })
const entry = lruCache.get<{ name: string }>('key')
lruCache.delete('key')
lruCache.clear()
console.log(lruCache.size)

Schema Type Hints

Use type hints in schema strings:

const schema = {
  name: 'User name',                    // string
  age: 'User age (number)',             // number
  count: 'Item count (integer)',        // integer
  active: 'Is active (boolean)',        // boolean
  tags: ['Tag names'],                  // array
  status: 'pending | active | done',    // enum
  profile: {                            // nested object
    bio: 'User bio',
    avatar: 'Avatar URL',
  },
}

Configuration

import { configureAIProps, getConfig, resetConfig } from 'ai-props'

// Configure globally
configureAIProps({
  model: 'sonnet',           // Default model
  cache: true,               // Enable caching
  cacheTTL: 300000,          // Cache TTL in ms
  system: 'Custom prompt',   // System prompt
  generate: async (schema, context) => {
    // Custom generator
    return { /* generated props */ }
  },
})

// Get current config
const config = getConfig()

// Reset to defaults
resetConfig()

API Reference

Types

interface PropSchema {
  [key: string]: string | string[] | PropSchema
}

interface GeneratePropsOptions {
  schema: PropSchema
  context?: Record<string, unknown>
  prompt?: string
  model?: string
  system?: string
}

interface GeneratePropsResult<T> {
  props: T
  cached: boolean
  metadata: {
    model: string
    duration?: number
  }
}

interface AIComponentOptions<P> {
  schema: PropSchema
  defaults?: Partial<P>
  required?: (keyof P)[]
  exclude?: (keyof P)[]
  config?: AIPropsConfig
}

interface ValidationResult {
  valid: boolean
  errors: ValidationError[]
}

interface ValidationError {
  path: string
  message: string
  expected?: string
  received?: unknown
}

License

MIT