From 7ca0c6c93f557a488b89818ff04da2af978982a4 Mon Sep 17 00:00:00 2001 From: Junya Okabe Date: Mon, 28 Oct 2024 02:21:00 +0900 Subject: [PATCH] feat: add support for biome update: README fix update dependencies --- .github/linters/.jscpd.json | 1 + README.md | 12 +- TEMPLATES/biome.json | 12 + dependencies/package-lock.json | 147 ++++++++++++ dependencies/package.json | 1 + lib/functions/buildFileList.sh | 2 + lib/functions/linterCommands.sh | 2 + scripts/linterVersions.sh | 1 + .../super-linter/controls/super_linter.rb | 3 + .../javascript_biome/javascript_bad_1.js | 225 ++++++++++++++++++ .../javascript_biome/javascript_good_1.js | 223 +++++++++++++++++ 11 files changed, 626 insertions(+), 3 deletions(-) create mode 100644 TEMPLATES/biome.json create mode 100644 test/linters/javascript_biome/javascript_bad_1.js create mode 100644 test/linters/javascript_biome/javascript_good_1.js diff --git a/.github/linters/.jscpd.json b/.github/linters/.jscpd.json index e72f5af3..5e6d4871 100644 --- a/.github/linters/.jscpd.json +++ b/.github/linters/.jscpd.json @@ -15,6 +15,7 @@ "**/test/linters/dotnet_sln_format_style", "**/test/linters/dotnet_sln_format_whitespace", "**/test/linters/html", + "**/test/linters/javascript_biome", "**/test/linters/javascript_es", "**/test/linters/javascript_prettier", "**/test/linters/javascript_standard", diff --git a/README.md b/README.md index 20a4a062..6ce46b1a 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ Super-linter supports the following tools: | **Helm charts** | [Checkov](https://www.checkov.io/) | See YAML formatters | | **HTML** | [HTMLHint](https://github.com/htmlhint/HTMLHint) | [Prettier](https://prettier.io/) | | **Java** | [checkstyle](https://checkstyle.org) | [google-java-format](https://github.com/google/google-java-format) | -| **JavaScript** | [ESLint](https://eslint.org/), [standard js](https://standardjs.com/) | [Prettier](https://prettier.io/) | +| **JavaScript** | [ESLint](https://eslint.org/), [standard js](https://standardjs.com/), [Biome](https://biomejs.dev) | [Prettier](https://prettier.io/) | | **JSON** | [eslint-plugin-jsonc (configured for JSON)](https://www.npmjs.com/package/eslint-plugin-jsonc) (default), [eslint-plugin-json](https://www.npmjs.com/package/eslint-plugin-json) | [Prettier](https://prettier.io/) | | **JSONC**, **JSON5** | [eslint-plugin-jsonc](https://www.npmjs.com/package/eslint-plugin-jsonc) | [Prettier](https://prettier.io/) | | **JSX**, **TSX** | [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y), [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) | [Prettier](https://prettier.io/) | @@ -110,7 +110,7 @@ Super-linter supports the following tools: | **Tekton** | [tekton-lint](https://github.com/IBM/tekton-lint) | See YAML formatters | | **Terraform** | [tflint](https://github.com/terraform-linters/tflint) , [terrascan](https://github.com/accurics/terrascan), [Checkov](https://www.checkov.io/) | [terraform fmt](https://developer.hashicorp.com/terraform/cli/commands/fmt) | | **Terragrunt** | [terragrunt](https://github.com/gruntwork-io/terragrunt) | N/A | -| **TypeScript** | [ESLint](https://eslint.org/), [standard js](https://standardjs.com/) | [Prettier](https://prettier.io/) | +| **TypeScript** | [ESLint](https://eslint.org/), [standard js](https://standardjs.com/), [Biome](https://biomejs.dev) | [Prettier](https://prettier.io/) | | **Vue** | | [Prettier](https://prettier.io/) | | **XML** | [LibXML](http://xmlsoft.org/) | | | **YAML** | [YamlLint](https://github.com/adrienverge/yamllint) | [Prettier](https://prettier.io/) | @@ -240,6 +240,7 @@ You can configure Super-linter using the following environment variables: | **FIX_GRAPHQL_PRETTIER** | `true` | Flag to enable or disable the formatting of GraphQL files with Prettier. | | **FIX_GROOVY** | `false` | Option to enable fix mode for `GROOVY`. | | **FIX_HTML_PRETTIER** | `true` | Flag to enable or disable the formatting of HTML files with Prettier. | +| **FIX_JAVASCRIPT_BIOME** | `false` | Option to enable fix mode for `JAVASCRIPT_BIOME`. | | **FIX_JAVASCRIPT_ES** | `false` | Option to enable fix mode for `JAVASCRIPT_ES`. | | **FIX_JAVASCRIPT_PRETTIER** | `false` | Flag to enable or disable the formatting of JavaScript files with Prettier. | | **FIX_JAVASCRIPT_STANDARD** | `false` | Option to enable fix mode for `JAVASCRIPT_STANDARD`. | @@ -268,6 +269,7 @@ You can configure Super-linter using the following environment variables: | **FIX_SQLFLUFF** | `false` | Option to enable fix mode for `SQLFLUFF`. | | **FIX_TERRAFORM_FMT** | `false` | Option to enable fix mode for `TERRAFORM_FMT`. | | **FIX_TSX** | `false` | Option to enable fix mode for `TSX`. | +| **FIX_TYPESCRIPT_BIOME** | `false` | Option to enable fix mode for `TYPESCRIPT_BIOME`. | | **FIX_TYPESCRIPT_ES** | `false` | Option to enable fix mode for `TYPESCRIPT_ES`. | | **FIX_TYPESCRIPT_PRETTIER** | `false` | Flag to enable or disable the formatting of TypeScript files with Prettier. | | **FIX_TYPESCRIPT_STANDARD** | `false` | Option to enable fix mode for `TYPESCRIPT_STANDARD`. | @@ -283,6 +285,7 @@ You can configure Super-linter using the following environment variables: | **IGNORE_GENERATED_FILES** | `false` | If set to `true`, super-linter will ignore all the files with `@generated` marker but without `@not-generated` marker. Jscpd and Checkov ignore this variable. Use their include and ignore features to select or ignore the files to lint. | | **IGNORE_GITIGNORED_FILES** | `false` | If set to `true`, super-linter will ignore all the files that are ignored by Git. Checkov ignores this variable. Use its include and ignore features to select or ignore the files to lint. | | **JAVA_FILE_NAME** | `sun_checks.xml` | Filename for [Checkstyle configuration](https://checkstyle.sourceforge.io/config.html). Checkstyle embeds several configuration files, such as `sun_checks.xml`, `google_checks.xml` that you can use without providing your own configuration file. | +| **JAVASCRIPT_BIOME_CONFIG_FILE** | `biome.json` | Filename for [Biome configuration](https://biomejs.dev/guides/configure-biome/) (ex: `biome.json`) | | **JAVASCRIPT_ES_CONFIG_FILE** | `.eslintrc.yml` | Filename for [ESLint configuration](https://eslint.org/docs/user-guide/configuring#configuration-file-formats) (ex: `.eslintrc.yml`, `.eslintrc.json`) | | **JSCPD_CONFIG_FILE** | `.jscpd.json` | Filename for JSCPD configuration | | **KUBERNETES_KUBECONFORM_OPTIONS** | `null` | Additional arguments to pass to the command-line when running **Kubernetes Kubeconform** (Example: --ignore-missing-schemas) | @@ -325,6 +328,7 @@ You can configure Super-linter using the following environment variables: | **SUPPRESS_POSSUM** | `false` | If set to `true`, will hide the ASCII possum at top of log output. Default is `false` | | **TERRAFORM_TERRASCAN_CONFIG_FILE** | `terrascan.toml` | Filename for [terrascan configuration](https://github.com/accurics/terrascan) (ex: `terrascan.toml`) | | **TERRAFORM_TFLINT_CONFIG_FILE** | `.tflint.hcl` | Filename for [tfLint configuration](https://github.com/terraform-linters/tflint) (ex: `.tflint.hcl`) | +| **TYPESCRIPT_BIOME_CONFIG_FILE** | `biome.json` | Filename for [Biome configuration](https://biomejs.dev/guides/configure-biome/) (ex: `biome.json`) | | **TYPESCRIPT_ES_CONFIG_FILE** | `.eslintrc.yml` | Filename for [ESLint configuration](https://eslint.org/docs/user-guide/configuring#configuration-file-formats) (ex: `.eslintrc.yml`, `.eslintrc.json`) | | **TYPESCRIPT_STANDARD_TSCONFIG_FILE** | `${DEFAULT_WORKSPACE}/tsconfig.json` | Path to the [TypeScript project configuration](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) in [ts-standard](https://github.com/standard/ts-standard). The path is relative to `DEFAULT_WORKSPACE` | | **USE_FIND_ALGORITHM** | `false` | By default, we use `git diff` to find all files in the workspace and what has been updated, this would enable the Linux `find` method instead to find all files to lint | @@ -363,6 +367,7 @@ You can configure Super-linter using the following environment variables: | **VALIDATE_HTML** | `true` | Flag to enable or disable the linting process of the HTML language. | | **VALIDATE_HTML_PRETTIER** | `true` | Flag to enable or disable checking the formatting of HTML files with Prettier. | | **VALIDATE_JAVA** | `true` | Flag to enable or disable the linting process of the Java language. (Utilizing: checkstyle) | +| **VALIDATE_JAVASCRIPT_BIOME** | `true` | Flag to enable or disable the linting process of the JavaScript language. (Utilizing: Biome) | | **VALIDATE_JAVASCRIPT_ES** | `true` | Flag to enable or disable the linting process of the JavaScript language. (Utilizing: ESLint) | | **VALIDATE_JAVASCRIPT_PRETTIER** | `true` | Flag to enable or disable checking the formatting of JavaScript files with Prettier. | | **VALIDATE_JAVASCRIPT_STANDARD** | `true` | Flag to enable or disable the linting process of the JavaScript language. (Utilizing: standard) | @@ -417,6 +422,7 @@ You can configure Super-linter using the following environment variables: | **VALIDATE_TERRAFORM_TFLINT** | `true` | Flag to enable or disable the linting process of the Terraform language. (Utilizing tflint) | | **VALIDATE_TERRAGRUNT** | `true` | Flag to enable or disable the linting process for Terragrunt files. | | **VALIDATE_TSX** | `true` | Flag to enable or disable the linting process for tsx files (Utilizing: ESLint) | +| **VALIDATE_TYPESCRIPT_BIOME** | `true` | Flag to enable or disable the linting process of the TypeScript language. (Utilizing: Biome) | | **VALIDATE_TYPESCRIPT_ES** | `true` | Flag to enable or disable the linting process of the TypeScript language. (Utilizing: ESLint) | | **VALIDATE_TYPESCRIPT_PRETTIER** | `true` | Flag to enable or disable checking the formatting of TypeScript files with Prettier. | | **VALIDATE_TYPESCRIPT_STANDARD** | `true` | Flag to enable or disable the linting process of the TypeScript language. (Utilizing: ts-standard) | @@ -763,4 +769,4 @@ github_conf ## How to contribute If you would like to help contribute to super-linter, see -[CONTRIBUTING](https://github.com/super-linter/super-linter/blob/main/.github/CONTRIBUTING.md). +[CONTRIBUTING](https://github.com/super-linter/super-linter/blob/main/.github/CONTRIBUTING.md). \ No newline at end of file diff --git a/TEMPLATES/biome.json b/TEMPLATES/biome.json new file mode 100644 index 00000000..24ce3b70 --- /dev/null +++ b/TEMPLATES/biome.json @@ -0,0 +1,12 @@ +{ + "formatter": { + "enabled": false, + "indentStyle": "tab", + "lineWidth": 120 + }, + "linter": { + "enabled": true, + "indentStyle": "tab", + "lineWidth": 120 + } +} diff --git a/dependencies/package-lock.json b/dependencies/package-lock.json index 67f16ab6..7ea4be9d 100644 --- a/dependencies/package-lock.json +++ b/dependencies/package-lock.json @@ -9,6 +9,7 @@ "@babel/eslint-parser": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.24.7", + "@biomejs/biome": "^1.9.4", "@coffeelint/cli": "^5.2.11", "@commitlint/config-conventional": "^19.5.0", "@ibm/tekton-lint": "^1.1.0", @@ -3227,6 +3228,152 @@ "node": ">=6.9.0" } }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@breejs/later": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.2.0.tgz", diff --git a/dependencies/package.json b/dependencies/package.json index 2af1eea3..cf070450 100644 --- a/dependencies/package.json +++ b/dependencies/package.json @@ -4,6 +4,7 @@ "@babel/eslint-parser": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.24.7", + "@biomejs/biome": "^1.9.4", "@coffeelint/cli": "^5.2.11", "@commitlint/config-conventional": "^19.5.0", "@ibm/tekton-lint": "^1.1.0", diff --git a/lib/functions/buildFileList.sh b/lib/functions/buildFileList.sh index 6b4a9b3f..68eb9d80 100755 --- a/lib/functions/buildFileList.sh +++ b/lib/functions/buildFileList.sh @@ -430,6 +430,7 @@ BuildFileArrays() { echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JAVA" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-GOOGLE_JAVA_FORMAT" elif [ "${FILE_TYPE}" == "js" ]; then + echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JAVASCRIPT_BIOME" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JAVASCRIPT_ES" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JAVASCRIPT_STANDARD" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JAVASCRIPT_PRETTIER" @@ -525,6 +526,7 @@ BuildFileArrays() { [[ ${FILE} != *"docker-bake.override.hcl"* ]]; then echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-TERRAGRUNT" elif [ "${FILE_TYPE}" == "ts" ]; then + echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-TYPESCRIPT_BIOME" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-TYPESCRIPT_ES" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-TYPESCRIPT_STANDARD" echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-TYPESCRIPT_PRETTIER" diff --git a/lib/functions/linterCommands.sh b/lib/functions/linterCommands.sh index 4c659c80..1bd5cf3d 100755 --- a/lib/functions/linterCommands.sh +++ b/lib/functions/linterCommands.sh @@ -87,6 +87,7 @@ LINTER_COMMANDS_ARRAY_GROOVY=(npm-groovy-lint -c "${GROOVY_LINTER_RULES}" --fail LINTER_COMMANDS_ARRAY_HTML=(htmlhint --config "${HTML_LINTER_RULES}") LINTER_COMMANDS_ARRAY_HTML_PRETTIER=("${PRETTIER_COMMAND[@]}") LINTER_COMMANDS_ARRAY_JAVA=(java -jar /usr/bin/checkstyle -c "${JAVA_LINTER_RULES}") +LINTER_COMMANDS_ARRAY_JAVASCRIPT_BIOME=(biome lint) LINTER_COMMANDS_ARRAY_JAVASCRIPT_ES=(eslint -c "${JAVASCRIPT_ES_LINTER_RULES}") LINTER_COMMANDS_ARRAY_JAVASCRIPT_PRETTIER=("${PRETTIER_COMMAND[@]}") LINTER_COMMANDS_ARRAY_JAVASCRIPT_STANDARD=(standard "${JAVASCRIPT_STANDARD_LINTER_RULES}") @@ -168,6 +169,7 @@ LINTER_COMMANDS_ARRAY_TERRAFORM_TFLINT=("TF_DATA_DIR=\"/tmp/.terraform-TERRAFORM LINTER_COMMANDS_ARRAY_TERRAFORM_TERRASCAN=(terrascan scan -i terraform -t all -c "${TERRAFORM_TERRASCAN_LINTER_RULES}" -f) LINTER_COMMANDS_ARRAY_TERRAGRUNT=(terragrunt hclfmt --terragrunt-check --terragrunt-log-level error --terragrunt-hclfmt-file) LINTER_COMMANDS_ARRAY_TSX=(eslint -c "${TSX_LINTER_RULES}") +LINTER_COMMANDS_ARRAY_TYPESCRIPT_BIOME=(biome lint) LINTER_COMMANDS_ARRAY_TYPESCRIPT_ES=(eslint -c "${TYPESCRIPT_ES_LINTER_RULES}") LINTER_COMMANDS_ARRAY_TYPESCRIPT_PRETTIER=("${PRETTIER_COMMAND[@]}") LINTER_COMMANDS_ARRAY_TYPESCRIPT_STANDARD=(ts-standard --parser @typescript-eslint/parser --plugin @typescript-eslint/eslint-plugin --project "${TYPESCRIPT_STANDARD_TSCONFIG_FILE}") diff --git a/scripts/linterVersions.sh b/scripts/linterVersions.sh index db599f9d..20326203 100755 --- a/scripts/linterVersions.sh +++ b/scripts/linterVersions.sh @@ -11,6 +11,7 @@ declare -A LINTER_NAMES_ARRAY LINTER_NAMES_ARRAY['ANSIBLE']="ansible-lint" LINTER_NAMES_ARRAY['BASH']="shellcheck" LINTER_NAMES_ARRAY['BASH_EXEC']="bash-exec" +LINTER_NAMES_ARRAY['BIOME']="biome" LINTER_NAMES_ARRAY['CHECKOV']="checkov" LINTER_NAMES_ARRAY['CLANG_FORMAT']="clang-format" LINTER_NAMES_ARRAY['CLOJURE']="clj-kondo" diff --git a/test/inspec/super-linter/controls/super_linter.rb b/test/inspec/super-linter/controls/super_linter.rb index d72acd27..702a2f03 100644 --- a/test/inspec/super-linter/controls/super_linter.rb +++ b/test/inspec/super-linter/controls/super_linter.rb @@ -146,6 +146,7 @@ control "super-linter-installed-commands" do { linter_name: "arm-ttk", version_command: "grep -iE 'version' '/usr/bin/arm-ttk' | xargs"}, { linter_name: "asl-validator"}, { linter_name: "bash-exec", expected_exit_status: 1}, # expect a return code = 1 because this linter doesn't support a "get linter version" command + { linter_name: "biome"}, { linter_name: "black"}, { linter_name: "cfn-lint"}, { linter_name: "checkov"}, @@ -334,6 +335,7 @@ control "super-linter-installed-npm-packages" do "@babel/eslint-parser", "@babel/preset-react", "@babel/preset-typescript", + "@biomejs/biome", "@coffeelint/cli", "@ibm/tekton-lint", "@react-native/eslint-config", @@ -528,6 +530,7 @@ control "super-linter-validate-files" do "/action/lib/.automation/.stylelintrc.json", "/action/lib/.automation/.tflint.hcl", "/action/lib/.automation/.yaml-lint.yml", + "/action/lib/.automation/biome.json", "/action/lib/.automation/phpcs.xml", "/action/lib/.automation/phpstan.neon", "/action/lib/.automation/psalm.xml", diff --git a/test/linters/javascript_biome/javascript_bad_1.js b/test/linters/javascript_biome/javascript_bad_1.js new file mode 100644 index 00000000..98e5ee29 --- /dev/null +++ b/test/linters/javascript_biome/javascript_bad_1.js @@ -0,0 +1,225 @@ +var http = require('http') +var createHandler = require( 'github-webhook-handler') + +var handler = createHandler( { path : /webhook, secret : (process.env.SECRET) }) + +var userArray = [ 'user1' ] +here is some garbage = that + +var teamDescription = Team of Robots +var teamPrivacy = 'closed' // closed (visible) / secret (hidden) are options here + +var teamName = process.env.GHES_TEAM_NAME +var teamAccess = 'pull' // pull,push,admin options here +var teamId = '' + +var orgRepos = [] + +// var creator = "" + +var foo = someFunction(); +var bar = a + 1; + +http.createServer(function (req, res) { + handler(req, res, function (err) { + console.log(err) + res.statusCode = 404 + res.end('no such location') + }) +}).listen(3000) + +handler.on('error', function (err) { + console.await.error('Error:', err.message) +}) + +handler.on('repository', function (event) { + if (event.payload.action === 'created') { + const repo = event.payload.repository.full_name + console.log(repo) + const org = event.payload.repository.owner.login + getTeamID(org) + setTimeout(checkTeamIDVariable, 1000) + } +}) + +handler.on('team', function (event) { +// TODO user events such as being removed from team or org + if (event.payload.action === 'deleted') { + // const name = event.payload.team.name + const org = event.payload.organization.login + getRepositories(org) + setTimeout(checkReposVariable, 5000) + } else if (event.payload.action === 'removed_from_repository') { + const org = event.payload.organization.login + getTeamID(org) + // const repo = event.payload.repository.full_name + setTimeout(checkTeamIDVariable, 1000) + } +}) + +function getTeamID (org) { + const https = require('https') + + const options = { + hostname: (process.env.GHE_HOST), + port: 443 + path: '/api/v3/orgs/' + org + '/teams', + method: 'GET', + headers: { + Authorization: 'token ' + (process.env.GHE_TOKEN), + 'Content-Type': 'application/json' + } + } + let body = [] + const req = https.request(options, (res) => { + res.on('data', (chunk) => { + body.push(chunk) + }).on('end', () => { + body = JSON.parse(Buffer.concat(body)) + body.forEach(item => { + if (item.name === teamName) { + teamId = item.id + } + }) + }) + }) + + req.on('error, (error) => { + console.error(error) + }) + + req.end() +} + +function checkTeamIDVariable (repo) { + if (typeof teamId != 'undefined') { + addTeamToRepo(repo, teamId) + } +} + +function checkReposVariable (org) { + if (typeof orgRepos !== 'undefined') { + // for(var repo of orgRepos) { + // addTeamToRepo(repo, teamId) + // } + reCreateTeam(org) + } +} + +function addTeamToRepo (repo, teamId) { + const https = require('https') + const data = JSON.stringify({ + permission: teamAccess + }) + + const options = { + hostname: (process.env.GHE_HOST), + port: 443, + path: '/api/v3/teams/' + teamId + '/repos/' + repo, + method: 'PUT', + headers: { + Authorization: 'token ' + (process.env.GHE_TOKEN), + 'Content-Type': 'application/json', + 'Content-Length': data.length + } + } + let body = [] + + const req = https.request(options, (res) => { + res.on('data', (chunk) => { + + body.push(chunk) + + }).on('end', () => { + + body = Buffer.concat(body).toString() + console.log(res.statusCode) + console.log('added team to ' + repo) + }) + }) + + req.on('error', (error) => { + console.error(error) + }) + + req.write(data) + req.end() +} + +function reCreateTeam (org) { + const https = require('https') + const data = JSON.stringify({ + name: teamName, + description: teamDescription, + privacy: teamPrivacy + maintainers: userArray, + repo_names: orgRepos + }) + + const options = { + hostname: (process.env.GHE_HOST), + port: 443 + path: '/api/v3/orgs/' + org + '/teams', + method: 'POST', + headers: { + Authorization: 'token ' + (process.env.GHE_TOKEN), + 'Content-Type': 'application/json', + 'Content-Length': data.length + } + } + // const body = [] + const req = https.request(options, (res) => { + if (res.statusCode !== 201) { + console.log('Status code: ' + res.statusCode) + console.log('Added ' + teamName + ' to ' + org + ' Failed') + res.on('data', function (chunk) { + console.log('BODY: ' + chunk) + }) + } else { + console.log('Added ' + teamName ' to ' + org) + } + }) + + req.on('error', (error) => { + console.error(error) + }) + + req.write(data) + req.end() +} + +function getRepositories (org) { + orgRepos = [] + + const https = require('https') + + const options = { + hostname: (process.env.GHE_HOST), + port: '443', + path: '/api/v3/orgs/' + org + "/repos", + method: 'GET', + headers: { + Authorization: 'token ' + (process.env.GHE_TOKEN), + 'Content-Type': 'application/json' + } + } + let body = [] + const req = https.request(options, (res) => { + res.on('data', (chunk) => { + body.push(chunk) + + }).on('end', () => { + body = JSON.parse(Buffer.concat(body)) + body.forEach(item => { + orgRepos.push(item.full_name) + + console.log(item.full_name) + }) + }) + }) + + req.on('error', (error) => { + console.error(error) + }) + req.end() +} diff --git a/test/linters/javascript_biome/javascript_good_1.js b/test/linters/javascript_biome/javascript_good_1.js new file mode 100644 index 00000000..309d71be --- /dev/null +++ b/test/linters/javascript_biome/javascript_good_1.js @@ -0,0 +1,223 @@ +var http = require("http"); +var createHandler = require("github-webhook-handler"); +var handler = createHandler({ path: "/webhook", secret: process.env.SECRET }); + +var userArray = ["user1"]; + +var teamDescription = "Team of Robots"; +var teamPrivacy = "closed"; // closed (visible) / secret (hidden) are options here + +var teamName = process.env.GHES_TEAM_NAME; +var teamAccess = "pull"; // pull,push,admin options here +var teamId = ""; + +var orgRepos = []; + +// var creator = "" + +http + .createServer(function (req, res) { + handler(req, res, function (err) { + console.log(err); + res.statusCode = 404; + res.end("no such location"); + }); + }) + .listen(3000); + +handler.on("error", function (err) { + console.error("Error:", err.message); +}); + +handler.on("repository", function (event) { + if (event.payload.action === "created") { + const repo = event.payload.repository.full_name; + console.log(repo); + const org = event.payload.repository.owner.login; + getTeamID(org); + setTimeout(checkTeamIDVariable, 1000); + } +}); + +handler.on("team", function (event) { + // TODO user events such as being removed from team or org + if (event.payload.action === "deleted") { + // const name = event.payload.team.name + const org = event.payload.organization.login; + getRepositories(org); + setTimeout(checkReposVariable, 5000); + } else if (event.payload.action === "removed_from_repository") { + const org = event.payload.organization.login; + getTeamID(org); + // const repo = event.payload.repository.full_name + setTimeout(checkTeamIDVariable, 1000); + } +}); + +function getTeamID(org) { + const https = require("https"); + + const options = { + hostname: process.env.GHE_HOST, + port: 443, + path: "/api/v3/orgs/" + org + "/teams", + method: "GET", + headers: { + Authorization: "token " + process.env.GHE_TOKEN, + "Content-Type": "application/json", + }, + }; + let body = []; + const req = https.request(options, (res) => { + res + .on("data", (chunk) => { + body.push(chunk); + }) + .on("end", () => { + body = JSON.parse(Buffer.concat(body)); + body.forEach((item) => { + if (item.name === teamName) { + teamId = item.id; + } + }); + }); + }); + + req.on("error", (error) => { + console.error(error); + }); + + req.end(); +} + +function checkTeamIDVariable(repo) { + if (typeof teamId !== "undefined") { + addTeamToRepo(repo, teamId); + } +} + +function checkReposVariable(org) { + if (typeof orgRepos !== "undefined") { + // for(var repo of orgRepos) { + // addTeamToRepo(repo, teamId) + // } + reCreateTeam(org); + } +} + +function addTeamToRepo(repo, teamId) { + const https = require("https"); + const data = JSON.stringify({ + permission: teamAccess, + }); + + const options = { + hostname: process.env.GHE_HOST, + port: 443, + path: "/api/v3/teams/" + teamId + "/repos/" + repo, + method: "PUT", + headers: { + Authorization: "token " + process.env.GHE_TOKEN, + "Content-Type": "application/json", + "Content-Length": data.length, + }, + }; + let body = []; + const req = https.request(options, (res) => { + res + .on("data", (chunk) => { + body.push(chunk); + }) + .on("end", () => { + body = Buffer.concat(body).toString(); + console.log(res.statusCode); + console.log("added team to " + repo); + }); + }); + + req.on("error", (error) => { + console.error(error); + }); + + req.write(data); + req.end(); +} + +function reCreateTeam(org) { + const https = require("https"); + const data = JSON.stringify({ + name: teamName, + description: teamDescription, + privacy: teamPrivacy, + maintainers: userArray, + repo_names: orgRepos, + }); + + const options = { + hostname: process.env.GHE_HOST, + port: 443, + path: "/api/v3/orgs/" + org + "/teams", + method: "POST", + headers: { + Authorization: "token " + process.env.GHE_TOKEN, + "Content-Type": "application/json", + "Content-Length": data.length, + }, + }; + // const body = [] + const req = https.request(options, (res) => { + if (res.statusCode !== 201) { + console.log("Status code: " + res.statusCode); + console.log("Added " + teamName + " to " + org + " Failed"); + res.on("data", function (chunk) { + console.log("BODY: " + chunk); + }); + } else { + console.log("Added " + teamName + " to " + org); + } + }); + + req.on("error", (error) => { + console.error(error); + }); + + req.write(data); + req.end(); +} + +function getRepositories(org) { + orgRepos = []; + + const https = require("https"); + + const options = { + hostname: process.env.GHE_HOST, + port: 443, + path: "/api/v3/orgs/" + org + "/repos", + method: "GET", + headers: { + Authorization: "token " + process.env.GHE_TOKEN, + "Content-Type": "application/json", + }, + }; + let body = []; + const req = https.request(options, (res) => { + res + .on("data", (chunk) => { + body.push(chunk); + }) + .on("end", () => { + body = JSON.parse(Buffer.concat(body)); + body.forEach((item) => { + orgRepos.push(item.full_name); + console.log(item.full_name); + }); + }); + }); + + req.on("error", (error) => { + console.error(error); + }); + + req.end(); +}