5
5
"io"
6
6
"regexp"
7
7
8
+ "github.com/samber/lo"
8
9
"golang.org/x/xerrors"
9
10
10
11
"github.com/aquasecurity/trivy/pkg/dependency"
@@ -21,7 +22,7 @@ type packageJSON struct {
21
22
Dependencies map [string ]string `json:"dependencies"`
22
23
OptionalDependencies map [string ]string `json:"optionalDependencies"`
23
24
DevDependencies map [string ]string `json:"devDependencies"`
24
- Workspaces [] string `json:"workspaces"`
25
+ Workspaces any `json:"workspaces"`
25
26
}
26
27
27
28
type Package struct {
@@ -65,7 +66,7 @@ func (p *Parser) Parse(r io.Reader) (Package, error) {
65
66
Dependencies : pkgJSON .Dependencies ,
66
67
OptionalDependencies : pkgJSON .OptionalDependencies ,
67
68
DevDependencies : pkgJSON .DevDependencies ,
68
- Workspaces : pkgJSON .Workspaces ,
69
+ Workspaces : parseWorkspaces ( pkgJSON .Workspaces ) ,
69
70
}, nil
70
71
}
71
72
@@ -82,6 +83,29 @@ func parseLicense(val interface{}) string {
82
83
return ""
83
84
}
84
85
86
+ // parseWorkspaces returns slice of workspaces
87
+ func parseWorkspaces (val any ) []string {
88
+ // Workspaces support 2 types - https://github.com/SchemaStore/schemastore/blob/d9516961f8a5b0e65a457808070147b5a866f60b/src/schemas/json/package.json#L777
89
+ switch ws := val .(type ) {
90
+ // Workspace as object (map[string][]string)
91
+ // e.g. "workspaces": {"packages": ["packages/*", "plugins/*"]},
92
+ case map [string ]interface {}:
93
+ // Take only workspaces for `packages` - https://classic.yarnpkg.com/blog/2018/02/15/nohoist/
94
+ if pkgsWorkspaces , ok := ws ["packages" ]; ok {
95
+ return lo .Map (pkgsWorkspaces .([]interface {}), func (workspace interface {}, _ int ) string {
96
+ return workspace .(string )
97
+ })
98
+ }
99
+ // Workspace as string array
100
+ // e.g. "workspaces": ["packages/*", "backend"],
101
+ case []interface {}:
102
+ return lo .Map (ws , func (workspace interface {}, _ int ) string {
103
+ return workspace .(string )
104
+ })
105
+ }
106
+ return nil
107
+ }
108
+
85
109
func IsValidName (name string ) bool {
86
110
// Name is optional field
87
111
// https://docs.npmjs.com/cli/v9/configuring-npm/package-json#name
0 commit comments