@@ -207,7 +207,7 @@ def assemble(cls, package_data, resource, codebase, package_adder):
207
207
208
208
@classmethod
209
209
def yield_npm_dependencies_and_resources (cls , package_resource , package_data , package_uid , codebase , package_adder ):
210
-
210
+
211
211
# in all cases yield possible dependencies
212
212
yield from yield_dependencies_from_package_data (package_data , package_resource .path , package_uid )
213
213
@@ -276,7 +276,9 @@ def create_packages_from_workspaces(
276
276
if npm_res .for_packages :
277
277
continue
278
278
279
- npm_res .for_packages = workspace_package_uids
279
+ for package_uid in workspace_package_uids :
280
+ package_adder (package_uid , npm_res , codebase )
281
+
280
282
npm_res .save (codebase )
281
283
282
284
@classmethod
@@ -374,6 +376,18 @@ def update_dependencies_by_purl(
374
376
if '_' in metadata :
375
377
requirement , _extra = metadata .split ('_' )
376
378
379
+ if ':' in requirement and '@' in requirement :
380
+ # dependencies with requirements like this are aliases and should be reported
381
+ aliased_package , _ , constraint = requirement .rpartition ('@' )
382
+ _ , _ , aliased_package_name = aliased_package .rpartition (':' )
383
+ sdns , _ , sdname = aliased_package_name .rpartition ('/' )
384
+ dep_purl = PackageURL (
385
+ type = cls .default_package_type ,
386
+ namespace = sdns ,
387
+ name = sdname
388
+ ).to_string ()
389
+ requirement = constraint
390
+
377
391
dep_package = models .DependentPackage (
378
392
purl = dep_purl ,
379
393
scope = scope ,
@@ -424,7 +438,7 @@ def get_workspace_members(cls, workspaces, codebase, workspace_root_path):
424
438
workspace_members .append (resource )
425
439
426
440
# Case 3: This is a complex glob pattern, we are doing a full codebase walk
427
- # and glob matching each resource
441
+ # and glob matching each resource
428
442
else :
429
443
for resource in workspace_root_path :
430
444
if NpmPackageJsonHandler .is_datafile (resource .location ) and fnmatch .fnmatch (
@@ -469,7 +483,7 @@ def update_workspace_members(cls, workspace_members, codebase):
469
483
workspace_package_versions_by_base_purl [base_purl ] = version
470
484
471
485
# Update workspace member package information from
472
- # workspace level data
486
+ # workspace level data
473
487
for base_purl , dependency in workspace_dependencies_by_base_purl .items ():
474
488
extracted_requirement = dependency .get ('extracted_requirement' )
475
489
if 'workspace' in extracted_requirement :
@@ -1011,6 +1025,13 @@ def parse(cls, location, package_only=False):
1011
1025
if '"' in ns_name :
1012
1026
ns_name = ns_name .replace ('"' , '' )
1013
1027
ns , _ , name = ns_name .rpartition ('/' )
1028
+
1029
+ if ':' in constraint and '@' in constraint :
1030
+ # dependencies with requirements like this are aliases and should be reported
1031
+ aliased_package , _ , constraint = constraint .rpartition ('@' )
1032
+ _ , _ , aliased_package_name = aliased_package .rpartition (':' )
1033
+ ns , _ , name = aliased_package_name .rpartition ('/' )
1034
+
1014
1035
sub_dependencies .append ((ns , name , constraint ,))
1015
1036
1016
1037
elif line .startswith (' ' * 2 ):
@@ -1112,7 +1133,7 @@ def parse(cls, location, package_only=False):
1112
1133
resolved_package = resolved_package_data .to_dict (),
1113
1134
)
1114
1135
1115
- if not dep_purl in dependencies_by_purl :
1136
+ if not dep_purl in dependencies_by_purl :
1116
1137
dependencies_by_purl [dep_purl ] = dep .to_dict ()
1117
1138
else :
1118
1139
# FIXME: We have duplicate dependencies because of aliases
@@ -1176,7 +1197,7 @@ def parse(cls, location, package_only=False):
1176
1197
_ , name_version = sections
1177
1198
elif len (sections ) == 3 :
1178
1199
_ , namespace , name_version = sections
1179
-
1200
+
1180
1201
name , version = name_version .split ("@" )
1181
1202
elif major_v == "5" or is_shrinkwrap :
1182
1203
if len (sections ) == 3 :
@@ -1264,7 +1285,7 @@ def parse(cls, location, package_only=False):
1264
1285
for key in extra_data_fields :
1265
1286
value = data .get (key , None )
1266
1287
if value is not None :
1267
- extra_data_deps [key ] = value
1288
+ extra_data_deps [key ] = value
1268
1289
1269
1290
dependency_data = models .DependentPackage (
1270
1291
purl = purl ,
@@ -1762,14 +1783,21 @@ def deps_mapper(deps, package, field_name, is_direct=True):
1762
1783
deps_by_name [npm_name ] = d
1763
1784
1764
1785
for fqname , requirement in deps .items ():
1765
- # Handle cases in ``resolutions`` with ``**``
1786
+ # Handle cases in ``resolutions`` with ``**``
1766
1787
# "resolutions": {
1767
1788
# "**/@typescript-eslint/eslint-plugin": "^4.1.1",
1768
1789
if fqname .startswith ('**' ):
1769
1790
fqname = fqname .replace ('**' , '' )
1770
1791
ns , name = split_scoped_package_name (fqname )
1771
1792
if not name :
1772
1793
continue
1794
+
1795
+ if ':' in requirement and '@' in requirement :
1796
+ # dependencies with requirements like this are aliases and should be reported
1797
+ aliased_package , _ , requirement = requirement .rpartition ('@' )
1798
+ _ , _ , aliased_package_name = aliased_package .rpartition (':' )
1799
+ ns , _ , name = aliased_package_name .rpartition ('/' )
1800
+
1773
1801
purl = PackageURL (type = 'npm' , namespace = ns , name = name ).to_string ()
1774
1802
1775
1803
# optionalDependencies override the dependencies with the same name
0 commit comments