vlt 0.0.0-3 → 0.0.0-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +2 -1
  2. package/package.json +17 -10
  3. package/postinstall.cjs +56 -0
  4. package/vlix +25 -0
  5. package/vlr +25 -0
  6. package/vlrx +25 -0
  7. package/vlt +25 -0
  8. package/vlx +25 -0
  9. package/cache-unzip-src-unzip.js +0 -7896
  10. package/cache-unzip-src-unzip.js.map +0 -7
  11. package/chunk-227OF2U2.js +0 -1183
  12. package/chunk-227OF2U2.js.map +0 -7
  13. package/chunk-3HXIYJS2.js +0 -54
  14. package/chunk-3HXIYJS2.js.map +0 -7
  15. package/chunk-AA6MVXJX.js +0 -19823
  16. package/chunk-AA6MVXJX.js.map +0 -7
  17. package/chunk-BCK4ZGNG.js +0 -41
  18. package/chunk-BCK4ZGNG.js.map +0 -7
  19. package/chunk-DH36SF3E.js +0 -35
  20. package/chunk-DH36SF3E.js.map +0 -7
  21. package/chunk-FNKWJ7AZ.js +0 -1379
  22. package/chunk-FNKWJ7AZ.js.map +0 -7
  23. package/chunk-H77UDCL3.js +0 -9820
  24. package/chunk-H77UDCL3.js.map +0 -7
  25. package/chunk-HL76E44L.js +0 -73
  26. package/chunk-HL76E44L.js.map +0 -7
  27. package/chunk-IN7DEH7F.js +0 -44
  28. package/chunk-IN7DEH7F.js.map +0 -7
  29. package/chunk-JLP2QDXQ.js +0 -1137
  30. package/chunk-JLP2QDXQ.js.map +0 -7
  31. package/chunk-JMGSFQ32.js +0 -969
  32. package/chunk-JMGSFQ32.js.map +0 -7
  33. package/chunk-JQRUGUZ3.js +0 -512
  34. package/chunk-JQRUGUZ3.js.map +0 -7
  35. package/chunk-K2BYYPM7.js +0 -8656
  36. package/chunk-K2BYYPM7.js.map +0 -7
  37. package/chunk-LNUDEBGP.js +0 -2071
  38. package/chunk-LNUDEBGP.js.map +0 -7
  39. package/chunk-MV5ZQ3LW.js +0 -1105
  40. package/chunk-MV5ZQ3LW.js.map +0 -7
  41. package/chunk-O7CDQZDW.js +0 -5234
  42. package/chunk-O7CDQZDW.js.map +0 -7
  43. package/chunk-OFW7MWFP.js +0 -82
  44. package/chunk-OFW7MWFP.js.map +0 -7
  45. package/chunk-PGDJ2ZZ6.js +0 -4810
  46. package/chunk-PGDJ2ZZ6.js.map +0 -7
  47. package/chunk-POVPHE2F.js +0 -1864
  48. package/chunk-POVPHE2F.js.map +0 -7
  49. package/chunk-PTVPYZHU.js +0 -72
  50. package/chunk-PTVPYZHU.js.map +0 -7
  51. package/chunk-SXBMMXTY.js +0 -11837
  52. package/chunk-SXBMMXTY.js.map +0 -7
  53. package/chunk-UZZ72UON.js +0 -152
  54. package/chunk-UZZ72UON.js.map +0 -7
  55. package/chunk-V7KRP7IO.js +0 -481
  56. package/chunk-V7KRP7IO.js.map +0 -7
  57. package/chunk-WVNUD273.js +0 -83
  58. package/chunk-WVNUD273.js.map +0 -7
  59. package/chunk-WYPE3MV4.js +0 -62
  60. package/chunk-WYPE3MV4.js.map +0 -7
  61. package/chunk-ZRNJWPYC.js +0 -37
  62. package/chunk-ZRNJWPYC.js.map +0 -7
  63. package/cli-package.json +0 -107
  64. package/config-3QQHUYLI.js +0 -179
  65. package/config-3QQHUYLI.js.map +0 -7
  66. package/devtools-5BBQJTDW.js +0 -16682
  67. package/devtools-5BBQJTDW.js.map +0 -7
  68. package/exec-C6GK336U.js +0 -50
  69. package/exec-C6GK336U.js.map +0 -7
  70. package/gui-IQ4M4K5X.js +0 -46
  71. package/gui-IQ4M4K5X.js.map +0 -7
  72. package/gui-assets/favicon.ico +0 -0
  73. package/gui-assets/fonts/geist-mono.ttf +0 -0
  74. package/gui-assets/fonts/inter.ttf +0 -0
  75. package/gui-assets/images/folder.png +0 -0
  76. package/gui-assets/index.html +0 -34
  77. package/gui-assets/index.js +0 -1549
  78. package/gui-assets/index.js.map +0 -7
  79. package/gui-assets/main.css +0 -1
  80. package/help-R6TSKVEA.js +0 -25
  81. package/help-R6TSKVEA.js.map +0 -7
  82. package/init-UTJGYULC.js +0 -25
  83. package/init-UTJGYULC.js.map +0 -7
  84. package/install-5XDTGLAU.js +0 -56
  85. package/install-5XDTGLAU.js.map +0 -7
  86. package/install-exec-VMPN3JE7.js +0 -28
  87. package/install-exec-VMPN3JE7.js.map +0 -7
  88. package/list-Q7IANZ3I.js +0 -129
  89. package/list-Q7IANZ3I.js.map +0 -7
  90. package/login-VHJEIRVU.js +0 -36
  91. package/login-VHJEIRVU.js.map +0 -7
  92. package/logout-5KMCSSR4.js +0 -36
  93. package/logout-5KMCSSR4.js.map +0 -7
  94. package/pkg-WYFDWETL.js +0 -364
  95. package/pkg-WYFDWETL.js.map +0 -7
  96. package/query-KP4F5D2Y.js +0 -117
  97. package/query-KP4F5D2Y.js.map +0 -7
  98. package/registry-client-package.json +0 -85
  99. package/reporter-LFGXWL6N.js +0 -18
  100. package/reporter-LFGXWL6N.js.map +0 -7
  101. package/rollback-remove-src-remove.js +0 -7398
  102. package/rollback-remove-src-remove.js.map +0 -7
  103. package/run-XNDZH72D.js +0 -68
  104. package/run-XNDZH72D.js.map +0 -7
  105. package/run-exec-NXA33NXJ.js +0 -41
  106. package/run-exec-NXA33NXJ.js.map +0 -7
  107. package/source-JWPG6PR3.js +0 -33
  108. package/source-JWPG6PR3.js.map +0 -7
  109. package/token-6IJNGEMI.js +0 -86
  110. package/token-6IJNGEMI.js.map +0 -7
  111. package/uninstall-MI7NFD27.js +0 -45
  112. package/uninstall-MI7NFD27.js.map +0 -7
  113. package/vlix.js +0 -25
  114. package/vlix.js.map +0 -7
  115. package/vlr.js +0 -25
  116. package/vlr.js.map +0 -7
  117. package/vlrx.js +0 -25
  118. package/vlrx.js.map +0 -7
  119. package/vlt.js +0 -24
  120. package/vlt.js.map +0 -7
  121. package/vlx.js +0 -25
  122. package/vlx.js.map +0 -7
  123. package/whoami-3IEXJF3U.js +0 -46
  124. package/whoami-3IEXJF3U.js.map +0 -7
  125. package/yoga.wasm +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/src/index.ts", "../../../src/package-json/src/index.ts", "../../../node_modules/.pnpm/polite-json@5.0.0/node_modules/polite-json/src/index.ts", "../../../src/spec/src/index.ts", "../../../src/fast-split/src/index.ts", "../../../src/semver/src/version.ts", "../../../src/semver/src/comparator.ts", "../../../src/semver/src/range.ts", "../../../src/semver/src/index.ts", "../../../src/spec/src/browser.ts"],
4
- "sourcesContent": ["import { error } from '@vltpkg/error-cause'\n\n/** anything that can be encoded in JSON */\nexport type JSONField =\n | JSONField[]\n | boolean\n | number\n | string\n | { [k: string]: JSONField }\n | null\n | undefined\n\n/** sha512 SRI string */\nexport type Integrity = `sha512-${string}`\n\n/** SHA256 key identifier */\nexport type KeyID = `SHA256:${string}`\n\n/** The Manifest['dist'] field present in registry manifests */\nexport type Dist = {\n integrity?: Integrity\n shasum?: string\n tarball?: string\n fileCount?: number\n unpackedSize?: number\n signatures?: {\n keyid: KeyID\n sig: string\n }[]\n}\n\n/** An object used to mark some peerDeps as optional */\nexport type PeerDependenciesMetaValue = {\n optional?: boolean\n}\n\n// Don't use Record here since TS cant do circular references with that\n// https://github.com/microsoft/TypeScript/issues/41164#issuecomment-1427073368\nexport type ConditionalValueObject = {\n [k: string]: ConditionalValue\n}\n\nexport type ConditionalValue =\n | ConditionalValue[]\n | ConditionalValueObject\n | string\n | null\n\nexport type ExportsSubpaths = {\n [path in '.' | `./${string}`]?: ConditionalValue\n}\n\nexport type Exports =\n | Exclude<ConditionalValue, null>\n | ExportsSubpaths\n\nexport type Imports = Record<`#${string}`, ConditionalValue>\n\nexport type FundingEntry = string | { url: string }\nexport type Funding = FundingEntry | FundingEntry[]\n\nexport type Person =\n | string\n | {\n name: string\n url?: string\n email?: string\n }\n\nexport type Repository =\n | string\n | {\n type: string\n url: string\n }\n\nexport type Bugs =\n | string\n | {\n url?: string\n email?: string\n }\n\nexport type Manifest = {\n /** The name of the package. optional because {} is a valid package.json */\n name?: string\n /** The version of the package. optional because {} is a valid package.json */\n version?: string\n /** production dependencies, name:specifier */\n dependencies?: Record<string, string>\n /** development dependencies, name:specifier */\n devDependencies?: Record<string, string>\n /** optional dependencies, name:specifier */\n optionalDependencies?: Record<string, string>\n /** peer dependencies, name:specifier */\n peerDependencies?: Record<string, string>\n /** peer dependencies marked as optional */\n peerDependenciesMeta?: Record<string, PeerDependenciesMetaValue>\n /** dependency ranges that are acceptable, but not forced */\n acceptDependencies?: Record<string, string>\n /** names of dependencies included in the package tarball */\n bundleDependencies?: string[]\n /** a message indicating that this is not to be used */\n deprecated?: string\n /** executable built and linked by this package */\n bin?: Record<string, string> | string\n /** run-script actions for this package */\n scripts?: Record<string, string>\n /** supported run-time platforms this package can run on */\n engines?: Record<string, string>\n /** supported operating systems this package can run on */\n os?: string[] | string\n /** supported CPU architectures this package can run on */\n cpu?: string[] | string\n /** URLs that can be visited to fund this project */\n funding?: Funding\n /**\n * Only present in Manifests served by a registry. Contains information\n * about the artifact served for this package release.\n */\n dist?: Dist\n /** a short description of the package */\n description?: string\n /** search keywords */\n keywords?: string[]\n /** where to go to file issues */\n bugs?: Bugs\n /** where the development happens */\n repository?: Repository\n /** the main module, if exports['.'] is not set */\n main?: string\n /** named subpath exports */\n exports?: Exports\n /** named #identifier imports */\n imports?: Imports\n /**\n * the HEAD of the git repo this was published from\n * only present in published packages\n */\n gitHead?: string\n /** whether the package is private */\n private?: boolean\n /** whether this is ESM or CommonJS by default */\n type?: 'commonjs' | 'module'\n /** npm puts this on published manifests */\n gypfile?: boolean\n /** the author of a package */\n author?: Person\n /** contributors to the package */\n contributors?: Person[]\n}\n\nexport type ManifestRegistry = Manifest &\n Required<Pick<Manifest, 'name' | 'version' | 'dist'>>\n\nexport type Packument = {\n name: string\n 'dist-tags': Record<string, string>\n versions: Record<string, Manifest>\n modified?: string\n time?: Record<string, string>\n readme?: string\n}\n\nexport type RefType = 'branch' | 'head' | 'other' | 'pull' | 'tag'\n\n/**\n * A representation of a given remote ref in a {@link RevDoc} object.\n */\nexport type RevDocEntry = Omit<Manifest, 'type'> &\n Required<Pick<Manifest, 'version'>> & {\n /** sha this references */\n sha: string\n /** ref as passed git locally */\n ref: string\n /** canonical full ref, like `refs/tags/blahblah` */\n rawRef: string\n /** what type of ref this is: 'branch', 'tag', etc. */\n type: RefType\n }\n\n/**\n * An object kind of resembling a packument, but about a git repo.\n */\nexport type RevDoc = Omit<Packument, 'versions'> & {\n /** all semver-looking tags go in this record */\n versions: Record<string, RevDocEntry>\n /** all named things that can be cloned down remotely */\n refs: Record<string, RevDocEntry>\n /** all named shas referenced above */\n shas: Record<string, string[]>\n}\n\nconst integrityRE = /^sha512-[a-zA-Z0-9/+]{86}==$/\nexport const isIntegrity = (i: unknown): i is Integrity =>\n typeof i === 'string' && integrityRE.test(i)\n\nexport const asIntegrity = (i: unknown): Integrity => {\n if (!isIntegrity(i)) {\n throw error(\n 'invalid integrity',\n {\n found: i,\n wanted: integrityRE,\n },\n asIntegrity,\n )\n }\n return i\n}\n\nexport const assertIntegrity: (\n i: unknown,\n) => asserts i is Integrity = i => {\n asIntegrity(i)\n}\n\nconst keyIDRE = /^SHA256:[a-zA-Z0-9/+]{43}$/\nexport const isKeyID = (k: unknown): k is KeyID =>\n typeof k === 'string' && keyIDRE.test(k)\n\nexport const asKeyID = (k: unknown): KeyID => {\n if (!isKeyID(k)) {\n throw error(\n 'invalid key ID',\n {\n found: k,\n wanted: keyIDRE,\n },\n asKeyID,\n )\n }\n return k\n}\n\nexport const assertKeyID: (k: unknown) => asserts k is KeyID = k => {\n asKeyID(k)\n}\n\nconst isObj = (o: unknown): o is Record<string, unknown> =>\n !!o && typeof o === 'object'\n\nconst maybeRecordStringString = (\n o: unknown,\n): o is Record<string, string> | undefined =>\n o === undefined || isRecordStringString(o)\n\nconst isRecordStringString = (\n o: unknown,\n): o is Record<string, string> =>\n isRecordStringT<string>(o, s => typeof s === 'string')\n\nconst isRecordStringT = <T>(\n o: unknown,\n check: (o: unknown) => boolean,\n): o is Record<string, T> =>\n isObj(o) &&\n Object.entries(o).every(\n ([k, v]) => typeof k === 'string' && check(v),\n )\n\nconst isRecordStringManifest = (\n o: unknown,\n): o is Record<string, Manifest> =>\n isRecordStringT<Manifest>(o, v => isManifest(v))\n\nconst maybePeerDependenciesMetaSet = (\n o: unknown,\n): o is Record<string, PeerDependenciesMetaValue> | undefined =>\n o === undefined ||\n isRecordStringT<PeerDependenciesMetaValue>(o, v =>\n isPeerDependenciesMetaValue(v),\n )\n\nconst maybeBoolean = (o: unknown): o is boolean =>\n o === undefined || typeof o === 'boolean'\n\nconst isPeerDependenciesMetaValue = (\n o: unknown,\n): o is PeerDependenciesMetaValue =>\n isObj(o) && maybeBoolean(o.optional)\n\nconst maybeString = (a: unknown): a is string | undefined =>\n a === undefined || typeof a === 'string'\n\nconst maybeDist = (a: unknown): a is Manifest['dist'] =>\n a === undefined || (isObj(a) && maybeString(a.tarball))\n\nexport const isManifest = (m: unknown): m is Manifest =>\n isObj(m) &&\n !Array.isArray(m) &&\n maybeString(m.name) &&\n maybeString(m.version) &&\n maybeRecordStringString(m.dependencies) &&\n maybeRecordStringString(m.devDependencies) &&\n maybeRecordStringString(m.optionalDependencies) &&\n maybeRecordStringString(m.peerDependencies) &&\n maybeRecordStringString(m.acceptDependencies) &&\n maybePeerDependenciesMetaSet(m.peerDependenciesMeta) &&\n maybeDist(m.dist)\n\nexport const isManifestRegistry = (\n m: unknown,\n): m is ManifestRegistry =>\n isManifest(m) && !!m.dist && !!m.name && !!m.version\n\nexport const asManifest = (\n m: unknown,\n from?: (...a: unknown[]) => any,\n): Manifest => {\n if (!isManifest(m)) {\n throw error('invalid manifest', { found: m }, from ?? asManifest)\n }\n return m\n}\n\nexport const asManifestRegistry = (\n m: unknown,\n from?: (...a: unknown[]) => any,\n): ManifestRegistry => {\n if (!isManifestRegistry(m)) {\n throw error(\n 'invalid registry manifest',\n { found: m },\n from ?? asManifestRegistry,\n )\n }\n return m\n}\n\nexport const assertManifest: (\n m: unknown,\n) => asserts m is Manifest = m => {\n asManifest(m, assertManifest)\n}\nexport const assertManifestRegistry: (\n m: unknown,\n) => asserts m is ManifestRegistry = m => {\n asManifestRegistry(m, assertManifestRegistry)\n}\n\nexport const isPackument = (p: unknown): p is Packument => {\n if (!isObj(p) || typeof p.name !== 'string') return false\n const { versions, 'dist-tags': distTags, time } = p\n return (\n isRecordStringString(distTags) &&\n isRecordStringManifest(versions) &&\n maybeRecordStringString(time) &&\n Object.values(distTags).every(v => versions[v]?.name == p.name)\n )\n}\n\nexport const asPackument = (\n p: unknown,\n from?: (...a: unknown[]) => any,\n): Packument => {\n if (!isPackument(p)) {\n throw error(\n 'invalid packument',\n { found: p },\n from ?? asPackument,\n )\n }\n return p\n}\n\nexport const assertPackument: (\n m: unknown,\n) => asserts m is Packument = m => {\n asPackument(m)\n}\n\n/**\n * Name of the package.json keys used to define different types of dependencies.\n */\nexport type DependencyTypeLong =\n | 'dependencies'\n | 'devDependencies'\n | 'optionalDependencies'\n | 'peerDependencies'\n\n/**\n * Unique keys that define different types of dependencies relationship.\n */\nexport type DependencyTypeShort =\n | 'dev'\n | 'optional'\n | 'peer'\n | 'peerOptional'\n | 'prod'\n\n/**\n * A set of the possible long dependency type names,\n * as used in `package.json` files.\n */\nexport const longDependencyTypes = new Set<DependencyTypeLong>([\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n])\n\n/**\n * A set of the short type keys used to represent dependency relationships.\n */\nexport const shortDependencyTypes = new Set<DependencyTypeShort>([\n 'prod',\n 'dev',\n 'peer',\n 'optional',\n 'peerOptional',\n])\n\n/**\n * Maps between long form names usually used in `package.json` files\n * to a corresponding short form name, used in lockfiles.\n */\nexport const dependencyTypes = new Map<\n DependencyTypeLong,\n DependencyTypeShort\n>([\n ['dependencies', 'prod'],\n ['devDependencies', 'dev'],\n ['peerDependencies', 'peer'],\n ['optionalDependencies', 'optional'],\n])\n", "import { error } from '@vltpkg/error-cause'\nimport type { ErrorCauseObject } from '@vltpkg/error-cause'\nimport { asManifest, longDependencyTypes } from '@vltpkg/types'\nimport type { Manifest } from '@vltpkg/types'\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { parse, stringify } from 'polite-json'\n\nexport class PackageJson {\n /**\n * cache of `package.json` loads\n */\n #cache = new Map<string, Manifest>()\n\n /**\n * cache of `package.json` paths by manifest\n */\n #pathCache = new Map<Manifest, string>()\n\n /**\n * cache of load errors\n */\n #errCache = new Map<string, ErrorCauseObject>()\n\n /**\n * Reads and parses contents of a `package.json` file at a directory `dir`.\n * `reload` will optionally skip reading from the cache when set to `true`.\n */\n read(dir: string, { reload }: { reload?: boolean } = {}): Manifest {\n const cachedPackageJson = !reload && this.#cache.get(dir)\n if (cachedPackageJson) {\n return cachedPackageJson\n }\n\n const filename = resolve(dir, 'package.json')\n\n const fail = (err: ErrorCauseObject) =>\n error('Could not read package.json file', err, this.read)\n\n const cachedError = !reload && this.#errCache.get(dir)\n if (cachedError) {\n throw fail(cachedError)\n }\n\n try {\n const res: Manifest = asManifest(\n parse(readFileSync(filename, { encoding: 'utf8' })),\n )\n this.#cache.set(dir, res)\n this.#pathCache.set(res, dir)\n return res\n } catch (err) {\n const ec: ErrorCauseObject = {\n path: filename,\n cause: err,\n }\n this.#errCache.set(dir, ec)\n throw fail(ec)\n }\n }\n\n write(dir: string, manifest: Manifest, indent?: number): void {\n const filename = resolve(dir, 'package.json')\n this.fix(manifest)\n\n try {\n // This assumes kIndent and kNewline are already present on the manifest because we would\n // only write a package.json after reading it which will set those properties.\n writeFileSync(filename, stringify(manifest, undefined, indent))\n this.#cache.set(dir, manifest)\n this.#pathCache.set(manifest, dir)\n } catch (err) {\n // If there was an error writing to this package.json then also delete it from our cache\n // just in case a future read would get stale data.\n this.#cache.delete(dir)\n this.#pathCache.delete(manifest)\n throw error(\n 'Could not write package.json file',\n {\n path: filename,\n cause: err,\n },\n this.write,\n )\n }\n }\n\n save(manifest: Manifest): void {\n const dir = this.#pathCache.get(manifest)\n if (!dir) {\n throw error(\n 'Could not save manifest',\n {\n manifest,\n },\n this.save,\n )\n }\n this.write(dir, manifest)\n }\n\n fix(manifest: Manifest): void {\n for (const depType of longDependencyTypes) {\n const deps = manifest[depType]\n if (deps) {\n // should sort dependencies by name\n manifest[depType] = Object.fromEntries(\n Object.entries(deps).sort(([a], [b]) =>\n a.localeCompare(b, 'en'),\n ),\n )\n }\n }\n }\n}\n", "/**\n * Copyright 2017 Kat Marchán\n * Copyright npm, Inc.\n * Copyright 2023 Isaac Z. Schlueter\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n *\n * ---\n *\n * 'polite-json' is a fork of 'json-parse-even-better-errors',\n * extended and distributed under the terms of the MIT license\n * above.\n *\n * 'json-parse-even-better-errors' is a fork of\n * 'json-parse-better-errors' by Kat Marchán, extended and\n * distributed under the terms of the MIT license above.\n */\n\n// version specific\n/* c8 ignore start */\nconst hexify = (s: string) =>\n Array.from(s)\n .map(\n c => '0x' + c.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0')\n )\n .join('')\n/* c8 ignore stop */\n\ntype ParseErrorMeta = {\n message: string\n position: number\n}\nconst parseError = (e: Error, txt: string, context: number): ParseErrorMeta => {\n if (!txt) {\n return {\n message: e.message + ' while parsing empty string',\n position: 0,\n }\n }\n const badToken = e.message.match(/^Unexpected (?:token (.*?))?/i)\n const atPos = e.message.match(/at positions? (\\d+)/)\n\n // version specific\n /* c8 ignore start */\n const errIdx = /^Unexpected end of JSON|Unterminated string in JSON/i.test(\n e.message\n )\n ? txt.length - 1\n : atPos && atPos[1]\n ? +atPos[1]\n : /is not valid JSON$/.test(e.message)\n ? 0\n : null\n\n const msg =\n badToken && badToken[1]\n ? e.message.replace(\n /^Unexpected token ./,\n `Unexpected token ${JSON.stringify(badToken[1])} (${hexify(\n badToken[1]\n )})`\n )\n : e.message\n /* c8 ignore stop */\n\n if (errIdx !== null && errIdx !== undefined) {\n const start = errIdx <= context ? 0 : errIdx - context\n\n const end = errIdx + context >= txt.length ? txt.length : errIdx + context\n\n const slice =\n (start === 0 ? '' : '...') +\n txt.slice(start, end) +\n (end === txt.length ? '' : '...')\n\n const near = txt === slice ? '' : 'near '\n\n return {\n message: msg + ` while parsing ${near}${JSON.stringify(slice)}`,\n position: errIdx,\n }\n } else {\n return {\n message: msg + ` while parsing '${txt.slice(0, context * 2)}'`,\n position: 0,\n }\n }\n}\n\nexport class JSONParseError extends SyntaxError {\n code: 'EJSONPARSE'\n cause: Error\n position: number\n constructor(\n er: Error,\n txt: string,\n context: number = 20,\n caller?: Function | ((...a: any[]) => any)\n ) {\n const { message, position } = parseError(er, txt, context)\n super(message)\n this.cause = er\n this.position = position\n this.code = 'EJSONPARSE'\n Error.captureStackTrace(this, caller || this.constructor)\n }\n get name() {\n return this.constructor.name\n }\n set name(_) {}\n get [Symbol.toStringTag]() {\n return this.constructor.name\n }\n}\n\nexport const kIndent = Symbol.for('indent')\nexport const kNewline = Symbol.for('newline')\n// only respect indentation if we got a line break, otherwise squash it\n// things other than objects and arrays aren't indented, so ignore those\n// Important: in both of these regexps, the $1 capture group is the newline\n// or undefined, and the $2 capture group is the indent, or undefined.\nconst formatRE = /^\\s*[{\\[]((?:\\r?\\n)+)([\\s\\t]*)/\nconst emptyRE = /^(?:\\{\\}|\\[\\])((?:\\r?\\n)+)?$/\n\nexport type Reviver = (this: any, key: string, value: any) => any\nexport type Replacer =\n | ((this: any, key: string, value: any) => any)\n | (string | number)[]\n | null\nexport type Scalar = string | number | null\nexport type JSONResult =\n | {\n [k: string]: JSONResult\n [kIndent]?: string\n [kNewline]?: string\n }\n | (JSONResult[] & { [kIndent]?: string; [kNewline]?: string })\n | Scalar\n\nexport const parse = (\n txt: string | Buffer,\n reviver?: Reviver | null,\n context?: number\n): JSONResult => {\n const parseText = stripBOM(String(txt))\n if (!reviver) reviver = undefined\n context = context || 20\n try {\n // get the indentation so that we can save it back nicely\n // if the file starts with {\" then we have an indent of '', ie, none\n // otherwise, pick the indentation of the next line after the first \\n\n // If the pattern doesn't match, then it means no indentation.\n // JSON.stringify ignores symbols, so this is reasonably safe.\n // if the string is '{}' or '[]', then use the default 2-space indent.\n const [, newline = '\\n', indent = ' '] = parseText.match(emptyRE) ||\n parseText.match(formatRE) || [, '', '']\n\n const result = JSON.parse(parseText, reviver)\n if (result && typeof result === 'object') {\n result[kNewline] = newline\n result[kIndent] = indent\n }\n return result\n } catch (e) {\n if (typeof txt !== 'string' && !Buffer.isBuffer(txt)) {\n const isEmptyArray =\n Array.isArray(txt) && (txt as Array<any>).length === 0\n throw Object.assign(\n new TypeError(\n `Cannot parse ${isEmptyArray ? 'an empty array' : String(txt)}`\n ),\n {\n code: 'EJSONPARSE',\n systemError: e,\n }\n )\n }\n\n throw new JSONParseError(e as Error, parseText, context, parse)\n }\n}\n\nexport const parseNoExceptions = (txt: string | Buffer, reviver?: Reviver) => {\n try {\n return JSON.parse(stripBOM(String(txt)), reviver)\n } catch (e) {}\n}\n\n// Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n// because the buffer-to-string conversion in `fs.readFileSync()`\n// translates it to FEFF, the UTF-16 BOM.\nconst stripBOM = (txt: string) => String(txt).replace(/^\\uFEFF/, '')\n\nexport const stringify = (\n obj: any,\n replacer?: Replacer,\n indent?: string | number\n) => {\n const space = indent === undefined ? obj[kIndent] : indent\n // TS is so weird with parameter overloads\n const res =\n /* c8 ignore start */\n typeof replacer === 'function'\n ? JSON.stringify(obj, replacer, space)\n : JSON.stringify(obj, replacer, space)\n /* c8 ignore stop */\n const nl = obj[kNewline] || '\\n'\n return space ? (nl === '\\n' ? res : res.split('\\n').join(nl)) + nl : res\n}\n", "import { homedir } from 'node:os'\nimport {\n isAbsolute,\n join,\n resolve,\n win32 as winPath,\n} from 'node:path'\nimport { inspect } from 'node:util'\nimport type { InspectOptions } from 'node:util'\nimport {\n defaultRegistry,\n defaultRegistries,\n defaultGitHosts,\n defaultGitHostArchives,\n defaultScopeRegistries,\n getOptions,\n gitHostWebsites,\n kCustomInspect,\n Spec as BrowserSpec,\n} from './browser.ts'\nimport type { SpecLike } from './browser.ts'\n\nexport {\n defaultRegistry,\n defaultRegistries,\n defaultGitHosts,\n defaultGitHostArchives,\n defaultScopeRegistries,\n getOptions,\n gitHostWebsites,\n kCustomInspect,\n}\nexport * from './types.ts'\n\nexport class Spec extends BrowserSpec implements SpecLike<Spec> {\n [kCustomInspect](\n _depth?: number,\n options?: InspectOptions,\n ): string {\n const str = inspect(\n Object.fromEntries(\n Object.entries(this).filter(([k, v]) => {\n return k !== 'options' && v !== undefined\n }),\n ),\n options,\n )\n return `@vltpkg/spec.Spec ${str}`\n }\n}\n\nSpec.nodejsDependencies = {\n homedir,\n isAbsolute,\n join,\n resolve,\n winPath,\n}\n", "/** utility types to turn a null/undefined/void return into string */\nexport type NullToString<T> = VoidReplace<T>\n\n/** Utility type to replace null/undefined with a given type */\nexport type NullReplace<T, R = string> =\n T extends NonNullable<T> ? T : NonNullable<T> | R\n\n/** Utility type to replace void with a given type */\nexport type VoidReplace<T, R = string> =\n undefined extends T ? NullReplace<Exclude<T, void>, R> | R\n : NullReplace<T, R>\n\n/**\n * Split a string by a string delimiter, optionally limiting the number\n * of parts parsed, and/or transforming the string parts into some other\n * type of value.\n *\n * Pass `-1` as the `limit` parameter to get all parts (useful if an `onPart`\n * method is provided)\n *\n * If an `onPart` method is provided, and returns `undefined`, then the\n * original string part is included in the result set.\n *\n * ```ts\n * import { fastSplit } from '@vltpkg/fast-split'\n *\n * // say we want to split a string on '.' characters\n * const str = getSomeStringSomehow()\n *\n * // basic usage, just like str.split('.'), gives us an array\n * const parts = fastSplit(str, '.')\n *\n * // get just the first two parts, leave the rest intact\n * // Note: unlike str.split('.', 3), the 'rest' here will\n * // include the entire rest of the string.\n * // If you do `str.split('.', 3)`, then the last item in the\n * // returned array is truncated at the next delimiter\n * const [first, second, rest] = fastSplit(str, '.', 3)\n *\n * // If you need to transform it, say if it's an IPv4 address\n * // that you want to turn into numbers, you can do that by\n * // providing the onPart method, which will be slightly faster\n * // than getting an array and subsequently looping over it\n * // pass `-1` as the limit to give us all parts\n * const nums = fastSplit(str, '.', -1, (part, parts, index) => Number(s))\n * ```\n */\nexport function fastSplit<T = string>(\n str: string,\n delim: string,\n limit: number,\n onPart: (part: string, parts: NullToString<T>[], i: number) => T,\n): NullToString<T>[]\nexport function fastSplit(\n str: string,\n delim: string,\n limit?: number,\n): string[]\nexport function fastSplit<T = string>(\n str: string,\n delim: string,\n limit = -1,\n onPart?: (\n part: string,\n parts: NullToString<T>[],\n i: number,\n ) => T | undefined,\n): NullToString<T>[] {\n let i = 0\n let p = 0\n const l = delim.length\n const parts: NullToString<T>[] = []\n while (i !== -1) {\n i = str.indexOf(delim, p)\n const part =\n i === -1 || parts.length === limit - 1 ?\n str.substring(p)\n : str.substring(p, i)\n parts.push((onPart?.(part, parts, i) ?? part) as NullToString<T>)\n if (parts.length === limit) {\n // push the rest into the last part\n return parts\n }\n p = i + l\n }\n return parts\n}\n", "import { syntaxError, typeError } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport type { Range } from './range.ts'\n\nconst maybeNumber = (s: string): number | string => {\n if (!/^[0-9]+$/.test(s)) return s\n const n = Number(s)\n return n <= Number.MAX_SAFE_INTEGER ? n : s\n}\n\nconst safeNumber = (\n s: string,\n version: string,\n field: string,\n): number => {\n const n = Number(s)\n if (n > Number.MAX_SAFE_INTEGER) {\n throw invalidVersion(\n version,\n `invalid ${field}, must be <= ${Number.MAX_SAFE_INTEGER}`,\n )\n }\n return n\n}\n\nconst re = {\n prefix: /^[ v=]+/,\n main: /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)/,\n prerelease: /-([0-9a-zA-Z_.-]+)(?:$|\\+)/,\n build: /\\+([0-9a-zA-Z_.-]+)$/,\n full: /^[ v=]*(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9a-zA-Z_.-]+))?(?:\\+([0-9a-zA-Z_.-]+))?$/,\n} as const\n\nconst invalidVersion = (\n version: string,\n message: string,\n): SyntaxError => {\n const er = syntaxError(\n `invalid version: ${message}`,\n { version },\n Version,\n )\n return er\n}\n\n/**\n * Types of incrementing supported by {@link Version#inc}\n */\nexport type IncrementType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pre'\n | 'premajor'\n | 'preminor'\n | 'prepatch'\n | 'prerelease'\n\n/**\n * A parsed object representation of a SemVer version string\n *\n * This is a bit less forgiving than node-semver, in that prerelease versions\n * MUST start with '-'. Otherwise, the allowed syntax is identical.\n */\nexport class Version {\n /** raw string provided to create this Version */\n raw: string\n\n /** major version number */\n major: number\n /** minor version number */\n minor: number\n /** patch version number */\n patch: number\n /**\n * List of `'.'`-separated strings and numbers indicating that this\n * version is a prerelease.\n *\n * This is undefined if the version does not have a prerelease section.\n */\n prerelease?: (number | string)[]\n /**\n * List of `'.'`-separated strings in the `build` section.\n *\n * This is undefined if the version does not have a build.\n */\n build?: string[]\n\n /** Canonical strict form of this version */\n toString() {\n return `${this.major}.${this.minor}.${this.patch}${\n this.prerelease ? '-' + this.prerelease.join('.') : ''\n }${this.build ? '+' + this.build.join('.') : ''}`\n }\n\n /** Generate a `Version` object from a SemVer string */\n static parse(version: string) {\n version = version.replace(re.prefix, '').trim()\n if (version.length > 256) {\n throw invalidVersion(\n version,\n 'must be less than 256 characters',\n )\n }\n\n const parsed = version.match(re.full)\n if (!parsed) {\n const main = version.match(re.main)\n if (!main) {\n throw invalidVersion(\n version,\n 'no Major.minor.patch tuple present',\n )\n } else {\n throw invalidVersion(\n version,\n 'invalid build or patch section',\n )\n }\n }\n const [_, major_, minor_, patch_, prerelease, build] = parsed as [\n string,\n string,\n string,\n string,\n string | undefined,\n string | undefined,\n ]\n const major = safeNumber(major_, version, 'major')\n const minor = safeNumber(minor_, version, 'minor')\n const patch = safeNumber(patch_, version, 'patch')\n\n return new Version(\n version,\n major,\n minor,\n patch,\n prerelease,\n build,\n )\n }\n\n constructor(\n version: string,\n major: number,\n minor: number,\n patch: number,\n prerelease: string | undefined,\n build: string | undefined,\n ) {\n this.raw = version\n this.major = major\n this.minor = minor\n this.patch = patch\n\n // has prerelease and/or build\n if (prerelease) {\n this.prerelease = fastSplit(prerelease, '.', -1, c => {\n if (!c) {\n throw invalidVersion(\n version,\n 'invalid prerelease, empty identifiers not allowed',\n )\n }\n return maybeNumber(c)\n })\n }\n if (build) {\n this.build = fastSplit(build, '.', -1, c => {\n if (!c) {\n throw invalidVersion(\n version,\n 'invalid build metadata, empty identifiers not allowed',\n )\n }\n })\n }\n }\n\n /**\n * Return 1 if this is > the provided version, -1 if we're less, or 0 if\n * they are equal.\n *\n * No special handling for prerelease versions, this is just a precedence\n * comparison.\n *\n * This can be used to sort a list of versions by precedence:\n *\n * ```ts\n * const versions: Version[] = getVersionsSomehow()\n * const sorted = versions.sort((a, b) => a.compare(b))\n * ```\n */\n compare(v: Version): -1 | 0 | 1 {\n if (this.major > v.major) return 1\n if (this.major < v.major) return -1\n if (this.minor > v.minor) return 1\n if (this.minor < v.minor) return -1\n if (this.patch > v.patch) return 1\n if (this.patch < v.patch) return -1\n // main tuple is equal now\n // if the version has no pr, we're definitely less than or equal to\n if (!v.prerelease?.length)\n return !this.prerelease?.length ? 0 : -1\n // v has a pr. if we don't, we're > it\n if (!this.prerelease?.length) return 1\n // we both have prereleases\n const len = Math.max(this.prerelease.length, v.prerelease.length)\n const me = this.prerelease\n const thee = v.prerelease\n for (let i = 0; i < len; i++) {\n const m = me[i]\n const t = thee[i]\n if (m === t) continue\n // having a field is > not having it\n if (t === undefined) return 1\n if (m === undefined) return -1\n // string parts are higher precedence than\n if (typeof m !== typeof t) {\n return typeof m === 'string' ? 1 : -1\n }\n return m > t ? 1 : -1\n }\n return 0\n }\n\n /**\n * The inverse of compare, for sorting version lists in reverse order\n */\n rcompare(v: Version) {\n return -1 * this.compare(v)\n }\n\n /** true if this version is > the argument */\n greaterThan(v: Version) {\n return this.compare(v) === 1\n }\n\n /** true if this version is >= the argument */\n greaterThanEqual(v: Version) {\n return this.compare(v) > -1\n }\n\n /** true if this version is < the argument */\n lessThan(v: Version) {\n return this.compare(v) === -1\n }\n\n /** true if this version is &lt;= the argument */\n lessThanEqual(v: Version) {\n return this.compare(v) < 1\n }\n\n /** true if these two versions have equal SemVer precedence */\n equals(v: Version) {\n return this.compare(v) === 0\n }\n\n /** just compare the M.m.p parts of the version */\n tupleEquals(v: Version) {\n return (\n this.major === v.major &&\n this.minor === v.minor &&\n this.patch === v.patch\n )\n }\n\n /** true if this version satisfies the range */\n satisfies(r: Range) {\n return r.test(this)\n }\n\n /**\n * Increment the version in place, in the manner specified.\n *\n * Part behaviors:\n *\n * - `'major'` If the version is a `M.0.0-...` version with a prerelease, then\n * simply drop the prerelease. Otherwise, set the minor and patch to 0, and\n * increment the major. So `1.0.0-beta` becomes `1.0.0`, and `1.2.3` becomes\n * `2.0.0`\n *\n * - `'minor'` If the version is a `M.m.0-...` version with a prerelease, then\n * simply drop the prerelease. Otherwise, set the patch to 0, and increment the\n * minor. So `1.2.0-beta` becomes `1.2.0`, and `1.2.3` becomes `1.3.0`.\n *\n * - `'patch'` If the version has a prerelease, then simply drop the\n * prerelease. Otherwise, increment the patch value. So `1.2.3-beta` becomes\n * `1.2.3` and `1.2.3` becomes `1.2.4`.\n *\n * - `'premajor'` Set the patch and minor versions to `0`, increment the major\n * version, and add a prerelease, using the optional identifier.\n *\n * - `'preminor'` Set the patch version to `0`, increment the minor version,\n * and add a prerelease, using the optional identifier.\n *\n * - `'prepatch'` If a prerelease is already present, increment the patch\n * version, otherwise leave it untouched, and add a prerelease, using the\n * optional identifier.\n *\n * - `'prerelease'` If a prerelease version is present, then behave the same as\n * `'prepatch'`. Otherwise, add a prerelease, using the optional identifier.\n *\n * - `'pre'` This is mostly for use by the other prerelease incrementers.\n *\n * - If a prerelease identifier is provided:\n *\n * Update that named portion of the prerelease. For example,\n * `inc('1.2.3-beta.4', 'pre', 'beta')` would result in `1.2.3-beta.5`.\n *\n * If there is no prerelease identifier by that name, then replace the\n * prerelease with `[name]`. So `inc('1.2.3-alpha.4', 'pre', 'beta')`\n * would result in `1.2.3-beta`.\n *\n * If the prerelease identifer is present, but has no numeric value\n * following it, then add `0`. So `inc('1.2.3-beta', 'pre', 'beta')`\n * would result in `1.2.3-beta.0`.\n *\n * - If no prerelease identifier is provided:\n *\n * If there is no current prerelease, then set the prerelease to `0`. So,\n * `inc('1.2.3', 'pre')` becomes `1.2.3-0`.\n *\n * If the last item in the prerelease is numeric, then increment it. So,\n * `inc('1.2.3-beta.3', 'pre')` becomes `1.2.3-beta.4`.\n */\n inc(part: IncrementType, prereleaseIdentifier?: string) {\n switch (part) {\n case 'premajor':\n this.prerelease = undefined\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', prereleaseIdentifier)\n break\n\n case 'preminor':\n this.prerelease = undefined\n this.patch = 0\n this.minor++\n this.inc('pre', prereleaseIdentifier)\n break\n\n case 'prepatch':\n this.prerelease = undefined\n this.inc('patch')\n this.inc('pre', prereleaseIdentifier)\n break\n\n case 'prerelease':\n if (!this.prerelease?.length)\n this.inc('patch', prereleaseIdentifier)\n this.inc('pre', prereleaseIdentifier)\n break\n\n case 'pre': {\n // this is a bit different than node-semver's logic, but simpler\n // always do zero-based incrementing, and either bump the existing\n // numeric pr value, or add a `.0` after the identifier.\n if (!prereleaseIdentifier) {\n if (!this.prerelease?.length) {\n this.prerelease = [0]\n break\n }\n const last = this.prerelease[this.prerelease.length - 1]\n if (typeof last === 'number') {\n this.prerelease[this.prerelease.length - 1] = last + 1\n } else {\n this.prerelease.push(0)\n }\n break\n }\n if (!this.prerelease?.length) {\n this.prerelease = [prereleaseIdentifier]\n break\n }\n const i = this.prerelease.indexOf(\n maybeNumber(prereleaseIdentifier),\n )\n if (i === -1) {\n this.prerelease = [prereleaseIdentifier]\n break\n }\n const baseValue = this.prerelease[i + 1]\n if (typeof baseValue === 'number') {\n this.prerelease[i + 1] = baseValue + 1\n break\n }\n if (i === this.prerelease.length - 1) {\n this.prerelease.push(0)\n break\n }\n this.prerelease.splice(i + 1, 0, 0)\n break\n }\n\n case 'major':\n if (!this.prerelease?.length || this.minor || this.patch)\n this.major++\n this.prerelease = undefined\n this.patch = 0\n this.minor = 0\n break\n\n case 'minor':\n if (!this.prerelease?.length || this.patch) this.minor++\n this.prerelease = undefined\n this.patch = 0\n break\n\n case 'patch':\n if (!this.prerelease?.length) this.patch++\n this.prerelease = undefined\n break\n\n default:\n throw typeError(\n 'Invalid increment identifier',\n {\n version: this,\n found: part,\n validOptions: [\n 'major',\n 'minor',\n 'patch',\n 'premajor',\n 'preminor',\n 'prepatch',\n 'prerelease',\n 'pre',\n ],\n },\n this.inc,\n )\n }\n\n this.raw = this.toString()\n return this\n }\n}\n", "// TODO: it might be faster to not have Version objects in the\n// comparator tuples, and instead just keep the parsed number arrays?\nimport { syntaxError } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport { Version } from './version.ts'\n\n/** all comparators are expressed in terms of these operators */\nexport type SimpleOperator = '' | '<' | '<=' | '>' | '>='\n/** operators that are expanded to simpler forms */\nexport type ComplexOperator = '^' | '~' | '~>'\n\nconst isOperator = (\n o?: string,\n): o is ComplexOperator | SimpleOperator =>\n !!o &&\n (o === '>' ||\n o === '<' ||\n o === '>=' ||\n o === '<=' ||\n o === '' ||\n o === '~' ||\n o === '^' ||\n o === '~>')\n\n/** comparator expressed as a [operator,version] tuple */\nexport type OVTuple = [SimpleOperator, Version]\n\nconst preJunk = new Set('=v \\t')\n\nconst invalidComp = (c: string, message: string): SyntaxError =>\n syntaxError(\n `invalid comparator: '${c}' ${message}`,\n { found: c },\n Comparator,\n )\n\nconst assertNumber = (value: string, c: string, field: string) => {\n const n = Number(value)\n if (n !== n) {\n throw invalidComp(\n c,\n `${field} must be numeric or 'x', got: '${value}'`,\n )\n }\n return n\n}\n\nconst assertVersion = (v: string, comp: string) => {\n if (!v) {\n throw invalidComp(comp, 'no value provided for operator')\n }\n}\n\nconst assertMissing = (\n value: string | undefined,\n c: string,\n field: string,\n) => {\n if (value && !isX(value)) {\n throw invalidComp(\n c,\n `cannot omit '${field}' and include subsequent fields`,\n )\n }\n}\n\nconst MAJOR = 0\nconst MINOR = 1\nconst PATCH = 2\n\nconst isX = (c?: string) => !c || c === 'X' || c === 'x' || c === '*'\n\n/**\n * The result of parsing a version value that might be either a full\n * version like `1.2.3` or an X-Range like `1.2.x`\n */\nexport type ParsedXRange =\n | ParsedXMajor\n | ParsedXMinor\n | ParsedXPatch\n | ParsedXVersion\n/**\n * a {@link ParsedXRange} that is just a `*`\n */\nexport type ParsedXMajor = []\n/**\n * a {@link ParsedXRange} that is just a major version\n */\nexport type ParsedXMinor = [number]\n/**\n * a {@link ParsedXRange} that is just a major and minor version\n */\nexport type ParsedXPatch = [number, number]\n/**\n * a {@link ParsedXRange} that is a full version\n */\nexport type ParsedXVersion = [\n M: number,\n m: number,\n p: number,\n pr?: string | undefined,\n b?: string | undefined,\n]\n\nconst isFullVersion = (\n parsed: ParsedXRange,\n): parsed is ParsedXVersion => undefined !== parsed[PATCH]\nconst isXPatch = (parsed: ParsedXRange): parsed is ParsedXPatch =>\n undefined !== parsed[MINOR] && undefined === parsed[PATCH]\nconst isXMinor = (parsed: ParsedXRange): parsed is ParsedXMinor =>\n undefined !== parsed[MAJOR] && undefined === parsed[MINOR]\nconst isXMajor = (parsed: ParsedXRange): parsed is ParsedXMajor =>\n undefined === parsed[MAJOR]\n\n/**\n * Class used to parse the `||` separated portions\n * of a range, and evaluate versions against it.\n *\n * This does most of the heavy lifting of range testing, and provides\n * little affordance for improperly formatted strings. It should be\n * considered an internal class, and usually not accessed directly.\n */\nexport class Comparator {\n /**\n * does this range include prereleases, even when they do not\n * match the tuple in the comparator?\n */\n includePrerelease: boolean\n /** raw string used to create this comparator */\n raw: string\n /** tokens extracted from the raw string input */\n tokens: string[]\n /**\n * Either the `any` comparator, the `none` comparator, or an operator\n * and a {@link ParsedXRange}\n */\n tuples: (Comparator | OVTuple)[] = []\n /** true if this comparator can not match anything */\n isNone = false\n /**\n * true if this comparator is a `'*'` type of range.\n *\n * Note that it still will not match versions with a prerelease value,\n * unless the tuple in the version matches the tuple provided to the\n * comparator, and the comparator version also has a prerelease value,\n * unless `includePrerelease` is set.\n */\n isAny = false\n\n /** the canonical strict simplified parsed form of this constructor */\n toString() {\n return (\n this.isNone ? '<0.0.0-0'\n : this.isAny ? '*'\n : /* c8 ignore next */\n this.tuples.map(c => (isAny(c) ? '*' : c.join(''))).join(' ')\n )\n }\n\n constructor(comp: string, includePrerelease = false) {\n this.includePrerelease = includePrerelease\n comp = comp.trim()\n this.raw = comp\n let hyphen = false\n const rawComps = fastSplit(comp, ' ', -1, (part, parts, i) => {\n if (part === '-') {\n if (hyphen) {\n throw invalidComp(\n comp,\n 'multiple hyphen ranges not allowed',\n )\n }\n if (parts.length !== 1 || i === -1) {\n throw invalidComp(\n comp,\n 'hyphen must be between two versions',\n )\n }\n hyphen = true\n } else if (hyphen && parts.length !== 2) {\n throw invalidComp(comp, 'hyphen range must be alone')\n }\n })\n\n // remove excess spaces, `> 1 2` => `>1 2`\n const comps: string[] = []\n let followingOperator = false\n\n let l = 0\n for (const c of rawComps) {\n if (c === '') continue\n if (!followingOperator) {\n followingOperator = isOperator(c)\n comps.push(c)\n l++\n continue\n }\n // we know this is not undefined since followingOperator guards that\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n comps[l - 1]! += c\n followingOperator = false\n }\n\n // TS mistakenly thinks hyphen is always false here\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (hyphen) {\n const [min, _, max] = comps\n /* c8 ignore start - defense in depth for TS, already guaranteed */\n if (!min || !max) {\n throw invalidComp(comp, 'hyphen must be between two versions')\n }\n /* c8 ignore stop */\n this.#parseHyphenRange(min, max)\n } else if (\n !comps.length ||\n (comps.length === 1 && isX(comps[0]))\n ) {\n this.tuples.push(this.#getComparatorAny())\n } else {\n for (const c of comps) {\n this.#parse(c)\n if (this.isNone) break\n }\n }\n this.tokens = comps\n this.isAny = true\n for (const c of this.tuples) {\n if (Array.isArray(c) || !c.isAny) {\n this.isAny = false\n break\n }\n }\n }\n\n // inclusive min\n #xInclusiveMin(raw: string): Comparator | OVTuple {\n const z = this.includePrerelease ? '0' : undefined\n const [M, m = 0, p = 0, pr = z, build] = this.#parseX(raw)\n return M === undefined ?\n this.#getComparatorAny()\n : ['>=', new Version(raw, M, m, p, pr, build)]\n }\n\n // exclusive min\n #xExclusiveMin(raw: string): Comparator | OVTuple {\n const parsed = this.#parseX(raw)\n if (isFullVersion(parsed)) {\n return ['>', new Version(raw, ...parsed)]\n }\n const z = this.includePrerelease ? '0' : undefined\n if (isXPatch(parsed)) {\n // >1.2 => >=1.3.0\n return [\n '>=',\n new Version(\n raw,\n parsed[MAJOR],\n parsed[MINOR] + 1,\n 0,\n z,\n undefined,\n ),\n ]\n }\n if (isXMinor(parsed)) {\n // >1 => >=2.0.0\n return [\n '>=',\n new Version(raw, parsed[MAJOR] + 1, 0, 0, z, undefined),\n ]\n }\n this.isNone = true\n this.tuples.length = 0\n return comparatorNone\n }\n\n #xInclusiveMax(raw: string): Comparator | OVTuple {\n const parsed = this.#parseX(raw)\n return (\n isFullVersion(parsed) ? ['<=', new Version(raw, ...parsed)]\n : isXPatch(parsed) ?\n [\n '<',\n new Version(\n raw,\n parsed[MAJOR],\n parsed[MINOR] + 1,\n 0,\n '0',\n undefined,\n ),\n ]\n : isXMinor(parsed) ?\n [\n '<',\n new Version(raw, parsed[MAJOR] + 1, 0, 0, '0', undefined),\n ]\n : this.#getComparatorAny()\n )\n }\n\n #xExclusiveMax(raw: string): Comparator | OVTuple {\n const z = this.includePrerelease ? '0' : undefined\n const [M = 0, m = 0, p = 0, pr = z, build] = this.#parseX(raw)\n if (M === 0 && m === 0 && p === 0 && pr === '0') {\n this.isNone = true\n this.tuples.length = 0\n return comparatorNone\n }\n return ['<', new Version(raw, M, m, p, pr, build)]\n }\n\n #validXM(raw: string, m?: string, p?: string): ParsedXMajor {\n assertMissing(m, raw, 'major')\n assertMissing(p, raw, 'major')\n if (m === '' || p === '') {\n throw invalidComp(raw, `(Did you mean '*'?)`)\n }\n return []\n }\n #validXm(\n raw: string,\n M: string,\n m?: string,\n p?: string,\n ): ParsedXMinor {\n assertMissing(p, raw, 'major')\n if (m === '' || p === '') {\n throw invalidComp(raw, `(Did you mean '${M}'?)`)\n }\n return [assertNumber(M, raw, 'major')]\n }\n #validXp(\n raw: string,\n M: string,\n m: string,\n p?: string,\n ): ParsedXPatch {\n if (p === '') {\n throw invalidComp(raw, `(Did you mean '${M}.${m}'?)`)\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n ]\n }\n #validTuple(\n raw: string,\n M: string,\n m: string,\n p: string,\n ): ParsedXVersion {\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(p, raw, 'patch'),\n ]\n }\n #validXbuild(\n raw: string,\n M: string,\n m: string,\n p: string,\n pl: number,\n ): ParsedXVersion {\n // build, no prerelease\n const patch = p.substring(0, pl)\n const build = p.substring(pl + 1)\n if (!patch) {\n throw invalidComp(raw, 'cannot specify build without patch')\n }\n if (!build) {\n throw invalidComp(raw, `encountered '+', but no build value`)\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(patch, raw, 'patch'),\n undefined,\n build,\n ]\n }\n\n #validXpr(\n raw: string,\n M: string,\n m: string,\n p: string,\n hy: number,\n ): ParsedXVersion {\n {\n // prerelease, no build\n const patch = p.substring(0, hy)\n const pr = p.substring(hy + 1)\n if (!patch) {\n throw invalidComp(\n raw,\n 'cannot specify prerelease without patch',\n )\n }\n if (!pr) {\n throw invalidComp(\n raw,\n `encountered '-', but no prerelease value`,\n )\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(patch, raw, 'patch'),\n pr,\n undefined,\n ]\n }\n }\n #validXprbuild(\n raw: string,\n M: string,\n m: string,\n p: string,\n hy: number,\n pl: number,\n ): ParsedXVersion {\n // both prerelease and build\n const patch = p.substring(0, hy)\n const pr = p.substring(hy + 1, pl)\n const build = p.substring(pl + 1)\n if (!patch) {\n throw invalidComp(\n raw,\n 'cannot specify prerelease without patch',\n )\n }\n if (!pr) {\n throw invalidComp(\n raw,\n `encountered '-', but no prerelease value`,\n )\n }\n if (!build) {\n throw invalidComp(raw, `encountered '+', but no build value`)\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(patch, raw, 'patch'),\n pr,\n build,\n ]\n }\n\n // pull the relevant values out of an X-range or version\n // return the fields for creating a Version object.\n // only call once operator is stripped off\n #parseX(raw: string): ParsedXRange {\n let [M, m, p] = fastSplit(raw, '.', 3)\n let prune = 0\n while (M && preJunk.has(M.charAt(prune))) prune++\n if (M !== undefined && prune !== 0) M = M.substring(prune)\n // the `|| !M` is so TS knows we've handled undefined\n if (!M || isX(M)) return this.#validXM(raw, m, p)\n if (!m || isX(m)) return this.#validXm(raw, M, m, p)\n if (!p || isX(p)) return this.#validXp(raw, M, m, p)\n\n const hy = p.indexOf('-')\n const pl = p.indexOf('+')\n if (pl === -1 && hy === -1) return this.#validTuple(raw, M, m, p)\n if (pl === -1) return this.#validXpr(raw, M, m, p, hy)\n if (hy === -1) return this.#validXbuild(raw, M, m, p, pl)\n return this.#validXprbuild(raw, M, m, p, hy, pl)\n }\n\n #parseHyphenRange(min: string, max: string) {\n const minv = this.#xInclusiveMin(min)\n const maxv = this.#xInclusiveMax(max)\n const minAny = isAny(minv)\n const maxAny = isAny(maxv)\n if (minAny && maxAny) this.tuples.push(this.#getComparatorAny())\n else if (minAny) this.tuples.push(maxv)\n else if (maxAny) this.tuples.push(minv)\n else this.tuples.push(minv, maxv)\n }\n\n #parse(comp: string) {\n const first = comp.charAt(0)\n const first2 = comp.substring(0, 2)\n const v1 = comp.substring(1)\n const v2 = comp.substring(2)\n switch (first2) {\n case '~>':\n assertVersion(v2, comp)\n return this.#parseTilde(v2)\n case '>=':\n assertVersion(v2, comp)\n return this.tuples.push(this.#xInclusiveMin(v2))\n case '<=':\n assertVersion(v2, comp)\n return this.tuples.push(this.#xInclusiveMax(v2))\n }\n switch (first) {\n case '~':\n assertVersion(v1, comp)\n return this.#parseTilde(v1)\n case '^':\n assertVersion(v1, comp)\n return this.#parseCaret(v1)\n case '>':\n assertVersion(v1, comp)\n return this.tuples.push(this.#xExclusiveMin(v1))\n case '<':\n assertVersion(v1, comp)\n return this.tuples.push(this.#xExclusiveMax(v1))\n }\n return this.#parseEq(comp)\n }\n\n #parseTilde(comp: string) {\n const parsed = this.#parseX(comp)\n if (isXMajor(parsed)) {\n this.tuples.push(this.#getComparatorAny())\n return\n }\n const z = this.includePrerelease ? '0' : undefined\n if (isXMinor(parsed)) {\n const [M] = parsed\n this.tuples.push(\n ['>=', new Version(comp, M, 0, 0, z, undefined)],\n ['<', new Version(comp, M + 1, 0, 0, '0', undefined)],\n )\n return\n }\n if (isXPatch(parsed)) {\n const [M, m] = parsed\n const z = this.includePrerelease ? '0' : undefined\n this.tuples.push(\n ['>=', new Version(comp, M, m, 0, z, undefined)],\n ['<', new Version(comp, M, m + 1, 0, '0', undefined)],\n )\n return\n }\n const [M, m, p, pr = z, build] = parsed\n this.tuples.push(\n ['>=', new Version(comp, M, m, p, pr, build)],\n ['<', new Version(comp, M, m + 1, 0, '0', build)],\n )\n }\n\n #parseCaret(comp: string) {\n const min = this.#xInclusiveMin(comp)\n if (isAny(min)) {\n this.tuples.push(min)\n return\n }\n const minv = min[1]\n if (minv.major !== 0) {\n this.tuples.push(min, [\n '<',\n new Version(comp, minv.major + 1, 0, 0, '0', undefined),\n ])\n } else if (minv.minor !== 0) {\n this.tuples.push(min, [\n '<',\n new Version(\n comp,\n minv.major,\n minv.minor + 1,\n 0,\n '0',\n undefined,\n ),\n ])\n } else if (!minv.prerelease?.length) {\n this.tuples.push(['', minv])\n } else {\n this.tuples.push(min, [\n '<',\n new Version(\n comp,\n minv.major,\n minv.minor,\n minv.patch + 1,\n '0',\n undefined,\n ),\n ])\n }\n }\n\n #parseEq(comp: string) {\n const parsed = this.#parseX(comp)\n const z = this.includePrerelease ? '0' : undefined\n if (isFullVersion(parsed)) {\n this.tuples.push(['', new Version(comp, ...parsed)])\n } else if (isXMajor(parsed)) {\n this.tuples.push(this.#getComparatorAny())\n } else if (isXMinor(parsed)) {\n this.tuples.push([\n '>=',\n new Version(comp, parsed[MAJOR], 0, 0, z, undefined),\n ])\n this.tuples.push([\n '<',\n new Version(comp, parsed[MAJOR] + 1, 0, 0, '0', undefined),\n ])\n } else if (isXPatch(parsed)) {\n this.tuples.push(\n [\n '>=',\n new Version(\n comp,\n parsed[MAJOR],\n parsed[MINOR],\n 0,\n z,\n undefined,\n ),\n ],\n [\n '<',\n new Version(\n comp,\n parsed[MAJOR],\n parsed[MINOR] + 1,\n 0,\n '0',\n undefined,\n ),\n ],\n )\n }\n }\n\n /** return true if the version is a match for this comparator */\n test(v: Version) {\n if (this.isNone) return false\n const ip = this.includePrerelease\n const hasPR = !!v.prerelease?.length\n let prOK = ip || !hasPR\n for (const c of this.tuples) {\n if (isAny(c)) {\n continue\n }\n const [op, cv] = c\n prOK ||= !!cv.prerelease?.length && v.tupleEquals(cv)\n switch (op) {\n case '':\n if (!v.equals(cv)) return false\n continue\n case '>':\n if (!v.greaterThan(cv)) return false\n continue\n case '>=':\n if (!v.greaterThanEqual(cv)) return false\n continue\n case '<':\n if (!v.lessThan(cv)) return false\n continue\n case '<=':\n if (!v.lessThanEqual(cv)) return false\n continue\n }\n }\n // they all passed, so it can only fail for having a prerelease\n // if we allow prereleases, or saw a matching tuple, that's ok.\n return prOK\n }\n\n #getComparatorAny() {\n return this.includePrerelease ? comparatorAnyPR : comparatorAny\n }\n}\n\nconst isAny = (c: Comparator | OVTuple): c is Comparator =>\n c === comparatorAny || c === comparatorAnyPR\nconst comparatorAny = {\n isAny: true,\n toString: () => '*',\n includePrerelease: false,\n test: (v: Version) => !v.prerelease?.length,\n} as Comparator\nconst comparatorAnyPR = {\n isAny: true,\n toString: () => '*',\n includePrerelease: true,\n test: (_: Version) => true,\n} as Comparator\nconst comparatorNone = {\n isNone: true,\n toString: () => '<0.0.0-0',\n includePrerelease: false,\n test: (_: Version) => false,\n} as unknown as Comparator\n", "import { fastSplit } from '@vltpkg/fast-split'\nimport { Comparator } from './comparator.ts'\nimport type { Version } from './version.ts'\n\n/**\n * A representation of a semver range, used to test versions.\n *\n * Includes a set of comparators representing the `||`-separated\n * sections of the range string\n */\nexport class Range {\n /** raw string used to create this Range */\n raw: string\n\n /** true if the range is `*` */\n isAny: boolean\n\n /** true if the range is a single semver version */\n isSingle: boolean\n\n /** true if the range cannot match anything */\n\n /**\n * set of {@link Comparator} objects representing the `||`-separated sections\n * of the range. If at least one of these matches, then the version is a\n * match.\n */\n set: Comparator[] = []\n\n /** true if all prerelease versions should be included */\n includePrerelease: boolean\n\n /** cached toString */\n #toString?: string\n\n constructor(range: string, includePrerelease = false) {\n this.raw = range\n this.includePrerelease = includePrerelease\n this.isAny = false\n let isFirst = true\n this.isSingle = false\n fastSplit(range, '||', -1, part => {\n if (this.isAny) return\n const cmp = new Comparator(part, this.includePrerelease)\n if (cmp.isAny) {\n this.set = [cmp]\n this.isAny = true\n return\n }\n this.set.push(cmp)\n if (!isFirst) this.isSingle = false\n else if (\n Array.isArray(cmp.tuples) &&\n cmp.tuples.length === 1 &&\n Array.isArray(cmp.tuples[0]) &&\n cmp.tuples[0][0] === ''\n ) {\n this.isSingle = true\n }\n isFirst = false\n })\n }\n\n /**\n * test a {@link Version} against the range\n */\n test(v: Version) {\n return this.set.some(c => c.test(v))\n }\n\n /** return the simplified canonical form of this range */\n toString() {\n if (this.#toString) return this.#toString\n if (this.isSingle) {\n this.#toString = String(this.set[0])\n return this.#toString\n }\n this.#toString = this.set.map(c => String(c)).join(' || ')\n return this.#toString\n }\n}\n", "import { Range } from './range.ts'\nimport { Version } from './version.ts'\nimport type { IncrementType } from './version.ts'\nimport { syntaxError } from '@vltpkg/error-cause'\n\nexport * from './comparator.ts'\nexport * from './range.ts'\nexport * from './version.ts'\n\n/** Return the parsed version string, or `undefined` if invalid */\nexport const parse = (version: Version | string) => {\n if (version instanceof Version) return version\n try {\n return Version.parse(String(version))\n } catch {\n return undefined\n }\n}\n\n/** Return the parsed version range, or `undefined` if invalid */\nexport const parseRange = (\n range: Range | string,\n includePrerelease = false,\n) => {\n if (typeof range === 'object') {\n if (range.includePrerelease === includePrerelease) return range\n range = range.raw\n }\n try {\n return new Range(range, includePrerelease)\n } catch {\n return undefined\n }\n}\n\n/**\n * return true if the version is valid\n *\n * Note: do not use this if you intend to immediately parse the version if it's\n * valid. Just use {@link parse}, and guard the possible undefined value, or\n * use `Version.parse(..)` to throw on invalid values.\n */\nexport const valid = (version: Version | string) => !!parse(version)\n\n/**\n * return true if the range is valid\n *\n * Note: do not use this if you intend to immediately parse the range if it's\n * valid. Just use {@link parseRange}, and guard the possible undefined value,\n * or use `new Range(..)` to throw on invalid values.\n */\nexport const validRange = (range: Range | string) =>\n !!parseRange(range)\n\n/**\n * Return true if the version satisfies the range.\n */\nexport const satisfies = (\n version: Version | string,\n range: Range | string,\n includePrerelease = false,\n) => {\n if (typeof version === 'string') {\n const parsed = parse(version)\n if (!parsed) return false\n version = parsed\n }\n if (typeof range === 'string') {\n const parsed = parseRange(range, includePrerelease)\n if (!parsed) return false\n range = parsed\n }\n return version.satisfies(range)\n}\n\n/**\n * Increment the specified part of the version, and return the resulting\n * object. If a Version object is provided, it will be modified in-place.\n *\n * See {@link Version.inc} for full description.\n */\nexport const inc = (\n version: Version | string,\n part: IncrementType,\n prereleaseIdentifier?: string,\n) =>\n (typeof version === 'string' ?\n Version.parse(version)\n : version\n ).inc(part, prereleaseIdentifier)\n\n/**\n * The method used by {@link sort}, exported for passing directly to\n * `Array.sort`.\n *\n * Usage:\n *\n * ```ts\n * import { sortMethod } from '@vltpkg/semver'\n * const versions = ['1.2.3', '5.2.3', '2.3.4']\n * console.log(versions.sort(sortMethod))\n * // ['1.2.3', '2.3.4', '5.2.3']\n * ```\n */\nexport const sortMethod = (\n a: Version | string,\n b: Version | string,\n) => {\n const pa = parse(a)\n const pb = parse(b)\n /* c8 ignore start - nondeterministic */\n if (!pa && !pb) return String(a).localeCompare(String(b), 'en')\n if (!pa) return 1\n if (!pb) return -1\n /* c8 ignore stop */\n return pa.compare(pb)\n}\n\n/**\n * Sort an array of version strings or objects in ascending SemVer precedence\n * order (ie, lowest versions first).\n *\n * Invalid version strings are sorted to the end of the array in ascending\n * alphabetical order.\n *\n * Note: when using this method, the list is cloned prior to sorting, to\n * prevent surprising mutation. To sort the list in place, see\n * {@link sortMethod}.\n */\nexport const sort = <T extends Version | string = Version | string>(\n list: T[],\n): T[] => list.slice().sort(sortMethod)\n\n/**\n * Sort an array of version strings or objects in descending SemVer\n * precedence order (ie, highest versions first).\n *\n * Invalid version strings are sorted to the end of the array in ascending\n * alphabetical order.\n *\n * Note: when using this method, the list is cloned prior to sorting, to\n * prevent surprising mutation. To sort the list in place, see\n * {@link rsortMethod}.\n */\nexport const rsort = <T extends Version | string = Version | string>(\n list: T[],\n): T[] => list.slice().sort(rsortMethod)\n\n/**\n * The method used by {@link rsort}, exported for passing directly to\n * `Array.sort`.\n *\n * Usage:\n *\n * ```ts\n * import { rsortMethod } from '@vltpkg/semver'\n * const versions = ['1.2.3', '5.2.3', '2.3.4']\n * console.log(versions.sort(rsortMethod))\n * // ['5.2.3', '2.3.4', '1.2.3']\n * ```\n */\nexport const rsortMethod = (\n a: Version | string,\n b: Version | string,\n) => {\n const pa = parse(a)\n const pb = parse(b)\n /* c8 ignore start - nondeterministic */\n if (!pa && !pb) return String(a).localeCompare(String(b), 'en')\n if (!pa) return 1\n if (!pb) return -1\n /* c8 ignore stop */\n return pa.rcompare(pb)\n}\n\n/**\n * Method used by {@link filter}, for use in `Array.filter` directly.\n *\n * Usage:\n *\n * ```ts\n * import { filterMethod } from '@vltpkg/semver'\n * const versions = ['1.2.3', '5.2.3', '2.3.4']\n * console.log(versions.filter(filterMethod('>=2.x')))\n * // ['5.2.3', '2.3.4']\n * ```\n */\nexport const filterMethod = (\n range: Range | string,\n includePrerelease = false,\n): ((version: Version | string) => boolean) => {\n const r = parseRange(range, includePrerelease)\n return !r ?\n () => false\n : version => satisfies(version, r, r.includePrerelease)\n}\n\n/**\n * Filter a list of versions to find all that match a given range.\n */\nexport const filter = <T extends Version | string = Version | string>(\n list: T[],\n range: Range | string,\n includePrerelease = false,\n): T[] => list.filter(filterMethod(range, includePrerelease))\n\n/**\n * Find the highest-precedence match for a range within a list of versions\n *\n * Returns `undefined` if no match was found.\n */\nexport const highest = (\n list: (Version | string)[],\n range: Range | string,\n includePrerelease = false,\n): Version | undefined => {\n const r = parseRange(range, includePrerelease)\n if (!r) return undefined\n let max: Version | undefined = undefined\n for (const v of list) {\n const version = parse(v)\n if (!version) continue\n if (!version.satisfies(r)) continue\n if (!max) max = version\n else if (version.greaterThan(max)) max = version\n }\n return max\n}\n\n/**\n * Faster form of {@link highest}, for use when the list is sorted\n * in precedence order (lower-precedence versions first).\n *\n * Note: This stops at the first match, and will produce incorrect results\n * when the list is not properly sorted!\n */\nexport const sortedHighest = (\n list: (Version | string)[],\n range: Range | string,\n includePrerelease = false,\n): Version | undefined => {\n const r = parseRange(range, includePrerelease)\n if (!r) return undefined\n for (let i = list.length - 1; i >= 0; i--) {\n const v = list[i]\n /* c8 ignore next */\n if (!v) continue\n const version = parse(v)\n if (!version) continue\n if (!version.satisfies(r)) continue\n return version\n }\n}\n\n/**\n * Faster form of {@link highest}, for use when the list is sorted\n * in reverse precedence order (higher-precedence versions first).\n *\n * Note: This stops at the first match, and will produce incorrect results\n * when the list is not properly sorted!\n */\nexport const rsortedHighest = (\n list: (Version | string)[],\n range: Range | string,\n includePrerelease = false,\n): Version | undefined => {\n const r = parseRange(range, includePrerelease)\n if (!r) return undefined\n for (const v of list) {\n const version = parse(v)\n if (!version) continue\n if (!version.satisfies(r)) continue\n return version\n }\n}\n\n/**\n * Find the lowest-precedence match for a range within a list of versions\n *\n * Returns `undefined` if no match was found.\n */\nexport const lowest = (\n list: (Version | string)[],\n range: Range | string,\n includePrerelease = false,\n): Version | undefined => {\n const r = parseRange(range, includePrerelease)\n if (!r) return undefined\n let min: Version | undefined = undefined\n for (const v of list) {\n const version = parse(v)\n if (!version) continue\n if (!version.satisfies(r)) continue\n if (!min) min = version\n else if (version.lessThan(min)) min = version\n }\n return min\n}\n\n/**\n * Faster form of {@link lowest}, for use when the list is sorted\n * in precedence order (lower-precedence versions first).\n *\n * Note: This stops at the first match, and will produce incorrect results\n * when the list is not properly sorted!\n */\nexport const sortedLowest = (\n list: (Version | string)[],\n range: Range | string,\n includePrerelease = false,\n): Version | undefined =>\n rsortedHighest(list, range, includePrerelease)\n\n/**\n * Faster form of {@link lowest}, for use when the list is sorted\n * in reverse precedence order (higher-precedence versions first).\n *\n * Note: This stops at the first match, and will produce incorrect results\n * when the list is not properly sorted!\n */\nexport const rsortedLowest = (\n list: (Version | string)[],\n range: Range | string,\n includePrerelease = false,\n): Version | undefined =>\n sortedHighest(list, range, includePrerelease)\n\n/**\n * Same as {@link sortMethod}, but throws if either version is not valid.\n * 1 if versionA is higher precedence than versionB\n * -1 if versionA is lower precedence than versionB\n * 0 if they have equal precedence\n */\nexport const compare = (\n versionA: Version | string,\n versionB: Version | string,\n) => {\n const a = parse(versionA)\n if (!a) {\n throw syntaxError('invalid version', { found: versionA })\n }\n const b = parse(versionB)\n if (!b) {\n throw syntaxError('invalid version', { found: versionB })\n }\n return a.compare(b)\n}\n\n/**\n * Inverse of {@link compare}\n *\n * Same as {@link rsortMethod}, but throws if either version is not valid.\n *\n * -1 if versionA is higher precedence than versionB\n * 1 if versionA is lower precedence than versionB\n * 0 if they have equal precedence\n */\nexport const rcompare = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionB, versionA)\n\n/** true if versionA is > versionB. throws on invalid values */\nexport const gt = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionA, versionB) > 0\n/** true if versionA is >= versionB. throws on invalid values */\nexport const gte = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionA, versionB) >= 0\n/** true if versionA is < versionB. throws on invalid values */\nexport const lt = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionA, versionB) < 0\n/** true if versionA is &lt;= versionB. throws on invalid values */\nexport const lte = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionA, versionB) <= 0\n/** true if versionA is not equal to versionB. throws on invalid values */\nexport const neq = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionA, versionB) !== 0\n/** true if versionA is equal to versionB. throws on invalid values */\nexport const eq = (\n versionA: Version | string,\n versionB: Version | string,\n) => compare(versionA, versionB) === 0\n\n/** extract the major version number, or undefined if invalid */\nexport const major = (version: Version | string) =>\n parse(version)?.major\n/** extract the minor version number, or undefined if invalid */\nexport const minor = (version: Version | string) =>\n parse(version)?.minor\n/** extract the patch version number, or undefined if invalid */\nexport const patch = (version: Version | string) =>\n parse(version)?.patch\n/**\n * extract the list of prerelease identifiers, or undefined if the version\n * is invalid. If no prerelease identifiers are present, returns `[]`.\n */\nexport const prerelease = (version: Version | string) => {\n const p = parse(version)\n if (!p) return undefined\n return p.prerelease ?? []\n}\n/**\n * extract the list of build identifiers, or undefined if the version\n * is invalid. If no build identifiers are present, returns `[]`.\n */\nexport const build = (version: Version | string) => {\n const p = parse(version)\n if (!p) return undefined\n return p.build ?? []\n}\n\n/** return all versions that do not have any prerelease identifiers */\nexport const stable = <T extends Version | string = Version | string>(\n versions: T[],\n): T[] =>\n versions.filter(v => {\n const p = parse(v)\n if (!p) return false\n return !p.prerelease?.length\n })\n", "import { error, typeError } from '@vltpkg/error-cause'\nimport type { ErrorCauseObject } from '@vltpkg/error-cause'\nimport { parseRange } from '@vltpkg/semver'\nimport type { Range } from '@vltpkg/semver'\nexport * from './types.ts'\nimport type {\n GitSelectorParsed,\n Scope,\n SpecLike,\n SpecOptions,\n SpecOptionsFilled,\n} from './types.ts'\n\nexport const kCustomInspect = Symbol.for('nodejs.util.inspect.custom')\n\nexport const defaultRegistry = 'https://registry.npmjs.org/'\n\nexport const defaultRegistries = {\n npm: 'https://registry.npmjs.org/',\n}\n\nexport const defaultGitHosts = {\n github: 'git+ssh://git@github.com:$1/$2.git',\n bitbucket: 'git+ssh://git@bitbucket.org:$1/$2.git',\n gitlab: 'git+ssh://git@gitlab.com:$1/$2.git',\n gist: 'git+ssh://git@gist.github.com/$1.git',\n}\n\nexport const defaultGitHostArchives = {\n github: 'https://codeload.github.com/$1/$2/tar.gz/$committish',\n bitbucket: 'https://bitbucket.org/$1/$2/get/$committish.tar.gz',\n gist: 'https://codeload.github.com/gist/$1/tar.gz/$committish',\n gitlab:\n 'https://gitlab.com/$1/$2/repository/archive.tar.gz?ref=$committish',\n}\n\n/**\n * These are just for legacy support of urls that are supported by npm\n * and observed in the wild.\n *\n * Not configurable, because no more will be added. If you wish to define\n * custom git hosts, use it with the `'git-hosts'` and `'git-host-archives'`\n * options.\n */\nexport const gitHostWebsites = {\n github: 'https://github.com/',\n bitbucket: 'https://bitbucket.org/',\n gist: 'https://gist.github.com/',\n gitlab: 'https://gitlab.com/',\n}\n\nexport const defaultScopeRegistries = {}\n\nexport const getOptions = (\n options?: SpecOptions,\n): SpecOptionsFilled => ({\n ...options,\n registry: options?.registry ?? defaultRegistry,\n 'scope-registries': options?.['scope-registries'] ?? {},\n 'git-hosts':\n options?.['git-hosts'] ?\n {\n ...defaultGitHosts,\n ...options['git-hosts'],\n }\n : defaultGitHosts,\n registries:\n options?.registries ?\n {\n ...defaultRegistries,\n ...options.registries,\n }\n : defaultRegistries,\n 'git-host-archives':\n options?.['git-host-archives'] ?\n {\n ...defaultGitHostArchives,\n ...options['git-host-archives'],\n }\n : defaultGitHostArchives,\n})\n\n/**\n * Various nameless scenarios that are handled in the\n * standard spec parsing and should return an unknown name.\n *\n * Returns `true` if the name can not be inferred, `false` otherwise.\n */\nconst startsWithSpecIdentifier = (\n spec: string,\n options: SpecOptionsFilled,\n): boolean =>\n spec.startsWith('/') ||\n spec.startsWith('./') ||\n spec.startsWith('../') ||\n spec.startsWith('file:') ||\n spec.startsWith('http:') ||\n spec.startsWith('https:') ||\n spec.startsWith('workspace:') ||\n spec.startsWith('git@') ||\n spec.startsWith('git://') ||\n spec.startsWith('git+ssh://') ||\n spec.startsWith('git+http://') ||\n spec.startsWith('git+https://') ||\n spec.startsWith('git+file://') ||\n spec.startsWith('git@github.com') ||\n spec.startsWith('registry:') ||\n // anything that starts with a known git host key, or a\n // custom registered registry protocol e.g: `github:`, `custom:`\n [\n ...Object.keys(options['git-hosts']),\n ...Object.keys(options.registries),\n ].some(key => spec.startsWith(`${key}:`))\n\n/**\n * Returns the location in which the first `@` value is found in a given\n * string, also takes into account that a string starting with @ is\n * using a scoped-name.\n */\nconst findFirstAt = (spec: string, hasScope: boolean) =>\n spec.indexOf('@', hasScope ? 1 : 0)\n\n/**\n * Return `true` if a given spec string is likely to be a git spec.\n */\nconst findGitIdentifier = (spec: string): boolean =>\n spec.indexOf('#') > 2\n\n/**\n * Return `true` if a given spec string is likely to be a file spec.\n */\nconst findFileIdentifier = (spec: string): boolean =>\n spec.includes('/')\n\n/**\n * Injects the Node.js dependencies into the Spec class.\n */\nexport type NodeJSDependenciesOptions = {\n homedir: typeof import('os').homedir\n isAbsolute: typeof import('node:path').isAbsolute\n join: typeof import('node:path').join\n resolve: typeof import('node:path').resolve\n winPath: typeof import('node:path').win32\n}\n\n/**\n * The base, isomorphic Spec implementation.\n */\nexport class Spec implements SpecLike<Spec> {\n /**\n * Create a Spec object from a full spec, name+bareSpec, or Spec object\n *\n * Note: If a Spec object is provided, it is returned as-is, without\n * investigating whether the options match.\n */\n static parse(\n name: string,\n bareSpec: string,\n options?: SpecOptions,\n ): Spec\n static parse(spec: string, options?: SpecOptions): Spec\n static parse(spec: Spec, options?: SpecOptions): Spec\n static parse(\n spec: Spec | string,\n bareOrOptions?: SpecOptions | string,\n options?: SpecOptions,\n ): Spec {\n return typeof spec === 'object' ? spec : (\n new this(spec, bareOrOptions, options)\n )\n }\n\n static parseArgs(specOrBareSpec: string, opts?: SpecOptions): Spec {\n const options = getOptions(opts ?? {})\n\n if (startsWithSpecIdentifier(specOrBareSpec, options)) {\n const parsed = this.parse('(unknown)', specOrBareSpec, options)\n // try to look into a potential parsed subspec for a name\n if (parsed.subspec) {\n parsed.name = parsed.subspec.name\n parsed.spec = `${parsed.name}@${parsed.bareSpec}`\n }\n return parsed\n } else {\n const hasScope = specOrBareSpec.startsWith('@')\n const at = findFirstAt(specOrBareSpec, hasScope)\n if (at > -1) {\n return this.parse(\n specOrBareSpec.substring(0, at),\n specOrBareSpec.substring(at + 1),\n options,\n )\n } else if (\n findGitIdentifier(specOrBareSpec) ||\n (!hasScope && findFileIdentifier(specOrBareSpec))\n ) {\n return this.parse('(unknown)', specOrBareSpec, options)\n } else {\n // doesn't have an @, so it's just a name with no version\n return this.parse(`${specOrBareSpec}@`, options)\n }\n }\n }\n\n static nodejsDependencies?: NodeJSDependenciesOptions\n\n type: 'file' | 'git' | 'registry' | 'remote' | 'workspace'\n spec: string\n options: SpecOptionsFilled\n name: string\n scope?: Scope\n scopeRegistry?: string\n bareSpec: string\n gitRemote?: string\n gitSelector?: string\n gitSelectorParsed?: GitSelectorParsed\n gitCommittish?: string\n namedGitHost?: string\n namedGitHostPath?: string\n workspaceSpec?: string\n workspace?: string\n namedRegistry?: string\n registry?: string\n registrySpec?: string\n conventionalRegistryTarball?: string\n semver?: string\n range?: Range\n distTag?: string\n remoteURL?: string\n file?: string\n subspec?: Spec\n #final?: Spec\n #toString?: string\n\n /**\n * Return the final entry in the chain of subspecs\n * When deciding which thing to actually fetch, spec.final is the thing\n * to look at.\n */\n get final(): Spec {\n if (this.#final) return this.#final\n return (this.#final = this.subspec ? this.subspec.final : this)\n }\n\n /**\n * Normally, the string value of a Spec is just the string passed in to\n * be parsed. However, in the case of a chain of subspecs, like\n * `foo@npm:bar@npm:baz@npm:quux@latest`, this simplifies out the middle\n * parts of the chain, returning just `foo@npm:quux@latest`\n */\n toString() {\n if (this.#toString !== undefined) return this.#toString\n let sub: Spec = this\n // we want the SECOND from the last in the chain\n while (sub.subspec?.subspec) sub = sub.subspec\n if (sub.subspec && sub.subspec.type !== 'registry')\n sub = sub.subspec\n return (this.#toString = this.name + '@' + sub.bareSpec)\n }\n\n declare ['constructor']: typeof Spec\n\n constructor(name: string, bareSpec: string, options?: SpecOptions)\n constructor(spec: string, options?: SpecOptions)\n constructor(\n spec: Spec | string,\n bareOrOptions?: SpecOptions | string,\n options?: SpecOptions,\n )\n constructor(\n spec: string,\n bareOrOptions?: SpecOptions | string,\n options: SpecOptions = {},\n ) {\n if (bareOrOptions && typeof bareOrOptions === 'object') {\n options = bareOrOptions\n bareOrOptions = undefined\n }\n this.options = getOptions(options)\n\n if (typeof bareOrOptions === 'string') {\n this.name = spec\n this.#parseScope(spec)\n this.bareSpec = bareOrOptions\n this.spec = `${this.name}@${bareOrOptions}`\n } else {\n this.spec = spec\n const hasScope = spec.startsWith('@')\n let at = findFirstAt(spec, hasScope)\n if (at === -1) {\n // assume that an unadorned spec is just a name at the default\n // registry\n at = spec.length\n spec += '@'\n }\n this.name = spec.substring(0, at)\n if (hasScope) this.#parseScope(this.name)\n this.bareSpec = spec.substring(at + 1)\n }\n\n // legacy affordance: allow project urls like\n // 'https://github.com/user/project#commitish' because npm suports it and\n // this pattern is observed in the wild.\n if (this.bareSpec.startsWith('https://')) {\n for (const [name, origin] of Object.entries(gitHostWebsites)) {\n if (this.bareSpec.startsWith(origin)) {\n const parsed = new URL(this.bareSpec)\n const [user, project] = parsed.pathname\n .replace(/\\.git$/, '')\n .replace(/\\/+/g, ' ')\n .trim()\n .split(' ')\n if (user && project) {\n this.bareSpec = `${name}:${user}/${project}${parsed.hash}`\n this.spec = `${this.name}@${this.bareSpec}`\n break\n }\n }\n }\n }\n\n if (this.bareSpec.startsWith('workspace:')) {\n this.type = 'workspace'\n const ws = this.bareSpec.substring('workspace:'.length).trim()\n const w = ws.lastIndexOf('@')\n if (w === -1) {\n this.workspace = this.name\n } else {\n const wsName = ws.substring(0, w)\n if (\n !wsName ||\n wsName === '*' ||\n wsName === '~' ||\n wsName === '^' ||\n (wsName.startsWith('@') ?\n wsName.split('/').length !== 2 ||\n wsName.substring(1).includes('@')\n : wsName.includes('@'))\n ) {\n throw this.#error(\n 'workspace: name must be a path or valid package name',\n { found: wsName },\n )\n }\n this.workspace = wsName\n }\n // workspace: is the same as workspace:*\n const wss = w === -1 ? ws : ws.substring(w + 1) || '*'\n const range = wss === '*' ? undefined : parseRange(wss)\n if (wss !== '*' && wss !== '~' && wss !== '^' && !range) {\n throw this.#error(\n 'workspace: spec must be one of *, ~, or ^, or a valid semver range',\n {\n found: wss,\n wanted: `'*'|'~'|'^'|SemverRange`,\n },\n )\n }\n this.workspaceSpec = wss\n if (range) {\n this.semver = wss\n this.range = range\n }\n return\n }\n\n if (\n this.bareSpec.startsWith('git://') ||\n this.bareSpec.startsWith('git+ssh://') ||\n this.bareSpec.startsWith('git+http://') ||\n this.bareSpec.startsWith('git+https://') ||\n this.bareSpec.startsWith('git+file://') ||\n // legacy affordance\n this.bareSpec.startsWith('git@github.com')\n ) {\n if (this.bareSpec.startsWith('git@')) {\n this.bareSpec = `git+ssh://${this.bareSpec}`\n this.spec = `${this.name}@${this.bareSpec}`\n }\n this.type = 'git'\n // see if it's one of the known named hosts, and if so, prefer\n // the shorter syntax.\n for (const [name, host] of Object.entries(\n this.options['git-hosts'],\n )) {\n const s = host.indexOf('$')\n if (s > 0 && this.bareSpec.startsWith(host.substring(0, s))) {\n const p = this.bareSpec\n .substring(s)\n .replace(/\\.git(#.*)?$/, '$1')\n this.bareSpec = `${name}:${p}`\n this.spec = `${this.name}@${this.bareSpec}`\n this.#parseHostedGit(name, host)\n this.type = 'git'\n return\n }\n }\n this.#parseGitSelector(this.bareSpec)\n return\n }\n\n // spooky\n const ghosts = Object.entries(this.options['git-hosts'])\n for (const [name, template] of ghosts) {\n if (this.#parseHostedGit(name, template)) {\n this.type = 'git'\n return\n }\n }\n\n if (this.bareSpec.startsWith('registry:')) {\n const reg = this.bareSpec.substring('registry:'.length)\n const h = reg.indexOf('#')\n if (h === -1) {\n throw this.#error('registry: must include name/version')\n }\n this.type = 'registry'\n let url = reg.substring(0, h)\n if (!url.endsWith('/')) url += '/'\n const regSpec = reg.substring(h + 1)\n for (let [name, u] of Object.entries(this.options.registries)) {\n if (!u.endsWith('/')) {\n u += '/'\n this.options.registries[name] = u\n }\n if (u === url) this.namedRegistry = name\n }\n this.#parseRegistrySpec(regSpec, url)\n this.#guessRegistryTarball()\n return\n }\n\n const regs = Object.entries(this.options.registries)\n for (const [host, url] of regs) {\n const h = `${host}:`\n if (this.bareSpec.startsWith(h)) {\n this.type = 'registry'\n this.namedRegistry = host\n this.#parseRegistrySpec(\n this.bareSpec.substring(h.length),\n url,\n ).namedRegistry ??= host\n this.#guessRegistryTarball()\n return\n }\n }\n\n if (\n this.bareSpec.startsWith('https://') ||\n this.bareSpec.startsWith('http://')\n ) {\n this.remoteURL = this.bareSpec\n this.type = 'remote'\n return\n }\n\n // explicit file: url\n if (this.bareSpec.startsWith('file:')) {\n this.type = 'file'\n const [path, uri] = getNormalizeFile(\n this.constructor.nodejsDependencies,\n )(this.bareSpec, this)\n this.file = path\n this.bareSpec = uri.replace(/\\/+$/, '')\n this.spec = `${this.name}@${this.bareSpec}`\n return\n }\n\n // legacy! once upon a time, `user/project` was a shorthand for pulling\n // packages from github, instead of the more verbose and explicit\n // `github:user/project`.\n if (\n !this.bareSpec.startsWith('./') &&\n !this.bareSpec.startsWith('../') &&\n this.options['git-hosts'].github\n ) {\n const hash = this.bareSpec.indexOf('#')\n const up =\n hash === -1 ? this.bareSpec : this.bareSpec.substring(0, hash)\n if (up.split('/').length === 2) {\n this.bareSpec = `github:${this.bareSpec}`\n this.spec = `${this.name}@${this.bareSpec}`\n this.#parseHostedGit(\n 'github',\n this.options['git-hosts'].github,\n )\n this.type = 'git'\n return\n }\n }\n\n // if it contains a / and isn't picked up in the github shorthand,\n // then convert to file: specifier\n if (\n this.bareSpec.includes('/') ||\n this.bareSpec === '.' ||\n this.bareSpec === '..'\n ) {\n this.type = 'file'\n const [file, uri] = getNormalizeFile(\n this.constructor.nodejsDependencies,\n )(`file:${this.bareSpec}`, this)\n this.bareSpec = uri\n this.spec = `${this.name}@${this.bareSpec}`\n this.file = file\n return\n }\n\n // at this point, must be either semver range or dist-tag\n this.type = 'registry'\n const range = parseRange(this.bareSpec)\n if (range) {\n this.semver = this.bareSpec.trim()\n this.range = range\n } else {\n this.distTag = this.bareSpec\n }\n this.registrySpec = this.bareSpec\n const { 'scope-registries': scopeRegs, registry } = this.options\n const scopeReg = this.scope && scopeRegs[this.scope]\n this.registry = scopeReg ?? registry\n this.#guessRegistryTarball()\n }\n\n #parseScope(name: string) {\n if (!name.startsWith('@')) return\n const s = name.indexOf('/')\n if (s > 1 && s < name.length - 1) {\n const scope = name.substring(0, s) as Scope\n this.registry = this.scopeRegistry =\n this.options['scope-registries'][scope]\n this.scope = scope\n }\n }\n\n #parseHostedGit(name: string, template: string) {\n if (this.bareSpec.startsWith(`${name}:`)) {\n const h = this.bareSpec.indexOf('#')\n const bare =\n h === -1 ? this.bareSpec : this.bareSpec.substring(0, h)\n const hash = h === -1 ? '' : this.bareSpec.substring(h)\n const hostPath = bare.substring(name.length + 1)\n if (!hostPath) {\n throw error('invalid named git host specifier', {\n spec: this,\n })\n }\n const split = hostPath.split('/')\n let t = template\n for (let i = 0; i < split.length; i++) {\n t = t.split(`$${i + 1}`).join(split[i])\n }\n t += hash\n this.namedGitHost = name\n this.namedGitHostPath = hostPath\n this.#parseGitSelector(t)\n if (this.gitCommittish && !this.gitSelectorParsed?.path) {\n const archiveHost = this.options['git-host-archives'][name]\n if (archiveHost) {\n this.type = 'remote'\n let t = archiveHost\n t = t.split('$committish').join(this.gitCommittish)\n for (let i = 0; i < split.length; i++) {\n t = t.split(`$${i + 1}`).join(split[i])\n }\n this.remoteURL = t\n }\n }\n return true\n }\n return false\n }\n\n /* c8 ignore start */\n [kCustomInspect](): string {\n return `@vltpkg/spec.Spec ${String(this)}`\n }\n /* c8 ignore stop */\n\n #guessRegistryTarball() {\n // only try to guess if it's a single comparator for a single version\n const { name, registry, range } = this.final\n if (!registry || !range?.isSingle) return\n const stripScope = /^@[^/]+\\//\n this.conventionalRegistryTarball = String(\n new URL(\n `/${name}/-/${name.replace(stripScope, '')}-${range}.tgz`,\n registry,\n ),\n )\n }\n\n #parseRegistrySpec(s: string, url: string) {\n // note: this takes priority over the scoped registry, if set\n this.registry = url\n this.subspec = this.constructor.parse(s, {\n ...this.options,\n registry: url,\n })\n return this.subspec\n }\n\n #error(message: string, extra: ErrorCauseObject = {}) {\n return error(message, { spec: this.spec, ...extra }, this.#error)\n }\n\n #parseGitSelector(s: string) {\n const h = s.indexOf('#')\n if (h === -1) {\n this.gitRemote = s\n return\n }\n this.gitRemote = s.substring(0, h)\n this.gitSelector = s.substring(h + 1)\n const [selectorParsed, committish, range] =\n this.constructor.parseGitSelector(this.gitSelector, this)\n this.range = range\n this.gitCommittish = committish\n this.gitSelectorParsed = selectorParsed\n }\n\n /**\n * Should only ever be called with the bit that comes AFTER the #\n * in the git remote url.\n */\n static parseGitSelector(\n selector: string,\n spec?: Spec,\n ): [parsed: GitSelectorParsed, committish?: string, range?: Range] {\n if (!selector) return [{}]\n const split = selector.split('::')\n const first = split[0]\n let committish: string | undefined = undefined\n let range: Range | undefined = undefined\n const parsed: GitSelectorParsed = {}\n\n /* c8 ignore start - for TS's benefit */\n if (typeof first !== 'string') {\n throw typeError('impossible', {\n found: first,\n wanted: String,\n })\n }\n /* c8 ignore stop */\n if (!first.includes(':')) {\n committish = first\n split.shift()\n }\n for (const kv of split) {\n const c = kv.indexOf(':')\n /* c8 ignore next */\n if (c === -1) continue\n const k = kv.substring(0, c)\n const v = kv.substring(c + 1)\n if (k === 'semver') {\n if (committish) {\n throw error(\n 'Cannot specify a semver range and committish value',\n { spec },\n )\n }\n range = parseRange(v)\n if (!range) {\n throw error(`Invalid git tag semver range: ${v}`, { spec })\n }\n }\n if (k === 'semver' || k === 'path') {\n if (k === 'path') {\n if (\n /* c8 ignore next */ this.nodejsDependencies?.isAbsolute(\n v,\n ) ||\n /(^|\\/|\\\\)\\.\\.($|\\\\|\\/)/.test(v)\n ) {\n throw error('Invalid path in git selector', { spec })\n }\n // normalize\n /* c8 ignore start */\n parsed.path = (\n this.nodejsDependencies ?\n this.nodejsDependencies.join('/', v).substring(1)\n : v).replace(/\\\\/g, '/')\n /* c8 ignore stop */\n } else {\n parsed[k] = v\n }\n }\n }\n return [parsed, committish, range]\n }\n}\n\n// normalize our kinda-sorta spec compliant `file:` specifiers\n//\n// For historical reasons, we need to support a lot of non-spec-compliant\n// behaviors, but this massages the result into a *slightly* less offensive\n// shape.\n//\n// The result will be either a fully compliant `file://` with an absolute path,\n// or a `file:` with a relative path starting with `~`, `./`, or `../`.\nexport const getNormalizeFile =\n (opts?: NodeJSDependenciesOptions) =>\n (bareSpec: string, spec: Spec): [path: string, uri: string] => {\n const slashes = bareSpec.substring(\n 'file:'.length,\n 'file://'.length,\n )\n const pref = `file:${slashes === '//' ? slashes : ''}`\n const rest = bareSpec.substring(pref.length)\n\n // default to '/' because eol == '/' for parsing purposes\n const [a = '', b = '/', c = '/', d = '/'] = rest.split('', 4)\n\n if (!a) {\n // file:// => file:.\n // file: => file:.\n return ['.', 'file:.']\n }\n\n if (\n (a === '/' && b === '~' && c !== '/') ||\n (a === '~' && b !== '/')\n ) {\n throw error(\n `invalid file: specifier. '~username' not supported`,\n { spec },\n )\n }\n\n if (a === '~') {\n // file://~ => file:~\n // file://~/x => file:~/x\n return /* c8 ignore start */ opts ?\n [\n opts.resolve(opts.homedir(), rest.substring(2)),\n `file:${rest}`,\n ]\n : [rest, `file:${rest}`]\n }\n\n if (a === '/' && b === '~') {\n // file:///~ => file:~\n // file:/~/x => file:~/x\n /* c8 ignore start - tested in test/index.ts */\n return opts ?\n [\n opts.resolve(opts.homedir(), rest.substring(3)),\n `file:${rest.substring(1)}`,\n ]\n : /* c8 ignore stop */\n [rest.substring(1), `file:${rest.substring(1)}`]\n }\n\n if (\n a === '/' &&\n b === '.' &&\n (c === '/' || (c === '.' && d === '/'))\n ) {\n // file:/./x => file:./x\n // file:///./x => file:./x\n // file:/../x => file:../x\n // file://../x => file:../x\n return [rest.substring(1), `file:${rest.substring(1)}`]\n }\n\n if (a === '.' && (b === '/' || (b === '.' && c === '/'))) {\n // file://. => file:.\n // file://./x => file:./x\n // file://../x => file:../x\n return [rest, `file:${rest}`]\n }\n\n if (slashes === '//') {\n // must be valid URI, since we ruled out relative and homedir above\n\n // not relative, but note that file://host/share is\n // windows-specific and does not work on darwin, so disallow it.\n try {\n const parsed = new URL(bareSpec)\n if (parsed.host) {\n if (parsed.host !== 'localhost') {\n throw error(\n `invalid file:// specifier. host must be empty or 'localhost'`,\n {\n spec,\n found: parsed.host,\n validOptions: ['', 'localhost'],\n },\n )\n }\n }\n // normalize blank authority\n // file://X:/foo => file:///X:/foo\n // file://localhost/x => file:///x\n // interpret a `file:///D:/x` as `D:/x` though\n return [\n parsed.pathname.replace(/^\\/([a-zA-Z]:\\/)/, '$1'),\n `file://${parsed.pathname}`,\n ]\n } catch (er) {\n // invalid URI for other reasons, eg file://x\\u0000y/z\n throw error('invalid file:// specifier', {\n spec,\n cause: er,\n })\n }\n }\n\n // no //, no authority, be ungovernable\n\n /* c8 ignore start */\n if (opts?.winPath.isAbsolute(rest)) {\n // file:/absolute => file:///absolute\n // file:/D:/foo => file:///D:/foo\n return [rest, `file://${rest}`]\n }\n /* c8 ignore stop */\n\n // file:x => file:./x\n return [`./${rest}`, `file:./${rest}`]\n }\n"],
5
- "mappings": "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",
6
- "names": ["resolve", "major", "minor", "patch", "patch", "M", "m", "z", "parse", "parse", "parse", "parse", "range", "t", "Spec", "resolve"]
7
- }
package/chunk-PTVPYZHU.js DELETED
@@ -1,72 +0,0 @@
1
- var global = globalThis;
2
- import {Buffer} from "node:buffer";
3
- import {setImmediate, clearImmediate} from "node:timers";
4
- import {createRequire as _vlt_createRequire} from 'node:module';
5
- var require = _vlt_createRequire(import.meta.filename);
6
- import {
7
- getUser
8
- } from "./chunk-227OF2U2.js";
9
- import {
10
- PackageJson
11
- } from "./chunk-POVPHE2F.js";
12
-
13
- // ../../src/init/src/index.ts
14
- import { basename, resolve } from "node:path";
15
-
16
- // ../../src/init/src/get-author-from-git-user.ts
17
- var getAuthorFromGitUser = (user) => {
18
- if (!user) return "";
19
- const { name, email } = user;
20
- let res = "";
21
- if (name) res += name;
22
- if (email) {
23
- if (name) res += " ";
24
- res += `<${email}>`;
25
- }
26
- return res;
27
- };
28
-
29
- // ../../src/init/src/index.ts
30
- var stderr = console.error;
31
- var template = ({
32
- name,
33
- author
34
- }) => ({
35
- name,
36
- version: "1.0.0",
37
- description: "",
38
- main: "index.js",
39
- ...author ? { author } : void 0
40
- });
41
- var init = async ({
42
- cwd = process.cwd(),
43
- author,
44
- logger = stderr
45
- } = {}) => {
46
- const packageJson = new PackageJson();
47
- const path = resolve(cwd, "package.json");
48
- try {
49
- packageJson.read(cwd);
50
- logger("package.json already exists");
51
- return {};
52
- } catch (e) {
53
- const err = e;
54
- if (!!e && err.message !== "Could not read package.json file") {
55
- throw err;
56
- }
57
- const name = basename(cwd);
58
- const data = template({
59
- name,
60
- author: author ?? getAuthorFromGitUser(await getUser().catch(() => void 0))
61
- });
62
- const indent = 2;
63
- packageJson.write(cwd, data, indent);
64
- return { manifest: { path, data } };
65
- }
66
- };
67
-
68
- export {
69
- getAuthorFromGitUser,
70
- init
71
- };
72
- //# sourceMappingURL=chunk-PTVPYZHU.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/init/src/index.ts", "../../../src/init/src/get-author-from-git-user.ts"],
4
- "sourcesContent": ["import { getUser } from '@vltpkg/git'\nimport { PackageJson } from '@vltpkg/package-json'\nimport type { JSONObj } from '@vltpkg/registry-client'\nimport type { Manifest } from '@vltpkg/types'\nimport { basename, resolve } from 'node:path'\nimport { getAuthorFromGitUser } from './get-author-from-git-user.ts'\nexport { getAuthorFromGitUser }\n\n// eslint-disable-next-line no-console\nconst stderr: (...a: unknown[]) => void = console.error\n\nexport type InitOptions = {\n cwd?: string\n author?: string\n logger?: (...a: unknown[]) => void\n}\n\nexport type CustomizableInitOptions = {\n name: string\n author: string\n}\n\nconst template = ({\n name,\n author,\n}: CustomizableInitOptions): Manifest => ({\n name,\n version: '1.0.0',\n description: '',\n main: 'index.js',\n ...(author ? { author } : undefined),\n})\n\nexport type JSONFileInfo<T extends JSONObj = JSONObj> = {\n path: string\n data: T\n}\n\nexport type InitFileResults = {\n manifest?: JSONFileInfo<Manifest>\n // TODO: enable these if/when we do more than just the manifest\n // Eg:\n // workspaces?: JSONFileInfo\n // config?: JSONFileInfo\n}\n\nexport const init = async ({\n cwd = process.cwd(),\n author,\n logger = stderr,\n}: InitOptions = {}): Promise<InitFileResults> => {\n const packageJson = new PackageJson()\n const path = resolve(cwd, 'package.json')\n try {\n packageJson.read(cwd)\n // will only return here in case the package.json file does not exist\n logger('package.json already exists')\n return {}\n } catch (e) {\n const err = e as Error\n if (!!e && err.message !== 'Could not read package.json file') {\n throw err\n }\n\n const name = basename(cwd)\n const data = template({\n name,\n author:\n author ??\n getAuthorFromGitUser(await getUser().catch(() => undefined)),\n })\n const indent = 2\n packageJson.write(cwd, data, indent)\n return { manifest: { path, data } }\n }\n}\n", "import type { GitUser } from '@vltpkg/git'\n\nexport const getAuthorFromGitUser = (user?: GitUser): string => {\n if (!user) return ''\n const { name, email } = user\n let res = ''\n if (name) res += name\n if (email) {\n if (name) res += ' '\n res += `<${email}>`\n }\n return res\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAIA,SAAS,UAAU,eAAe;;;ACF3B,IAAM,uBAAuB,CAAC,SAA2B;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,EAAE,MAAM,MAAM,IAAI;AACxB,MAAI,MAAM;AACV,MAAI,KAAM,QAAO;AACjB,MAAI,OAAO;AACT,QAAI,KAAM,QAAO;AACjB,WAAO,IAAI,KAAK;AAAA,EAClB;AACA,SAAO;AACT;;;ADHA,IAAM,SAAoC,QAAQ;AAalD,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA;AACF,OAA0C;AAAA,EACxC;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,GAAI,SAAS,EAAE,OAAO,IAAI;AAC5B;AAeO,IAAM,OAAO,OAAO;AAAA,EACzB,MAAM,QAAQ,IAAI;AAAA,EAClB;AAAA,EACA,SAAS;AACX,IAAiB,CAAC,MAAgC;AAChD,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,OAAO,QAAQ,KAAK,cAAc;AACxC,MAAI;AACF,gBAAY,KAAK,GAAG;AAEpB,WAAO,6BAA6B;AACpC,WAAO,CAAC;AAAA,EACV,SAAS,GAAG;AACV,UAAM,MAAM;AACZ,QAAI,CAAC,CAAC,KAAK,IAAI,YAAY,oCAAoC;AAC7D,YAAM;AAAA,IACR;AAEA,UAAM,OAAO,SAAS,GAAG;AACzB,UAAM,OAAO,SAAS;AAAA,MACpB;AAAA,MACA,QACE,UACA,qBAAqB,MAAM,QAAQ,EAAE,MAAM,MAAM,MAAS,CAAC;AAAA,IAC/D,CAAC;AACD,UAAM,SAAS;AACf,gBAAY,MAAM,KAAK,MAAM,MAAM;AACnC,WAAO,EAAE,UAAU,EAAE,MAAM,KAAK,EAAE;AAAA,EACpC;AACF;",
6
- "names": []
7
- }