go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/npm/packagejson.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package npm
     5  
     6  import (
     7  	"encoding/json"
     8  	"io"
     9  
    10  	"go.mondoo.com/cnquery/providers-sdk/v1/upstream/mvd"
    11  )
    12  
    13  // PackageJson allows parsing the package json file
    14  type PackageJson struct {
    15  	Name            string            `json:"name"`
    16  	Description     string            `json:"description"`
    17  	Version         string            `json:"version"`
    18  	License         string            `jsonn:"license"`
    19  	Dependencies    map[string]string `jsonn:"dependencies"`
    20  	DevDependencies map[string]string `jsonn:"devDependencies"`
    21  }
    22  
    23  type PackageJsonLockEntry struct {
    24  	Version string `json:"version"`
    25  	Dev     bool   `json:"dev"`
    26  }
    27  
    28  // PackageJsonLock is the struct to represent the package.lock file
    29  type PackageJsonLock struct {
    30  	Name         string                          `json:"name"`
    31  	Version      string                          `json:"version"`
    32  	Dependencies map[string]PackageJsonLockEntry `jsonn:"dependencies"`
    33  }
    34  
    35  func ParsePackageJson(r io.Reader) ([]*mvd.Package, error) {
    36  	data, err := io.ReadAll(r)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  
    41  	var packageJson PackageJson
    42  	err = json.Unmarshal(data, &packageJson)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  
    47  	entries := []*mvd.Package{}
    48  
    49  	// add own package
    50  	entries = append(entries, &mvd.Package{
    51  		Name:      packageJson.Name,
    52  		Version:   packageJson.Version,
    53  		Format:    "npm",
    54  		Namespace: "nodejs",
    55  	})
    56  
    57  	// add all dependencies
    58  
    59  	for k, v := range packageJson.Dependencies {
    60  		entries = append(entries, &mvd.Package{
    61  			Name:      k,
    62  			Version:   v,
    63  			Format:    "npm",
    64  			Namespace: "nodejs",
    65  		})
    66  	}
    67  
    68  	return entries, nil
    69  }
    70  
    71  func ParsePackageJsonLock(r io.Reader) ([]*mvd.Package, error) {
    72  	data, err := io.ReadAll(r)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	var packageJsonLock PackageJsonLock
    78  	err = json.Unmarshal(data, &packageJsonLock)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	entries := []*mvd.Package{}
    84  
    85  	// add own package
    86  	entries = append(entries, &mvd.Package{
    87  		Name:      packageJsonLock.Name,
    88  		Version:   packageJsonLock.Version,
    89  		Format:    "npm",
    90  		Namespace: "nodejs",
    91  	})
    92  
    93  	// add all dependencies
    94  	for k, v := range packageJsonLock.Dependencies {
    95  		entries = append(entries, &mvd.Package{
    96  			Name:      k,
    97  			Version:   v.Version,
    98  			Format:    "npm",
    99  			Namespace: "nodejs",
   100  		})
   101  	}
   102  
   103  	return entries, nil
   104  }