{"version":3,"sources":["../core/resolvers/HTTPResolver.ts"],"names":["HTTPResolver","name","description","type","capabilities","io","read","write","list","contexts","import","path","output","supportedContentTypes","defaultContentType","priority","cache","strategy","ttl","duration","Map","defaultTimeout","defaultCacheTimeout","canResolve","ref","config","baseUrl","resolve","MlldResolutionError","reference","url","buildUrl","validateDomain","cacheKey","toString","cached","getCached","cacheTimeout","contentType","detectContentType","pathname","content","metadata","source","timestamp","Date","taintLevel","TaintLevel","EXTERNAL","mimeType","headers","etag","fetchFromHttp","set","now","size","parseInt","undefined","error","status","message","originalError","validateConfig","errors","push","URL","Array","isArray","allowedDomains","every","d","timeout","followRedirects","maxRedirects","validateSSL","checkAccess","operation","endsWith","cleanRef","startsWith","slice","hostname","includes","join","protocol","key","get","maxAge","delete","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","signal","redirect","clearTimeout","ok","Error","statusText","isTextContent","text","responseHeaders","forEach","value","toLowerCase","textTypes","some","filePath","parse","result","success","hasModuleExports","ast","JSON","node","kind"],"mappings":"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","file":"chunk-7T5PMNS2.mjs","sourcesContent":["import { \n  Resolver, \n  ResolverContent, \n  ResolverType,\n  ContentInfo,\n  ResolverCapabilities\n} from '@core/resolvers/types';\nimport { MlldResolutionError } from '@core/errors';\nimport { TaintLevel } from '@security/taint/TaintTracker';\n\n/**\n * Configuration for HTTPResolver\n */\nexport interface HTTPResolverConfig {\n  /**\n   * Base URL for resolving references\n   */\n  baseUrl: string;\n\n  /**\n   * Authentication headers\n   */\n  headers?: Record<string, string>;\n\n  /**\n   * Allowed domains (if not specified, only baseUrl domain is allowed)\n   */\n  allowedDomains?: string[];\n\n  /**\n   * Request timeout in milliseconds\n   */\n  timeout?: number;\n\n  /**\n   * Whether to follow redirects\n   */\n  followRedirects?: boolean;\n\n  /**\n   * Maximum number of redirects to follow\n   */\n  maxRedirects?: number;\n\n  /**\n   * Cache timeout in milliseconds\n   */\n  cacheTimeout?: number;\n\n  /**\n   * Whether to validate SSL certificates (default: true)\n   */\n  validateSSL?: boolean;\n}\n\n/**\n * HTTP Resolver - provides access to modules via HTTP/HTTPS\n * Supports authentication and domain restrictions for security\n */\nexport class HTTPResolver implements Resolver {\n  name = 'HTTP';\n  description = 'Resolves modules from HTTP/HTTPS endpoints';\n  type: ResolverType = 'input';\n  \n  capabilities: ResolverCapabilities = {\n    io: { read: true, write: false, list: false },\n    contexts: { import: true, path: true, output: false },\n    supportedContentTypes: ['module', 'data', 'text'],\n    defaultContentType: 'text',\n    priority: 20, // Same as other external resolvers\n    cache: { \n      strategy: 'persistent',\n      ttl: { duration: 300 } // 5 minutes\n    }\n  };\n\n  private readonly cache: Map<string, { \n    content: string; \n    timestamp: number; \n    etag?: string;\n    headers?: Record<string, string>;\n  }> = new Map();\n  \n  private readonly defaultTimeout = 30000; // 30 seconds\n  private readonly defaultCacheTimeout = 300000; // 5 minutes\n\n  /**\n   * Check if this resolver can handle the reference\n   */\n  canResolve(ref: string, config?: HTTPResolverConfig): boolean {\n    // We can handle any reference if we have a valid baseUrl\n    return !!config?.baseUrl;\n  }\n\n  /**\n   * Resolve a reference to HTTP content\n   */\n  async resolve(ref: string, config?: HTTPResolverConfig): Promise<ResolverContent> {\n    if (!config?.baseUrl) {\n      throw new MlldResolutionError(\n        'HTTPResolver requires baseUrl in configuration',\n        { reference: ref }\n      );\n    }\n\n    // Build the full URL\n    const url = this.buildUrl(ref, config);\n    \n    // Validate the URL domain\n    this.validateDomain(url, config);\n\n    // Check cache first\n    const cacheKey = url.toString();\n    const cached = this.getCached(cacheKey, config.cacheTimeout);\n    if (cached) {\n      const contentType = await this.detectContentType(url.pathname, cached.content);\n      return {\n        content: cached.content,\n        contentType,\n        metadata: {\n          source: url.toString(),\n          timestamp: new Date(),\n          taintLevel: (TaintLevel as any).EXTERNAL,\n          mimeType: cached.headers?.['content-type'] || 'text/plain'\n        }\n      };\n    }\n\n    try {\n      // Fetch from HTTP endpoint\n      const { content, etag, headers } = await this.fetchFromHttp(url, config, cached?.etag);\n      \n      // Update cache\n      this.cache.set(cacheKey, {\n        content,\n        timestamp: Date.now(),\n        etag,\n        headers\n      });\n\n      const contentType = await this.detectContentType(url.pathname, content);\n      return {\n        content,\n        contentType,\n        metadata: {\n          source: url.toString(),\n          timestamp: new Date(),\n          taintLevel: (TaintLevel as any).EXTERNAL,\n          mimeType: headers['content-type'] || 'text/plain',\n          size: parseInt(headers['content-length'] || '0', 10) || undefined\n        }\n      };\n    } catch (error) {\n      if (error.status === 404) {\n        throw new MlldResolutionError(\n          `Resource not found: ${url}`,\n          { reference: ref, url: url.toString() }\n        );\n      }\n      throw new MlldResolutionError(\n        `Failed to fetch from HTTP: ${error.message}`,\n        { \n          reference: ref, \n          url: url.toString(),\n          originalError: error\n        }\n      );\n    }\n  }\n\n  /**\n   * Validate configuration\n   */\n  validateConfig(config: any): string[] {\n    const errors: string[] = [];\n\n    if (!config?.baseUrl) {\n      errors.push('baseUrl is required');\n    } else if (typeof config.baseUrl !== 'string') {\n      errors.push('baseUrl must be a string');\n    } else {\n      try {\n        new URL(config.baseUrl);\n      } catch {\n        errors.push('baseUrl must be a valid URL');\n      }\n    }\n\n    if (config.headers !== undefined) {\n      if (typeof config.headers !== 'object' || Array.isArray(config.headers)) {\n        errors.push('headers must be an object');\n      }\n    }\n\n    if (config.allowedDomains !== undefined) {\n      if (!Array.isArray(config.allowedDomains)) {\n        errors.push('allowedDomains must be an array');\n      } else if (!config.allowedDomains.every(d => typeof d === 'string')) {\n        errors.push('allowedDomains must contain only strings');\n      }\n    }\n\n    if (config.timeout !== undefined) {\n      if (typeof config.timeout !== 'number' || config.timeout < 0) {\n        errors.push('timeout must be a non-negative number');\n      }\n    }\n\n    if (config.followRedirects !== undefined && typeof config.followRedirects !== 'boolean') {\n      errors.push('followRedirects must be a boolean');\n    }\n\n    if (config.maxRedirects !== undefined) {\n      if (typeof config.maxRedirects !== 'number' || config.maxRedirects < 0) {\n        errors.push('maxRedirects must be a non-negative number');\n      }\n    }\n\n    if (config.validateSSL !== undefined && typeof config.validateSSL !== 'boolean') {\n      errors.push('validateSSL must be a boolean');\n    }\n\n    return errors;\n  }\n\n  /**\n   * Check access - HTTP resolver is read-only\n   */\n  async checkAccess(ref: string, operation: 'read' | 'write', config?: HTTPResolverConfig): Promise<boolean> {\n    if (operation === 'write') {\n      return false; // HTTP resolver is read-only\n    }\n\n    if (!config?.baseUrl) {\n      return false;\n    }\n\n    try {\n      const url = this.buildUrl(ref, config);\n      this.validateDomain(url, config);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Build the full URL from reference and config\n   */\n  private buildUrl(ref: string, config: HTTPResolverConfig): URL {\n    const baseUrl = config.baseUrl.endsWith('/') ? config.baseUrl : config.baseUrl + '/';\n    const cleanRef = ref.startsWith('/') ? ref.slice(1) : ref;\n    \n    try {\n      return new URL(cleanRef, baseUrl);\n    } catch (error) {\n      throw new MlldResolutionError(\n        `Invalid URL: ${baseUrl}${cleanRef}`,\n        { reference: ref, baseUrl: config.baseUrl }\n      );\n    }\n  }\n\n  /**\n   * Validate that the URL domain is allowed\n   */\n  private validateDomain(url: URL, config: HTTPResolverConfig): void {\n    const baseUrl = new URL(config.baseUrl);\n    const allowedDomains = config.allowedDomains || [baseUrl.hostname];\n\n    if (!allowedDomains.includes(url.hostname)) {\n      throw new MlldResolutionError(\n        `Domain not allowed: ${url.hostname}. Allowed domains: ${allowedDomains.join(', ')}`,\n        { url: url.toString(), allowedDomains }\n      );\n    }\n\n    // Ensure HTTPS for security (unless explicitly disabled)\n    if (url.protocol !== 'https:' && config.validateSSL !== false) {\n      throw new MlldResolutionError(\n        'Only HTTPS URLs are allowed for security reasons',\n        { url: url.toString() }\n      );\n    }\n  }\n\n  /**\n   * Get cached content if available\n   */\n  private getCached(\n    key: string, \n    timeout?: number\n  ): { content: string; etag?: string; headers?: Record<string, string> } | null {\n    const cached = this.cache.get(key);\n    if (!cached) return null;\n\n    const maxAge = timeout ?? this.defaultCacheTimeout;\n    if (Date.now() - cached.timestamp > maxAge) {\n      this.cache.delete(key);\n      return null;\n    }\n\n    return { \n      content: cached.content, \n      etag: cached.etag,\n      headers: cached.headers\n    };\n  }\n\n  /**\n   * Fetch content from HTTP endpoint\n   */\n  private async fetchFromHttp(\n    url: URL,\n    config: HTTPResolverConfig,\n    etag?: string\n  ): Promise<{ content: string; etag?: string; headers: Record<string, string> }> {\n    const controller = new AbortController();\n    const timeout = config.timeout || this.defaultTimeout;\n    \n    const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n    try {\n      const headers: HeadersInit = {\n        'User-Agent': 'mlld-http-resolver',\n        'Accept': 'text/plain, text/*, application/json',\n        ...config.headers\n      };\n\n      if (etag) {\n        headers['If-None-Match'] = etag;\n      }\n\n      const response = await fetch(url.toString(), {\n        headers,\n        signal: controller.signal,\n        redirect: config.followRedirects === false ? 'manual' : 'follow'\n      });\n\n      clearTimeout(timeoutId);\n\n      if (response.status === 304) {\n        // Not modified, use cache\n        const cached = this.cache.get(url.toString());\n        if (cached) {\n          return { \n            content: cached.content, \n            etag: cached.etag,\n            headers: cached.headers || {}\n          };\n        }\n      }\n\n      if (!response.ok) {\n        const error = new Error(`HTTP error: ${response.status} ${response.statusText}`);\n        (error as any).status = response.status;\n        throw error;\n      }\n\n      // Check content type\n      const contentType = response.headers.get('content-type') || '';\n      if (!this.isTextContent(contentType)) {\n        throw new Error(`Unsupported content type: ${contentType}`);\n      }\n\n      const content = await response.text();\n      \n      // Convert headers to plain object\n      const responseHeaders: Record<string, string> = {};\n      response.headers.forEach((value, key) => {\n        responseHeaders[key.toLowerCase()] = value;\n      });\n\n      return {\n        content,\n        etag: response.headers.get('etag') || undefined,\n        headers: responseHeaders\n      };\n    } catch (error) {\n      if (error.name === 'AbortError') {\n        throw new Error(`Request timeout after ${timeout}ms`);\n      }\n      throw error;\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  /**\n   * Check if content type is text-based\n   */\n  private isTextContent(contentType: string): boolean {\n    const textTypes = [\n      'text/',\n      'application/json',\n      'application/xml',\n      'application/javascript',\n      'application/x-yaml',\n      'application/x-mlld'\n    ];\n\n    return textTypes.some(type => contentType.toLowerCase().includes(type));\n  }\n\n  /**\n   * Detect content type based on file extension and content\n   */\n  private async detectContentType(filePath: string, content: string): Promise<'module' | 'data' | 'text'> {\n    // Check file extension\n    if (filePath.endsWith('.mld') || filePath.endsWith('.mlld')) {\n      return 'module';\n    }\n    if (filePath.endsWith('.json')) {\n      return 'data';\n    }\n    \n    // Try to detect mlld module content\n    try {\n      const { parse } = await import('@grammar/parser');\n      const result = await parse(content);\n      if (result.success && this.hasModuleExports(result.ast)) {\n        return 'module';\n      }\n    } catch {\n      // Not valid mlld\n    }\n    \n    // Try JSON\n    try {\n      JSON.parse(content);\n      return 'data';\n    } catch {\n      // Not JSON\n    }\n    \n    return 'text';\n  }\n  \n  /**\n   * Check if AST has module exports\n   */\n  private hasModuleExports(ast: any): boolean {\n    // Check if there are any directive nodes (not just text/newlines)\n    if (!ast || !Array.isArray(ast)) return false;\n    \n    return ast.some(node => \n      node && node.type === 'Directive' && \n      ['var', 'exe', 'path'].includes(node.kind)\n    );\n  }\n}"]}