{
  "version": 3,
  "sources": ["../../../../src/packages/package-bins/index.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport type { DependencyManifest, PackageBin } from '../types/index.ts';\nimport { glob } from 'tinyglobby';\nimport isSubdir from 'is-subdir';\n\nexport type Command = {\n  name: string;\n  path: string;\n};\n\nexport async function getBinsFromPackageManifest(\n  manifest: DependencyManifest,\n  pkgPath: string\n): Promise<Command[]> {\n  if (typeof manifest.bin !== 'undefined') {\n    return commandsFromBin(manifest.bin, manifest.name, pkgPath);\n  }\n\n  if (typeof manifest.directories?.bin !== 'undefined') {\n    const binDir = path.join(pkgPath, manifest.directories.bin);\n\n    const files = await findFiles(binDir);\n\n    return files.map((file) => ({\n      name: path.basename(file),\n      path: path.join(binDir, file),\n    }));\n  }\n\n  return [];\n}\n\nasync function findFiles(dir: string): Promise<string[]> {\n  try {\n    return await glob('**', {\n      cwd: dir,\n      onlyFiles: true,\n      followSymbolicLinks: false,\n      expandDirectories: false,\n    });\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n      throw err;\n    }\n\n    return [];\n  }\n}\n\nfunction commandsFromBin(\n  bin: PackageBin,\n  pkgName: string,\n  pkgPath: string\n): Array<{\n  name: string;\n  path: string;\n}> {\n  if (typeof bin === 'string') {\n    return [\n      {\n        name: normalizeBinName(pkgName),\n        path: path.join(pkgPath, bin),\n      },\n    ];\n  }\n  return Object.keys(bin)\n    .filter(\n      (commandName) =>\n        encodeURIComponent(commandName) === commandName ||\n        commandName === '$' ||\n        commandName.startsWith('@')\n    )\n    .map((commandName) => {\n      const binPath = bin[commandName];\n\n      if (typeof binPath !== 'string') {\n        return null;\n      }\n\n      return {\n        name: normalizeBinName(commandName),\n        path: path.join(pkgPath, binPath),\n      };\n    })\n    .filter(Boolean)\n    .filter((cmd) => {\n      return isSubdir(pkgPath, cmd.path);\n    });\n}\n\nfunction normalizeBinName(name: string): string {\n  return name.startsWith('@') ? name.slice(name.indexOf('/') + 1) : name;\n}\n"],
  "mappings": "AAAA,OAAO,UAAU;AAEjB,SAAS,YAAY;AACrB,OAAO,cAAc;AAOrB,eAAsB,2BACpB,UACA,SACoB;AACpB,MAAI,OAAO,SAAS,QAAQ,aAAa;AACvC,WAAO,gBAAgB,SAAS,KAAK,SAAS,MAAM,OAAO;AAAA,EAC7D;AAEA,MAAI,OAAO,SAAS,aAAa,QAAQ,aAAa;AACpD,UAAM,SAAS,KAAK,KAAK,SAAS,SAAS,YAAY,GAAG;AAE1D,UAAM,QAAQ,MAAM,UAAU,MAAM;AAEpC,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,MAAM,KAAK,SAAS,IAAI;AAAA,MACxB,MAAM,KAAK,KAAK,QAAQ,IAAI;AAAA,IAC9B,EAAE;AAAA,EACJ;AAEA,SAAO,CAAC;AACV;AAEA,eAAe,UAAU,KAAgC;AACvD,MAAI;AACF,WAAO,MAAM,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,mBAAmB;AAAA,IACrB,CAAC;AAAA,EAEH,SAAS,KAAU;AACjB,QAAK,IAA8B,SAAS,UAAU;AACpD,YAAM;AAAA,IACR;AAEA,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBACP,KACA,SACA,SAIC;AACD,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,MACL;AAAA,QACE,MAAM,iBAAiB,OAAO;AAAA,QAC9B,MAAM,KAAK,KAAK,SAAS,GAAG;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,KAAK,GAAG,EACnB;AAAA,IACC,CAAC,gBACC,mBAAmB,WAAW,MAAM,eACpC,gBAAgB,OAChB,YAAY,WAAW,GAAG;AAAA,EAC9B,EACC,IAAI,CAAC,gBAAgB;AACpB,UAAM,UAAU,IAAI,WAAW;AAE/B,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,MAAM,iBAAiB,WAAW;AAAA,MAClC,MAAM,KAAK,KAAK,SAAS,OAAO;AAAA,IAClC;AAAA,EACF,CAAC,EACA,OAAO,OAAO,EACd,OAAO,CAAC,QAAQ;AACf,WAAO,SAAS,SAAS,IAAI,IAAI;AAAA,EACnC,CAAC;AACL;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI;AACpE;",
  "names": []
}
