@vltpkg/dep-id 1.0.0-rc.8 → 1.0.0-rc.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { error } from '@vltpkg/error-cause';
2
- import { Spec } from '@vltpkg/spec/browser';
2
+ import { currentDefaultRegistryName, defaultRegistryName, Spec, } from '@vltpkg/spec/browser';
3
3
  export const delimiter = '·';
4
4
  const EXTRA_PEER_SET_DELIMITER = 'ṗ:';
5
5
  const depIDRegExp = new RegExp(`^((git)?${delimiter}[^${delimiter}]*${delimiter}[^${delimiter}]*(${delimiter}[^${delimiter}]*)?$` +
@@ -22,7 +22,7 @@ export const joinDepIDTuple = (list) => {
22
22
  const f = encode(first);
23
23
  switch (type) {
24
24
  case 'registry':
25
- return `${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`;
25
+ return `${delimiter}${f || defaultRegistryName}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`;
26
26
  case 'git':
27
27
  return `${type}${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`;
28
28
  default:
@@ -61,7 +61,7 @@ export const splitDepID = (id) => {
61
61
  }
62
62
  res = [
63
63
  type || 'registry',
64
- f,
64
+ f || defaultRegistryName,
65
65
  decodeURIComponent(second),
66
66
  decode(extra),
67
67
  ];
@@ -118,7 +118,7 @@ const seenHydratedTuples = new Map();
118
118
  export const hydrateTuple = (tuple, name, options = {}) => {
119
119
  const [type, first, second] = tuple;
120
120
  // memoized entries return early
121
- const cacheKey = (name ?? '') + type + first + (second ?? '');
121
+ const cacheKey = (name ?? '') + ',' + type + ',' + first + ',' + (second ?? '');
122
122
  const seen = seenHydratedTuples.get(cacheKey);
123
123
  if (seen)
124
124
  return seen;
@@ -152,33 +152,42 @@ export const hydrateTuple = (tuple, name, options = {}) => {
152
152
  found: tuple,
153
153
  });
154
154
  }
155
- if (!first) {
156
- // just a normal name@version on the default registry
157
- const s = Spec.parseArgs(second, options);
158
- if (name && s.name !== name) {
159
- res = Spec.parse(name, `npm:${second}`, options);
160
- }
161
- else {
162
- res = s;
163
- }
155
+ const defaultName = options.registry &&
156
+ currentDefaultRegistryName(options.registry, options);
157
+ const defaultRegistryURL = options.registry ?
158
+ options.registry.endsWith('/') ?
159
+ options.registry
160
+ : options.registry + '/'
161
+ : undefined;
162
+ const firstURL = first.endsWith('/') ? first : first + '/';
163
+ const hasScope = second.startsWith('@');
164
+ const hasAtVersion = second.includes('@', hasScope ? 1 : 0);
165
+ const name_ = (hasAtVersion && hasScope ?
166
+ `@${second.split('@')[1]}`
167
+ : second.split('@')[0]) /* c8 ignore next */ || '(unknown)';
168
+ const usesDefaultRegistry = !first ||
169
+ first === defaultName ||
170
+ firstURL === defaultRegistryURL;
171
+ const noAliasedNameUsed = !name || name === name_;
172
+ if (usesDefaultRegistry && noAliasedNameUsed) {
173
+ const version = (hasAtVersion &&
174
+ second.split('@')[hasScope ? 2 : 1]) /* c8 ignore next */ ||
175
+ second;
176
+ res = Spec.parse(name || name_, version, options);
164
177
  break;
165
178
  }
166
179
  if (!/^https?:\/\//.test(first)) {
167
180
  const reg = options.registries?.[first];
168
- if (first !== 'npm' && !reg) {
181
+ if (first !== defaultRegistryName && !reg) {
169
182
  throw error('named registry not found in options', {
170
183
  name: first,
171
184
  found: tuple,
172
185
  });
173
186
  }
174
- res = Spec.parse(name ?? '(unknown)', `${first}:${second}`, options);
187
+ res = Spec.parse(name || name_, `${first}:${second}`, options);
175
188
  break;
176
189
  }
177
- const s = Spec.parse(name ?? '(unknown)', `registry:${first}#${second}`, options);
178
- res =
179
- name && s.final.name !== name ?
180
- Spec.parse(s.final.name, s.bareSpec, options)
181
- : s;
190
+ res = Spec.parse(name || name_, `registry:${first}#${second}`, options);
182
191
  break;
183
192
  }
184
193
  case 'git': {
@@ -204,12 +213,32 @@ export const hydrateTuple = (tuple, name, options = {}) => {
204
213
  seenHydratedTuples.set(cacheKey, res);
205
214
  return res;
206
215
  };
207
- // Strip out the default registry, there's no need to store that
208
- const omitDefReg = (s) => (!s ||
209
- s === 'https://registry.npmjs.org' ||
210
- s === 'https://registry.npmjs.org/') ?
211
- ''
212
- : s;
216
+ const matchRegistryURL = (registry, registries) => {
217
+ // iterate on known registries to check if any known value
218
+ // matches the current default registry of this Spec value
219
+ for (const [alias, url] of Object.entries(registries)) {
220
+ // normalize trailing slash for comparison
221
+ const specRegURL = registry.endsWith('/') ? registry : registry + '/';
222
+ const knownRegURL = url.endsWith('/') ? url : url + '/';
223
+ if (specRegURL === knownRegURL) {
224
+ return alias;
225
+ }
226
+ }
227
+ };
228
+ /**
229
+ * Convert a Spec's registry URL to a known short registry name, if possible.
230
+ */
231
+ const convertToKnownShortRegistryName = (s, registry) => {
232
+ if (!s.registry)
233
+ return;
234
+ const reg = registry ?? s.registry;
235
+ const namedRegistry = matchRegistryURL(reg, s.options.registries);
236
+ if (namedRegistry)
237
+ return namedRegistry;
238
+ const namedJSRRegistry = matchRegistryURL(reg, s.options['jsr-registries']);
239
+ if (namedJSRRegistry)
240
+ return namedJSRRegistry;
241
+ };
213
242
  const seenTuples = new Map();
214
243
  /**
215
244
  * Get the {@link DepIDTuple} for a given {@link Spec} and {@link Manifest}.
@@ -220,6 +249,7 @@ const seenTuples = new Map();
220
249
  export const getTuple = (spec, mani, extra) => {
221
250
  // memoized entries return early
222
251
  const cacheKey = String(spec) +
252
+ (spec.registry ?? '') +
223
253
  (mani.name ?? '') +
224
254
  (mani.version ?? '') +
225
255
  (extra ?? '');
@@ -230,16 +260,6 @@ export const getTuple = (spec, mani, extra) => {
230
260
  const f = spec.final;
231
261
  switch (f.type) {
232
262
  case 'registry': {
233
- // try to shorten to a known name if we can.
234
- const reg = omitDefReg(f.registry);
235
- if (!f.namedRegistry && reg) {
236
- for (const [alias, host] of Object.entries(spec.options.registries)) {
237
- if (reg === host) {
238
- f.namedRegistry = alias;
239
- break;
240
- }
241
- }
242
- }
243
263
  const version = mani.version ?
244
264
  mani.version.startsWith('v') ?
245
265
  mani.version.slice(1)
@@ -247,7 +267,11 @@ export const getTuple = (spec, mani, extra) => {
247
267
  : f.bareSpec;
248
268
  res = [
249
269
  f.type,
250
- f.namedRegistry ?? reg,
270
+ f.namedRegistry ||
271
+ convertToKnownShortRegistryName(f, f.scopeRegistry) ||
272
+ f.scopeRegistry ||
273
+ f.registry ||
274
+ defaultRegistryName,
251
275
  `${isPackageNameConfused(spec, mani.name) ? spec.name : (mani.name ?? f.name)}@${version}`,
252
276
  extra,
253
277
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport type { Manifest } from '@vltpkg/types'\n\nexport const delimiter: Delimiter = '·'\nexport type Delimiter = '·'\nconst EXTRA_PEER_SET_DELIMITER = 'ṗ:'\n\n/**\n * Dependency IDs are a URI-encoded set of strings, separated\n * by the {@link Delimiter} character (`'·'`).\n *\n * The first entry is always the specifier type. The rest depend on the\n * type. `git`, `registry`, and `workspace` entries have 3 fields, the rest\n * have 2.\n *\n * - `registry`: `'registry·<registry>·name@specifier'`\n * The `<registry>` portion can be a known named registry name, or a\n * url to a registry. If empty, it is the default registry. Examples:\n * - `··some-package@2.0.1`\n * - `·npm·whatever@1.2.3`\n * - `·http%3A%2F%2Fvlt.sh%2F·x@1.2.3`\n * - `git`: `'git·<git remote>·<git selector>'`. For example:\n * - `git·github:user/project·branchname`\n * - `git·git%2Bssh%3A%2F%2Fuser%40host%3Aproject.git·semver:1.x`\n * - `workspace`: `'workspace·<path>'`. For example:\n * - `workspace·src/mything`\n * - `remote`: `'remote·<url>'`\n * - `file`: `'file·<path>'`\n *\n * Lastly, the final portion can contain arbitrary string data, and is\n * used to store peer dep resolutions to maintain the peerDep contract.\n */\nexport type DepID =\n | `${'' | 'git'}${Delimiter}${string}${Delimiter}${string}${Delimiter}${string}`\n | `${'' | 'git'}${Delimiter}${string}${Delimiter}${string}`\n | `${'file' | 'remote' | 'workspace'}${Delimiter}${string}${Delimiter}${string}`\n | `${'file' | 'remote' | 'workspace'}${Delimiter}${string}`\n\n/**\n * A {@link DepID}, split apart and URI-decoded\n */\nexport type DepIDTuple =\n | [\n type: 'git',\n gitRemote: string,\n gitSelector: string,\n extra?: string,\n ]\n | [\n type: 'registry',\n registry: string,\n registrySpec: string,\n extra?: string,\n ]\n | [type: 'file', path: string, extra?: string]\n | [type: 'remote', url: string, extra?: string]\n | [type: 'workspace', workspace: string, extra?: string]\n\nconst depIDRegExp = new RegExp(\n `^((git)?${delimiter}[^${delimiter}]*${delimiter}[^${delimiter}]*(${\n delimiter\n }[^${delimiter}]*)?$` +\n `|` +\n `^(file|remote|workspace)${delimiter}[^${\n delimiter\n }]*)(${delimiter}[^${delimiter}]*)?$`,\n)\n\nexport const isDepID = (str: unknown): str is DepID =>\n typeof str === 'string' && depIDRegExp.test(str)\n\nexport const asDepID = (str: string): DepID => {\n if (!isDepID(str)) {\n throw error('Expected dep id', {\n found: str,\n })\n }\n return str\n}\n\n/**\n * turn a {@link DepIDTuple} into a {@link DepID}\n */\nexport const joinDepIDTuple = (list: DepIDTuple): DepID => {\n const [type, first, second, extra] = list\n const f = encode(first)\n switch (type) {\n case 'registry':\n return `${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`\n case 'git':\n return `${type}${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`\n default:\n return `${type}${delimiter}${f}${second ? `${delimiter}${encode(second)}` : ''}`\n }\n}\n\n// allow @, but otherwise, escape everything urls do\nconst encode = (s?: string) =>\n s ?\n encodeURIComponent(s)\n .replaceAll('%40', '@')\n .replaceAll('%2f', '§')\n .replaceAll('%2F', '§')\n : s\n\nconst decode = (s?: string) =>\n s ?\n decodeURIComponent(\n s.replaceAll('@', '%40').replaceAll('§', '%2F'),\n )\n : s\n\nconst seenSplitDepIDs = new Map<string, DepIDTuple>()\n/**\n * turn a {@link DepID} into a {@link DepIDTuple}\n */\nexport const splitDepID = (id: string): DepIDTuple => {\n // memoized entries return early\n const seen = seenSplitDepIDs.get(id)\n if (seen) return seen\n\n let res: DepIDTuple\n const [type, first = '', second, extra] = id\n .replaceAll('§', '/')\n .split(delimiter, 4)\n const f = decodeURIComponent(first)\n switch (type) {\n case 'git':\n case '': {\n if (second === undefined) {\n throw error(`invalid ${type} id`, { found: id })\n }\n res = [\n type || 'registry',\n f,\n decodeURIComponent(second),\n decode(extra),\n ]\n break\n }\n case 'file':\n case 'remote':\n case 'workspace': {\n res = [type, f, decode(second)]\n break\n }\n default: {\n throw error('invalid DepID type', {\n found: type,\n validOptions: ['git', 'file', 'workspace', 'remote', ''],\n })\n }\n }\n seenSplitDepIDs.set(id, res)\n return res\n}\n\n/**\n * Retrieves the base {@link DepID} for a given depID,\n * ignoring any extra information that may be present.\n */\nexport const baseDepID = (id: string): DepID => {\n const [type, first, second] = splitDepID(id)\n switch (type) {\n case 'git':\n case 'registry':\n return joinDepIDTuple([type, first, second])\n default:\n return joinDepIDTuple([type, first])\n }\n}\n\nconst seenHydrated = new Map<string, Spec>()\n/**\n * Turn a {@link DepID} into a {@link Spec} object\n */\nexport const hydrate = (\n id: DepID,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n // memozied entries return early\n const cacheKey = (name ?? '') + id\n const seen = seenHydrated.get(cacheKey)\n if (seen) return seen\n\n const res = hydrateTuple(splitDepID(id), name, options)\n seenHydrated.set(cacheKey, res)\n return res\n}\n\nconst seenHydratedTuples = new Map<string, Spec>()\n/**\n * Turn a {@link DepIDTuple} into a {@link Spec} object\n */\nexport const hydrateTuple = (\n tuple: DepIDTuple,\n name?: string,\n options: SpecOptions = {},\n) => {\n const [type, first, second] = tuple\n\n // memoized entries return early\n const cacheKey = (name ?? '') + type + first + (second ?? '')\n const seen = seenHydratedTuples.get(cacheKey)\n if (seen) return seen\n\n let res: Spec\n switch (type) {\n case 'remote': {\n if (!first)\n throw error('no remoteURL found on remote id', {\n found: tuple,\n })\n res = Spec.parse(name ?? '(unknown)', first, options)\n break\n }\n case 'file': {\n if (!first) {\n throw error('no file path found on remote id', {\n found: tuple,\n })\n }\n res = Spec.parse(name ?? '(unknown)', `file:${first}`, options)\n break\n }\n case 'registry': {\n if (typeof first !== 'string') {\n throw error('no registry url or name in registry ID', {\n found: tuple,\n })\n }\n if (!second) {\n throw error('no name/specifier in registry ID', {\n found: tuple,\n })\n }\n if (!first) {\n // just a normal name@version on the default registry\n const s = Spec.parseArgs(second, options)\n if (name && s.name !== name) {\n res = Spec.parse(name, `npm:${second}`, options)\n } else {\n res = s\n }\n break\n }\n if (!/^https?:\\/\\//.test(first)) {\n const reg = options.registries?.[first]\n if (first !== 'npm' && !reg) {\n throw error('named registry not found in options', {\n name: first,\n found: tuple,\n })\n }\n res = Spec.parse(\n name ?? '(unknown)',\n `${first}:${second}`,\n options,\n )\n break\n }\n const s = Spec.parse(\n name ?? '(unknown)',\n `registry:${first}#${second}`,\n options,\n )\n res =\n name && s.final.name !== name ?\n Spec.parse(s.final.name, s.bareSpec, options)\n : s\n break\n }\n case 'git': {\n if (!first) {\n throw error('no git remote in git ID', {\n found: tuple,\n })\n }\n res = Spec.parse(\n name ?? '(unknown)',\n first + '#' + second,\n options,\n )\n break\n }\n case 'workspace': {\n if (!first) {\n throw error('no name/path on workspace id', { found: tuple })\n }\n res =\n name && name !== first ?\n Spec.parse(name, `workspace:${first}@*`, options)\n : Spec.parse(first, `workspace:*`, options)\n break\n }\n }\n seenHydratedTuples.set(cacheKey, res)\n return res\n}\n\n// Strip out the default registry, there's no need to store that\nconst omitDefReg = (s?: string): string =>\n (\n !s ||\n s === 'https://registry.npmjs.org' ||\n s === 'https://registry.npmjs.org/'\n ) ?\n ''\n : s\n\nconst seenTuples = new Map<string, DepIDTuple>()\n/**\n * Get the {@link DepIDTuple} for a given {@link Spec} and {@link Manifest}.\n * The Manifest is used to get the name and version, if possible. If not found\n * in the manifest, registry ID types will use the name or bareSpec from the\n * specifier, so at least there's something to use later.\n */\nexport const getTuple = (\n spec: Spec,\n mani: Pick<Manifest, 'name' | 'version'>,\n extra?: string,\n): DepIDTuple => {\n // memoized entries return early\n const cacheKey =\n String(spec) +\n (mani.name ?? '') +\n (mani.version ?? '') +\n (extra ?? '')\n const seen = seenTuples.get(cacheKey)\n if (seen) return seen\n\n let res: DepIDTuple\n const f = spec.final\n switch (f.type) {\n case 'registry': {\n // try to shorten to a known name if we can.\n const reg = omitDefReg(f.registry)\n if (!f.namedRegistry && reg) {\n for (const [alias, host] of Object.entries(\n spec.options.registries,\n )) {\n if (reg === host) {\n f.namedRegistry = alias\n break\n }\n }\n }\n const version =\n mani.version ?\n mani.version.startsWith('v') ?\n mani.version.slice(1)\n : mani.version\n : f.bareSpec\n res = [\n f.type,\n f.namedRegistry ?? reg,\n `${isPackageNameConfused(spec, mani.name) ? spec.name : (mani.name ?? f.name)}@${version}`,\n extra,\n ]\n break\n }\n case 'git': {\n const {\n namedGitHost,\n namedGitHostPath,\n gitRemote,\n gitSelector = '',\n } = f\n if (!gitRemote)\n throw error('no host on git specifier', { spec })\n if (namedGitHost) {\n if (!namedGitHostPath) {\n throw error('named git host without path portion', {\n spec,\n })\n }\n res = [\n f.type,\n `${namedGitHost}:${namedGitHostPath}`,\n gitSelector,\n extra,\n ]\n break\n } else {\n res = [f.type, gitRemote, gitSelector, extra]\n }\n break\n }\n case 'remote': {\n const { remoteURL } = f\n if (!remoteURL)\n throw error('no URL on remote specifier', { spec })\n res = [f.type, remoteURL, extra]\n break\n }\n case 'file':\n case 'workspace':\n throw error('Path-based dep ids are not supported', { spec })\n }\n seenTuples.set(cacheKey, res)\n return res\n}\n\n/**\n * Checks for a potentially manifest-confused package name.\n * Returns `true` if the package name is confused, `false` otherwise.\n */\nexport const isPackageNameConfused = (spec?: Spec, name?: string) =>\n !!spec?.name && // a nameless spec can't be checked\n !spec.subspec && // it's not an aliased package or using a custom protocol\n spec.type === 'registry' && // the defined spec is of type registry\n spec.name !== name // its name is not the same as the defined spec name\n\n/**\n * Get the {@link DepID} for a given {@link Spec} and {@link Manifest}. The\n * Manifest is used to get the name and version, if possible. If not found in\n * the manifest, registry ID types will use the name or bareSpec from the\n * specifier, so at least there's something to use later.\n */\nexport const getId = (\n spec: Spec,\n mani: Pick<Manifest, 'name' | 'version'>,\n extra?: string,\n): DepID => joinDepIDTuple(getTuple(spec, mani, extra))\n\n/**\n * Join a modifier and a peer set hash into a single \"extra\" string.\n */\nexport function joinExtra({\n modifier,\n peerSetHash,\n}: {\n modifier?: string\n peerSetHash?: string\n}): string | undefined {\n if (!modifier && !peerSetHash) return\n if (modifier && peerSetHash) return `${modifier}${peerSetHash}`\n if (modifier) return modifier\n return peerSetHash\n}\n\n/**\n * Split an \"extra\" string into a modifier and a peerSetHash.\n */\nexport function splitExtra(extra: string): {\n modifier?: string\n peerSetHash?: string\n} {\n if (!extra) return {}\n\n // only peerSetHash is present, return it\n if (extra.startsWith(EXTRA_PEER_SET_DELIMITER)) {\n return { peerSetHash: extra }\n }\n\n // only modifier is present, return its value\n const idx = extra.indexOf(EXTRA_PEER_SET_DELIMITER)\n if (idx === -1) {\n return { modifier: extra }\n }\n\n // Both modifier and peerSetHash are present\n return {\n modifier: extra.slice(0, idx),\n peerSetHash: extra.slice(idx),\n }\n}\n\n/**\n * Reset internal caches. This should be used when options change since\n * they're not take into account in the memoization keys.\n */\nexport const resetCaches = () => {\n seenHydrated.clear()\n seenHydratedTuples.clear()\n seenSplitDepIDs.clear()\n seenTuples.clear()\n}\n"]}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport {\n currentDefaultRegistryName,\n defaultRegistryName,\n Spec,\n} from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport type { Manifest } from '@vltpkg/types'\n\nexport const delimiter: Delimiter = '·'\nexport type Delimiter = '·'\nconst EXTRA_PEER_SET_DELIMITER = 'ṗ:'\n\n/**\n * Dependency IDs are a URI-encoded set of strings, separated\n * by the {@link Delimiter} character (`'·'`).\n *\n * The first entry is always the specifier type. The rest depend on the\n * type. `git`, `registry`, and `workspace` entries have 3 fields, the rest\n * have 2.\n *\n * - `registry`: `'registry·<registry>·name@specifier'`\n * The `<registry>` portion can be a known named registry name, or a\n * url to a registry. If empty, it is the default registry. Examples:\n * - `··some-package@2.0.1`\n * - `·npm·whatever@1.2.3`\n * - `·http%3A%2F%2Fvlt.sh%2F·x@1.2.3`\n * - `git`: `'git·<git remote>·<git selector>'`. For example:\n * - `git·github:user/project·branchname`\n * - `git·git%2Bssh%3A%2F%2Fuser%40host%3Aproject.git·semver:1.x`\n * - `workspace`: `'workspace·<path>'`. For example:\n * - `workspace·src/mything`\n * - `remote`: `'remote·<url>'`\n * - `file`: `'file·<path>'`\n *\n * Lastly, the final portion can contain arbitrary string data, and is\n * used to store peer dep resolutions to maintain the peerDep contract.\n */\nexport type DepID =\n | `${'' | 'git'}${Delimiter}${string}${Delimiter}${string}${Delimiter}${string}`\n | `${'' | 'git'}${Delimiter}${string}${Delimiter}${string}`\n | `${'file' | 'remote' | 'workspace'}${Delimiter}${string}${Delimiter}${string}`\n | `${'file' | 'remote' | 'workspace'}${Delimiter}${string}`\n\n/**\n * A {@link DepID}, split apart and URI-decoded\n */\nexport type DepIDTuple =\n | [\n type: 'git',\n gitRemote: string,\n gitSelector: string,\n extra?: string,\n ]\n | [\n type: 'registry',\n registry: string,\n registrySpec: string,\n extra?: string,\n ]\n | [type: 'file', path: string, extra?: string]\n | [type: 'remote', url: string, extra?: string]\n | [type: 'workspace', workspace: string, extra?: string]\n\nconst depIDRegExp = new RegExp(\n `^((git)?${delimiter}[^${delimiter}]*${delimiter}[^${delimiter}]*(${\n delimiter\n }[^${delimiter}]*)?$` +\n `|` +\n `^(file|remote|workspace)${delimiter}[^${\n delimiter\n }]*)(${delimiter}[^${delimiter}]*)?$`,\n)\n\nexport const isDepID = (str: unknown): str is DepID =>\n typeof str === 'string' && depIDRegExp.test(str)\n\nexport const asDepID = (str: string): DepID => {\n if (!isDepID(str)) {\n throw error('Expected dep id', {\n found: str,\n })\n }\n return str\n}\n\n/**\n * turn a {@link DepIDTuple} into a {@link DepID}\n */\nexport const joinDepIDTuple = (list: DepIDTuple): DepID => {\n const [type, first, second, extra] = list\n const f = encode(first)\n switch (type) {\n case 'registry':\n return `${delimiter}${f || defaultRegistryName}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`\n case 'git':\n return `${type}${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`\n default:\n return `${type}${delimiter}${f}${second ? `${delimiter}${encode(second)}` : ''}`\n }\n}\n\n// allow @, but otherwise, escape everything urls do\nconst encode = (s?: string) =>\n s ?\n encodeURIComponent(s)\n .replaceAll('%40', '@')\n .replaceAll('%2f', '§')\n .replaceAll('%2F', '§')\n : s\n\nconst decode = (s?: string) =>\n s ?\n decodeURIComponent(\n s.replaceAll('@', '%40').replaceAll('§', '%2F'),\n )\n : s\n\nconst seenSplitDepIDs = new Map<string, DepIDTuple>()\n/**\n * turn a {@link DepID} into a {@link DepIDTuple}\n */\nexport const splitDepID = (id: string): DepIDTuple => {\n // memoized entries return early\n const seen = seenSplitDepIDs.get(id)\n if (seen) return seen\n\n let res: DepIDTuple\n const [type, first = '', second, extra] = id\n .replaceAll('§', '/')\n .split(delimiter, 4)\n const f = decodeURIComponent(first)\n switch (type) {\n case 'git':\n case '': {\n if (second === undefined) {\n throw error(`invalid ${type} id`, { found: id })\n }\n res = [\n type || 'registry',\n f || defaultRegistryName,\n decodeURIComponent(second),\n decode(extra),\n ]\n break\n }\n case 'file':\n case 'remote':\n case 'workspace': {\n res = [type, f, decode(second)]\n break\n }\n default: {\n throw error('invalid DepID type', {\n found: type,\n validOptions: ['git', 'file', 'workspace', 'remote', ''],\n })\n }\n }\n seenSplitDepIDs.set(id, res)\n return res\n}\n\n/**\n * Retrieves the base {@link DepID} for a given depID,\n * ignoring any extra information that may be present.\n */\nexport const baseDepID = (id: string): DepID => {\n const [type, first, second] = splitDepID(id)\n switch (type) {\n case 'git':\n case 'registry':\n return joinDepIDTuple([type, first, second])\n default:\n return joinDepIDTuple([type, first])\n }\n}\n\nconst seenHydrated = new Map<string, Spec>()\n/**\n * Turn a {@link DepID} into a {@link Spec} object\n */\nexport const hydrate = (\n id: DepID,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n // memozied entries return early\n const cacheKey = (name ?? '') + id\n const seen = seenHydrated.get(cacheKey)\n if (seen) return seen\n\n const res = hydrateTuple(splitDepID(id), name, options)\n seenHydrated.set(cacheKey, res)\n return res\n}\n\nconst seenHydratedTuples = new Map<string, Spec>()\n/**\n * Turn a {@link DepIDTuple} into a {@link Spec} object\n */\nexport const hydrateTuple = (\n tuple: DepIDTuple,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n const [type, first, second] = tuple\n\n // memoized entries return early\n const cacheKey =\n (name ?? '') + ',' + type + ',' + first + ',' + (second ?? '')\n const seen = seenHydratedTuples.get(cacheKey)\n if (seen) return seen\n\n let res: Spec\n switch (type) {\n case 'remote': {\n if (!first)\n throw error('no remoteURL found on remote id', {\n found: tuple,\n })\n res = Spec.parse(name ?? '(unknown)', first, options)\n break\n }\n case 'file': {\n if (!first) {\n throw error('no file path found on remote id', {\n found: tuple,\n })\n }\n res = Spec.parse(name ?? '(unknown)', `file:${first}`, options)\n break\n }\n case 'registry': {\n if (typeof first !== 'string') {\n throw error('no registry url or name in registry ID', {\n found: tuple,\n })\n }\n if (!second) {\n throw error('no name/specifier in registry ID', {\n found: tuple,\n })\n }\n const defaultName =\n options.registry &&\n currentDefaultRegistryName(options.registry, options)\n const defaultRegistryURL =\n options.registry ?\n options.registry.endsWith('/') ?\n options.registry\n : options.registry + '/'\n : undefined\n const firstURL = first.endsWith('/') ? first : first + '/'\n const hasScope = second.startsWith('@')\n const hasAtVersion = second.includes('@', hasScope ? 1 : 0)\n const name_ =\n (hasAtVersion && hasScope ?\n `@${second.split('@')[1]}`\n : second.split('@')[0]) /* c8 ignore next */ || '(unknown)'\n const usesDefaultRegistry =\n !first ||\n first === defaultName ||\n firstURL === defaultRegistryURL\n const noAliasedNameUsed = !name || name === name_\n if (usesDefaultRegistry && noAliasedNameUsed) {\n const version =\n (hasAtVersion &&\n second.split('@')[\n hasScope ? 2 : 1\n ]) /* c8 ignore next */ ||\n second\n res = Spec.parse(name || name_, version, options)\n break\n }\n if (!/^https?:\\/\\//.test(first)) {\n const reg = options.registries?.[first]\n if (first !== defaultRegistryName && !reg) {\n throw error('named registry not found in options', {\n name: first,\n found: tuple,\n })\n }\n res = Spec.parse(name || name_, `${first}:${second}`, options)\n break\n }\n res = Spec.parse(\n name || name_,\n `registry:${first}#${second}`,\n options,\n )\n break\n }\n case 'git': {\n if (!first) {\n throw error('no git remote in git ID', {\n found: tuple,\n })\n }\n res = Spec.parse(\n name ?? '(unknown)',\n first + '#' + second,\n options,\n )\n break\n }\n case 'workspace': {\n if (!first) {\n throw error('no name/path on workspace id', { found: tuple })\n }\n res =\n name && name !== first ?\n Spec.parse(name, `workspace:${first}@*`, options)\n : Spec.parse(first, `workspace:*`, options)\n break\n }\n }\n seenHydratedTuples.set(cacheKey, res)\n return res\n}\n\nconst matchRegistryURL = (\n registry: string,\n registries: Record<string, string>,\n): string | undefined => {\n // iterate on known registries to check if any known value\n // matches the current default registry of this Spec value\n for (const [alias, url] of Object.entries(registries)) {\n // normalize trailing slash for comparison\n const specRegURL =\n registry.endsWith('/') ? registry : registry + '/'\n const knownRegURL = url.endsWith('/') ? url : url + '/'\n if (specRegURL === knownRegURL) {\n return alias\n }\n }\n}\n\n/**\n * Convert a Spec's registry URL to a known short registry name, if possible.\n */\nconst convertToKnownShortRegistryName = (\n s: Spec,\n registry?: string,\n): string | undefined => {\n if (!s.registry) return\n const reg = registry ?? s.registry\n const namedRegistry = matchRegistryURL(reg, s.options.registries)\n if (namedRegistry) return namedRegistry\n\n const namedJSRRegistry = matchRegistryURL(\n reg,\n s.options['jsr-registries'],\n )\n if (namedJSRRegistry) return namedJSRRegistry\n}\n\nconst seenTuples = new Map<string, DepIDTuple>()\n/**\n * Get the {@link DepIDTuple} for a given {@link Spec} and {@link Manifest}.\n * The Manifest is used to get the name and version, if possible. If not found\n * in the manifest, registry ID types will use the name or bareSpec from the\n * specifier, so at least there's something to use later.\n */\nexport const getTuple = (\n spec: Spec,\n mani: Pick<Manifest, 'name' | 'version'>,\n extra?: string,\n): DepIDTuple => {\n // memoized entries return early\n const cacheKey =\n String(spec) +\n (spec.registry ?? '') +\n (mani.name ?? '') +\n (mani.version ?? '') +\n (extra ?? '')\n const seen = seenTuples.get(cacheKey)\n if (seen) return seen\n\n let res: DepIDTuple\n const f = spec.final\n switch (f.type) {\n case 'registry': {\n const version =\n mani.version ?\n mani.version.startsWith('v') ?\n mani.version.slice(1)\n : mani.version\n : f.bareSpec\n res = [\n f.type,\n f.namedRegistry ||\n convertToKnownShortRegistryName(f, f.scopeRegistry) ||\n f.scopeRegistry ||\n f.registry ||\n defaultRegistryName,\n `${isPackageNameConfused(spec, mani.name) ? spec.name : (mani.name ?? f.name)}@${version}`,\n extra,\n ]\n break\n }\n case 'git': {\n const {\n namedGitHost,\n namedGitHostPath,\n gitRemote,\n gitSelector = '',\n } = f\n if (!gitRemote)\n throw error('no host on git specifier', { spec })\n if (namedGitHost) {\n if (!namedGitHostPath) {\n throw error('named git host without path portion', {\n spec,\n })\n }\n res = [\n f.type,\n `${namedGitHost}:${namedGitHostPath}`,\n gitSelector,\n extra,\n ]\n break\n } else {\n res = [f.type, gitRemote, gitSelector, extra]\n }\n break\n }\n case 'remote': {\n const { remoteURL } = f\n if (!remoteURL)\n throw error('no URL on remote specifier', { spec })\n res = [f.type, remoteURL, extra]\n break\n }\n case 'file':\n case 'workspace':\n throw error('Path-based dep ids are not supported', { spec })\n }\n seenTuples.set(cacheKey, res)\n return res\n}\n\n/**\n * Checks for a potentially manifest-confused package name.\n * Returns `true` if the package name is confused, `false` otherwise.\n */\nexport const isPackageNameConfused = (spec?: Spec, name?: string) =>\n !!spec?.name && // a nameless spec can't be checked\n !spec.subspec && // it's not an aliased package or using a custom protocol\n spec.type === 'registry' && // the defined spec is of type registry\n spec.name !== name // its name is not the same as the defined spec name\n\n/**\n * Get the {@link DepID} for a given {@link Spec} and {@link Manifest}. The\n * Manifest is used to get the name and version, if possible. If not found in\n * the manifest, registry ID types will use the name or bareSpec from the\n * specifier, so at least there's something to use later.\n */\nexport const getId = (\n spec: Spec,\n mani: Pick<Manifest, 'name' | 'version'>,\n extra?: string,\n): DepID => joinDepIDTuple(getTuple(spec, mani, extra))\n\n/**\n * Join a modifier and a peer set hash into a single \"extra\" string.\n */\nexport function joinExtra({\n modifier,\n peerSetHash,\n}: {\n modifier?: string\n peerSetHash?: string\n}): string | undefined {\n if (!modifier && !peerSetHash) return\n if (modifier && peerSetHash) return `${modifier}${peerSetHash}`\n if (modifier) return modifier\n return peerSetHash\n}\n\n/**\n * Split an \"extra\" string into a modifier and a peerSetHash.\n */\nexport function splitExtra(extra: string): {\n modifier?: string\n peerSetHash?: string\n} {\n if (!extra) return {}\n\n // only peerSetHash is present, return it\n if (extra.startsWith(EXTRA_PEER_SET_DELIMITER)) {\n return { peerSetHash: extra }\n }\n\n // only modifier is present, return its value\n const idx = extra.indexOf(EXTRA_PEER_SET_DELIMITER)\n if (idx === -1) {\n return { modifier: extra }\n }\n\n // Both modifier and peerSetHash are present\n return {\n modifier: extra.slice(0, idx),\n peerSetHash: extra.slice(idx),\n }\n}\n\n/**\n * Reset internal caches. This should be used when options change since\n * they're not take into account in the memoization keys.\n */\nexport const resetCaches = () => {\n seenHydrated.clear()\n seenHydratedTuples.clear()\n seenSplitDepIDs.clear()\n seenTuples.clear()\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAQrD,cAAc,cAAc,CAAA;AAG5B;;;GAGG;AAEH,eAAO,MAAM,OAAO,OACd,KAAK,SACF,MAAM,YACJ,WAAW,KACnB,IAQF,CAAA;AAGD;;;GAGG;AAEH,eAAO,MAAM,YAAY,UAChB,UAAU,SACV,MAAM,YACJ,WAAW,KACnB,IAoGF,CAAA;AAED;;;GAGG;AAEH,eAAO,MAAM,WAAW,YAIvB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,IAAI,EACL,MAAM,cAAc,CAAA;AAKrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAQrD,cAAc,cAAc,CAAA;AAG5B;;;GAGG;AAEH,eAAO,MAAM,OAAO,OACd,KAAK,SACF,MAAM,YACJ,WAAW,KACnB,IAQF,CAAA;AAGD;;;GAGG;AAEH,eAAO,MAAM,YAAY,UAChB,UAAU,SACV,MAAM,YACJ,WAAW,KACnB,IAkHF,CAAA;AAED;;;GAGG;AAEH,eAAO,MAAM,WAAW,YAIvB,CAAA"}
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { error } from '@vltpkg/error-cause';
2
- import { Spec } from '@vltpkg/spec';
2
+ import { currentDefaultRegistryName, defaultRegistryName, Spec, } from '@vltpkg/spec';
3
3
  import { resetCaches as browserResetCaches, splitDepID, } from "./browser.js";
4
4
  // Here we re-export the browser-specific parts of the implementation
5
5
  // we disable the eslint rules for import/export since we are intentionally
@@ -33,7 +33,7 @@ const seenHydratedTuples = new Map();
33
33
  export const hydrateTuple = (tuple, name, options = {}) => {
34
34
  const [type, first, second] = tuple;
35
35
  // memoized entries return early
36
- const cacheKey = (name ?? '') + type + first + (second ?? '');
36
+ const cacheKey = (name ?? '') + ',' + type + ',' + first + ',' + (second ?? '');
37
37
  const seen = seenHydratedTuples.get(cacheKey);
38
38
  if (seen)
39
39
  return seen;
@@ -44,7 +44,7 @@ export const hydrateTuple = (tuple, name, options = {}) => {
44
44
  throw error('no remoteURL found on remote id', {
45
45
  found: tuple,
46
46
  });
47
- res = Spec.parse(name ?? '(unknown)', first);
47
+ res = Spec.parse(name ?? '(unknown)', first, options);
48
48
  break;
49
49
  }
50
50
  case 'file': {
@@ -67,33 +67,42 @@ export const hydrateTuple = (tuple, name, options = {}) => {
67
67
  found: tuple,
68
68
  });
69
69
  }
70
- if (!first) {
71
- // just a normal name@version on the default registry
72
- const s = Spec.parse(second);
73
- if (name && s.name !== name) {
74
- res = Spec.parse(`${name}@npm:${second}`);
75
- }
76
- else {
77
- res = s;
78
- }
70
+ const defaultName = options.registry &&
71
+ currentDefaultRegistryName(options.registry, options);
72
+ const defaultRegistryURL = options.registry ?
73
+ options.registry.endsWith('/') ?
74
+ options.registry
75
+ : options.registry + '/'
76
+ : undefined;
77
+ const firstURL = first.endsWith('/') ? first : first + '/';
78
+ const hasScope = second.startsWith('@');
79
+ const hasAtVersion = second.includes('@', hasScope ? 1 : 0);
80
+ const name_ = (hasAtVersion && hasScope ?
81
+ `@${second.split('@')[1]}`
82
+ : second.split('@')[0]) /* c8 ignore next */ || '(unknown)';
83
+ const usesDefaultRegistry = !first ||
84
+ first === defaultName ||
85
+ firstURL === defaultRegistryURL;
86
+ const noAliasedNameUsed = !name || name === name_;
87
+ if (usesDefaultRegistry && noAliasedNameUsed) {
88
+ const version = (hasAtVersion &&
89
+ second.split('@')[hasScope ? 2 : 1]) /* c8 ignore next */ ||
90
+ second;
91
+ res = Spec.parse(name || name_, version, options);
79
92
  break;
80
93
  }
81
94
  if (!/^https?:\/\//.test(first)) {
82
95
  const reg = options.registries?.[first];
83
- if (first !== 'npm' && !reg) {
96
+ if (first !== defaultRegistryName && !reg) {
84
97
  throw error('named registry not found in options', {
85
98
  name: first,
86
99
  found: tuple,
87
100
  });
88
101
  }
89
- res = Spec.parse(name ?? '(unknown)', `${first}:${second}`, options);
102
+ res = Spec.parse(name || name_, `${first}:${second}`, options);
90
103
  break;
91
104
  }
92
- const s = Spec.parse(name ?? '(unknown)', `registry:${first}#${second}`, options);
93
- res =
94
- name && s.final.name !== name ?
95
- Spec.parse(s.final.name + '@' + s.bareSpec)
96
- : s;
105
+ res = Spec.parse(name || name_, `registry:${first}#${second}`, options);
97
106
  break;
98
107
  }
99
108
  case 'git': {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { Spec } from '@vltpkg/spec'\nimport {\n resetCaches as browserResetCaches,\n splitDepID,\n} from './browser.ts'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { DepID, DepIDTuple } from './browser.ts'\n\n// Here we re-export the browser-specific parts of the implementation\n// we disable the eslint rules for import/export since we are intentionally\n// re-exporting the `hydrate` and `hydrateTuple` functions to make sure they\n// use the Node.js-specific `Spec.parse` method that relies on internal node\n// modules like `util` and `path` that are not isomorphic.\n// eslint-disable-next-line import/export\nexport * from './browser.ts'\n\nconst seenHydrated = new Map<string, Spec>()\n/**\n * Turn a {@link DepID} into a {@link Spec} object using\n * the Node.js-specific `Spec.parse` method.\n */\n// eslint-disable-next-line import/export\nexport const hydrate = (\n id: DepID,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n // memoized entries return early\n const cacheKey = (name ?? '') + id\n const seen = seenHydrated.get(cacheKey)\n if (seen) return seen\n const res = hydrateTuple(splitDepID(id), name, options)\n seenHydrated.set(cacheKey, res)\n return res\n}\n\nconst seenHydratedTuples = new Map<string, Spec>()\n/**\n * Turn a {@link DepIDTuple} into a {@link Spec} object using\n * the Node.js-specific `Spec.parse` method.\n */\n// eslint-disable-next-line import/export\nexport const hydrateTuple = (\n tuple: DepIDTuple,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n const [type, first, second] = tuple\n\n // memoized entries return early\n const cacheKey = (name ?? '') + type + first + (second ?? '')\n const seen = seenHydratedTuples.get(cacheKey)\n if (seen) return seen\n\n let res: Spec\n switch (type) {\n case 'remote': {\n if (!first)\n throw error('no remoteURL found on remote id', {\n found: tuple,\n })\n res = Spec.parse(name ?? '(unknown)', first)\n break\n }\n case 'file': {\n if (!first) {\n throw error('no file path found on remote id', {\n found: tuple,\n })\n }\n res = Spec.parse(name ?? '(unknown)', `file:${first}`, options)\n break\n }\n case 'registry': {\n if (typeof first !== 'string') {\n throw error('no registry url or name in registry ID', {\n found: tuple,\n })\n }\n if (!second) {\n throw error('no name/specifier in registry ID', {\n found: tuple,\n })\n }\n if (!first) {\n // just a normal name@version on the default registry\n const s = Spec.parse(second)\n if (name && s.name !== name) {\n res = Spec.parse(`${name}@npm:${second}`)\n } else {\n res = s\n }\n break\n }\n if (!/^https?:\\/\\//.test(first)) {\n const reg = options.registries?.[first]\n if (first !== 'npm' && !reg) {\n throw error('named registry not found in options', {\n name: first,\n found: tuple,\n })\n }\n res = Spec.parse(\n name ?? '(unknown)',\n `${first}:${second}`,\n options,\n )\n break\n }\n const s = Spec.parse(\n name ?? '(unknown)',\n `registry:${first}#${second}`,\n options,\n )\n res =\n name && s.final.name !== name ?\n Spec.parse(s.final.name + '@' + s.bareSpec)\n : s\n break\n }\n case 'git': {\n if (!first) {\n throw error('no git remote in git ID', {\n found: tuple,\n })\n }\n res = Spec.parse(\n name ?? '(unknown)',\n first + '#' + second,\n options,\n )\n break\n }\n case 'workspace': {\n if (!first) {\n throw error('no name/path on workspace id', { found: tuple })\n }\n res =\n name && name !== first ?\n Spec.parse(name, `workspace:${first}@*`, options)\n : Spec.parse(first, `workspace:*`, options)\n break\n }\n }\n seenHydratedTuples.set(cacheKey, res)\n return res\n}\n\n/**\n * Reset internal caches. This should be used when options change since\n * they're not take into account in the memoization keys.\n */\n// eslint-disable-next-line import/export\nexport const resetCaches = () => {\n seenHydrated.clear()\n seenHydratedTuples.clear()\n browserResetCaches()\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport {\n currentDefaultRegistryName,\n defaultRegistryName,\n Spec,\n} from '@vltpkg/spec'\nimport {\n resetCaches as browserResetCaches,\n splitDepID,\n} from './browser.ts'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { DepID, DepIDTuple } from './browser.ts'\n\n// Here we re-export the browser-specific parts of the implementation\n// we disable the eslint rules for import/export since we are intentionally\n// re-exporting the `hydrate` and `hydrateTuple` functions to make sure they\n// use the Node.js-specific `Spec.parse` method that relies on internal node\n// modules like `util` and `path` that are not isomorphic.\n// eslint-disable-next-line import/export\nexport * from './browser.ts'\n\nconst seenHydrated = new Map<string, Spec>()\n/**\n * Turn a {@link DepID} into a {@link Spec} object using\n * the Node.js-specific `Spec.parse` method.\n */\n// eslint-disable-next-line import/export\nexport const hydrate = (\n id: DepID,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n // memoized entries return early\n const cacheKey = (name ?? '') + id\n const seen = seenHydrated.get(cacheKey)\n if (seen) return seen\n const res = hydrateTuple(splitDepID(id), name, options)\n seenHydrated.set(cacheKey, res)\n return res\n}\n\nconst seenHydratedTuples = new Map<string, Spec>()\n/**\n * Turn a {@link DepIDTuple} into a {@link Spec} object using\n * the Node.js-specific `Spec.parse` method.\n */\n// eslint-disable-next-line import/export\nexport const hydrateTuple = (\n tuple: DepIDTuple,\n name?: string,\n options: SpecOptions = {},\n): Spec => {\n const [type, first, second] = tuple\n\n // memoized entries return early\n const cacheKey =\n (name ?? '') + ',' + type + ',' + first + ',' + (second ?? '')\n const seen = seenHydratedTuples.get(cacheKey)\n if (seen) return seen\n\n let res: Spec\n switch (type) {\n case 'remote': {\n if (!first)\n throw error('no remoteURL found on remote id', {\n found: tuple,\n })\n res = Spec.parse(name ?? '(unknown)', first, options)\n break\n }\n case 'file': {\n if (!first) {\n throw error('no file path found on remote id', {\n found: tuple,\n })\n }\n res = Spec.parse(name ?? '(unknown)', `file:${first}`, options)\n break\n }\n case 'registry': {\n if (typeof first !== 'string') {\n throw error('no registry url or name in registry ID', {\n found: tuple,\n })\n }\n if (!second) {\n throw error('no name/specifier in registry ID', {\n found: tuple,\n })\n }\n const defaultName =\n options.registry &&\n currentDefaultRegistryName(options.registry, options)\n const defaultRegistryURL =\n options.registry ?\n options.registry.endsWith('/') ?\n options.registry\n : options.registry + '/'\n : undefined\n const firstURL = first.endsWith('/') ? first : first + '/'\n const hasScope = second.startsWith('@')\n const hasAtVersion = second.includes('@', hasScope ? 1 : 0)\n const name_ =\n (hasAtVersion && hasScope ?\n `@${second.split('@')[1]}`\n : second.split('@')[0]) /* c8 ignore next */ || '(unknown)'\n const usesDefaultRegistry =\n !first ||\n first === defaultName ||\n firstURL === defaultRegistryURL\n const noAliasedNameUsed = !name || name === name_\n if (usesDefaultRegistry && noAliasedNameUsed) {\n const version =\n (hasAtVersion &&\n second.split('@')[\n hasScope ? 2 : 1\n ]) /* c8 ignore next */ ||\n second\n res = Spec.parse(name || name_, version, options)\n break\n }\n if (!/^https?:\\/\\//.test(first)) {\n const reg = options.registries?.[first]\n if (first !== defaultRegistryName && !reg) {\n throw error('named registry not found in options', {\n name: first,\n found: tuple,\n })\n }\n res = Spec.parse(name || name_, `${first}:${second}`, options)\n break\n }\n res = Spec.parse(\n name || name_,\n `registry:${first}#${second}`,\n options,\n )\n break\n }\n case 'git': {\n if (!first) {\n throw error('no git remote in git ID', {\n found: tuple,\n })\n }\n res = Spec.parse(\n name ?? '(unknown)',\n first + '#' + second,\n options,\n )\n break\n }\n case 'workspace': {\n if (!first) {\n throw error('no name/path on workspace id', { found: tuple })\n }\n res =\n name && name !== first ?\n Spec.parse(name, `workspace:${first}@*`, options)\n : Spec.parse(first, `workspace:*`, options)\n break\n }\n }\n seenHydratedTuples.set(cacheKey, res)\n return res\n}\n\n/**\n * Reset internal caches. This should be used when options change since\n * they're not take into account in the memoization keys.\n */\n// eslint-disable-next-line import/export\nexport const resetCaches = () => {\n seenHydrated.clear()\n seenHydratedTuples.clear()\n browserResetCaches()\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vltpkg/dep-id",
3
3
  "description": "create and hydrate dependency IDs",
4
- "version": "1.0.0-rc.8",
4
+ "version": "1.0.0-rc.9",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
@@ -21,9 +21,9 @@
21
21
  }
22
22
  },
23
23
  "dependencies": {
24
- "@vltpkg/types": "1.0.0-rc.8",
25
- "@vltpkg/error-cause": "1.0.0-rc.8",
26
- "@vltpkg/spec": "1.0.0-rc.8"
24
+ "@vltpkg/spec": "1.0.0-rc.9",
25
+ "@vltpkg/error-cause": "1.0.0-rc.9",
26
+ "@vltpkg/types": "1.0.0-rc.9"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@eslint/js": "^9.34.0",