4
4
ManifestDependencyFieldNames as PackageManifestDependenciesFieldNames ,
5
5
} from '@metamask/action-utils' ;
6
6
import { isPlainObject } from '@metamask/utils' ;
7
+ const validateNPMPackageName = require ( 'validate-npm-package-name' ) ;
7
8
import { readJsonObjectFile } from './fs.js' ;
8
9
import { isTruthyString } from './misc-utils.js' ;
9
10
import { semver , SemVer } from './semver.js' ;
@@ -144,8 +145,10 @@ function isValidPackageManifestVersionField(
144
145
145
146
/**
146
147
* Type guard to ensure that the provided version value is a valid dependency version
147
- * specifier for a package manifest. This function validates both semantic versioning
148
- * ranges and the special 'workspace:^' notation.
148
+ * specifier for a package manifest. This function validates:
149
+ * - semantic versioning ranges
150
+ * - 'workspace:^' notation
151
+ * - 'npm:{packageName}:{semverRange}' redirections
149
152
*
150
153
* @param version - The value to check.
151
154
* @returns `true` if the version is a valid string that either
@@ -155,9 +158,23 @@ function isValidPackageManifestVersionField(
155
158
function isValidPackageManifestDependencyValue (
156
159
version : unknown ,
157
160
) : version is string {
158
- return (
159
- isValidPackageManifestVersionField ( version ) || version === 'workspace:^'
160
- ) ;
161
+ if ( typeof version !== 'string' ) {
162
+ return false ;
163
+ }
164
+ if ( isValidPackageManifestVersionField ( version ) || version === 'workspace:^' ) {
165
+ return true ;
166
+ }
167
+ const redirectedDependencyRegexp = / ^ n p m : ( .* ) @ ( .* ?) $ / u;
168
+ try {
169
+ const redirectedDependencyMatch = redirectedDependencyRegexp . exec ( version ) ;
170
+ if ( ! redirectedDependencyMatch || redirectedDependencyMatch . length < 3 ) {
171
+ return false ;
172
+ }
173
+ const [ redirectedName , redirectedVersion ] = redirectedDependencyMatch ;
174
+ return validateNPMPackageName ( redirectedName ) && isValidPackageManifestVersionField ( redirectedVersion ) ;
175
+ } catch ( e ) {
176
+ return false ;
177
+ }
161
178
}
162
179
163
180
/**
0 commit comments