(cls, location, package_only=False)
| 619 | |
| 620 | @classmethod |
| 621 | def parse(cls, location, package_only=False): |
| 622 | |
| 623 | with io.open(location, encoding='utf-8') as loc: |
| 624 | package_data = json.load(loc) |
| 625 | |
| 626 | # we have two formats: v1 and v2 |
| 627 | lockfile_version = package_data.get('lockfileVersion', 1) |
| 628 | root_name = package_data.get('name') |
| 629 | root_version = package_data.get('version') |
| 630 | root_ns, _ , root_name = root_name.rpartition('/') |
| 631 | |
| 632 | extra_data = dict(lockfile_version=lockfile_version) |
| 633 | # this is the top level element that we return |
| 634 | root_package_mapping = dict( |
| 635 | datasource_id=cls.datasource_id, |
| 636 | type=cls.default_package_type, |
| 637 | primary_language=cls.default_primary_language, |
| 638 | namespace=root_ns, |
| 639 | name=root_name, |
| 640 | version=root_version, |
| 641 | extra_data=extra_data, |
| 642 | **get_urls(root_ns, root_name, root_version) |
| 643 | ) |
| 644 | root_package_data = models.PackageData.from_data(root_package_mapping, package_only) |
| 645 | |
| 646 | # https://docs.npmjs.com/cli/v8/configuring-npm/package-lock-json#lockfileversion |
| 647 | if lockfile_version == 1: |
| 648 | deps_key = 'dependencies' |
| 649 | else: |
| 650 | # v2 and may be v3??? |
| 651 | deps_key = 'packages' |
| 652 | |
| 653 | deps_mapping = package_data.get(deps_key) or {} |
| 654 | |
| 655 | # Top level package metadata is present here |
| 656 | root_pkg = deps_mapping.get("") |
| 657 | if root_pkg: |
| 658 | pkg_name = root_pkg.get('name') |
| 659 | pkg_ns, _ , pkg_name = pkg_name.rpartition('/') |
| 660 | pkg_version = root_pkg.get('version') |
| 661 | pkg_purl = PackageURL( |
| 662 | type=cls.default_package_type, |
| 663 | namespace=pkg_ns, |
| 664 | name=pkg_name, |
| 665 | version=pkg_version, |
| 666 | ).to_string() |
| 667 | if pkg_purl != root_package_data.purl: |
| 668 | if TRACE_NPM: |
| 669 | logger_debug(f'BaseNpmLockHandler: parse: purl mismatch: {pkg_purl} vs {root_package_data.purl}') |
| 670 | else: |
| 671 | extracted_license_statement = root_pkg.get('license') |
| 672 | if extracted_license_statement: |
| 673 | root_package_data.extracted_license_statement = extracted_license_statement |
| 674 | root_package_data.populate_license_fields() |
| 675 | |
| 676 | deps_mapper( |
| 677 | deps=root_pkg.get('devDependencies') or {}, |
| 678 | package=root_package_data, |
nothing calls this directly
no test coverage detected