{"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":[],"mappings":"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","file":"next.mjs","sourcesContent":["import { z } from 'zod';\nimport type {\n  ActionMetadata,\n  TransactionRequest,\n  TransactionResponse,\n  LinkedAction,\n  TypedActionParameter,\n  ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// =============================================================================\n// LEGACY SCHEMAS (Backwards compatible)\n// =============================================================================\n\nexport const ActionButtonSchema = z.object({\n  label: z.string().min(1).max(50),\n  value: z.string().min(1),\n  type: z.enum(['button', 'input']),\n  placeholder: z.string().optional(),\n  disabled: z.boolean().optional(),\n});\n\n// =============================================================================\n// SOLANA-STYLE PARAMETER SCHEMAS\n// =============================================================================\n\n/**\n * Parameter types enum\n */\nexport const ActionParameterTypeSchema = z.enum([\n  'text',\n  'number',\n  'email',\n  'url',\n  'date',\n  'datetime-local',\n  'textarea',\n  'select',\n  'radio',\n  'checkbox',\n  'address',\n  'token',\n  'amount',\n]);\n\n/**\n * Option for select/radio/checkbox\n */\nexport const ActionParameterOptionSchema = z.object({\n  label: z.string().min(1),\n  value: z.string(),\n  selected: z.boolean().optional(),\n});\n\n/**\n * Base parameter fields\n */\nconst ActionParameterBaseSchema = z.object({\n  name: z.string().min(1).max(50),\n  label: z.string().max(100).optional(),\n  required: z.boolean().optional(),\n  pattern: z.string().optional(),\n  patternDescription: z.string().optional(),\n  min: z.union([z.string(), z.number()]).optional(),\n  max: z.union([z.string(), z.number()]).optional(),\n});\n\n/**\n * Non-selectable parameter (text, number, etc.)\n */\nexport const ActionParameterSchema = ActionParameterBaseSchema.extend({\n  type: z.enum([\n    'text', 'number', 'email', 'url', 'date', 'datetime-local',\n    'textarea', 'address', 'token', 'amount'\n  ]).optional(),\n});\n\n/**\n * Selectable parameter (select, radio, checkbox)\n */\nexport const ActionParameterSelectableSchema = ActionParameterBaseSchema.extend({\n  type: z.enum(['select', 'radio', 'checkbox']),\n  options: z.array(ActionParameterOptionSchema).min(1),\n});\n\n/**\n * Union of all parameter types\n */\nexport const TypedActionParameterSchema = z.union([\n  ActionParameterSelectableSchema,\n  ActionParameterSchema,\n]);\n\n// =============================================================================\n// LINKED ACTION SCHEMAS\n// =============================================================================\n\n/**\n * Linked action type enum\n */\nexport const LinkedActionTypeSchema = z.enum(['transaction', 'post', 'external-link']);\n\n/**\n * Linked action with href template and parameters\n */\nexport const LinkedActionSchema = z.object({\n  type: LinkedActionTypeSchema.optional(),\n  href: z.string().min(1),\n  label: z.string().min(1).max(50),\n  disabled: z.boolean().optional(),\n  parameters: z.array(TypedActionParameterSchema).optional(),\n});\n\n/**\n * Links section containing linked actions\n */\nexport const ActionLinksSchema = z.object({\n  actions: z.array(LinkedActionSchema).min(1),\n});\n\n// =============================================================================\n// ACTION CHAINING SCHEMAS\n// =============================================================================\n\nexport const PostNextActionLinkSchema = z.object({\n  type: z.literal('post'),\n  href: z.string().min(1),\n});\n\nexport const InlineNextActionLinkSchema: z.ZodType<{ type: 'inline'; action: ActionMetadata }> = z.object({\n  type: z.literal('inline'),\n  action: z.lazy(() => ActionMetadataSchema),\n});\n\nexport const NextActionLinkSchema = z.union([\n  PostNextActionLinkSchema,\n  InlineNextActionLinkSchema,\n]);\n\n// =============================================================================\n// MAIN SCHEMAS (Enhanced)\n// =============================================================================\n\n/**\n * Icon can be URL or base64 data URI\n */\nconst iconSchema = z.string().refine(\n  (val) => {\n    // Allow URLs\n    if (val.startsWith('http://') || val.startsWith('https://')) return true;\n    // Allow base64 data URIs\n    if (val.startsWith('data:image/')) return true;\n    // Allow relative paths\n    if (val.startsWith('/')) return true;\n    return false;\n  },\n  { message: 'Icon must be a valid URL, base64 data URI, or relative path' }\n);\n\n/**\n * Enhanced ActionMetadata schema with links support\n */\nexport const ActionMetadataSchema = z.object({\n  type: z.enum(['action', 'completed']).optional(),\n  title: z.string().min(1).max(200),\n  icon: iconSchema,\n  description: z.string().min(1).max(1000),\n  label: z.string().max(50).optional(),\n  // Legacy actions (optional)\n  actions: z.array(ActionButtonSchema).optional(),\n  // Solana-style linked actions (optional)\n  links: ActionLinksSchema.optional(),\n  disabled: z.boolean().optional(),\n  error: z.object({ message: z.string() }).optional(),\n}).refine(\n  (data) => {\n    // Must have either actions or links (or both)\n    return (data.actions && data.actions.length > 0) ||\n           (data.links?.actions && data.links.actions.length > 0);\n  },\n  { message: 'Must have at least one action or linked action' }\n);\n\n/**\n * Enhanced TransactionRequest with data support\n */\nexport const TransactionRequestSchema = z.object({\n  account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n  action: z.string().min(1),\n  input: z.string().optional(),\n  // Solana-style parameter data\n  data: z.record(z.union([z.string(), z.array(z.string())])).optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n  to: z.string().regex(addressRegex, 'Invalid to address'),\n  value: z.string(),\n  data: z.string().regex(hexRegex, 'Invalid hex data'),\n  chainId: z.number().positive(),\n});\n\n/**\n * Enhanced TransactionResponse with multi-tx and chaining support\n */\nexport const TransactionResponseSchema = z.object({\n  // Single transaction (legacy)\n  transaction: EVMTransactionSchema.optional(),\n  // Multiple transactions (batch)\n  transactions: z.array(EVMTransactionSchema).optional(),\n  message: z.string().optional(),\n  // Action chaining\n  links: z.object({\n    next: NextActionLinkSchema.optional(),\n  }).optional(),\n}).refine(\n  (data) => {\n    // Must have either transaction or transactions\n    return data.transaction !== undefined || (data.transactions && data.transactions.length > 0);\n  },\n  { message: 'Must have either transaction or transactions' }\n);\n\n// Validation functions\nexport function validateActionMetadata(\n  data: unknown\n): ValidationResult<ActionMetadata> {\n  const result = ActionMetadataSchema.safeParse(data);\n  if (result.success) {\n    return { success: true, data: result.data as ActionMetadata };\n  }\n  return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n  data: unknown\n): ValidationResult<TransactionRequest> {\n  const result = TransactionRequestSchema.safeParse(data);\n  if (result.success) {\n    return { success: true, data: result.data };\n  }\n  return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n  data: unknown\n): ValidationResult<TransactionResponse> {\n  const result = TransactionResponseSchema.safeParse(data);\n  if (result.success) {\n    return { success: true, data: result.data as TransactionResponse };\n  }\n  return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n  return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n  return hexRegex.test(hex);\n}\n\n// =============================================================================\n// NEW VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate a linked action\n */\nexport function validateLinkedAction(\n  data: unknown\n): ValidationResult<LinkedAction> {\n  const result = LinkedActionSchema.safeParse(data);\n  if (result.success) {\n    return { success: true, data: result.data as LinkedAction };\n  }\n  return { success: false, error: result.error.message };\n}\n\n/**\n * Validate a parameter\n */\nexport function validateParameter(\n  data: unknown\n): ValidationResult<TypedActionParameter> {\n  const result = TypedActionParameterSchema.safeParse(data);\n  if (result.success) {\n    return { success: true, data: result.data as TypedActionParameter };\n  }\n  return { success: false, error: result.error.message };\n}\n\n/**\n * Validate parameter values against their definitions\n */\nexport function validateParameterValues(\n  parameters: TypedActionParameter[],\n  values: Record<string, string | string[]>\n): ValidationResult<Record<string, string | string[]>> {\n  const errors: string[] = [];\n\n  for (const param of parameters) {\n    const value = values[param.name];\n\n    // Check required\n    if (param.required && (value === undefined || value === '' || (Array.isArray(value) && value.length === 0))) {\n      errors.push(`${param.label || param.name} is required`);\n      continue;\n    }\n\n    // Skip validation if no value and not required\n    if (value === undefined || value === '') continue;\n\n    const strValue = Array.isArray(value) ? value[0] : value;\n\n    // Validate pattern\n    if (param.pattern && strValue) {\n      const regex = new RegExp(param.pattern);\n      if (!regex.test(strValue)) {\n        errors.push(param.patternDescription || `${param.label || param.name} has invalid format`);\n      }\n    }\n\n    // Validate min/max for number types\n    if ((param.type === 'number' || param.type === 'amount') && strValue) {\n      const numValue = parseFloat(strValue);\n      if (isNaN(numValue)) {\n        errors.push(`${param.label || param.name} must be a number`);\n      } else {\n        if (param.min !== undefined && numValue < Number(param.min)) {\n          errors.push(`${param.label || param.name} must be at least ${param.min}`);\n        }\n        if (param.max !== undefined && numValue > Number(param.max)) {\n          errors.push(`${param.label || param.name} must be at most ${param.max}`);\n        }\n      }\n    }\n\n    // Validate address type\n    if (param.type === 'address' && strValue && !isValidAddress(strValue)) {\n      errors.push(`${param.label || param.name} must be a valid Ethereum address`);\n    }\n  }\n\n  if (errors.length > 0) {\n    return { success: false, error: errors.join(', ') };\n  }\n\n  return { success: true, data: values };\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n  'Access-Control-Allow-Origin': '*',\n  'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n  'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n  // GET handler - returns action metadata\n  async function GET() {\n    try {\n      const metadata = action.getMetadata();\n      return NextResponse.json(metadata, { headers: corsHeaders });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : 'Unknown error';\n      return NextResponse.json(\n        { error: { message } },\n        { status: 500, headers: corsHeaders }\n      );\n    }\n  }\n\n  // POST handler - returns transaction\n  async function POST(request: NextRequest) {\n    try {\n      const body = await request.json();\n\n      // Validate request\n      const validation = validateTransactionRequest(body);\n      if (!validation.success) {\n        return NextResponse.json(\n          { error: { message: validation.error } },\n          { status: 400, headers: corsHeaders }\n        );\n      }\n\n      // Handle request\n      const response = await action.handleRequest(validation.data);\n\n      return NextResponse.json(response, { headers: corsHeaders });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : 'Unknown error';\n      return NextResponse.json(\n        { error: { message } },\n        { status: 500, headers: corsHeaders }\n      );\n    }\n  }\n\n  // OPTIONS handler - CORS preflight\n  async function OPTIONS() {\n    return new NextResponse(null, { headers: corsHeaders });\n  }\n\n  return { GET, POST, OPTIONS };\n}\n"]}