index.mjs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { dirname, join } from 'path'
  2. import { existsSync, promises as fs, readFileSync } from 'fs'
  3. import { createRequire } from 'module'
  4. export { loadPackageJSON, isPackageListed } from './dist/shared.mjs'
  5. const _require = createRequire(import.meta.url)
  6. export function resolveModule(name, options) {
  7. try {
  8. return _require.resolve(name, options)
  9. }
  10. catch (e) {
  11. return undefined
  12. }
  13. }
  14. export function importModule(path) {
  15. return import(path).then((i) => {
  16. if (i && i.default && i.default.__esModule)
  17. return i.default
  18. return i
  19. })
  20. }
  21. export function isPackageExists(name, options) {
  22. return !!resolvePackage(name, options)
  23. }
  24. function getPackageJsonPath(name, options) {
  25. const entry = resolvePackage(name, options)
  26. if (!entry)
  27. return
  28. return searchPackageJSON(entry)
  29. }
  30. export async function getPackageInfo(name, options) {
  31. const packageJsonPath = getPackageJsonPath(name, options)
  32. if (!packageJsonPath)
  33. return
  34. const pkg = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
  35. return {
  36. name,
  37. version: pkg.version,
  38. rootPath: dirname(packageJsonPath),
  39. packageJsonPath,
  40. packageJson: pkg,
  41. }
  42. }
  43. export function getPackageInfoSync(name, options) {
  44. const packageJsonPath = getPackageJsonPath(name, options)
  45. if (!packageJsonPath)
  46. return
  47. const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8'))
  48. return {
  49. name,
  50. version: pkg.version,
  51. rootPath: dirname(packageJsonPath),
  52. packageJsonPath,
  53. packageJson: pkg,
  54. }
  55. }
  56. function resolvePackage(name, options = {}) {
  57. try {
  58. return _require.resolve(`${name}/package.json`, options)
  59. }
  60. catch {
  61. }
  62. try {
  63. return _require.resolve(name, options)
  64. }
  65. catch (e) {
  66. if (e.code !== 'MODULE_NOT_FOUND')
  67. console.error(e)
  68. return false
  69. }
  70. }
  71. function searchPackageJSON(dir) {
  72. let packageJsonPath
  73. while (true) {
  74. if (!dir)
  75. return
  76. const newDir = dirname(dir)
  77. if (newDir === dir)
  78. return
  79. dir = newDir
  80. packageJsonPath = join(dir, 'package.json')
  81. if (existsSync(packageJsonPath))
  82. break
  83. }
  84. return packageJsonPath
  85. }