Skip to content

Commit dbadf36

Browse files
committed
move eslint files
1 parent 98a6c9c commit dbadf36

File tree

13 files changed

+171
-200
lines changed

13 files changed

+171
-200
lines changed

cmd/analyze.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"codacy/cli-v2/config"
55
"codacy/cli-v2/tools"
6+
"codacy/cli-v2/tools/eslint"
67
"codacy/cli-v2/tools/pmd"
78
"encoding/json"
89
"fmt"
@@ -188,12 +189,13 @@ func getToolName(toolName string, version string) string {
188189
}
189190

190191
func runEslintAnalysis(workDirectory string, pathsToCheck []string, autoFix bool, outputFile string, outputFormat string) {
191-
eslint := config.Config.Tools()["eslint"]
192-
eslintInstallationDirectory := eslint.InstallDir
192+
tool := config.Config.Tools()["eslint"]
193+
eslintInstallationDirectory := tool.InstallDir
193194
nodeRuntime := config.Config.Runtimes()["node"]
194195
nodeBinary := nodeRuntime.Binaries["node"]
195196

196-
tools.RunEslint(workDirectory, eslintInstallationDirectory, nodeBinary, pathsToCheck, autoFix, outputFile, outputFormat)
197+
//todo pass config file
198+
eslint.RunEslint(workDirectory, eslintInstallationDirectory, nodeBinary, pathsToCheck, autoFix, outputFile, outputFormat, "")
197199
}
198200

199201
func runTrivyAnalysis(workDirectory string, pathsToCheck []string, outputFile string, outputFormat string) {

cmd/init.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"codacy/cli-v2/config"
55
"codacy/cli-v2/tools"
6+
"codacy/cli-v2/tools/eslint"
67
"codacy/cli-v2/tools/pmd"
78
"encoding/json"
89
"errors"
@@ -172,7 +173,7 @@ func buildRepositoryConfigurationFiles(token string) error {
172173
eslintApiConfiguration := extractESLintConfiguration(apiToolConfigurations)
173174
if eslintApiConfiguration != nil {
174175
eslintDomainConfiguration := convertAPIToolConfigurationToDomain(*eslintApiConfiguration)
175-
eslintConfigurationString := tools.CreateEslintConfig(eslintDomainConfiguration)
176+
eslintConfigurationString := eslint.CreateEslintConfig(eslintDomainConfiguration)
176177

177178
eslintConfigFile, err := os.Create("eslint.config.mjs")
178179
if err != nil {
@@ -388,7 +389,7 @@ func createDefaultTrivyConfigFile() error {
388389
func createDefaultEslintConfigFile() error {
389390
// Use empty tool configuration to get default settings
390391
emptyConfig := tools.ToolConfiguration{}
391-
content := tools.CreateEslintConfig(emptyConfig)
392+
content := eslint.CreateEslintConfig(emptyConfig)
392393

393394
// Write to file
394395
return os.WriteFile("eslint.config.mjs", []byte(content), 0644)
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package tools
1+
package eslint
22

33
import (
44
"encoding/json"
55
"fmt"
66
"strings"
7+
8+
"codacy/cli-v2/tools"
79
)
810

911
func quoteWhenIsNotJson(value string) string {
@@ -18,7 +20,7 @@ func quoteWhenIsNotJson(value string) string {
1820
}
1921
}
2022

21-
func CreateEslintConfig(configuration ToolConfiguration) string {
23+
func CreateEslintConfig(configuration tools.ToolConfiguration) string {
2224
result := `export default [
2325
{
2426
rules: {
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tools
1+
package eslint
22

33
import (
44
"os"
@@ -9,7 +9,7 @@ import (
99
// * Run from the root of the repo we want to analyse
1010
// * NODE_PATH="<the installed eslint path>/node_modules"
1111
// * The local installed ESLint should have the @microsoft/eslint-formatter-sarif installed
12-
func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory string, nodeBinary string, pathsToCheck []string, autoFix bool, outputFile string, outputFormat string) {
12+
func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory string, nodeBinary string, pathsToCheck []string, autoFix bool, outputFile string, outputFormat string, configFile string) {
1313
eslintInstallationNodeModules := filepath.Join(eslintInstallationDirectory, "node_modules")
1414
eslintJsPath := filepath.Join(eslintInstallationNodeModules, ".bin", "eslint")
1515

@@ -19,13 +19,19 @@ func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory
1919
}
2020
if outputFormat == "sarif" {
2121
//When outputting in SARIF format
22-
cmd.Args = append(cmd.Args, "-f", "@microsoft/eslint-formatter-sarif")
22+
cmd.Args = append(cmd.Args, "-f", filepath.Join(eslintInstallationNodeModules, "@microsoft", "eslint-formatter-sarif", "sarif.js"))
2323
}
2424

2525
if outputFile != "" {
2626
//When writing to file, use the output file option
2727
cmd.Args = append(cmd.Args, "-o", outputFile)
2828
}
29+
30+
// Add config file flag if provided
31+
if configFile != "" {
32+
cmd.Args = append(cmd.Args, "-c", configFile)
33+
}
34+
2935
if len(pathsToCheck) > 0 {
3036
cmd.Args = append(cmd.Args, pathsToCheck...)
3137
} else {

tools/eslintRunner_test.go

Lines changed: 0 additions & 49 deletions
This file was deleted.

tools/eslintConfigCreator_test.go renamed to tools/test/eslint/eslintConfigCreator_test.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
package tools
1+
package eslint
22

33
import (
44
"testing"
55

6+
"codacy/cli-v2/tools"
7+
"codacy/cli-v2/tools/eslint"
8+
69
"github.com/stretchr/testify/assert"
710
)
811

9-
func testConfig(t *testing.T, configuration ToolConfiguration, expected string) {
10-
actual := CreateEslintConfig(configuration)
12+
func testConfig(t *testing.T, configuration tools.ToolConfiguration, expected string) {
13+
actual := eslint.CreateEslintConfig(configuration)
1114
assert.Equal(t, expected, actual)
1215
}
1316

1417
func TestCreateEslintConfigEmptyConfig(t *testing.T) {
1518
testConfig(t,
16-
ToolConfiguration{},
19+
tools.ToolConfiguration{},
1720
`export default [
1821
{
1922
rules: {
@@ -24,8 +27,8 @@ func TestCreateEslintConfigEmptyConfig(t *testing.T) {
2427

2528
func TestCreateEslintConfigConfig1(t *testing.T) {
2629
testConfig(t,
27-
ToolConfiguration{
28-
PatternsConfiguration: []PatternConfiguration{
30+
tools.ToolConfiguration{
31+
PatternsConfiguration: []tools.PatternConfiguration{
2932
{
3033
PatternId: "ESLint8_semi",
3134
},
@@ -42,11 +45,11 @@ func TestCreateEslintConfigConfig1(t *testing.T) {
4245

4346
func TestCreateEslintConfigUnnamedParam(t *testing.T) {
4447
testConfig(t,
45-
ToolConfiguration{
46-
PatternsConfiguration: []PatternConfiguration{
48+
tools.ToolConfiguration{
49+
PatternsConfiguration: []tools.PatternConfiguration{
4750
{
4851
PatternId: "ESLint8_semi",
49-
ParameterConfigurations: []PatternParameterConfiguration{
52+
ParameterConfigurations: []tools.PatternParameterConfiguration{
5053
{
5154
Name: "unnamedParam",
5255
Value: "never",
@@ -66,11 +69,11 @@ func TestCreateEslintConfigUnnamedParam(t *testing.T) {
6669

6770
func TestCreateEslintConfigNamedParam(t *testing.T) {
6871
testConfig(t,
69-
ToolConfiguration{
70-
PatternsConfiguration: []PatternConfiguration{
72+
tools.ToolConfiguration{
73+
PatternsConfiguration: []tools.PatternConfiguration{
7174
{
7275
PatternId: "consistent-return",
73-
ParameterConfigurations: []PatternParameterConfiguration{
76+
ParameterConfigurations: []tools.PatternParameterConfiguration{
7477
{
7578
Name: "treatUndefinedAsUnspecified",
7679
Value: "false",
@@ -90,11 +93,11 @@ func TestCreateEslintConfigNamedParam(t *testing.T) {
9093

9194
func TestCreateEslintConfigUnnamedAndNamedParam(t *testing.T) {
9295
testConfig(t,
93-
ToolConfiguration{
94-
PatternsConfiguration: []PatternConfiguration{
96+
tools.ToolConfiguration{
97+
PatternsConfiguration: []tools.PatternConfiguration{
9598
{
9699
PatternId: "consistent-return",
97-
ParameterConfigurations: []PatternParameterConfiguration{
100+
ParameterConfigurations: []tools.PatternParameterConfiguration{
98101
{
99102
Name: "treatUndefinedAsUnspecified",
100103
Value: "false",
@@ -118,8 +121,8 @@ func TestCreateEslintConfigUnnamedAndNamedParam(t *testing.T) {
118121

119122
func TestCreateEslintConfigSupportPlugins(t *testing.T) {
120123
testConfig(t,
121-
ToolConfiguration{
122-
PatternsConfiguration: []PatternConfiguration{
124+
tools.ToolConfiguration{
125+
PatternsConfiguration: []tools.PatternConfiguration{
123126
{
124127
PatternId: "plugin/consistent-return",
125128
},
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package eslint
2+
3+
import (
4+
"encoding/json"
5+
"log"
6+
"os"
7+
"os/exec"
8+
"path/filepath"
9+
"strings"
10+
"testing"
11+
12+
"codacy/cli-v2/tools/eslint"
13+
14+
"github.com/stretchr/testify/assert"
15+
)
16+
17+
// SarifResult represents a single result in a SARIF report
18+
type SarifResult struct {
19+
RuleID string `json:"ruleId"`
20+
Message struct {
21+
Text string `json:"text"`
22+
} `json:"message"`
23+
Locations []struct {
24+
PhysicalLocation struct {
25+
ArtifactLocation struct {
26+
URI string `json:"uri"`
27+
} `json:"artifactLocation"`
28+
Region struct {
29+
StartLine int `json:"startLine"`
30+
StartColumn int `json:"startColumn"`
31+
EndLine int `json:"endLine"`
32+
EndColumn int `json:"endColumn"`
33+
} `json:"region"`
34+
} `json:"physicalLocation"`
35+
} `json:"locations"`
36+
}
37+
38+
// SarifReport represents the structure of a SARIF report
39+
type SarifReport struct {
40+
Runs []struct {
41+
Results []SarifResult `json:"results"`
42+
} `json:"runs"`
43+
}
44+
45+
func TestRunEslintToFile(t *testing.T) {
46+
homeDirectory, err := os.UserHomeDir()
47+
if err != nil {
48+
log.Fatal(err.Error())
49+
}
50+
currentDirectory, err := os.Getwd()
51+
if err != nil {
52+
log.Fatal(err.Error())
53+
}
54+
55+
// Find node binary
56+
nodeBinary, err := exec.LookPath("node")
57+
if err != nil {
58+
t.Fatalf("Node.js is not installed: %v", err)
59+
}
60+
61+
// Use the current directory since files are in flat structure
62+
testDirectory := currentDirectory
63+
tempResultFile := filepath.Join(os.TempDir(), "eslint.sarif")
64+
defer os.Remove(tempResultFile)
65+
66+
// Use absolute paths
67+
repositoryToAnalyze := testDirectory
68+
eslintInstallDir := filepath.Join(homeDirectory, ".cache/codacy/tools/[email protected]")
69+
70+
// Debug logging
71+
log.Printf("Test directory: %s", testDirectory)
72+
log.Printf("ESLint install dir: %s", eslintInstallDir)
73+
log.Printf("Node binary: %s", nodeBinary)
74+
log.Printf("Temp result file: %s", tempResultFile)
75+
76+
// Check if ESLint is installed
77+
if _, err := os.Stat(eslintInstallDir); os.IsNotExist(err) {
78+
t.Fatalf("ESLint is not installed at %s", eslintInstallDir)
79+
}
80+
81+
// Run ESLint on test.js
82+
eslint.RunEslint(repositoryToAnalyze, eslintInstallDir, nodeBinary, []string{"test.js"}, false, tempResultFile, "sarif", "")
83+
84+
// Check if the output file was created
85+
obtainedSarifBytes, err := os.ReadFile(tempResultFile)
86+
if err != nil {
87+
t.Fatalf("Failed to read output file: %v", err)
88+
}
89+
90+
// Normalize paths in the obtained SARIF output
91+
obtainedSarif := string(obtainedSarifBytes)
92+
obtainedSarif = strings.ReplaceAll(obtainedSarif, currentDirectory+"/", "")
93+
94+
// Parse the normalized SARIF output
95+
var sarifReport SarifReport
96+
err = json.Unmarshal([]byte(obtainedSarif), &sarifReport)
97+
if err != nil {
98+
t.Fatalf("Failed to parse SARIF output: %v", err)
99+
}
100+
101+
// Verify we have results
102+
assert.NotEmpty(t, sarifReport.Runs, "SARIF report should have at least one run")
103+
assert.NotEmpty(t, sarifReport.Runs[0].Results, "SARIF report should have at least one result")
104+
105+
// Define expected violations
106+
expectedViolations := map[string]bool{
107+
"semi": false,
108+
}
109+
110+
// Check each result
111+
for _, result := range sarifReport.Runs[0].Results {
112+
// Mark this rule as found
113+
expectedViolations[result.RuleID] = true
114+
115+
// Verify the file path is correct
116+
assert.Contains(t, result.Locations[0].PhysicalLocation.ArtifactLocation.URI, "test.js",
117+
"Violation should be in test.js")
118+
119+
// Verify line numbers are reasonable
120+
assert.Greater(t, result.Locations[0].PhysicalLocation.Region.StartLine, 0,
121+
"Start line should be positive")
122+
assert.Less(t, result.Locations[0].PhysicalLocation.Region.StartLine, 10,
123+
"Start line should be within the file")
124+
}
125+
126+
// Verify all expected violations were found
127+
for ruleID, found := range expectedViolations {
128+
assert.True(t, found, "Expected violation %s was not found", ruleID)
129+
}
130+
}

0 commit comments

Comments
 (0)