{"version":3,"sources":["../../../src/extensions/discovery.ts"],"sourcesContent":["/**\n * Discovery Extension for x402 Bazaar\n *\n * This extension allows resource servers to declare discovery metadata\n * that will be registered with the facilitator's Bazaar catalog.\n *\n * @example\n * ```typescript\n * import { declareDiscoveryExtension } from \"@b3dotfun/anyspend-x402/extensions\";\n *\n * app.use(paymentMiddleware(\"0xAddr\", {\n *   \"/weather\": {\n *     price: \"$0.01\",\n *     network: \"base\",\n *     config: {\n *       ...declareDiscoveryExtension({\n *         discoverable: true,\n *         output: {\n *           example: { temperature: 72, conditions: \"sunny\" },\n *           schema: {\n *             type: \"object\",\n *             properties: {\n *               temperature: { type: \"number\" },\n *               conditions: { type: \"string\" },\n *             },\n *           },\n *         },\n *         metadata: {\n *           name: \"Weather API\",\n *           description: \"Real-time weather data\",\n *           category: \"data\",\n *           tags: [\"weather\", \"api\"],\n *         },\n *       }),\n *     },\n *   },\n * }, facilitator));\n * ```\n */\n\nimport { DiscoveryMetadata, JSONSchema } from \"../types/shared/middleware\";\n\n// Re-export JSONSchema for convenience\nexport type { JSONSchema };\n\n/**\n * Schema definition for input/output\n */\nexport interface SchemaDefinition {\n  /**\n   * Example value for documentation and testing\n   */\n  example?: unknown;\n\n  /**\n   * JSON Schema definition\n   */\n  schema?: JSONSchema;\n}\n\n// Re-export DiscoveryMetadata for convenience\nexport { DiscoveryMetadata };\n\n/**\n * Options for declareDiscoveryExtension\n */\nexport interface DiscoveryExtensionOptions {\n  /**\n   * Whether this endpoint should be discoverable in the Bazaar\n   *\n   * @default true\n   */\n  discoverable?: boolean;\n\n  /**\n   * Input schema definition (request body/params)\n   */\n  input?: SchemaDefinition;\n\n  /**\n   * Output schema definition (response)\n   */\n  output?: SchemaDefinition;\n\n  /**\n   * Metadata for the discovery catalog\n   */\n  metadata?: DiscoveryMetadata;\n}\n\n/**\n * Result of declareDiscoveryExtension to spread into config\n */\nexport interface DiscoveryExtensionConfig {\n  discoverable: boolean;\n  discoveryInput?: SchemaDefinition;\n  discoveryOutput?: SchemaDefinition;\n  discoveryMetadata?: DiscoveryMetadata;\n}\n\n/**\n * Declares discovery metadata for a payment-protected endpoint.\n *\n * This helper function creates the configuration needed for automatic\n * registration with the facilitator's Bazaar discovery catalog.\n *\n * @param options - Discovery extension options\n * @returns Configuration object to spread into PaymentMiddlewareConfig\n *\n * @example\n * ```typescript\n * // Basic usage - just make discoverable\n * config: {\n *   ...declareDiscoveryExtension({ discoverable: true })\n * }\n *\n * // With output schema\n * config: {\n *   ...declareDiscoveryExtension({\n *     output: {\n *       example: { temperature: 72 },\n *       schema: { type: \"object\", properties: { temperature: { type: \"number\" } } }\n *     }\n *   })\n * }\n *\n * // Full metadata\n * config: {\n *   ...declareDiscoveryExtension({\n *     discoverable: true,\n *     input: {\n *       example: { city: \"San Francisco\" },\n *       schema: { type: \"object\", properties: { city: { type: \"string\" } } }\n *     },\n *     output: {\n *       example: { temperature: 72, conditions: \"sunny\" },\n *       schema: {\n *         type: \"object\",\n *         properties: {\n *           temperature: { type: \"number\" },\n *           conditions: { type: \"string\" }\n *         }\n *       }\n *     },\n *     metadata: {\n *       name: \"Weather API\",\n *       category: \"data\",\n *       tags: [\"weather\"],\n *       provider: \"WeatherCorp\"\n *     }\n *   })\n * }\n * ```\n */\nexport function declareDiscoveryExtension(\n  options: DiscoveryExtensionOptions = {},\n): DiscoveryExtensionConfig {\n  const { discoverable = true, input, output, metadata } = options;\n\n  const config: DiscoveryExtensionConfig = {\n    discoverable,\n  };\n\n  // Only add discoveryInput if it has meaningful content\n  if (input?.example !== undefined || input?.schema) {\n    config.discoveryInput = {\n      ...(input.example !== undefined && { example: input.example }),\n      ...(input.schema && { schema: input.schema }),\n    };\n  }\n\n  // Only add discoveryOutput if it has meaningful content\n  if (output?.example !== undefined || output?.schema) {\n    config.discoveryOutput = {\n      ...(output.example !== undefined && { example: output.example }),\n      ...(output.schema && { schema: output.schema }),\n    };\n  }\n\n  if (metadata && Object.keys(metadata).length > 0) {\n    config.discoveryMetadata = metadata;\n  }\n\n  return config;\n}\n\n/**\n * Type guard to check if config has discovery extension\n *\n * @param config - The configuration object to check\n * @returns True if the config has discovery extension properties\n */\nexport function hasDiscoveryExtension(config: unknown): config is DiscoveryExtensionConfig {\n  return (\n    typeof config === \"object\" &&\n    config !== null &&\n    \"discoverable\" in config &&\n    typeof (config as DiscoveryExtensionConfig).discoverable === \"boolean\"\n  );\n}\n"],"mappings":";;;AA0JO,SAAS,0BACd,UAAqC,CAAC,GACZ;AAC1B,QAAM,EAAE,eAAe,MAAM,OAAO,QAAQ,SAAS,IAAI;AAEzD,QAAM,SAAmC;AAAA,IACvC;AAAA,EACF;AAGA,MAAI,OAAO,YAAY,UAAa,OAAO,QAAQ;AACjD,WAAO,iBAAiB;AAAA,MACtB,GAAI,MAAM,YAAY,UAAa,EAAE,SAAS,MAAM,QAAQ;AAAA,MAC5D,GAAI,MAAM,UAAU,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7C;AAAA,EACF;AAGA,MAAI,QAAQ,YAAY,UAAa,QAAQ,QAAQ;AACnD,WAAO,kBAAkB;AAAA,MACvB,GAAI,OAAO,YAAY,UAAa,EAAE,SAAS,OAAO,QAAQ;AAAA,MAC9D,GAAI,OAAO,UAAU,EAAE,QAAQ,OAAO,OAAO;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAChD,WAAO,oBAAoB;AAAA,EAC7B;AAEA,SAAO;AACT;AAQO,SAAS,sBAAsB,QAAqD;AACzF,SACE,OAAO,WAAW,YAClB,WAAW,QACX,kBAAkB,UAClB,OAAQ,OAAoC,iBAAiB;AAEjE;","names":[]}