diff --git a/providers/os/resources/languages/javascript/packagejson/parser.go b/providers/os/resources/languages/javascript/packagejson/parser.go index 2d2ba1e165..00eab0915a 100644 --- a/providers/os/resources/languages/javascript/packagejson/parser.go +++ b/providers/os/resources/languages/javascript/packagejson/parser.go @@ -9,6 +9,8 @@ import ( "fmt" "regexp" "strings" + + "github.com/rs/zerolog/log" ) // packageJson allows parsing the package json file @@ -24,7 +26,7 @@ type packageJson struct { Dependencies map[string]string `jsonn:"dependencies"` DevDependencies map[string]string `jsonn:"devDependencies"` Repository packageJsonRepository `json:"repository"` - Engines map[string]string `jsonn:"engines"` + Engines enginesField `jsonn:"engines"` CPU []string `json:"cpu"` OS []string `json:"os"` @@ -32,6 +34,35 @@ type packageJson struct { evidence []string `json:"-"` } +type enginesField map[string]string + +func (p *enginesField) UnmarshalJSON(data []byte) error { + var raw interface{} + if err := json.Unmarshal(data, &raw); err != nil { + return err + } + + // Default to an empty map + n := map[string]string{} + + switch v := raw.(type) { + case map[string]interface{}: + for key, value := range v { + if strVal, ok := value.(string); ok { + n[key] = strVal + } else { + log.Warn().Msgf("invalid type for engines[%s]", key) + } + } + default: + log.Warn().Msgf("invalid engines field type: %T", v) + } + + *p = n + + return nil +} + type booleanField bool func (p *booleanField) UnmarshalJSON(data []byte) error { diff --git a/providers/os/resources/languages/javascript/packagejson/parser_test.go b/providers/os/resources/languages/javascript/packagejson/parser_test.go index f0a3d27621..30a4f1b8d7 100644 --- a/providers/os/resources/languages/javascript/packagejson/parser_test.go +++ b/providers/os/resources/languages/javascript/packagejson/parser_test.go @@ -136,6 +136,13 @@ func TestPackageJson(t *testing.T) { }, }, }, + // https://github.com/mondoohq/cnquery/issues/5235 + { + Fixture: "./testdata/engines-malformed-GH5235.json", + Expected: packageJson{ + Engines: map[string]string{}, + }, + }, { Fixture: "./testdata/homepage.json", Expected: packageJson{ diff --git a/providers/os/resources/languages/javascript/packagejson/testdata/engines-malformed-GH5235.json b/providers/os/resources/languages/javascript/packagejson/testdata/engines-malformed-GH5235.json new file mode 100644 index 0000000000..abdddd171b --- /dev/null +++ b/providers/os/resources/languages/javascript/packagejson/testdata/engines-malformed-GH5235.json @@ -0,0 +1,5 @@ +{ + "engines": [ + "node >= 0.8.0" + ] +} diff --git a/providers/os/resources/languages/javascript/packagejson/testdata/engines.json b/providers/os/resources/languages/javascript/packagejson/testdata/engines.json index 9766d3d065..697fa5488a 100644 --- a/providers/os/resources/languages/javascript/packagejson/testdata/engines.json +++ b/providers/os/resources/languages/javascript/packagejson/testdata/engines.json @@ -2,4 +2,4 @@ "engines": { "node": ">=0.10.3 <15" } -} \ No newline at end of file +}