(key, node)
| 148 | // install-directory name and is forgeable through aliases / manifest |
| 149 | // confusion. |
| 150 | const keyTargetsNode = (key, node) => { |
| 151 | let parsed |
| 152 | try { |
| 153 | parsed = npa(key) |
| 154 | } catch { |
| 155 | return false |
| 156 | } |
| 157 | switch (parsed.type) { |
| 158 | case 'tag': |
| 159 | case 'range': |
| 160 | case 'version': { |
| 161 | const trusted = getTrustedRegistryIdentity(node) |
| 162 | if (!trusted) { |
| 163 | return false |
| 164 | } |
| 165 | return trusted.name === parsed.name |
| 166 | } |
| 167 | case 'git': { |
| 168 | let resolvedParsed |
| 169 | try { |
| 170 | const resolved = primaryResolvedSource(node) |
| 171 | resolvedParsed = resolved ? npa(resolved) : null |
| 172 | } catch { |
| 173 | /* istanbul ignore next */ |
| 174 | return false |
| 175 | } |
| 176 | const keyHost = parsed.hosted?.ssh({ noCommittish: true }) |
| 177 | const nodeHost = resolvedParsed?.hosted?.ssh({ noCommittish: true }) |
| 178 | return !!(keyHost && nodeHost && keyHost === nodeHost) |
| 179 | } |
| 180 | case 'file': |
| 181 | case 'directory': |
| 182 | case 'remote': |
| 183 | return resolvedSourceSpecs(node) |
| 184 | .some(resolved => resolved === parsed.saveSpec || resolved === parsed.fetchSpec) |
| 185 | default: |
| 186 | return false |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | // Apply approvals for all currently-installed versions of a single package. |
| 191 | // |
no test coverage detected
searching dependent graphs…