{"version":3,"sources":["../core/utils/findProjectRoot.ts","../core/resolvers/ProjectPathResolver.ts"],"names":["findProjectRoot","startPath","fileSystem","currentDir","resolve","homeDir","homedir","logger","debug","dirname","lockFilePath","join","exists","fallbackIndicators","indicator","warn","ProjectPathResolver","constructor","name","description","type","capabilities","io","read","write","list","contexts","import","path","output","supportedContentTypes","defaultContentType","priority","cache","strategy","canResolve","ref","config","startsWith","basePath","isProjectRoot","findProjectRootFromCwd","MlldResolutionError","reference","availableConfig","Object","keys","context","content","contentType","metadata","source","timestamp","Date","relativePath","substring","length","fullPath","normalizedBasePath","normalizedFullPath","extname","withMld","readFile","detectContentType","originalRef","MlldFileNotFoundError","error","result","validateConfig","errors","push","checkAccess","operation","readonly","filePath","endsWith","parse","success","hasModuleExports","ast","JSON","Array","isArray","some","node","includes","kind","indicators","projectRoot","process","cwd"],"mappings":"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","file":"chunk-P46TIXQR.mjs","sourcesContent":["import * as path from 'path';\nimport * as os from 'os';\nimport type { IFileSystemService } from '@services/fs/IFileSystemService';\nimport { logger } from '@core/utils/logger';\n\n/**\n * Find the project root by searching up the directory tree for mlld.lock.json\n * or other project indicators.\n * \n * @param startPath - The directory to start searching from\n * @param fileSystem - The filesystem service to use\n * @returns The project root path, or the original startPath if not found\n */\nexport async function findProjectRoot(\n  startPath: string,\n  fileSystem: IFileSystemService\n): Promise<string> {\n  let currentDir = path.resolve(startPath);\n  const homeDir = os.homedir();\n  \n  logger.debug(`Finding project root from: ${startPath}`);\n  \n  while (currentDir !== homeDir && currentDir !== path.dirname(currentDir)) {\n    // First priority: mlld.lock.json\n    const lockFilePath = path.join(currentDir, 'mlld.lock.json');\n    if (await fileSystem.exists(lockFilePath)) {\n      logger.debug(`Found mlld.lock.json at: ${currentDir}`);\n      return currentDir;\n    }\n    \n    // Fallback indicators (if no mlld.lock.json found)\n    const fallbackIndicators = ['package.json', '.git', 'pyproject.toml', 'Cargo.toml'];\n    for (const indicator of fallbackIndicators) {\n      if (await fileSystem.exists(path.join(currentDir, indicator))) {\n        // Found a project root, but warn that mlld.lock.json is missing\n        logger.warn(`Found project root at ${currentDir} but mlld.lock.json is missing`);\n        return currentDir;\n      }\n    }\n    \n    currentDir = path.dirname(currentDir);\n  }\n  \n  // If no project root found, return original startPath\n  logger.debug(`No project root found, using original path: ${startPath}`);\n  return startPath;\n}","import * as path from 'path';\nimport { \n  Resolver, \n  ResolverContent, \n  ResolverType,\n  ContentInfo,\n  ResolverCapabilities\n} from '@core/resolvers/types';\nimport { MlldResolutionError, MlldFileNotFoundError } from '@core/errors';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\nimport { findProjectRoot } from '@core/utils/findProjectRoot';\nimport { logger } from '@core/utils/logger';\n\n/**\n * Configuration for ProjectPathResolver\n */\nexport interface ProjectPathResolverConfig {\n  /**\n   * Base path for the project (typically project root)\n   */\n  basePath: string;\n\n  /**\n   * Whether this resolver is read-only\n   */\n  readonly?: boolean;\n}\n\n/**\n * Base Path Resolver - handles @base/ references\n * Maps @base to the project root directory\n */\nexport class ProjectPathResolver implements Resolver {\n  name = 'base';\n  description = 'Resolves @base references to project root files';\n  type: ResolverType = 'io';\n  \n  capabilities: ResolverCapabilities = {\n    io: { read: true, write: false, list: false },\n    contexts: { import: true, path: true, output: false },\n    supportedContentTypes: ['text', 'module'],\n    defaultContentType: 'text',\n    priority: 1,\n    cache: { strategy: 'none' } // Project path is static\n  };\n\n  constructor(private fileSystem: IFileSystemService) {\n    // No caching needed - project path is static\n  }\n\n  canResolve(ref: string, config?: ProjectPathResolverConfig): boolean {\n    // Can resolve if reference starts with @base\n    // OR if we have a config (which means prefix was stripped)\n    return ref.startsWith('@base') || !!config;\n  }\n\n  /**\n   * Resolve a @base reference\n   */\n  async resolve(ref: string, config?: ProjectPathResolverConfig): Promise<ResolverContent> {\n    // Try config basePath first\n    let basePath = config?.basePath;\n    \n    // If not provided or seems incorrect, detect project root\n    if (!basePath || !(await this.isProjectRoot(basePath))) {\n      logger.debug(`Detecting project root (basePath: ${basePath})`);\n      basePath = await this.findProjectRootFromCwd();\n    }\n    \n    if (!basePath) {\n      throw new MlldResolutionError(\n        'ProjectPathResolver: Unable to determine project root. ' +\n        'This usually means the resolver registry was not properly configured. ' +\n        'Check that @base prefix is mapped to base resolver with basePath.',\n        { reference: ref, availableConfig: Object.keys(config || {}) }\n      );\n    }\n\n    // Variable context - return the project path as text\n    if (!config || !config.context || config.context === 'variable') {\n      // If it's just @base, return the base path\n      if (ref === '@base' || ref === 'base') {\n        return {\n          content: basePath,\n          contentType: 'text',\n          metadata: {\n            source: 'base',\n            timestamp: new Date()\n          }\n        };\n      }\n    }\n\n    // Path context - read the file content\n    if (config.context === 'path') {\n      // Extract the path after @base\n      let relativePath: string;\n      if (ref.startsWith('@base/')) {\n        relativePath = ref.substring('@base/'.length);\n      } else if (ref.startsWith('@base')) {\n        relativePath = ref.substring('@base'.length);\n      } else {\n        // With prefix stripping, we might just get the path directly\n        relativePath = ref;\n      }\n\n      // Remove leading slash if present\n      if (relativePath.startsWith('/')) {\n        relativePath = relativePath.substring(1);\n      }\n\n      // If no path specified, just return the project path\n      if (!relativePath) {\n        return {\n          content: basePath,\n          contentType: 'text',\n          metadata: {\n            source: 'base',\n            timestamp: new Date()\n          }\n        };\n      }\n\n      // Resolve full path relative to project root\n      const fullPath = path.resolve(basePath, relativePath);\n\n      // Security check: ensure the resolved path is within the project\n      const normalizedBasePath = path.resolve(basePath);\n      const normalizedFullPath = path.resolve(fullPath);\n      if (!normalizedFullPath.startsWith(normalizedBasePath)) {\n        throw new MlldResolutionError(\n          `Path outside project directory: ${relativePath}`,\n          {}\n        );\n      }\n\n      // Check if file exists\n      if (!await this.fileSystem.exists(fullPath)) {\n        // Try with .mld extension if no extension provided\n        if (!path.extname(fullPath)) {\n          const withMld = fullPath + '.mld';\n          if (await this.fileSystem.exists(withMld)) {\n            const content = await this.fileSystem.readFile(withMld);\n            const contentType = await this.detectContentType(withMld, content);\n            \n            return {\n              content,\n              contentType,\n              metadata: {\n                source: withMld,\n                timestamp: new Date(),\n                originalRef: ref\n              }\n            };\n          }\n        }\n        \n        throw new MlldFileNotFoundError(\n          `File not found: ${fullPath}`,\n          { path: fullPath }\n        );\n      }\n\n      try {\n        // Read the file\n        const content = await this.fileSystem.readFile(fullPath);\n        const contentType = await this.detectContentType(fullPath, content);\n\n        return {\n          content,\n          contentType,\n          metadata: {\n            source: fullPath,\n            timestamp: new Date(),\n            originalRef: ref\n          }\n        };\n      } catch (error) {\n        throw new MlldFileNotFoundError(\n          `Failed to read file: ${fullPath}`,\n          { path: fullPath }\n        );\n      }\n    }\n\n    // Import context - similar to path but validates module content\n    if (config.context === 'import') {\n      // For imports, delegate to path logic but ensure module validation\n      const result = await this.resolve(ref, { ...config, context: 'path' });\n      \n      // Validate that imported content is a module\n      if (result.contentType !== 'module') {\n        throw new MlldResolutionError(\n          `Import target is not a module: ${ref}`,\n          {}\n        );\n      }\n      \n      return result;\n    }\n\n    throw new MlldResolutionError(\n      `base resolver does not support context: ${config.context}`,\n      {}\n    );\n  }\n\n  /**\n   * Validate resolver configuration\n   */\n  validateConfig(config: any): string[] {\n    const errors: string[] = [];\n    \n    if (!config) {\n      errors.push('Configuration is required');\n      return errors;\n    }\n\n    if (!config.basePath) {\n      errors.push('basePath is required');\n    } else if (typeof config.basePath !== 'string') {\n      errors.push('basePath must be a string');\n    }\n\n    return errors;\n  }\n\n  /**\n   * Check if an operation is allowed\n   */\n  async checkAccess(ref: string, operation: 'read' | 'write', config?: ProjectPathResolverConfig): Promise<boolean> {\n    // For now, allow all read operations, deny write operations if readonly\n    if (operation === 'write' && config?.readonly) {\n      return false;\n    }\n    return operation === 'read';\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\n  /**\n   * Check if a path is likely a project root\n   */\n  private async isProjectRoot(path: string): Promise<boolean> {\n    // Check for project indicators\n    const indicators = ['package.json', '.git', 'mlld.config.json', 'mlld.lock.json'];\n    for (const indicator of indicators) {\n      if (await this.fileSystem.exists(path + '/' + indicator)) {\n        return true;\n      }\n    }\n    return false;\n  }\n  \n  /**\n   * Find project root from current working directory\n   */\n  private async findProjectRootFromCwd(): Promise<string | null> {\n    try {\n      const projectRoot = await findProjectRoot(process.cwd(), this.fileSystem);\n      return projectRoot;\n    } catch (error) {\n      logger.warn('Failed to find project root:', error);\n      return null;\n    }\n  }\n}"]}