diff --git a/src/packagedcode/npm.py b/src/packagedcode/npm.py index 18ad27d7564..765f9765f23 100644 --- a/src/packagedcode/npm.py +++ b/src/packagedcode/npm.py @@ -12,6 +12,7 @@ import logging import json import re +import sys import urllib.parse from functools import partial from itertools import islice @@ -35,8 +36,10 @@ SCANCODE_DEBUG_PACKAGE = os.environ.get('SCANCODE_DEBUG_PACKAGE', False) +SCANCODE_DEBUG_PACKAGE_NPM = os.environ.get('SCANCODE_DEBUG_PACKAGE_NPM', False) TRACE = SCANCODE_DEBUG_PACKAGE +TRACE_NPM = SCANCODE_DEBUG_PACKAGE_NPM def logger_debug(*args): @@ -45,8 +48,7 @@ def logger_debug(*args): logger = logging.getLogger(__name__) -if TRACE: - import sys +if TRACE or TRACE_NPM: logging.basicConfig(stream=sys.stdout) logger.setLevel(logging.DEBUG) @@ -643,11 +645,16 @@ def parse(cls, location, package_only=False): # @npm: if "@npm:" in ns: ns = ns.split(':')[1] + if "@npm:" in name: + name = name.split(':')[1] top_requirements.append((ns, name, constraint,)) else: raise Exception('Inconsistent content') + if TRACE_NPM: + logger_debug(f'YarnLockV1Handler: parse: top_requirements: {top_requirements}') + # top_requirements should be all for the same package ns_names = set([(ns, name) for ns, name, _constraint in top_requirements]) assert len(ns_names) == 1, f'Different names for same dependency is not supported: {ns_names!r}' diff --git a/tests/packagedcode/data/npm/yarn-lock/v1-complex2/yarn.lock b/tests/packagedcode/data/npm/yarn-lock/v1-complex2/yarn.lock new file mode 100644 index 00000000000..dbdacf57fe6 --- /dev/null +++ b/tests/packagedcode/data/npm/yarn-lock/v1-complex2/yarn.lock @@ -0,0 +1,109 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/core@^7.0.0", "@babel/core@^7.23.3", "@babel/core@^7.23.9": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" + integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== + dependencies: + "@babel/parser" "^7.24.4" + "@babel/types" "^7.24.0" + json5 "^2.2.3" + semver "^6.3.1" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +change-case@^5.4.3, change-case@^5.4.4, "latest-change-case@npm:change-case@^5.4.3": + version "5.4.4" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" + integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== + +esbuild@^0.19.3, "esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0", esbuild@~0.19.10: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + +"globby-legacy@npm:globby@^11.0.4", globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" diff --git a/tests/packagedcode/data/npm/yarn-lock/v1-complex2/yarn.lock-expected b/tests/packagedcode/data/npm/yarn-lock/v1-complex2/yarn.lock-expected new file mode 100644 index 00000000000..91d390b1ed0 --- /dev/null +++ b/tests/packagedcode/data/npm/yarn-lock/v1-complex2/yarn.lock-expected @@ -0,0 +1,1018 @@ +[ + { + "type": "npm", + "namespace": null, + "name": null, + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/%40babel/core@7.24.4", + "extracted_requirement": "^7.0.0 ^7.23.3 ^7.23.9", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "@babel", + "name": "core", + "version": "7.24.4", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz", + "size": null, + "sha1": "1f758428e88e0d8c563874741bc4ffc4f71a4717", + "md5": null, + "sha256": null, + "sha512": "3015653173fe924979dfde1104b4b1c64fe22d37951ae5d35777080d76af3e930caa74a7b7a6a92a06a7fd4f0edd44966425994ff4db81f12929ae2e3203780e", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/%22%40babel/parser%22", + "extracted_requirement": "^7.24.4", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/%22%40babel/types%22", + "extracted_requirement": "^7.24.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/json5", + "extracted_requirement": "^2.2.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/semver", + "extracted_requirement": "^6.3.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/@babel/core", + "repository_download_url": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "api_data_url": "https://registry.npmjs.org/@babel%2fcore/7.24.4", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/%40babel/core@7.24.4" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/ansi-styles@3.2.1", + "extracted_requirement": "^3.2.0 ^3.2.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "ansi-styles", + "version": "3.2.1", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "size": null, + "sha1": "41fbb20243e50b12be0f04b8dedbf07520ce841d", + "md5": null, + "sha256": null, + "sha512": "553d1923a91945d4e1f18c89c3748c6d89bfbbe36a7ec03112958ed0f7fdb2af3f7bde16c713a93cac7d151d459720ad3950cd390fbc9ed96a17189173eaf9a8", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/color-convert", + "extracted_requirement": "^1.9.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/ansi-styles", + "repository_download_url": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "api_data_url": "https://registry.npmjs.org/ansi-styles/3.2.1", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/ansi-styles@3.2.1" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/change-case@5.4.4", + "extracted_requirement": "^5.4.3 ^5.4.4 ^5.4.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "change-case", + "version": "5.4.4", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz", + "size": null, + "sha1": "0d52b507d8fb8f204343432381d1a6d7bff97a02", + "md5": null, + "sha256": null, + "sha512": "1d14324e4dbf60f124b7d4e750f6cea6beb8530dca3a270558f5416fec621ef77a781c7fa8fafdc6a7c11434fc3f6bd6b2fbf3e236c491f0deef55b757236edb", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": "https://www.npmjs.com/package/change-case", + "repository_download_url": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "api_data_url": "https://registry.npmjs.org/change-case/5.4.4", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/change-case@5.4.4" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/esbuild@0.19.12", + "extracted_requirement": "^0.19.3 ~0.17.6 || ~0.18.0 || ~0.19.0 ~0.19.10", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "esbuild", + "version": "0.19.12", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz", + "size": null, + "sha1": "dc82ee5dc79e82f5a5c3b4323a2a641827db3e04", + "md5": null, + "sha256": null, + "sha512": "68046a82af2ba05063d39e0abd0af97f5b05bb40fae46fa6899442b89c89d06d77670c7bbd16abe59867dad910373217701acd56cbfff2cb5e8698fe1808e06e", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/%22%40esbuild/android-arm64%22", + "extracted_requirement": "0.19.12", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/%22%40esbuild/android-x64%22", + "extracted_requirement": "0.19.12", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/esbuild", + "repository_download_url": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "api_data_url": "https://registry.npmjs.org/esbuild/0.19.12", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/esbuild@0.19.12" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/globby@11.1.0", + "extracted_requirement": "^11.0.4 ^11.0.3 ^11.0.4 ^11.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "globby", + "version": "11.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz", + "size": null, + "sha1": "bd4be98bb042f83d796f7e3811991fbe82a0d34b", + "md5": null, + "sha256": null, + "sha512": "8e121768ecf2d6c6fc232a1c6abb964a7d538e69c156cf00ca1732f37ae6c4d27cab6b96282023dc29c963e2a91925c2b9e00f7348b4e6456f54ab4fd6df52de", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/array-union", + "extracted_requirement": "^2.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/dir-glob", + "extracted_requirement": "^3.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/fast-glob", + "extracted_requirement": "^3.2.9", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/ignore", + "extracted_requirement": "^5.2.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/merge2", + "extracted_requirement": "^1.4.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/slash", + "extracted_requirement": "^3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/globby", + "repository_download_url": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "api_data_url": "https://registry.npmjs.org/globby/11.1.0", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/globby@11.1.0" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/globby@10.0.1", + "extracted_requirement": "10.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "globby", + "version": "10.0.1", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz", + "size": null, + "sha1": "4782c34cb75dd683351335c5829cc3420e606b22", + "md5": null, + "sha256": null, + "sha512": "b12b388a7135141d98422ca67264efe8d58436bc8006350d3de5a13af9a7e128ed2b26e096cc8f671141dd4d7ff8bd5b622d2b3590ea08b947c8b6039753eae4", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/%22%40types/glob%22", + "extracted_requirement": "^7.1.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/array-union", + "extracted_requirement": "^2.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/dir-glob", + "extracted_requirement": "^3.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/fast-glob", + "extracted_requirement": "^3.0.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/glob", + "extracted_requirement": "^7.1.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/ignore", + "extracted_requirement": "^5.1.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/merge2", + "extracted_requirement": "^1.2.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/slash", + "extracted_requirement": "^3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/globby", + "repository_download_url": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "api_data_url": "https://registry.npmjs.org/globby/10.0.1", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/globby@10.0.1" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/string-width@4.2.3", + "extracted_requirement": "^4.2.0 ^1.0.2 || 2 || 3 || 4 ^4.1.0 ^4.2.0 ^4.2.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "string-width", + "version": "4.2.3", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz", + "size": null, + "sha1": "269c7117d27b05ad2e536830a8ec895ef9c6d010", + "md5": null, + "sha256": null, + "sha512": "c0ac90450a63274b08a7ad84ad265d1ac8cc256b1aa79a1136284786ee86ec954effd8c807a5327af2feb57b8eaab9e0f23fdcc4a4d6c96530bd24eb8a2673fe", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/emoji-regex", + "extracted_requirement": "^8.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/is-fullwidth-code-point", + "extracted_requirement": "^3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/strip-ansi", + "extracted_requirement": "^6.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/string-width", + "repository_download_url": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "api_data_url": "https://registry.npmjs.org/string-width/4.2.3", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/string-width@4.2.3" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/string-width@3.1.0", + "extracted_requirement": "^3.0.0 ^3.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "string-width", + "version": "3.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz", + "size": null, + "sha1": "22767be21b62af1081574306f69ac51b62203961", + "md5": null, + "sha256": null, + "sha512": "bda7dcbfa2a3559292833d3aa0cfc7e860c1ac0b73f2f76141a9068c522f36b1c0eb2dc7085d422272f2f902eaf1d4c93d0d5bf8a0d4a8315cb647515b8e1ed7", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/emoji-regex", + "extracted_requirement": "^7.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/is-fullwidth-code-point", + "extracted_requirement": "^2.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/strip-ansi", + "extracted_requirement": "^5.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/string-width", + "repository_download_url": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "api_data_url": "https://registry.npmjs.org/string-width/3.1.0", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/string-width@3.1.0" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/strip-ansi@6.0.1", + "extracted_requirement": "^6.0.1 ^6.0.0 ^6.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "strip-ansi", + "version": "6.0.1", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "size": null, + "sha1": "9e26c63d30f53443e9489495b2105d37b67a85d9", + "md5": null, + "sha256": null, + "sha512": "637f153d21dcaa416b0a916743dbee4979aabaebf9a1738aa46793e9a1abaf7a3719cf409556ba2417d448e0a76f1186645fbfd28a08ecaacfb944b3b54754e4", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/ansi-regex", + "extracted_requirement": "^5.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/strip-ansi", + "repository_download_url": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "api_data_url": "https://registry.npmjs.org/strip-ansi/6.0.1", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/strip-ansi@6.0.1" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/strip-ansi@3.0.1", + "extracted_requirement": "^3.0.0 ^3.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "strip-ansi", + "version": "3.0.1", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "size": null, + "sha1": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "md5": null, + "sha256": null, + "sha512": "561ba64926c1a834cff29d992ca8f8d148c1095e3ebfc6d4484a546f82a34605a4f696ea185e111058fa2846a089d6f67ff33a0330b41261720cd19ac3d382ce", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/ansi-regex", + "extracted_requirement": "^2.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/strip-ansi", + "repository_download_url": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "api_data_url": "https://registry.npmjs.org/strip-ansi/3.0.1", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/strip-ansi@3.0.1" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/wrap-ansi@7.0.0", + "extracted_requirement": "^7.0.0 ^7.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "wrap-ansi", + "version": "7.0.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "size": null, + "sha1": "67e145cff510a6a6984bdf1152911d69d2eb9e43", + "md5": null, + "sha256": null, + "sha512": "6151888f691a98b493c70e8db198e80717d2c2c9f4c9c75eb26738a7e436d5ce733ee675a65f8d7f155dc4fb5d1ef98d54e43a5d2606e0052dcadfc58bb0f5e9", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/ansi-styles", + "extracted_requirement": "^4.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/string-width", + "extracted_requirement": "^4.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/strip-ansi", + "extracted_requirement": "^6.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/wrap-ansi", + "repository_download_url": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "api_data_url": "https://registry.npmjs.org/wrap-ansi/7.0.0", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/wrap-ansi@7.0.0" + }, + "extra_data": {} + }, + { + "purl": "pkg:npm/wrap-ansi@5.1.0", + "extracted_requirement": "^5.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": { + "type": "npm", + "namespace": "", + "name": "wrap-ansi", + "version": "5.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "size": null, + "sha1": "1fd1f67235d5b6d0fee781056001bfb694c03b09", + "md5": null, + "sha256": null, + "sha512": "402d7f88dff6fd13d52798d82bc046b6d8f9cfcdcb9922a6bdbbeb5cf3422d94846f7d8a2950c90e5fcc3add8dd35a94d87fc593311af4f2ada3506a0e3b5ded", + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:npm/ansi-styles", + "extracted_requirement": "^3.2.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/string-width", + "extracted_requirement": "^3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:npm/strip-ansi", + "extracted_requirement": "^5.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://www.npmjs.com/package/wrap-ansi", + "repository_download_url": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "api_data_url": "https://registry.npmjs.org/wrap-ansi/5.1.0", + "datasource_id": "yarn_lock_v1", + "purl": "pkg:npm/wrap-ansi@5.1.0" + }, + "extra_data": {} + } + ], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "yarn_lock_v1", + "purl": null + } +] \ No newline at end of file diff --git a/tests/packagedcode/test_npm.py b/tests/packagedcode/test_npm.py index 85c80c46c48..91ac518dd8c 100644 --- a/tests/packagedcode/test_npm.py +++ b/tests/packagedcode/test_npm.py @@ -304,6 +304,13 @@ def test_parse_yarn_lock_v1(self): packages = npm.YarnLockV1Handler.parse(test_file) self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES) + def test_parse_complex_yarn_lock_v1(self): + test_file = self.get_test_loc('npm/yarn-lock/v1-complex2/yarn.lock') + expected_loc = self.get_test_loc( + 'npm/yarn-lock/v1-complex2/yarn.lock-expected') + packages = npm.YarnLockV1Handler.parse(test_file) + self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES) + def test_parse_yarn_lock_v1_complex(self): test_file = self.get_test_loc('npm/yarn-lock/v1-complex/yarn.lock') expected_loc = self.get_test_loc(