runtime-versions.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import checkNodeVersion from 'check-node-version';
  2. type RuntimeVersions = {
  3. node: string | undefined;
  4. npm: string | undefined;
  5. pnpm: string | undefined;
  6. };
  7. // define original types because the object returned is not according to the official type definition
  8. type SatisfiedVersionInfo = {
  9. isSatisfied: true;
  10. version: {
  11. version: string;
  12. }
  13. }
  14. type NotfoundVersionInfo = {
  15. isSatisfied: true;
  16. notfound: true;
  17. }
  18. type VersionInfo = SatisfiedVersionInfo | NotfoundVersionInfo;
  19. function isNotfoundVersionInfo(info: VersionInfo): info is NotfoundVersionInfo {
  20. return 'notfound' in info;
  21. }
  22. function isSatisfiedVersionInfo(info: VersionInfo): info is SatisfiedVersionInfo {
  23. return 'version' in info;
  24. }
  25. const getVersion = (versionInfo: VersionInfo): string | undefined => {
  26. if (isNotfoundVersionInfo(versionInfo)) {
  27. return undefined;
  28. }
  29. if (isSatisfiedVersionInfo(versionInfo)) {
  30. return versionInfo.version.version;
  31. }
  32. return undefined;
  33. };
  34. export function getRuntimeVersions(): Promise<RuntimeVersions> {
  35. return new Promise((resolve, reject) => {
  36. checkNodeVersion({}, (error, result) => {
  37. if (error) {
  38. reject(error);
  39. return;
  40. }
  41. resolve({
  42. node: getVersion(result.versions.node as unknown as VersionInfo),
  43. npm: getVersion(result.versions.npm as unknown as VersionInfo),
  44. pnpm: getVersion(result.versions.pnpm as unknown as VersionInfo),
  45. });
  46. });
  47. });
  48. }