detect.cjs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. 'use strict';
  2. const fs = require('node:fs');
  3. const fsPromises = require('node:fs/promises');
  4. const path = require('node:path');
  5. const process = require('node:process');
  6. const constants = require('./constants.cjs');
  7. function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
  8. const fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
  9. const fsPromises__default = /*#__PURE__*/_interopDefaultCompat(fsPromises);
  10. const path__default = /*#__PURE__*/_interopDefaultCompat(path);
  11. const process__default = /*#__PURE__*/_interopDefaultCompat(process);
  12. async function detect(options = {}) {
  13. const { cwd, onUnknown } = options;
  14. for (const directory of lookup(cwd)) {
  15. for (const lock of Object.keys(constants.LOCKS)) {
  16. if (await fileExists(path__default.join(directory, lock))) {
  17. const name = constants.LOCKS[lock];
  18. const result2 = await parsePackageJson(path__default.join(directory, "package.json"), onUnknown);
  19. if (result2)
  20. return result2;
  21. else
  22. return { name, agent: name };
  23. }
  24. }
  25. const result = await parsePackageJson(path__default.join(directory, "package.json"), onUnknown);
  26. if (result)
  27. return result;
  28. }
  29. return null;
  30. }
  31. function detectSync(options = {}) {
  32. const { cwd, onUnknown } = options;
  33. for (const directory of lookup(cwd)) {
  34. for (const lock of Object.keys(constants.LOCKS)) {
  35. if (fileExistsSync(path__default.join(directory, lock))) {
  36. const name = constants.LOCKS[lock];
  37. const result2 = parsePackageJsonSync(path__default.join(directory, "package.json"), onUnknown);
  38. if (result2)
  39. return result2;
  40. else
  41. return { name, agent: name };
  42. }
  43. }
  44. const result = parsePackageJsonSync(path__default.join(directory, "package.json"), onUnknown);
  45. if (result)
  46. return result;
  47. }
  48. return null;
  49. }
  50. function getUserAgent() {
  51. const userAgent = process__default.env.npm_config_user_agent;
  52. if (!userAgent) {
  53. return null;
  54. }
  55. const name = userAgent.split("/")[0];
  56. return constants.AGENTS.includes(name) ? name : null;
  57. }
  58. function* lookup(cwd = process__default.cwd()) {
  59. let directory = path__default.resolve(cwd);
  60. const { root } = path__default.parse(directory);
  61. while (directory && directory !== root) {
  62. yield directory;
  63. directory = path__default.dirname(directory);
  64. }
  65. }
  66. async function parsePackageJson(filepath, onUnknown) {
  67. return !filepath || !await fileExists(filepath) ? null : handlePackageManager(filepath, onUnknown);
  68. }
  69. function parsePackageJsonSync(filepath, onUnknown) {
  70. return !filepath || !fileExistsSync(filepath) ? null : handlePackageManager(filepath, onUnknown);
  71. }
  72. function handlePackageManager(filepath, onUnknown) {
  73. try {
  74. const pkg = JSON.parse(fs__default.readFileSync(filepath, "utf8"));
  75. let agent;
  76. if (typeof pkg.packageManager === "string") {
  77. const [name, ver] = pkg.packageManager.replace(/^\^/, "").split("@");
  78. let version = ver;
  79. if (name === "yarn" && Number.parseInt(ver) > 1) {
  80. agent = "yarn@berry";
  81. version = "berry";
  82. return { name, agent, version };
  83. } else if (name === "pnpm" && Number.parseInt(ver) < 7) {
  84. agent = "pnpm@6";
  85. return { name, agent, version };
  86. } else if (constants.AGENTS.includes(name)) {
  87. agent = name;
  88. return { name, agent, version };
  89. } else {
  90. return onUnknown?.(pkg.packageManager) ?? null;
  91. }
  92. }
  93. } catch {
  94. }
  95. return null;
  96. }
  97. async function fileExists(filePath) {
  98. try {
  99. const stats = await fsPromises__default.stat(filePath);
  100. if (stats.isFile()) {
  101. return true;
  102. }
  103. } catch {
  104. }
  105. return false;
  106. }
  107. function fileExistsSync(filePath) {
  108. try {
  109. const stats = fs__default.statSync(filePath);
  110. if (stats.isFile()) {
  111. return true;
  112. }
  113. } catch {
  114. }
  115. return false;
  116. }
  117. exports.detect = detect;
  118. exports.detectSync = detectSync;
  119. exports.getUserAgent = getUserAgent;