{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-env/parseNodeSpecifier.ts"],
  "sourcesContent": ["import { PnpmError } from '../error/index.ts';\n\nexport type NodeSpecifier = {\n  releaseChannel: string;\n  useNodeVersion: string;\n};\n\nfunction isStableVersion(version: string): boolean {\n  return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n}\nfunction matchPrereleaseVersion(version: string): RegExpMatchArray | null {\n  return version.match(\n    /^\\d+\\.\\d+\\.\\d+-((rc)(\\..+)|(test|v8-canary|nightly)(.+))$/\n  );\n}\n\nconst STABLE_RELEASE_ERROR_HINT =\n  'The correct syntax for stable release is strictly X.Y.Z or release/X.Y.Z';\n\nexport function isValidVersion(specifier: string): boolean {\n  if (specifier.includes('/')) {\n    const [releaseChannel, useNodeVersion] = specifier.split('/');\n\n    if (\n      typeof releaseChannel !== 'string' ||\n      typeof useNodeVersion !== 'string'\n    ) {\n      return false;\n    }\n\n    if (releaseChannel === 'release') {\n      return isStableVersion(useNodeVersion);\n    }\n\n    return useNodeVersion.includes(releaseChannel);\n  }\n\n  return (\n    isStableVersion(specifier) || matchPrereleaseVersion(specifier) != null\n  );\n}\n\nexport function parseNodeSpecifier(specifier: string): NodeSpecifier {\n  if (specifier.includes('/')) {\n    const [releaseChannel, useNodeVersion] = specifier.split('/');\n\n    if (\n      typeof releaseChannel !== 'string' ||\n      typeof useNodeVersion !== 'string'\n    ) {\n      throw new PnpmError(\n        'INVALID_NODE_VERSION',\n        `\"${specifier}\" is not a valid Node.js version`\n      );\n    }\n\n    if (releaseChannel === 'release') {\n      if (!isStableVersion(useNodeVersion)) {\n        throw new PnpmError(\n          'INVALID_NODE_VERSION',\n          `\"${specifier}\" is not a valid Node.js version`,\n          {\n            hint: STABLE_RELEASE_ERROR_HINT,\n          }\n        );\n      }\n    } else if (!useNodeVersion.includes(releaseChannel)) {\n      throw new PnpmError(\n        'MISMATCHED_RELEASE_CHANNEL',\n        `Node.js version (${useNodeVersion}) must contain the release channel (${releaseChannel})`\n      );\n    }\n\n    return { releaseChannel, useNodeVersion };\n  }\n\n  const prereleaseMatch = matchPrereleaseVersion(specifier);\n\n  if (prereleaseMatch !== null) {\n    const m2 = prereleaseMatch[2];\n\n    if (typeof m2 !== 'string') {\n      throw new PnpmError(\n        'INVALID_NODE_VERSION',\n        `\"${specifier}\" is not a valid Node.js version`\n      );\n    }\n\n    return { releaseChannel: m2, useNodeVersion: specifier };\n  }\n\n  if (isStableVersion(specifier)) {\n    return { releaseChannel: 'release', useNodeVersion: specifier };\n  }\n\n  let hint: string | undefined;\n  if (['nightly', 'rc', 'test', 'v8-canary'].includes(specifier)) {\n    hint = `The correct syntax for ${specifier} release is strictly X.Y.Z-${specifier}.W`;\n  } else if (\n    /^\\d+\\.\\d+$/.test(specifier) ||\n    /^\\d+$/.test(specifier) ||\n    ['release', 'stable', 'latest'].includes(specifier)\n  ) {\n    hint = STABLE_RELEASE_ERROR_HINT;\n  }\n  throw new PnpmError(\n    'INVALID_NODE_VERSION',\n    `\"${specifier}\" is not a valid Node.js version`,\n    { hint }\n  );\n}\n"],
  "mappings": "AAAA,SAAS,iBAAiB;AAO1B,SAAS,gBAAgB,SAA0B;AACjD,SAAO,kBAAkB,KAAK,OAAO;AACvC;AACA,SAAS,uBAAuB,SAA0C;AACxE,SAAO,QAAQ;AAAA,IACb;AAAA,EACF;AACF;AAEA,MAAM,4BACJ;AAEK,SAAS,eAAe,WAA4B;AACzD,MAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,UAAM,CAAC,gBAAgB,cAAc,IAAI,UAAU,MAAM,GAAG;AAE5D,QACE,OAAO,mBAAmB,YAC1B,OAAO,mBAAmB,UAC1B;AACA,aAAO;AAAA,IACT;AAEA,QAAI,mBAAmB,WAAW;AAChC,aAAO,gBAAgB,cAAc;AAAA,IACvC;AAEA,WAAO,eAAe,SAAS,cAAc;AAAA,EAC/C;AAEA,SACE,gBAAgB,SAAS,KAAK,uBAAuB,SAAS,KAAK;AAEvE;AAEO,SAAS,mBAAmB,WAAkC;AACnE,MAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,UAAM,CAAC,gBAAgB,cAAc,IAAI,UAAU,MAAM,GAAG;AAE5D,QACE,OAAO,mBAAmB,YAC1B,OAAO,mBAAmB,UAC1B;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA,IAAI,SAAS;AAAA,MACf;AAAA,IACF;AAEA,QAAI,mBAAmB,WAAW;AAChC,UAAI,CAAC,gBAAgB,cAAc,GAAG;AACpC,cAAM,IAAI;AAAA,UACR;AAAA,UACA,IAAI,SAAS;AAAA,UACb;AAAA,YACE,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,CAAC,eAAe,SAAS,cAAc,GAAG;AACnD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,oBAAoB,cAAc,uCAAuC,cAAc;AAAA,MACzF;AAAA,IACF;AAEA,WAAO,EAAE,gBAAgB,eAAe;AAAA,EAC1C;AAEA,QAAM,kBAAkB,uBAAuB,SAAS;AAExD,MAAI,oBAAoB,MAAM;AAC5B,UAAM,KAAK,gBAAgB,CAAC;AAE5B,QAAI,OAAO,OAAO,UAAU;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,QACA,IAAI,SAAS;AAAA,MACf;AAAA,IACF;AAEA,WAAO,EAAE,gBAAgB,IAAI,gBAAgB,UAAU;AAAA,EACzD;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO,EAAE,gBAAgB,WAAW,gBAAgB,UAAU;AAAA,EAChE;AAEA,MAAI;AACJ,MAAI,CAAC,WAAW,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,GAAG;AAC9D,WAAO,0BAA0B,SAAS,8BAA8B,SAAS;AAAA,EACnF,WACE,aAAa,KAAK,SAAS,KAC3B,QAAQ,KAAK,SAAS,KACtB,CAAC,WAAW,UAAU,QAAQ,EAAE,SAAS,SAAS,GAClD;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,IAAI,SAAS;AAAA,IACb,EAAE,KAAK;AAAA,EACT;AACF;",
  "names": []
}
