{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-script-runners/buildCommandNotFoundHint.ts"],
  "sourcesContent": ["import type { PackageScripts } from '../types/index.ts';\nimport didYouMean, { ReturnTypeEnums } from 'didyoumean2';\nimport { readdirSync } from 'node:fs';\nimport path from 'node:path';\n\nexport function getNearestProgram({\n  dir,\n  modulesDir,\n  programName,\n  workspaceDir,\n}: {\n  dir: string;\n  modulesDir: string;\n  programName: string;\n  workspaceDir: string | undefined;\n}): string | null {\n  try {\n    const binDir = path.join(dir, modulesDir, '.bin');\n\n    const programList = readProgramsFromDir(binDir);\n\n    if (typeof workspaceDir === 'string' && workspaceDir !== dir) {\n      const workspaceBinDir = path.join(workspaceDir, modulesDir, '.bin');\n      programList.push(...readProgramsFromDir(workspaceBinDir));\n    }\n\n    return getNearest(programName, programList);\n  } catch {\n    return null;\n  }\n}\n\nfunction readProgramsFromDir(binDir: string): string[] {\n  const files = readdirSync(binDir);\n\n  if (process.platform !== 'win32') {\n    return files;\n  }\n\n  const executableExtensions = ['.cmd', '.bat', '.ps1', '.exe', '.com'];\n\n  return files.map((fullName: string): string => {\n    const { name, ext } = path.parse(fullName);\n\n    return executableExtensions.includes(ext.toLowerCase()) ? name : fullName;\n  });\n}\n\nexport function buildCommandNotFoundHint(\n  scriptName: string,\n  scripts?: PackageScripts | undefined\n): string {\n  let hint = `Command \"${scriptName}\" not found.`;\n\n  const nearestCommand = getNearestScript(scriptName, scripts);\n\n  if (typeof nearestCommand === 'string') {\n    hint += ` Did you mean \"pnpm run ${nearestCommand}\"?`;\n  }\n\n  return hint;\n}\n\nexport function getNearestScript(\n  scriptName: string,\n  scripts?: PackageScripts | undefined\n): string | null {\n  return getNearest(scriptName, Object.keys(scripts ?? []));\n}\n\nexport function getNearest(\n  name: string,\n  list: readonly string[] | null\n): string | null {\n  if (list == null || list.length === 0) return null;\n  return didYouMean(name, list, {\n    returnType: ReturnTypeEnums.FIRST_CLOSEST_MATCH,\n  });\n}\n"],
  "mappings": "AACA,OAAO,cAAc,uBAAuB;AAC5C,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AAEV,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKkB;AAChB,MAAI;AACF,UAAM,SAAS,KAAK,KAAK,KAAK,YAAY,MAAM;AAEhD,UAAM,cAAc,oBAAoB,MAAM;AAE9C,QAAI,OAAO,iBAAiB,YAAY,iBAAiB,KAAK;AAC5D,YAAM,kBAAkB,KAAK,KAAK,cAAc,YAAY,MAAM;AAClE,kBAAY,KAAK,GAAG,oBAAoB,eAAe,CAAC;AAAA,IAC1D;AAEA,WAAO,WAAW,aAAa,WAAW;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,QAA0B;AACrD,QAAM,QAAQ,YAAY,MAAM;AAEhC,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAEpE,SAAO,MAAM,IAAI,CAAC,aAA6B;AAC7C,UAAM,EAAE,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ;AAEzC,WAAO,qBAAqB,SAAS,IAAI,YAAY,CAAC,IAAI,OAAO;AAAA,EACnE,CAAC;AACH;AAEO,SAAS,yBACd,YACA,SACQ;AACR,MAAI,OAAO,YAAY,UAAU;AAEjC,QAAM,iBAAiB,iBAAiB,YAAY,OAAO;AAE3D,MAAI,OAAO,mBAAmB,UAAU;AACtC,YAAQ,2BAA2B,cAAc;AAAA,EACnD;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,YACA,SACe;AACf,SAAO,WAAW,YAAY,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC;AAC1D;AAEO,SAAS,WACd,MACA,MACe;AACf,MAAI,QAAQ,QAAQ,KAAK,WAAW,EAAG,QAAO;AAC9C,SAAO,WAAW,MAAM,MAAM;AAAA,IAC5B,YAAY,gBAAgB;AAAA,EAC9B,CAAC;AACH;",
  "names": []
}
