Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ The tool is invoked using the `codacy-cli` command, and provides two main comman
runtimes:
- node@22.2.0
tools:
- eslint@9.3.0
- eslint@8.57.0

- **`codacy-cli install`**: Command to install the specified node and eslint versions before running analysis.

Expand Down
2 changes: 1 addition & 1 deletion cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ func configFileTemplate(tools []tools.Tool) string {

// Default versions
defaultVersions := map[string]string{
ESLint: "9.3.0",
ESLint: "8.57.0",
Trivy: "0.59.1",
PyLint: "3.3.6",
PMD: "6.55.0",
Expand Down
2 changes: 1 addition & 1 deletion cmd/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestConfigFileTemplate(t *testing.T) {
expected: []string{
"node@22.2.0",
"python@3.11.11",
"eslint@9.3.0",
"eslint@8.57.0",
"trivy@0.59.1",
"pylint@3.3.6",
"pmd@6.55.0",
Expand Down
2 changes: 1 addition & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ Use "{{.CommandPath}} [command] --help" for more information about a command.{{e
runtimes:
- node@22.2.0
tools:
- eslint@9.3.0
- eslint@8.57.0

` + color.New(color.FgCyan).Sprint("For more information and examples, visit:") + `
https://github.com/codacy/codacy-cli-v2
Expand Down
2 changes: 1 addition & 1 deletion integration-tests/init-without-token/expected/codacy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ runtimes:
- dart@3.7.2
- java@17.0.10
tools:
- eslint@9.3.0
- eslint@8.57.0
- trivy@0.59.1
- pylint@3.3.6
- pmd@6.55.0
Expand Down
50 changes: 47 additions & 3 deletions tools/eslintConfigCreator.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,66 @@ func CreateEslintConfig(configuration []domain.PatternConfiguration) string {

parametersString := ""

// Find default value for unnamedParam if needed
defaultUnnamedParamValue := ""
for _, paramDef := range patternConfiguration.PatternDefinition.Parameters {
if paramDef.Name == "unnamedParam" {
defaultUnnamedParamValue = paramDef.Default
break
}
}

// Process parameters
foundUnnamedParam := false
for _, parameter := range patternConfiguration.Parameters {
if parameter.Name == "unnamedParam" {
parametersString += quoteWhenIsNotJson(parameter.Value)
foundUnnamedParam = true
// If value is empty but we have a default, use the default
if parameter.Value == "" && defaultUnnamedParamValue != "" {
parametersString += quoteWhenIsNotJson(defaultUnnamedParamValue)
} else if parameter.Value != "" {
parametersString += quoteWhenIsNotJson(parameter.Value)
}
}
}

// If we found an unnamed param with empty value but have a default, use it
if foundUnnamedParam && parametersString == "" && defaultUnnamedParamValue != "" {
parametersString += quoteWhenIsNotJson(defaultUnnamedParamValue)
}

// build named parameters json object
namedParametersString := ""
for _, parameter := range patternConfiguration.Parameters {
if parameter.Name != "unnamedParam" {
paramValue := parameter.Value

// If value is empty, look for default in pattern definition
if paramValue == "" {
for _, paramDef := range patternConfiguration.PatternDefinition.Parameters {
if paramDef.Name == parameter.Name && paramDef.Default != "" {
paramValue = paramDef.Default
break
}
}
}

// Skip only if both value and default are empty
if paramValue == "" {
continue
}

if len(namedParametersString) == 0 {
namedParametersString += "{"
} else {
namedParametersString += ", "
}
namedParametersString += fmt.Sprintf("\"%s\": %s", parameter.Name, quoteWhenIsNotJson(parameter.Value))

if paramValue == "true" || paramValue == "false" {
Comment thread
franciscoovazevedo marked this conversation as resolved.
namedParametersString += fmt.Sprintf("\"%s\": %s", parameter.Name, paramValue)
} else {
namedParametersString += fmt.Sprintf("\"%s\": %s", parameter.Name, quoteWhenIsNotJson(paramValue))
}
}
}
if len(namedParametersString) > 0 {
Expand All @@ -84,7 +128,7 @@ func CreateEslintConfig(configuration []domain.PatternConfiguration) string {
result += " "

if parametersString == "" {
result += fmt.Sprintf(`"%s": "error",`, rule)
result += fmt.Sprintf(`"%s": ["error"],`, rule)
result += "\n"
} else {
result += fmt.Sprintf(`"%s": ["error", %s],`, rule, parametersString)
Expand Down
70 changes: 69 additions & 1 deletion tools/eslintConfigCreator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func TestCreateEslintConfigConfig1(t *testing.T) {
`export default [
{
rules: {
"semi": "error",
"semi": ["error"],
}
}
];`)
Expand Down Expand Up @@ -133,3 +133,71 @@ func TestCreateEslintConfigDoNotSupportPlugins(t *testing.T) {
}
];`)
}

func TestCreateEslintConfigWithDefaultValues(t *testing.T) {
testConfig(t,
[]domain.PatternConfiguration{
{
PatternDefinition: domain.PatternDefinition{
Id: "ESLint8_no-fallthrough",
Parameters: []domain.ParameterConfiguration{
{
Name: "commentPattern",
Default: "",
},
{
Name: "allowEmptyCase",
Default: "false",
},
},
},
Parameters: []domain.ParameterConfiguration{
{
Name: "commentPattern",
Value: "", // Empty value with empty default - should be skipped
},
{
Name: "allowEmptyCase",
Value: "", // Empty value with default "false" - should use default
},
},
},
},
`export default [
{
rules: {
"no-fallthrough": ["error", {"allowEmptyCase": false}],
}
}
];`)
}

func TestCreateEslintConfigWithUnnamedDefaultValues(t *testing.T) {
testConfig(t,
[]domain.PatternConfiguration{
{
PatternDefinition: domain.PatternDefinition{
Id: "ESLint8_no-inner-declarations",
Parameters: []domain.ParameterConfiguration{
{
Name: "unnamedParam",
Default: "functions",
},
},
},
Parameters: []domain.ParameterConfiguration{
{
Name: "unnamedParam",
Value: "", // Empty value with default "functions" - should use default
},
},
},
},
`export default [
{
rules: {
"no-inner-declarations": ["error", "functions"],
}
}
];`)
}
Loading