@vltpkg/dep-id 1.0.0-rc.14 → 1.0.0-rc.15
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.
- package/README.md +4 -4
- package/dist/browser.d.ts +13 -13
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +152 -17
- package/dist/browser.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ import { manifest } from '@vltpkg/package-info'
|
|
|
24
24
|
// default registry
|
|
25
25
|
const spec = Spec.parse('x@latest')
|
|
26
26
|
const mani = await manifest(spec)
|
|
27
|
-
const id = getId(spec, mani) // registry
|
|
27
|
+
const id = getId(spec, mani) // registry~~x@1.2.3
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
{
|
|
@@ -33,18 +33,18 @@ import { manifest } from '@vltpkg/package-info'
|
|
|
33
33
|
registries: { vlt: 'http://vlt.sh' },
|
|
34
34
|
})
|
|
35
35
|
const mani = await manifest(spec)
|
|
36
|
-
const id = getId(spec, mani) // registry
|
|
36
|
+
const id = getId(spec, mani) // registry~vlt~y@latest
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
{
|
|
40
40
|
// git, hosted
|
|
41
41
|
const spec = Spec.parse('x@github:a/b#branch')
|
|
42
42
|
const mani = await manifest(spec)
|
|
43
|
-
const id = getId(spec, mani) // git
|
|
43
|
+
const id = getId(spec, mani) // git~github:a/b~branch
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
// Hydrate by providing a name, and options for the spec creation
|
|
47
|
-
const spec = hydrate('git
|
|
47
|
+
const spec = hydrate('git~github:a/b~branch', 'x') // x@github:a/b#branch
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
### Note
|
package/dist/browser.d.ts
CHANGED
|
@@ -2,28 +2,28 @@ import { Spec } from '@vltpkg/spec/browser';
|
|
|
2
2
|
import type { SpecOptions } from '@vltpkg/spec/browser';
|
|
3
3
|
import type { Manifest } from '@vltpkg/types';
|
|
4
4
|
export declare const delimiter: Delimiter;
|
|
5
|
-
export type Delimiter = '
|
|
5
|
+
export type Delimiter = '~';
|
|
6
6
|
/**
|
|
7
7
|
* Dependency IDs are a URI-encoded set of strings, separated
|
|
8
|
-
* by the {@link Delimiter} character (`'
|
|
8
|
+
* by the {@link Delimiter} character (`'~'`).
|
|
9
9
|
*
|
|
10
10
|
* The first entry is always the specifier type. The rest depend on the
|
|
11
11
|
* type. `git`, `registry`, and `workspace` entries have 3 fields, the rest
|
|
12
12
|
* have 2.
|
|
13
13
|
*
|
|
14
|
-
* - `registry`: `'registry
|
|
14
|
+
* - `registry`: `'registry~<registry>~name@specifier'`
|
|
15
15
|
* The `<registry>` portion can be a known named registry name, or a
|
|
16
16
|
* url to a registry. If empty, it is the default registry. Examples:
|
|
17
|
-
* -
|
|
18
|
-
* -
|
|
19
|
-
* -
|
|
20
|
-
* - `git`: `'git
|
|
21
|
-
* - `git
|
|
22
|
-
* - `git
|
|
23
|
-
* - `workspace`: `'workspace
|
|
24
|
-
* - `workspace
|
|
25
|
-
* - `remote`: `'remote
|
|
26
|
-
* - `file`: `'file
|
|
17
|
+
* - `~~some-package@2.0.1`
|
|
18
|
+
* - `~npm~whatever@1.2.3`
|
|
19
|
+
* - `~http%3A%2F%2Fvlt.sh%2F~x@1.2.3`
|
|
20
|
+
* - `git`: `'git~<git remote>~<git selector>'`. For example:
|
|
21
|
+
* - `git~github:user/project~branchname`
|
|
22
|
+
* - `git~git%2Bssh%3A%2F%2Fuser%40host%3Aproject.git~semver:1.x`
|
|
23
|
+
* - `workspace`: `'workspace~<path>'`. For example:
|
|
24
|
+
* - `workspace~src/mything`
|
|
25
|
+
* - `remote`: `'remote~<url>'`
|
|
26
|
+
* - `file`: `'file~<path>'`
|
|
27
27
|
*
|
|
28
28
|
* Lastly, the final portion can contain arbitrary string data, and is
|
|
29
29
|
* used to store peer dep resolutions to maintain the peerDep contract.
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,IAAI,EACL,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,eAAO,MAAM,SAAS,EAAE,SAAe,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,GAAG,CAAA;AAG3B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,KAAK,GACb,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAC9E,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GACzD,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAC9E,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,EAAE,CAAA;AAE7D;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,MAAM;IACnB,KAAK,CAAC,EAAE,MAAM;CACf,GACD;IACE,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,MAAM;IAChB,YAAY,EAAE,MAAM;IACpB,KAAK,CAAC,EAAE,MAAM;CACf,GACD,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,GAC5C,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,GAC7C,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;AAY1D,eAAO,MAAM,OAAO,QAAS,OAAO,KAAG,GAAG,IAAI,KACI,CAAA;AAElD,eAAO,MAAM,OAAO,QAAS,MAAM,KAAG,KAOrC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,SAAU,UAAU,KAAG,KAWjD,CAAA;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { error } from '@vltpkg/error-cause';
|
|
2
2
|
import { currentDefaultRegistryName, defaultRegistryName, Spec, } from '@vltpkg/spec/browser';
|
|
3
|
-
export const delimiter = '
|
|
4
|
-
const EXTRA_PEER_SET_DELIMITER = '
|
|
3
|
+
export const delimiter = '~';
|
|
4
|
+
const EXTRA_PEER_SET_DELIMITER = 'peer.';
|
|
5
5
|
const depIDRegExp = new RegExp(`^((git)?${delimiter}[^${delimiter}]*${delimiter}[^${delimiter}]*(${delimiter}[^${delimiter}]*)?$` +
|
|
6
6
|
`|` +
|
|
7
7
|
`^(file|remote|workspace)${delimiter}[^${delimiter}]*)(${delimiter}[^${delimiter}]*)?$`);
|
|
@@ -29,16 +29,152 @@ export const joinDepIDTuple = (list) => {
|
|
|
29
29
|
return `${type}${delimiter}${f}${second ? `${delimiter}${encode(second)}` : ''}`;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
-
//
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
:
|
|
32
|
+
// Escape chars unsafe for filesystems or reserved for DepID syntax
|
|
33
|
+
const ESCAPE = {
|
|
34
|
+
_: '__',
|
|
35
|
+
'+': '_p',
|
|
36
|
+
'\\': '_b',
|
|
37
|
+
':': '_c',
|
|
38
|
+
'~': '_t',
|
|
39
|
+
'<': '_l',
|
|
40
|
+
'>': '_g',
|
|
41
|
+
'"': '_q',
|
|
42
|
+
'|': '_i',
|
|
43
|
+
'?': '_m',
|
|
44
|
+
'*': '_a',
|
|
45
|
+
' ': '_s',
|
|
46
|
+
};
|
|
47
|
+
// Unescape map (includes trailing dot/space escapes)
|
|
48
|
+
const UNESCAPE = {
|
|
49
|
+
__: '_',
|
|
50
|
+
_p: '+',
|
|
51
|
+
_b: '\\',
|
|
52
|
+
_c: ':',
|
|
53
|
+
_t: '~',
|
|
54
|
+
_l: '<',
|
|
55
|
+
_g: '>',
|
|
56
|
+
_q: '"',
|
|
57
|
+
_i: '|',
|
|
58
|
+
_m: '?',
|
|
59
|
+
_a: '*',
|
|
60
|
+
_d: '.',
|
|
61
|
+
_s: ' ',
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Checks if a character code represents a control character (0x00-0x1F).
|
|
65
|
+
* Control characters are non-printable ASCII characters that need special encoding.
|
|
66
|
+
*/
|
|
67
|
+
const isControl = (code) => code >= 0x00 && code <= 0x1f;
|
|
68
|
+
/**
|
|
69
|
+
* Converts a character code to a 2-digit uppercase hexadecimal string.
|
|
70
|
+
* Used to encode control characters as _XX format (e.g., 0x0A becomes "0A").
|
|
71
|
+
*/
|
|
72
|
+
const toHex2Upper = (code) => code.toString(16).toUpperCase().padStart(2, '0');
|
|
73
|
+
/**
|
|
74
|
+
* Checks if a character is a valid hexadecimal digit (0-9, A-F, a-f).
|
|
75
|
+
* Used during decoding to identify hex-encoded control characters (e.g., _0A, _1F).
|
|
76
|
+
*/
|
|
77
|
+
const isHexDigit = (c) => (c >= '0' && c <= '9') ||
|
|
78
|
+
(c >= 'A' && c <= 'F') ||
|
|
79
|
+
(c >= 'a' && c <= 'f');
|
|
80
|
+
/**
|
|
81
|
+
* Encodes a string into a DepID format.
|
|
82
|
+
* Handles special characters, control characters, and trailing dots.
|
|
83
|
+
*/
|
|
84
|
+
const encode = (s) => {
|
|
85
|
+
if (!s)
|
|
86
|
+
return s;
|
|
87
|
+
let out = '';
|
|
88
|
+
// Loop through each character in the string
|
|
89
|
+
for (const ch of s) {
|
|
90
|
+
/* c8 ignore next */
|
|
91
|
+
if (!ch)
|
|
92
|
+
continue;
|
|
93
|
+
// '/' becomes '+', and that '+' is NOT escaped
|
|
94
|
+
if (ch === '/') {
|
|
95
|
+
out += '+';
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// Escape special characters with predefined mappings
|
|
99
|
+
const mapped = ESCAPE[ch];
|
|
100
|
+
if (mapped) {
|
|
101
|
+
// Found a special character that needs escaping, append the escaped version
|
|
102
|
+
out += mapped;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// Check if the character is a control character and encode it as _XX
|
|
106
|
+
const code = ch.charCodeAt(0);
|
|
107
|
+
if (isControl(code)) {
|
|
108
|
+
// Found a control character, encode it as _XX
|
|
109
|
+
out += '_' + toHex2Upper(code); // _00, _0A, _1F, etc.
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// If no special characters or control characters were found, append the character as-is
|
|
113
|
+
out += ch;
|
|
114
|
+
}
|
|
115
|
+
// Escape trailing dot (Windows strips these)
|
|
116
|
+
if (out.endsWith('.'))
|
|
117
|
+
out = out.slice(0, -1) + '_d';
|
|
118
|
+
return out;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Decodes a DepID string back into its original form.
|
|
122
|
+
* Handles special characters, control characters, and trailing dots.
|
|
123
|
+
*/
|
|
124
|
+
const decode = (s) => {
|
|
125
|
+
if (!s)
|
|
126
|
+
return s;
|
|
127
|
+
let out = '';
|
|
128
|
+
// Loop through each character in the string
|
|
129
|
+
for (let i = 0; i < s.length; i++) {
|
|
130
|
+
const ch = s[i];
|
|
131
|
+
/* c8 ignore next */
|
|
132
|
+
if (!ch)
|
|
133
|
+
continue;
|
|
134
|
+
if (ch === '+') {
|
|
135
|
+
out += '/';
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (ch !== '_') {
|
|
139
|
+
out += ch;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// Try to parse an escape sequence starting at '_'
|
|
143
|
+
const next = s[i + 1];
|
|
144
|
+
if (next === undefined) {
|
|
145
|
+
out += '_';
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// "__" -> "_"
|
|
149
|
+
if (next === '_') {
|
|
150
|
+
out += '_';
|
|
151
|
+
i += 1;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// "_X" single-letter escapes
|
|
155
|
+
const two = s.slice(i, i + 2); // "_p", "_d", etc.
|
|
156
|
+
const mapped = UNESCAPE[two];
|
|
157
|
+
if (mapped) {
|
|
158
|
+
out += mapped;
|
|
159
|
+
i += 1;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// "_XX" hex escape for control chars, where first hex digit is 0 or 1
|
|
163
|
+
const h1 = s[i + 1];
|
|
164
|
+
const h2 = s[i + 2];
|
|
165
|
+
if ((h1 === '0' || h1 === '1') &&
|
|
166
|
+
h2 !== undefined &&
|
|
167
|
+
isHexDigit(h2)) {
|
|
168
|
+
const hex = s.slice(i + 1, i + 3); // "0A", "1F", etc.
|
|
169
|
+
out += String.fromCharCode(parseInt(hex, 16));
|
|
170
|
+
i += 2;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// Not a recognized escape; leave '_' as-is
|
|
174
|
+
out += '_';
|
|
175
|
+
}
|
|
176
|
+
return out;
|
|
177
|
+
};
|
|
42
178
|
const seenSplitDepIDs = new Map();
|
|
43
179
|
/**
|
|
44
180
|
* turn a {@link DepID} into a {@link DepIDTuple}
|
|
@@ -49,20 +185,19 @@ export const splitDepID = (id) => {
|
|
|
49
185
|
if (seen)
|
|
50
186
|
return seen;
|
|
51
187
|
let res;
|
|
52
|
-
const [type, first = '', second, extra] = id
|
|
53
|
-
|
|
54
|
-
.split(delimiter, 4);
|
|
55
|
-
const f = decodeURIComponent(first);
|
|
188
|
+
const [type, first = '', second, extra] = id.split(delimiter, 4);
|
|
189
|
+
const f = decode(first) || ''; // decode handles + -> / internally
|
|
56
190
|
switch (type) {
|
|
57
191
|
case 'git':
|
|
58
192
|
case '': {
|
|
59
193
|
if (second === undefined) {
|
|
60
194
|
throw error(`invalid ${type} id`, { found: id });
|
|
61
195
|
}
|
|
196
|
+
const decodedSecond = decode(second) || '';
|
|
62
197
|
res = [
|
|
63
198
|
type || 'registry',
|
|
64
199
|
f || defaultRegistryName,
|
|
65
|
-
|
|
200
|
+
decodedSecond,
|
|
66
201
|
decode(extra),
|
|
67
202
|
];
|
|
68
203
|
break;
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,IAAI,GACL,MAAM,sBAAsB,CAAA;AAI7B,MAAM,CAAC,MAAM,SAAS,GAAc,GAAG,CAAA;AAEvC,MAAM,wBAAwB,GAAG,IAAI,CAAA;AAqDrC,MAAM,WAAW,GAAG,IAAI,MAAM,CAC5B,WAAW,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,MAC5D,SACF,KAAK,SAAS,OAAO;IACnB,GAAG;IACH,2BAA2B,SAAS,KAClC,SACF,OAAO,SAAS,KAAK,SAAS,OAAO,CACxC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAY,EAAgB,EAAE,CACpD,OAAO,GAAG,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAS,EAAE;IAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC,iBAAiB,EAAE;YAC7B,KAAK,EAAE,GAAG;SACX,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAgB,EAAS,EAAE;IACxD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,SAAS,GAAG,CAAC,IAAI,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAC7H,KAAK,KAAK;YACR,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAC7G;YACE,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACpF,CAAC;AACH,CAAC,CAAA;AAED,oDAAoD;AACpD,MAAM,MAAM,GAAG,CAAC,CAAU,EAAE,EAAE,CAC5B,CAAC,CAAC,CAAC;IACD,kBAAkB,CAAC,CAAC,CAAC;SAClB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;SACtB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;SACtB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;IAC3B,CAAC,CAAC,CAAC,CAAA;AAEL,MAAM,MAAM,GAAG,CAAC,CAAU,EAAE,EAAE,CAC5B,CAAC,CAAC,CAAC;IACD,kBAAkB,CAChB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAChD;IACH,CAAC,CAAC,CAAC,CAAA;AAEL,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsB,CAAA;AACrD;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAc,EAAE;IACnD,gCAAgC;IAChC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACpC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAErB,IAAI,GAAe,CAAA;IACnB,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE;SACzC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACtB,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACnC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,EAAE,CAAC,CAAC,CAAC;YACR,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;YAClD,CAAC;YACD,GAAG,GAAG;gBACJ,IAAI,IAAI,UAAU;gBAClB,CAAC,IAAI,mBAAmB;gBACxB,kBAAkB,CAAC,MAAM,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC;aACd,CAAA;YACD,MAAK;QACP,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YAC/B,MAAK;QACP,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,KAAK,CAAC,oBAAoB,EAAE;gBAChC,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC;aACzD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAS,EAAE;IAC7C,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QAC9C;YACE,OAAO,cAAc,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IACxC,CAAC;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAgB,CAAA;AAC5C;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,EAAS,EACT,IAAa,EACb,UAAuB,EAAE,EACnB,EAAE;IACR,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAErB,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACvD,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC/B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAgB,CAAA;AAClD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAiB,EACjB,IAAa,EACb,UAAuB,EAAE,EACnB,EAAE;IACR,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAA;IAEnC,gCAAgC;IAChC,MAAM,QAAQ,GACZ,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC7C,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAErB,IAAI,GAAS,CAAA;IACb,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,KAAK;gBACR,MAAM,KAAK,CAAC,iCAAiC,EAAE;oBAC7C,KAAK,EAAE,KAAK;iBACb,CAAC,CAAA;YACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YACrD,MAAK;QACP,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,CAAC,iCAAiC,EAAE;oBAC7C,KAAK,EAAE,KAAK;iBACb,CAAC,CAAA;YACJ,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE,QAAQ,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC/D,MAAK;QACP,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC,wCAAwC,EAAE;oBACpD,KAAK,EAAE,KAAK;iBACb,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,KAAK,CAAC,kCAAkC,EAAE;oBAC9C,KAAK,EAAE,KAAK;iBACb,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,WAAW,GACf,OAAO,CAAC,QAAQ;gBAChB,0BAA0B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACvD,MAAM,kBAAkB,GACtB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC9B,OAAO,CAAC,QAAQ;oBAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG;gBAC1B,CAAC,CAAC,SAAS,CAAA;YACb,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAA;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;YACvC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3D,MAAM,KAAK,GACT,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC;gBACzB,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,IAAI,WAAW,CAAA;YAC7D,MAAM,mBAAmB,GACvB,CAAC,KAAK;gBACN,KAAK,KAAK,WAAW;gBACrB,QAAQ,KAAK,kBAAkB,CAAA;YACjC,MAAM,iBAAiB,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,CAAA;YACjD,IAAI,mBAAmB,IAAI,iBAAiB,EAAE,CAAC;gBAC7C,MAAM,OAAO,GACX,CAAC,YAAY;oBACX,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CACf,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjB,CAAC,CAAC,oBAAoB;oBACzB,MAAM,CAAA;gBACR,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjD,MAAK;YACP,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAA;gBACvC,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;gBACjD,IAAI,KAAK,KAAK,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBACrD,MAAM,KAAK,CAAC,qCAAqC,EAAE;wBACjD,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,KAAK;qBACb,CAAC,CAAA;gBACJ,CAAC;gBACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,OAAO,CAAC,CAAA;gBAC9D,MAAK;YACP,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CACd,IAAI,IAAI,KAAK,EACb,YAAY,KAAK,IAAI,MAAM,EAAE,EAC7B,OAAO,CACR,CAAA;YACD,MAAK;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,CAAC,yBAAyB,EAAE;oBACrC,KAAK,EAAE,KAAK;iBACb,CAAC,CAAA;YACJ,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CACd,IAAI,IAAI,WAAW,EACnB,KAAK,GAAG,GAAG,GAAG,MAAM,EACpB,OAAO,CACR,CAAA;YACD,MAAK;QACP,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;YAC/D,CAAC;YACD,GAAG;gBACD,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;oBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,EAAE,OAAO,CAAC;oBACnD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAK;QACP,CAAC;IACH,CAAC;IACD,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACrC,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CACvB,QAAgB,EAChB,UAAkC,EACd,EAAE;IACtB,0DAA0D;IAC1D,0DAA0D;IAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,0CAA0C;QAC1C,MAAM,UAAU,GACd,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAA;QACpD,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;QACvD,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,+BAA+B,GAAG,CACtC,CAAO,EACP,QAAiB,EACG,EAAE;IACtB,IAAI,CAAC,CAAC,CAAC,QAAQ;QAAE,OAAM;IACvB,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAA;IAClC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACjE,IAAI,aAAa;QAAE,OAAO,aAAa,CAAA;IAEvC,MAAM,gBAAgB,GAAG,gBAAgB,CACvC,GAAG,EACH,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAC5B,CAAA;IACD,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAA;AAChD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAU,EACV,IAAwC,EACxC,KAAc,EACF,EAAE;IACd,gCAAgC;IAChC,MAAM,QAAQ,GACZ,MAAM,CAAC,IAAI,CAAC;QACZ,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACrB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACjB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACpB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACf,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACrC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAErB,IAAI,GAAe,CAAA;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;IACpB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,CAAC,CAAC;gBACZ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBACvB,CAAC,CAAC,IAAI,CAAC,OAAO;gBAChB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;YACd,GAAG,GAAG;gBACJ,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,aAAa;oBACb,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC;oBACnD,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,QAAQ;oBACV,mBAAmB;gBACrB,GAAG,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE;gBAC1F,KAAK;aACN,CAAA;YACD,MAAK;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,EACJ,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,WAAW,GAAG,EAAE,GACjB,GAAG,CAAC,CAAA;YACL,IAAI,CAAC,SAAS;gBACZ,MAAM,KAAK,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YACnD,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,KAAK,CAAC,qCAAqC,EAAE;wBACjD,IAAI;qBACL,CAAC,CAAA;gBACJ,CAAC;gBACD,GAAG,GAAG;oBACJ,CAAC,CAAC,IAAI;oBACN,GAAG,YAAY,IAAI,gBAAgB,EAAE;oBACrC,WAAW;oBACX,KAAK;iBACN,CAAA;gBACD,MAAK;YACP,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;YAC/C,CAAC;YACD,MAAK;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;YACvB,IAAI,CAAC,SAAS;gBACZ,MAAM,KAAK,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YACrD,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;YAChC,MAAK;QACP,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW;YACd,MAAM,KAAK,CAAC,sCAAsC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACjE,CAAC;IACD,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC7B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAW,EAAE,IAAa,EAAE,EAAE,CAClE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,mCAAmC;IACnD,CAAC,IAAI,CAAC,OAAO,IAAI,yDAAyD;IAC1E,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,uCAAuC;IACnE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAA,CAAC,oDAAoD;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,IAAU,EACV,IAAwC,EACxC,KAAc,EACP,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AAEvD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,QAAQ,EACR,WAAW,GAIZ;IACC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW;QAAE,OAAM;IACrC,IAAI,QAAQ,IAAI,WAAW;QAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC/D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IAItC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IAErB,yCAAyC;IACzC,IAAI,KAAK,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;IAC/B,CAAC;IAED,6CAA6C;IAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;IACnD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,4CAA4C;IAC5C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC7B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;KAC9B,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE;IAC9B,YAAY,CAAC,KAAK,EAAE,CAAA;IACpB,kBAAkB,CAAC,KAAK,EAAE,CAAA;IAC1B,eAAe,CAAC,KAAK,EAAE,CAAA;IACvB,UAAU,CAAC,KAAK,EAAE,CAAA;AACpB,CAAC,CAAA","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 const jsrReg = options['jsr-registries']?.[first]\n if (first !== defaultRegistryName && !reg && !jsrReg) {\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
|
+
{"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 = 'peer.'\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// Escape chars unsafe for filesystems or reserved for DepID syntax\nconst ESCAPE: Record<string, string> = {\n _: '__',\n '+': '_p',\n '\\\\': '_b',\n ':': '_c',\n '~': '_t',\n '<': '_l',\n '>': '_g',\n '\"': '_q',\n '|': '_i',\n '?': '_m',\n '*': '_a',\n ' ': '_s',\n}\n\n// Unescape map (includes trailing dot/space escapes)\nconst UNESCAPE: Record<string, string> = {\n __: '_',\n _p: '+',\n _b: '\\\\',\n _c: ':',\n _t: '~',\n _l: '<',\n _g: '>',\n _q: '\"',\n _i: '|',\n _m: '?',\n _a: '*',\n _d: '.',\n _s: ' ',\n}\n\n/**\n * Checks if a character code represents a control character (0x00-0x1F).\n * Control characters are non-printable ASCII characters that need special encoding.\n */\nconst isControl = (code: number) => code >= 0x00 && code <= 0x1f\n\n/**\n * Converts a character code to a 2-digit uppercase hexadecimal string.\n * Used to encode control characters as _XX format (e.g., 0x0A becomes \"0A\").\n */\nconst toHex2Upper = (code: number) =>\n code.toString(16).toUpperCase().padStart(2, '0')\n\n/**\n * Checks if a character is a valid hexadecimal digit (0-9, A-F, a-f).\n * Used during decoding to identify hex-encoded control characters (e.g., _0A, _1F).\n */\nconst isHexDigit = (c: string) =>\n (c >= '0' && c <= '9') ||\n (c >= 'A' && c <= 'F') ||\n (c >= 'a' && c <= 'f')\n\n/**\n * Encodes a string into a DepID format.\n * Handles special characters, control characters, and trailing dots.\n */\nconst encode = (s?: string) => {\n if (!s) return s\n\n let out = ''\n // Loop through each character in the string\n for (const ch of s) {\n /* c8 ignore next */\n if (!ch) continue\n\n // '/' becomes '+', and that '+' is NOT escaped\n if (ch === '/') {\n out += '+'\n continue\n }\n\n // Escape special characters with predefined mappings\n const mapped = ESCAPE[ch]\n if (mapped) {\n // Found a special character that needs escaping, append the escaped version\n out += mapped\n continue\n }\n\n // Check if the character is a control character and encode it as _XX\n const code = ch.charCodeAt(0)\n if (isControl(code)) {\n // Found a control character, encode it as _XX\n out += '_' + toHex2Upper(code) // _00, _0A, _1F, etc.\n continue\n }\n\n // If no special characters or control characters were found, append the character as-is\n out += ch\n }\n\n // Escape trailing dot (Windows strips these)\n if (out.endsWith('.')) out = out.slice(0, -1) + '_d'\n\n return out\n}\n\n/**\n * Decodes a DepID string back into its original form.\n * Handles special characters, control characters, and trailing dots.\n */\nconst decode = (s?: string) => {\n if (!s) return s\n\n let out = ''\n\n // Loop through each character in the string\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]\n /* c8 ignore next */\n if (!ch) continue\n\n if (ch === '+') {\n out += '/'\n continue\n }\n\n if (ch !== '_') {\n out += ch\n continue\n }\n\n // Try to parse an escape sequence starting at '_'\n const next = s[i + 1]\n if (next === undefined) {\n out += '_'\n continue\n }\n\n // \"__\" -> \"_\"\n if (next === '_') {\n out += '_'\n i += 1\n continue\n }\n\n // \"_X\" single-letter escapes\n const two = s.slice(i, i + 2) // \"_p\", \"_d\", etc.\n const mapped = UNESCAPE[two]\n if (mapped) {\n out += mapped\n i += 1\n continue\n }\n\n // \"_XX\" hex escape for control chars, where first hex digit is 0 or 1\n const h1 = s[i + 1]\n const h2 = s[i + 2]\n if (\n (h1 === '0' || h1 === '1') &&\n h2 !== undefined &&\n isHexDigit(h2)\n ) {\n const hex = s.slice(i + 1, i + 3) // \"0A\", \"1F\", etc.\n out += String.fromCharCode(parseInt(hex, 16))\n i += 2\n continue\n }\n\n // Not a recognized escape; leave '_' as-is\n out += '_'\n }\n\n return out\n}\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.split(delimiter, 4)\n const f = decode(first) || '' // decode handles + -> / internally\n switch (type) {\n case 'git':\n case '': {\n if (second === undefined) {\n throw error(`invalid ${type} id`, { found: id })\n }\n const decodedSecond = decode(second) || ''\n res = [\n type || 'registry',\n f || defaultRegistryName,\n decodedSecond,\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 const jsrReg = options['jsr-registries']?.[first]\n if (first !== defaultRegistryName && !reg && !jsrReg) {\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"]}
|
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.
|
|
4
|
+
"version": "1.0.0-rc.15",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/vltpkg/vltpkg.git",
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
},
|
|
10
10
|
"author": "vlt technology inc. <support@vlt.sh> (http://vlt.sh)",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@vltpkg/error-cause": "1.0.0-rc.
|
|
13
|
-
"@vltpkg/
|
|
14
|
-
"@vltpkg/
|
|
12
|
+
"@vltpkg/error-cause": "1.0.0-rc.15",
|
|
13
|
+
"@vltpkg/spec": "1.0.0-rc.15",
|
|
14
|
+
"@vltpkg/types": "1.0.0-rc.15"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@eslint/js": "^9.39.1",
|