{
  "version": 3,
  "sources": ["../../../../src/packages/node.resolver/index.ts"],
  "sourcesContent": ["import type { FetchFromRegistry } from '../fetching-types/index.ts';\nimport semver from 'semver';\nimport versionSelectorType from 'version-selector-type';\n\ntype NodeVersion = {\n  version: string;\n  lts: false | string;\n};\n\nconst SEMVER_OPTS = {\n  includePrerelease: true,\n  loose: true,\n};\n\nexport async function resolveNodeVersion(\n  fetch: FetchFromRegistry,\n  versionSpec: string,\n  nodeMirrorBaseUrl?: string\n): Promise<string | null> {\n  const allVersions = await fetchAllVersions(fetch, nodeMirrorBaseUrl);\n\n  if (versionSpec === 'latest') {\n    return allVersions[0]?.version ?? null;\n  }\n\n  const { versions, versionRange } = filterVersions(allVersions, versionSpec);\n\n  return semver.maxSatisfying(versions, versionRange, SEMVER_OPTS) ?? null;\n}\n\nexport async function resolveNodeVersions(\n  fetch: FetchFromRegistry,\n  versionSpec?: string,\n  nodeMirrorBaseUrl?: string\n): Promise<string[]> {\n  const allVersions = await fetchAllVersions(fetch, nodeMirrorBaseUrl);\n  if (typeof versionSpec === 'undefined') {\n    return allVersions.map(({ version }) => version);\n  }\n\n  if (versionSpec === 'latest') {\n    const version = allVersions[0]?.version;\n\n    return typeof version === 'string' ? [version] : [];\n  }\n\n  const { versions, versionRange } = filterVersions(allVersions, versionSpec);\n\n  return versions.filter((version): boolean => {\n    return semver.satisfies(version, versionRange, SEMVER_OPTS);\n  });\n}\n\nasync function fetchAllVersions(\n  fetch: FetchFromRegistry,\n  nodeMirrorBaseUrl?: string\n): Promise<NodeVersion[]> {\n  const response = await fetch(\n    `${nodeMirrorBaseUrl ?? 'https://nodejs.org/download/release/'}index.json`\n  );\n\n  return ((await response.json()) as NodeVersion[]).map(({ version, lts }) => ({\n    version: version.substring(1),\n    lts,\n  }));\n}\n\nfunction filterVersions(\n  versions: NodeVersion[],\n  versionSelector: string\n): { versions: string[]; versionRange: string } {\n  if (versionSelector === 'lts') {\n    return {\n      versions: versions\n        .filter(({ lts }) => lts !== false)\n        .map(({ version }) => version),\n      versionRange: '*',\n    };\n  }\n\n  const vst = versionSelectorType(versionSelector);\n\n  if (vst?.type === 'tag') {\n    const wantedLtsVersion = vst.normalized.toLowerCase();\n\n    return {\n      versions: versions\n        .filter(\n          ({ lts }) =>\n            typeof lts === 'string' && lts.toLowerCase() === wantedLtsVersion\n        )\n        .map(({ version }) => version),\n      versionRange: '*',\n    };\n  }\n\n  return {\n    versions: versions.map(({ version }: NodeVersion): string => {\n      return version;\n    }),\n    versionRange: versionSelector,\n  };\n}\n"],
  "mappings": "AACA,OAAO,YAAY;AACnB,OAAO,yBAAyB;AAOhC,MAAM,cAAc;AAAA,EAClB,mBAAmB;AAAA,EACnB,OAAO;AACT;AAEA,eAAsB,mBACpB,OACA,aACA,mBACwB;AACxB,QAAM,cAAc,MAAM,iBAAiB,OAAO,iBAAiB;AAEnE,MAAI,gBAAgB,UAAU;AAC5B,WAAO,YAAY,CAAC,GAAG,WAAW;AAAA,EACpC;AAEA,QAAM,EAAE,UAAU,aAAa,IAAI,eAAe,aAAa,WAAW;AAE1E,SAAO,OAAO,cAAc,UAAU,cAAc,WAAW,KAAK;AACtE;AAEA,eAAsB,oBACpB,OACA,aACA,mBACmB;AACnB,QAAM,cAAc,MAAM,iBAAiB,OAAO,iBAAiB;AACnE,MAAI,OAAO,gBAAgB,aAAa;AACtC,WAAO,YAAY,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO;AAAA,EACjD;AAEA,MAAI,gBAAgB,UAAU;AAC5B,UAAM,UAAU,YAAY,CAAC,GAAG;AAEhC,WAAO,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI,CAAC;AAAA,EACpD;AAEA,QAAM,EAAE,UAAU,aAAa,IAAI,eAAe,aAAa,WAAW;AAE1E,SAAO,SAAS,OAAO,CAAC,YAAqB;AAC3C,WAAO,OAAO,UAAU,SAAS,cAAc,WAAW;AAAA,EAC5D,CAAC;AACH;AAEA,eAAe,iBACb,OACA,mBACwB;AACxB,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,qBAAqB,sCAAsC;AAAA,EAChE;AAEA,UAAS,MAAM,SAAS,KAAK,GAAqB,IAAI,CAAC,EAAE,SAAS,IAAI,OAAO;AAAA,IAC3E,SAAS,QAAQ,UAAU,CAAC;AAAA,IAC5B;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,eACP,UACA,iBAC8C;AAC9C,MAAI,oBAAoB,OAAO;AAC7B,WAAO;AAAA,MACL,UAAU,SACP,OAAO,CAAC,EAAE,IAAI,MAAM,QAAQ,KAAK,EACjC,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC/B,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,MAAM,oBAAoB,eAAe;AAE/C,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,mBAAmB,IAAI,WAAW,YAAY;AAEpD,WAAO;AAAA,MACL,UAAU,SACP;AAAA,QACC,CAAC,EAAE,IAAI,MACL,OAAO,QAAQ,YAAY,IAAI,YAAY,MAAM;AAAA,MACrD,EACC,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC/B,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,SAAS,IAAI,CAAC,EAAE,QAAQ,MAA2B;AAC3D,aAAO;AAAA,IACT,CAAC;AAAA,IACD,cAAc;AAAA,EAChB;AACF;",
  "names": []
}
