feat: lint commit messages with commitlint (#6118)

Add support to run Commitlint against commit messages. It supports the
current modes:

- Lint the commit message of the last commit
- Lint the commit messages of the pushed commits in case there is more
  than one pushed commit

This commit also removes stuff that we used to run commitlint as a
standalone tool because we can now use the commitlint instance that
Super-linter ships:

- lint-commit steps in lint-commit the GitHub Actions workflow
- lint-commit Make target
- commitlint and its dependencies in package.json and package-lock.json
This commit is contained in:
Marco Ferrari 2024-09-19 10:53:13 +02:00 committed by GitHub
parent b526effb8b
commit 5d6e3fcecc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 971 additions and 994 deletions

View file

@ -35,40 +35,3 @@ jobs:
else
echo "This pull request contains ${commit_count} commit."
fi
- name: Set commit metadata
run: |
SET_INTERVAL_VALUES="true"
if [[ ${{ github.event_name }} == 'push' ]] || [[ ${{ github.event_name }} == 'merge_group' ]]; then
echo "Using default commit metadata"
SET_INTERVAL_VALUES="false"
elif [[ ${{ github.event_name }} == 'pull_request' ]]; then
FROM_INTERVAL_COMMITLINT=${{ github.event.pull_request.head.sha }}~${{ github.event.pull_request.commits }}
TO_INTERVAL_COMMITLINT=${{ github.event.pull_request.head.sha }}
else
echo "[ERROR] Event not supported when setting commit metadata"
exit 1
fi
if [ "${SET_INTERVAL_VALUES}" == "true" ]; then
if [ -z "${FROM_INTERVAL_COMMITLINT}" ]; then
echo "[ERROR] FROM_INTERVAL_COMMITLINT is empty"
exit 1
fi
if [ -z "${TO_INTERVAL_COMMITLINT}" ]; then
echo "[ERROR] TO_INTERVAL_COMMITLINT is empty"
exit 1
fi
{
echo "FROM_INTERVAL_COMMITLINT=${FROM_INTERVAL_COMMITLINT}"
echo "TO_INTERVAL_COMMITLINT=${TO_INTERVAL_COMMITLINT}"
} >> "${GITHUB_ENV}"
else
echo "Skip updating GITHUB_ENV. SET_INTERVAL_VALUES: ${SET_INTERVAL_VALUES}"
fi
- name: Validate commits
run: |
make lint-commits

View file

@ -175,6 +175,7 @@ test-actions-runner-debug: ## Run super-linter with ACTIONS_RUNNER_DEBUG=true
-e ENABLE_GITHUB_ACTIONS_GROUP_TITLE=true \
-e DEFAULT_BRANCH=main \
-e USE_FIND_ALGORITHM=true \
-e VALIDATE_GIT_COMMITLINT=false \
-v "$(CURDIR)/.github":/tmp/lint/.github \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -187,6 +188,7 @@ test-actions-steps-debug: ## Run super-linter with ACTIONS_STEPS_DEBUG=true
-e ENABLE_GITHUB_ACTIONS_GROUP_TITLE=true \
-e DEFAULT_BRANCH=main \
-e USE_FIND_ALGORITHM=true \
-e VALIDATE_GIT_COMMITLINT=false \
-v "$(CURDIR)/.github":/tmp/lint/.github \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -199,6 +201,7 @@ test-runner-debug: ## Run super-linter with RUNNER_DEBUG=1
-e ENABLE_GITHUB_ACTIONS_GROUP_TITLE=true \
-e DEFAULT_BRANCH=main \
-e USE_FIND_ALGORITHM=true \
-e VALIDATE_GIT_COMMITLINT=false \
-v "$(CURDIR)/.github":/tmp/lint/.github \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -211,6 +214,7 @@ test-find: ## Run super-linter on a subdirectory with USE_FIND_ALGORITHM=true
-e ENABLE_GITHUB_ACTIONS_GROUP_TITLE=true \
-e DEFAULT_BRANCH=main \
-e USE_FIND_ALGORITHM=true \
-e VALIDATE_GIT_COMMITLINT=false \
-v "$(CURDIR)/.github":/tmp/lint/.github \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -227,6 +231,7 @@ test-non-default-workdir: ## Run super-linter with DEFAULT_WORKSPACE set
-e DEFAULT_WORKSPACE=/tmp/not-default-workspace \
-e USE_FIND_ALGORITHM=true \
-e VALIDATE_ALL_CODEBASE=true \
-e VALIDATE_GIT_COMMITLINT=false \
-v $(CURDIR)/.github:/tmp/not-default-workspace/.github \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -433,6 +438,7 @@ test-linter-commands: ## Test linterCommands
# Run this test against a small directory because we're only interested in
# loading default configuration files. The directory that we run super-linter
# against should not be .github because that includes default linter rules.
# Disable commitlint because the workspace is not a Git repository.
.PHONY: test-default-config-files
test-default-config-files: ## Test default configuration files loading
docker run \
@ -441,6 +447,7 @@ test-default-config-files: ## Test default configuration files loading
-e ENABLE_GITHUB_ACTIONS_GROUP_TITLE=true \
-e DEFAULT_BRANCH=main \
-e USE_FIND_ALGORITHM=true \
-e VALIDATE_GIT_COMMITLINT=false \
-v "$(CURDIR)/docs":/tmp/lint \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -454,6 +461,7 @@ test-custom-ssl-cert: ## Test the configuration of a custom SSL/TLS certificate
-e DEFAULT_BRANCH=main \
-e USE_FIND_ALGORITHM=true \
-e SSL_CERT_SECRET="$(shell cat test/data/ssl-certificate/rootCA-test.crt)" \
-e VALIDATE_GIT_COMMITLINT=false \
-v "$(CURDIR)/docs":/tmp/lint \
--rm \
$(SUPER_LINTER_TEST_CONTAINER_URL)
@ -592,19 +600,6 @@ build-dev-container-image: docker-dev-container-build-check ## Build commit lint
--build-arg UID=$(shell id -u) \
-t ${DEV_CONTAINER_URL} "${CURDIR}/dev-dependencies"
.PHONY: lint-commits
lint-commits: build-dev-container-image ## Lint commits
docker run \
-v "$(CURDIR):/source-repository" \
--rm \
${DEV_CONTAINER_URL} \
commitlint \
--config .github/linters/commitlint.config.js \
--cwd /source-repository \
--from ${FROM_INTERVAL_COMMITLINT} \
--to ${TO_INTERVAL_COMMITLINT} \
--verbose
.PHONY: release-please-dry-run
release-please-dry-run: build-dev-container-image check-github-token ## Run release-please in dry-run mode to preview the release pull request
@echo "Running release-please against branch: ${RELEASE_PLEASE_TARGET_BRANCH}"; \

View file

@ -64,6 +64,7 @@ Super-linter supports the following tools:
| **CSS**, **SCSS**, **Sass** | [stylelint](https://stylelint.io/) | [Prettier](https://prettier.io/) |
| **Clojure** | [clj-kondo](https://github.com/borkdude/clj-kondo) | |
| **CoffeeScript** | [coffeelint](https://coffeelint.github.io/) | |
| **Commit messages** | [commitlint](https://commitlint.js.org/) | |
| **Copy/paste detection** | [jscpd](https://github.com/kucherenko/jscpd) | N/A |
| **Dart** | [dart analyze command](https://dart.dev/guides/language/analysis-options) | |
| **Dockerfile** | [Haskell Dockerfile Linter (Hadolint)](https://github.com/hadolint/hadolint), [Checkov](https://www.checkov.io/) | |
@ -218,8 +219,10 @@ You can configure Super-linter using the following environment variables:
| **DISABLE_ERRORS** | `false` | Flag to have the linter complete with exit code 0 even if errors were detected. |
| **DOCKERFILE_HADOLINT_FILE_NAME** | `.hadolint.yaml` | Filename for [hadolint configuration](https://github.com/hadolint/hadolint) (ex: `.hadolintlintrc.yaml`) |
| **EDITORCONFIG_FILE_NAME** | `.ecrc` | Filename for [editorconfig-checker configuration](https://github.com/editorconfig-checker/editorconfig-checker) |
| **ENABLE_COMMITLINT_STRICT_MODE** | `false` | If set to `true`, enables [commitlint strict mode](https://commitlint.js.org/reference/cli.html). |
| **ENABLE_GITHUB_ACTIONS_GROUP_TITLE** | `false` if `RUN_LOCAL=true`, `true` otherwise | Flag to enable [GitHub Actions log grouping](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#grouping-log-lines). |
| **ENABLE_GITHUB_ACTIONS_STEP_SUMMARY** | `false` if `RUN_LOCAL=true`, `true` otherwise | Flag to enable [GitHub Actions job summary](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary) for the Super-linter action. For more information, see [Summary outputs](#summary-outputs). |
| **ENFORCE_COMMITLINT_CONFIGURATION_CHECK** | `false` | If set to `true` and `VALIDATE_GIT_COMMITLINT` is set to `true`, Super-linter exits with an error if there's no commitlint configuration file. Otherwise, Super-linter emits a warning and forcefully sets `VALIDATE_GIT_COMMITLINT` to `false`. |
| **FILTER_REGEX_EXCLUDE** | not set | Regular expression defining which files will be excluded from linting (ex: `.*src/test.*`). Not setting this variable means to process all files. Jscpd and Checkov ignore this variable. Use their include and ignore features to select or ignore the files to lint. |
| **FILTER_REGEX_INCLUDE** | not set | Regular expression defining which files will be processed by linters (ex: `.*src/.*`). Not setting this variable means to process all files. `FILTER_REGEX_INCLUDE` is evaluated before `FILTER_REGEX_EXCLUDE`. Jscpd and Checkov ignore this variable. Use their include and ignore features to select or ignore the files to lint. |
| **FIX_ANSIBLE** | `false` | Option to enable fix mode for `ANSIBLE`. |
@ -347,6 +350,7 @@ You can configure Super-linter using the following environment variables:
| **VALIDATE_EDITORCONFIG** | `true` | Flag to enable or disable the linting process with the EditorConfig. |
| **VALIDATE_ENV** | `true` | Flag to enable or disable the linting process of the ENV language. |
| **VALIDATE_GHERKIN** | `true` | Flag to enable or disable the linting process of the Gherkin language. |
| **VALIDATE_GIT_COMMITLINT** | `true` | Option to enable or disable the linting process of Git commits with commitlint. commitlint needs a configuration file to work. Also, see the `ENFORCE_COMMITLINT_CONFIGURATION_CHECK` and the `ENABLE_COMMITLINT_STRICT_MODE` variables. |
| **VALIDATE_GIT_MERGE_CONFLICT_MARKERS** | `true` | Option to enable or disable checking if files contain Git merge conflict markers. |
| **VALIDATE_GITHUB_ACTIONS** | `true` | Flag to enable or disable the linting process of the GitHub Actions. |
| **VALIDATE_GITLEAKS** | `true` | Flag to enable or disable the linting process of the secrets. |

747
dependencies/package-lock.json generated vendored
View file

@ -10,11 +10,13 @@
"@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.24.7",
"@coffeelint/cli": "^5.2.11",
"@commitlint/config-conventional": "^19.5.0",
"@ibm/tekton-lint": "^1.1.0",
"@react-native/eslint-config": "^0.75.2",
"@stoplight/spectral-cli": "^6.11.1",
"@typescript-eslint/eslint-plugin": "^7.16.1",
"asl-validator": "^3.8.3",
"commitlint": "^19.5.0",
"eslint": "^8.57.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^9.1.0",
@ -3282,6 +3284,459 @@
"node": ">=0.1.90"
}
},
"node_modules/@commitlint/cli": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.5.0.tgz",
"integrity": "sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==",
"license": "MIT",
"dependencies": {
"@commitlint/format": "^19.5.0",
"@commitlint/lint": "^19.5.0",
"@commitlint/load": "^19.5.0",
"@commitlint/read": "^19.5.0",
"@commitlint/types": "^19.5.0",
"tinyexec": "^0.3.0",
"yargs": "^17.0.0"
},
"bin": {
"commitlint": "cli.js"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/config-conventional": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz",
"integrity": "sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==",
"license": "MIT",
"dependencies": {
"@commitlint/types": "^19.5.0",
"conventional-changelog-conventionalcommits": "^7.0.2"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/config-validator": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz",
"integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==",
"license": "MIT",
"dependencies": {
"@commitlint/types": "^19.5.0",
"ajv": "^8.11.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/ensure": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz",
"integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==",
"license": "MIT",
"dependencies": {
"@commitlint/types": "^19.5.0",
"lodash.camelcase": "^4.3.0",
"lodash.kebabcase": "^4.1.1",
"lodash.snakecase": "^4.1.1",
"lodash.startcase": "^4.4.0",
"lodash.upperfirst": "^4.3.1"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/execute-rule": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz",
"integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==",
"license": "MIT",
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/format": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz",
"integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==",
"license": "MIT",
"dependencies": {
"@commitlint/types": "^19.5.0",
"chalk": "^5.3.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/format/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@commitlint/is-ignored": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.5.0.tgz",
"integrity": "sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==",
"license": "MIT",
"dependencies": {
"@commitlint/types": "^19.5.0",
"semver": "^7.6.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/lint": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.5.0.tgz",
"integrity": "sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==",
"license": "MIT",
"dependencies": {
"@commitlint/is-ignored": "^19.5.0",
"@commitlint/parse": "^19.5.0",
"@commitlint/rules": "^19.5.0",
"@commitlint/types": "^19.5.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/load": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.5.0.tgz",
"integrity": "sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==",
"license": "MIT",
"dependencies": {
"@commitlint/config-validator": "^19.5.0",
"@commitlint/execute-rule": "^19.5.0",
"@commitlint/resolve-extends": "^19.5.0",
"@commitlint/types": "^19.5.0",
"chalk": "^5.3.0",
"cosmiconfig": "^9.0.0",
"cosmiconfig-typescript-loader": "^5.0.0",
"lodash.isplainobject": "^4.0.6",
"lodash.merge": "^4.6.2",
"lodash.uniq": "^4.5.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/load/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@commitlint/load/node_modules/cosmiconfig": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.1",
"import-fresh": "^3.3.0",
"js-yaml": "^4.1.0",
"parse-json": "^5.2.0"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/d-fischer"
},
"peerDependencies": {
"typescript": ">=4.9.5"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@commitlint/load/node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/message": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz",
"integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==",
"license": "MIT",
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/parse": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz",
"integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==",
"license": "MIT",
"dependencies": {
"@commitlint/types": "^19.5.0",
"conventional-changelog-angular": "^7.0.0",
"conventional-commits-parser": "^5.0.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/read": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz",
"integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==",
"license": "MIT",
"dependencies": {
"@commitlint/top-level": "^19.5.0",
"@commitlint/types": "^19.5.0",
"git-raw-commits": "^4.0.0",
"minimist": "^1.2.8",
"tinyexec": "^0.3.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/read/node_modules/dargs": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
"integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/read/node_modules/git-raw-commits": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
"integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
"license": "MIT",
"dependencies": {
"dargs": "^8.0.0",
"meow": "^12.0.1",
"split2": "^4.0.0"
},
"bin": {
"git-raw-commits": "cli.mjs"
},
"engines": {
"node": ">=16"
}
},
"node_modules/@commitlint/read/node_modules/meow": {
"version": "12.1.1",
"resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
"integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
"license": "MIT",
"engines": {
"node": ">=16.10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/resolve-extends": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz",
"integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==",
"license": "MIT",
"dependencies": {
"@commitlint/config-validator": "^19.5.0",
"@commitlint/types": "^19.5.0",
"global-directory": "^4.0.1",
"import-meta-resolve": "^4.0.0",
"lodash.mergewith": "^4.6.2",
"resolve-from": "^5.0.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/resolve-extends/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@commitlint/rules": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.5.0.tgz",
"integrity": "sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==",
"license": "MIT",
"dependencies": {
"@commitlint/ensure": "^19.5.0",
"@commitlint/message": "^19.5.0",
"@commitlint/to-lines": "^19.5.0",
"@commitlint/types": "^19.5.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/to-lines": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz",
"integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==",
"license": "MIT",
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/top-level": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz",
"integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==",
"license": "MIT",
"dependencies": {
"find-up": "^7.0.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/top-level/node_modules/find-up": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
"integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
"license": "MIT",
"dependencies": {
"locate-path": "^7.2.0",
"path-exists": "^5.0.0",
"unicorn-magic": "^0.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/locate-path": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
"integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"license": "MIT",
"dependencies": {
"p-locate": "^6.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/p-limit": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"license": "MIT",
"dependencies": {
"yocto-queue": "^1.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/p-locate": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"license": "MIT",
"dependencies": {
"p-limit": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/path-exists": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/@commitlint/top-level/node_modules/yocto-queue": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
"integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
"license": "MIT",
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/types": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz",
"integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==",
"license": "MIT",
"dependencies": {
"@types/conventional-commits-parser": "^5.0.0",
"chalk": "^5.3.0"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/@commitlint/types/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@csstools/css-parser-algorithms": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz",
@ -6701,6 +7156,15 @@
"@types/responselike": "^1.0.0"
}
},
"node_modules/@types/conventional-commits-parser": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
"integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/emscripten": {
"version": "1.39.13",
"resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz",
@ -7974,6 +8438,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array-ify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
"integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
"license": "MIT"
},
"node_modules/array-includes": {
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
@ -9259,6 +9729,22 @@
"node": ">= 6"
}
},
"node_modules/commitlint": {
"version": "19.5.0",
"resolved": "https://registry.npmjs.org/commitlint/-/commitlint-19.5.0.tgz",
"integrity": "sha512-lCtwxgFulvMnCgBc8MVPlVMf+PNOqQSBhHpEnjV2JjEQEAhxjVDtC7IeuEtR+hHpGvHt6CwlLtm3uZNyEby5dQ==",
"license": "MIT",
"dependencies": {
"@commitlint/cli": "^19.5.0",
"@commitlint/types": "^19.5.0"
},
"bin": {
"commitlint": "cli.js"
},
"engines": {
"node": ">=v18"
}
},
"node_modules/common-tags": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
@ -9272,6 +9758,16 @@
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
},
"node_modules/compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
"integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
"license": "MIT",
"dependencies": {
"array-ify": "^1.0.0",
"dot-prop": "^5.1.0"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -9291,6 +9787,30 @@
"@babel/types": "^7.6.1"
}
},
"node_modules/conventional-changelog-angular": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
"integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
"license": "ISC",
"dependencies": {
"compare-func": "^2.0.0"
},
"engines": {
"node": ">=16"
}
},
"node_modules/conventional-changelog-conventionalcommits": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
"integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
"license": "ISC",
"dependencies": {
"compare-func": "^2.0.0"
},
"engines": {
"node": ">=16"
}
},
"node_modules/conventional-commits-detector": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/conventional-commits-detector/-/conventional-commits-detector-1.0.3.tgz",
@ -9585,6 +10105,36 @@
"node": ">=6"
}
},
"node_modules/conventional-commits-parser": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
"integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
"license": "MIT",
"dependencies": {
"is-text-path": "^2.0.0",
"JSONStream": "^1.3.5",
"meow": "^12.0.1",
"split2": "^4.0.0"
},
"bin": {
"conventional-commits-parser": "cli.mjs"
},
"engines": {
"node": ">=16"
}
},
"node_modules/conventional-commits-parser/node_modules/meow": {
"version": "12.1.1",
"resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
"integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
"license": "MIT",
"engines": {
"node": ">=16.10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/convert-source-map": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
@ -9644,6 +10194,23 @@
"url": "https://github.com/sponsors/d-fischer"
}
},
"node_modules/cosmiconfig-typescript-loader": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz",
"integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==",
"license": "MIT",
"dependencies": {
"jiti": "^1.19.1"
},
"engines": {
"node": ">=v16"
},
"peerDependencies": {
"@types/node": "*",
"cosmiconfig": ">=8.2",
"typescript": ">=4"
}
},
"node_modules/cosmiconfig/node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@ -10269,6 +10836,27 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dot-prop": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
"integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
"license": "MIT",
"dependencies": {
"is-obj": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/dot-prop/node_modules/is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/dotenv": {
"version": "16.4.5",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
@ -10468,7 +11056,6 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"optional": true,
"engines": {
"node": ">=6"
}
@ -12919,6 +13506,30 @@
"node": ">=10.0"
}
},
"node_modules/global-directory": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
"integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
"license": "MIT",
"dependencies": {
"ini": "4.1.1"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/global-directory/node_modules/ini": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
"integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
"license": "ISC",
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/global-modules": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
@ -13496,6 +14107,16 @@
"node": ">=8"
}
},
"node_modules/import-meta-resolve": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
"integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@ -14114,6 +14735,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-text-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
"integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
"license": "MIT",
"dependencies": {
"text-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-typed-array": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
@ -14295,6 +14928,15 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jiti": {
"version": "1.21.6",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
"integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
"license": "MIT",
"bin": {
"jiti": "bin/jiti.js"
}
},
"node_modules/joycon": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
@ -14517,6 +15159,15 @@
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"engines": [
"node >= 0.2.0"
],
"license": "MIT"
},
"node_modules/jsonpath-plus": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.1.0.tgz",
@ -14533,6 +15184,22 @@
"node": ">=0.10.0"
}
},
"node_modules/JSONStream": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
"integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
"license": "(MIT OR Apache-2.0)",
"dependencies": {
"jsonparse": "^1.2.0",
"through": ">=2.2.7 <3"
},
"bin": {
"JSONStream": "bin.js"
},
"engines": {
"node": "*"
}
},
"node_modules/jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
@ -14746,21 +15413,57 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"license": "MIT"
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"license": "MIT"
},
"node_modules/lodash.kebabcase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
"integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
"node_modules/lodash.mergewith": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
"integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
"license": "MIT"
},
"node_modules/lodash.snakecase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
"integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
"license": "MIT"
},
"node_modules/lodash.sortby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
},
"node_modules/lodash.startcase": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
"integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
"license": "MIT"
},
"node_modules/lodash.topath": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz",
@ -14781,6 +15484,12 @@
"resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz",
"integrity": "sha1-egy/ZfQ7WShiWp1NDcVLGMrcfvM="
},
"node_modules/lodash.upperfirst": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
"integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
"license": "MIT"
},
"node_modules/long": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
@ -20393,6 +21102,18 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"node_modules/text-extensions": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
"integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -20827,6 +21548,12 @@
"real-require": "^0.2.0"
}
},
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"license": "MIT"
},
"node_modules/through2": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
@ -20897,6 +21624,12 @@
"node": ">= 6"
}
},
"node_modules/tinyexec": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz",
"integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==",
"license": "MIT"
},
"node_modules/tinylogic": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tinylogic/-/tinylogic-2.0.0.tgz",
@ -21533,6 +22266,18 @@
"node": ">=4"
}
},
"node_modules/unicorn-magic": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
"integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/unified": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",

View file

@ -5,11 +5,13 @@
"@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.24.7",
"@coffeelint/cli": "^5.2.11",
"@commitlint/config-conventional": "^19.5.0",
"@ibm/tekton-lint": "^1.1.0",
"@react-native/eslint-config": "^0.75.2",
"@stoplight/spectral-cli": "^6.11.1",
"@typescript-eslint/eslint-plugin": "^7.16.1",
"asl-validator": "^3.8.3",
"commitlint": "^19.5.0",
"eslint": "^8.57.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^9.1.0",

View file

@ -20,8 +20,7 @@ ENV PATH="${NODE_PATH}/.bin:${PATH}"
# Split this from the previous RUN instruction so we can cache the costly installation step
# hadolint ignore=DL3059
RUN commitlint --version \
&& release-please --version \
RUN release-please --version \
&& git config --global --add safe.directory /source-repository
ARG USERNAME=super-linter-dev

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,8 @@
{
"name": "commitlint-container-image",
"name": "super-linter-dev-tools-container-image",
"private": true,
"version": "0.0.1-local",
"dependencies": {
"@commitlint/cli": "^19.4.0",
"@commitlint/config-conventional": "^19.2.2",
"release-please": "^16.12.0"
},
"license": "MIT"

View file

@ -118,6 +118,18 @@ function BuildFileList() {
debug "DEFAULT_JSCPD_TEST_CASE_DIRECTORY: ${DEFAULT_JSCPD_TEST_CASE_DIRECTORY}"
RAW_FILE_ARRAY+=("${DEFAULT_JSCPD_TEST_CASE_DIRECTORY}/bad")
RAW_FILE_ARRAY+=("${DEFAULT_JSCPD_TEST_CASE_DIRECTORY}/good")
debug "Adding test case directories to the list of directories to analyze with Commitlint."
DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY="${GITHUB_WORKSPACE}/${TEST_CASE_FOLDER}/git_commitlint"
# We need this for parallel
export DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY
debug "DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY: ${DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY}"
RAW_FILE_ARRAY+=("${DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY}/bad")
RAW_FILE_ARRAY+=("${DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY}/good")
# Commitlint uses Git to get commit data, so the dynamically created test case repositories
# need to be marked as safe
git config --global --add safe.directory "${DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY}/bad"
git config --global --add safe.directory "${DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY}/good"
fi
debug "Add GITHUB_WORKSPACE (${GITHUB_WORKSPACE}) to the list of files to lint because we might need it for linters that lint the whole workspace"
@ -239,10 +251,13 @@ BuildFileArrays() {
echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-CHECKOV"
fi
# JSCPD test cases are handled below because we first need to exclude non-relevant test cases
# Test cases for these languages are handled below because we first need to exclude non-relevant test cases
if [[ "${TEST_CASE_RUN}" == "false" ]]; then
debug "Add ${FILE} to the list of items to lint with JSCPD"
echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JSCPD"
debug "Add ${FILE} to the list of items to lint with Commitlint"
echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-GIT_COMMITLINT"
fi
# Handle the corner case where FILE=${GITHUB_WORKSPACE}, and the user set
@ -311,6 +326,12 @@ BuildFileArrays() {
echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-JSCPD"
fi
# Handle Commitlint test cases
if [[ "${TEST_CASE_RUN}" == "true" ]] && [[ "${FILE}" =~ .*${DEFAULT_GIT_COMMITLINT_TEST_CASE_DIRECTORY}.* ]] && [[ -d "${FILE}" ]]; then
debug "${FILE} is a test case for Commitlint. Adding it to the list of items to lint with Commitlint"
echo "${FILE}" >>"${FILE_ARRAYS_DIRECTORY_PATH}/file-array-GIT_COMMITLINT"
fi
# See https://docs.renovatebot.com/configuration-options/
if [[ "${BASE_FILE}" =~ renovate.json5? ]] ||
[ "${BASE_FILE}" == ".renovaterc" ] || [[ "${BASE_FILE}" =~ .renovaterc.json5? ]]; then

View file

@ -68,6 +68,15 @@ if [ -n "${GITLEAKS_LOG_LEVEL:-}" ]; then
fi
LINTER_COMMANDS_ARRAY_GITLEAKS+=(--source)
LINTER_COMMANDS_ARRAY_GHERKIN=(gherkin-lint -c "${GHERKIN_LINTER_RULES}")
LINTER_COMMANDS_ARRAY_GIT_COMMITLINT=(commitlint --verbose --cwd "{}")
if [[ -n "${GITHUB_BEFORE_SHA:-}" ]]; then
LINTER_COMMANDS_ARRAY_GIT_COMMITLINT+=(--from "${GITHUB_BEFORE_SHA}" --to "${GITHUB_SHA}")
else
LINTER_COMMANDS_ARRAY_GIT_COMMITLINT+=(--last)
fi
if [ "${ENABLE_COMMITLINT_STRICT_MODE:-}" == 'true' ]; then
LINTER_COMMANDS_ARRAY_GIT_COMMITLINT+=("${COMMITLINT_STRICT_MODE_OPTIONS[@]}")
fi
LINTER_COMMANDS_ARRAY_GIT_MERGE_CONFLICT_MARKERS=(git-merge-conflict-markers)
LINTER_COMMANDS_ARRAY_GO=(golangci-lint run -c "${GO_LINTER_RULES}" --fast)
LINTER_COMMANDS_ARRAY_GO_MODULES=(golangci-lint run --allow-parallel-runners -c "${GO_LINTER_RULES}")

View file

@ -5,8 +5,10 @@ function ValidateBooleanConfigurationVariables() {
ValidateBooleanVariable "BASH_EXEC_IGNORE_LIBRARIES" "${BASH_EXEC_IGNORE_LIBRARIES}"
ValidateBooleanVariable "CREATE_LOG_FILE" "${CREATE_LOG_FILE}"
ValidateBooleanVariable "DISABLE_ERRORS" "${DISABLE_ERRORS}"
ValidateBooleanVariable "ENABLE_COMMITLINT_STRICT_MODE" "${ENABLE_COMMITLINT_STRICT_MODE}"
ValidateBooleanVariable "ENABLE_GITHUB_ACTIONS_GROUP_TITLE" "${ENABLE_GITHUB_ACTIONS_GROUP_TITLE}"
ValidateBooleanVariable "ENABLE_GITHUB_ACTIONS_STEP_SUMMARY" "${ENABLE_GITHUB_ACTIONS_STEP_SUMMARY}"
ValidateBooleanVariable "ENFORCE_COMMITLINT_CONFIGURATION_CHECK" "${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}"
ValidateBooleanVariable "FIX_MODE_ENABLED" "${FIX_MODE_ENABLED}"
ValidateBooleanVariable "FIX_MODE_TEST_CASE_RUN" "${FIX_MODE_TEST_CASE_RUN}"
ValidateBooleanVariable "IGNORE_GENERATED_FILES" "${IGNORE_GENERATED_FILES}"
@ -374,6 +376,37 @@ function ValidateSuperLinterSummaryOutputPath() {
debug "Super-linter summary ouput path passed validation"
}
ValidateCommitlintConfiguration() {
local GITHUB_WORKSPACE="${1}"
local ENFORCE_COMMITLINT_CONFIGURATION_CHECK="${2}"
debug "Validating Commitlint configuration. Enforce commitlint configuration check: ${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}"
if [[ "${VALIDATE_GIT_COMMITLINT}" == "true" ]]; then
local COMMITLINT_VERSION_CHECK_OUTPUT
COMMITLINT_VERSION_CHECK_OUTPUT="$(commitlint --cwd "${GITHUB_WORKSPACE}" --last)"
local COMMITLINT_EXIT_CODE=$?
debug "Commitlint configuration check output:\n${COMMITLINT_VERSION_CHECK_OUTPUT}"
# Commitlint exits with 9 if no configuration file is avaialble.
# Ref: https://github.com/conventional-changelog/commitlint/pull/4143
# Ref: https://commitlint.js.org/reference/cli.html
# Set this here so we can reuse this variable for tests
COMMITLINT_EXIT_CODE_CONFIGURATION_ERROR=9
if [[ ${COMMITLINT_EXIT_CODE} -eq ${COMMITLINT_EXIT_CODE_CONFIGURATION_ERROR} ]]; then
warn "Git commit message validation with commitlint is enabled, but no commitlint configuration file is available. Disabling commitlint. To suppress this message, either disable Git commit validation by setting VALIDATE_GIT_COMMITLINT to false in your Super-linter configuration, or provide a commitlint configuration file."
VALIDATE_GIT_COMMITLINT="false"
export VALIDATE_GIT_COMMITLINT
if [[ "${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}" == "true" ]]; then
info "Commitlint configuration check enforcement is enabled. Exiting with an error because the commitlint configuration check failed."
return 1
fi
fi
else
debug "Commitlint is disabled. Skipping commitlint configuration validation"
fi
}
function WarnIfVariableIsSet() {
local INPUT_VARIABLE="${1}"
shift

View file

@ -14,6 +14,7 @@ LANGUAGE_ARRAY=('ANSIBLE' 'ARM' 'BASH' 'BASH_EXEC' 'CHECKOV' 'CLANG_FORMAT'
'ENV'
'GITHUB_ACTIONS'
'GITLEAKS' 'GHERKIN'
"GIT_COMMITLINT"
"GIT_MERGE_CONFLICT_MARKERS"
'GO' 'GO_MODULES' 'GO_RELEASER' 'GOOGLE_JAVA_FORMAT'
"GRAPHQL_PRETTIER"

View file

@ -101,4 +101,6 @@ SQLFLUFF_FIX_MODE_OPTIONS+=("${SQLFLUFF_SHARED_SUBCOMMAND_OPTIONS[@]}")
# will not be passed to the --workdir option as well.
INPUT_CONSUME_COMMAND=("&& echo \"Linted: {}\"")
COMMITLINT_STRICT_MODE_OPTIONS=("--strict")
GITLEAKS_LOG_LEVEL_OPTIONS=("--log-level")

View file

@ -137,6 +137,14 @@ declare -l REMOVE_ANSI_COLOR_CODES_FROM_OUTPUT
REMOVE_ANSI_COLOR_CODES_FROM_OUTPUT="${REMOVE_ANSI_COLOR_CODES_FROM_OUTPUT:-"false"}"
export REMOVE_ANSI_COLOR_CODES_FROM_OUTPUT
declare -l ENABLE_COMMITLINT_STRICT_MODE
ENABLE_COMMITLINT_STRICT_MODE="${ENABLE_COMMITLINT_STRICT_MODE:-"false"}"
export ENABLE_COMMITLINT_STRICT_MODE
declare -l ENFORCE_COMMITLINT_CONFIGURATION_CHECK
ENFORCE_COMMITLINT_CONFIGURATION_CHECK="${ENFORCE_COMMITLINT_CONFIGURATION_CHECK:-"false"}"
export ENFORCE_COMMITLINT_CONFIGURATION_CHECK
# Define private output paths early because cleanup depends on those being defined
DEFAULT_SUPER_LINTER_OUTPUT_DIRECTORY_NAME="super-linter-output"
SUPER_LINTER_OUTPUT_DIRECTORY_NAME="${SUPER_LINTER_OUTPUT_DIRECTORY_NAME:-${DEFAULT_SUPER_LINTER_OUTPUT_DIRECTORY_NAME}}"
@ -783,6 +791,10 @@ else
debug "Skipped the validation of the local Git environment because we don't depend on it."
fi
if ! ValidateCommitlintConfiguration "${GITHUB_WORKSPACE}" "${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}"; then
fatal "Error while validating commitlint configuration"
fi
ValidateDeprecatedVariables
# After checking if LOG_LEVEL is set to a deprecated value (see the ValidateDeprecatedVariables function),

View file

@ -24,6 +24,7 @@ LINTER_NAMES_ARRAY['ENV']="dotenv-linter"
LINTER_NAMES_ARRAY['GITHUB_ACTIONS']="actionlint"
LINTER_NAMES_ARRAY['GITLEAKS']="gitleaks"
LINTER_NAMES_ARRAY['GHERKIN']="gherkin-lint"
LINTER_NAMES_ARRAY['GIT_COMMITLINT']="commitlint"
LINTER_NAMES_ARRAY['GIT_MERGE_CONFLICT_MARKERS']="git-merge-conflict-markers"
LINTER_NAMES_ARRAY['GO']="golangci-lint"
LINTER_NAMES_ARRAY['GO_MODULES']="${LINTER_NAMES_ARRAY['GO']}"

View file

@ -22,6 +22,7 @@
| GITHUB_ACTIONS | Fail ❌ |
| GITLEAKS | Fail ❌ |
| GHERKIN | Fail ❌ |
| GIT_COMMITLINT | Fail ❌ |
| GIT_MERGE_CONFLICT_MARKERS | Fail ❌ |
| GO | Fail ❌ |
| GO_MODULES | Fail ❌ |

View file

@ -27,6 +27,7 @@
| GITHUB_ACTIONS | Fail ❌ |
| GITLEAKS | Fail ❌ |
| GHERKIN | Fail ❌ |
| GIT_COMMITLINT | Fail ❌ |
| GIT_MERGE_CONFLICT_MARKERS | Fail ❌ |
| GO | Fail ❌ |
| GO_MODULES | Fail ❌ |

View file

@ -22,6 +22,7 @@
| GITHUB_ACTIONS | Pass ✅ |
| GITLEAKS | Pass ✅ |
| GHERKIN | Pass ✅ |
| GIT_COMMITLINT | Pass ✅ |
| GIT_MERGE_CONFLICT_MARKERS | Pass ✅ |
| GO | Pass ✅ |
| GO_MODULES | Pass ✅ |

View file

@ -27,6 +27,7 @@
| GITHUB_ACTIONS | Pass ✅ |
| GITLEAKS | Pass ✅ |
| GHERKIN | Pass ✅ |
| GIT_COMMITLINT | Pass ✅ |
| GIT_MERGE_CONFLICT_MARKERS | Pass ✅ |
| GO | Pass ✅ |
| GO_MODULES | Pass ✅ |

View file

@ -155,6 +155,7 @@ control "super-linter-installed-commands" do
{ linter_name: "clippy", linter_command: "cargo clippy"},
{ linter_name: "clj-kondo"},
{ linter_name: "coffeelint"},
{ linter_name: "commitlint"},
{ linter_name: "composer"},
{ linter_name: "cpplint"},
{ linter_name: "dart"},
@ -341,6 +342,7 @@ control "super-linter-installed-npm-packages" do
"@typescript-eslint/eslint-plugin",
"@typescript-eslint/parser",
"asl-validator",
"commitlint",
"eslint",
"eslint-config-airbnb",
"eslint-config-prettier",

View file

@ -55,6 +55,7 @@ source "lib/functions/linterCommands.sh"
# because some tests modify LINTER_COMMANDS_xxx variables
BASE_LINTER_COMMANDS_ARRAY_ANSIBLE=("${LINTER_COMMANDS_ARRAY_ANSIBLE[@]}")
BASE_LINTER_COMMANDS_ARRAY_GITHUB_ACTIONS=("${LINTER_COMMANDS_ARRAY_GITHUB_ACTIONS[@]}")
BASE_LINTER_COMMANDS_ARRAY_GIT_COMMITLINT=("${LINTER_COMMANDS_ARRAY_GIT_COMMITLINT[@]}")
BASE_LINTER_COMMANDS_ARRAY_GITLEAKS=("${LINTER_COMMANDS_ARRAY_GITLEAKS[@]}")
BASE_LINTER_COMMANDS_ARRAY_GO_MODULES=("${LINTER_COMMANDS_ARRAY_GO_MODULES[@]}")
BASE_LINTER_COMMANDS_ARRAY_JSCPD=("${LINTER_COMMANDS_ARRAY_JSCPD[@]}")
@ -125,6 +126,27 @@ function JscpdCommandTest() {
notice "${FUNCTION_NAME} PASS"
}
EnableCommitlintStrictModeCommandTest() {
local FUNCTION_NAME
FUNCTION_NAME="${FUNCNAME[0]}"
info "${FUNCTION_NAME} start"
# shellcheck disable=SC2034
ENABLE_COMMITLINT_STRICT_MODE="true"
# Source the file again so it accounts for modifications
# shellcheck source=/dev/null
source "lib/functions/linterCommands.sh"
EXPECTED_COMMAND=("${BASE_LINTER_COMMANDS_ARRAY_GIT_COMMITLINT[@]}" "${COMMITLINT_STRICT_MODE_OPTIONS[@]}")
if ! AssertArraysElementsContentMatch "LINTER_COMMANDS_ARRAY_GIT_COMMITLINT" "EXPECTED_COMMAND"; then
fatal "${FUNCTION_NAME} test failed"
fi
notice "${FUNCTION_NAME} PASS"
}
function GitleaksCommandTest() {
local FUNCTION_NAME
FUNCTION_NAME="${FUNCNAME[0]}"
@ -372,6 +394,7 @@ AddOptionsToCommandTest() {
LinterCommandPresenceTest
IgnoreGitIgnoredFilesJscpdCommandTest
JscpdCommandTest
EnableCommitlintStrictModeCommandTest
GitleaksCommandTest
GitleaksCommandCustomLogLevelTest
InitInputConsumeCommandsTest

View file

@ -4,12 +4,8 @@ set -o errexit
set -o nounset
set -o pipefail
# Default log level
# shellcheck disable=SC2034
LOG_LEVEL="DEBUG"
# shellcheck source=/dev/null
source "lib/functions/log.sh"
source "test/testUtils.sh"
# shellcheck source=/dev/null
source "lib/functions/validation.sh"
@ -525,6 +521,46 @@ CheckIfFixModeIsEnabledTest() {
}
ValidateCommitlintConfigurationTest() {
local FUNCTION_NAME
FUNCTION_NAME="${FUNCNAME[0]}"
info "${FUNCTION_NAME} start"
GITHUB_WORKSPACE="$(mktemp -d)"
initialize_git_repository "${GITHUB_WORKSPACE}"
local ENFORCE_COMMITLINT_CONFIGURATION_CHECK="false"
VALIDATE_GIT_COMMITLINT="false"
if ! ValidateCommitlintConfiguration "${GITHUB_WORKSPACE}" "${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}"; then
fatal "VALIDATE_GIT_COMMITLINT: ${VALIDATE_GIT_COMMITLINT} should have passed validation"
else
debug "VALIDATE_GIT_COMMITLINT: ${VALIDATE_GIT_COMMITLINT} passed validation as expected"
fi
VALIDATE_GIT_COMMITLINT="true"
if ! ValidateCommitlintConfiguration "${GITHUB_WORKSPACE}" "${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}"; then
fatal "VALIDATE_GIT_COMMITLINT: ${VALIDATE_GIT_COMMITLINT}, ENFORCE_COMMITLINT_CONFIGURATION_CHECK: ${ENFORCE_COMMITLINT_CONFIGURATION_CHECK} should have passed validation"
else
debug "VALIDATE_GIT_COMMITLINT: ${VALIDATE_GIT_COMMITLINT}, ENFORCE_COMMITLINT_CONFIGURATION_CHECK: ${ENFORCE_COMMITLINT_CONFIGURATION_CHECK} passed validation as expected"
fi
if [[ "${VALIDATE_GIT_COMMITLINT}" == "true" ]]; then
fatal "VALIDATE_GIT_COMMITLINT should have been false"
else
debug "VALIDATE_GIT_COMMITLINT is ${VALIDATE_GIT_COMMITLINT} as expected"
fi
VALIDATE_GIT_COMMITLINT="true"
ENFORCE_COMMITLINT_CONFIGURATION_CHECK="true"
if ValidateCommitlintConfiguration "${GITHUB_WORKSPACE}" "${ENFORCE_COMMITLINT_CONFIGURATION_CHECK}"; then
fatal "VALIDATE_GIT_COMMITLINT: ${VALIDATE_GIT_COMMITLINT}, ENFORCE_COMMITLINT_CONFIGURATION_CHECK: ${ENFORCE_COMMITLINT_CONFIGURATION_CHECK} should have failed validation"
else
debug "VALIDATE_GIT_COMMITLINT: ${VALIDATE_GIT_COMMITLINT}, ENFORCE_COMMITLINT_CONFIGURATION_CHECK: ${ENFORCE_COMMITLINT_CONFIGURATION_CHECK} failed validation as expected"
fi
notice "${FUNCTION_NAME} PASS"
}
IsUnsignedIntegerSuccessTest
IsUnsignedIntegerFailureTest
ValidateDeprecatedVariablesTest
@ -536,3 +572,4 @@ ValidateValidationVariablesTest
ValidationVariablesExportTest
ValidateCheckModeAndFixModeVariablesTest
CheckIfFixModeIsEnabledTest
ValidateCommitlintConfigurationTest

View file

@ -0,0 +1,8 @@
# Commitlint test cases are dynamically generated Git repositories with
# purpose-crafted commit messages. So:
# Ignore all files in this dir...
*
# ... except for this one.
!.gitignore

View file

@ -24,9 +24,27 @@ configure_typescript_for_test_cases() {
COMMAND_TO_RUN+=(--env TYPESCRIPT_STANDARD_TSCONFIG_FILE=".github/linters/tsconfig.json")
}
configure_git_commitlint_test_cases() {
debug "Initializing commitlint test case"
local GIT_COMMITLINT_GOOD_TEST_CASE_REPOSITORY="test/linters/git_commitlint/good"
rm -rfv "${GIT_COMMITLINT_GOOD_TEST_CASE_REPOSITORY}"
initialize_git_repository "${GIT_COMMITLINT_GOOD_TEST_CASE_REPOSITORY}"
touch "${GIT_COMMITLINT_GOOD_TEST_CASE_REPOSITORY}/test-file.txt"
git -C "${GIT_COMMITLINT_GOOD_TEST_CASE_REPOSITORY}" add .
git -C "${GIT_COMMITLINT_GOOD_TEST_CASE_REPOSITORY}" commit -m "feat: initial commit"
local GIT_COMMITLINT_BAD_TEST_CASE_REPOSITORY="test/linters/git_commitlint/bad"
rm -rfv "${GIT_COMMITLINT_BAD_TEST_CASE_REPOSITORY}"
initialize_git_repository "${GIT_COMMITLINT_BAD_TEST_CASE_REPOSITORY}"
touch "${GIT_COMMITLINT_BAD_TEST_CASE_REPOSITORY}/test-file.txt"
git -C "${GIT_COMMITLINT_BAD_TEST_CASE_REPOSITORY}" add .
git -C "${GIT_COMMITLINT_BAD_TEST_CASE_REPOSITORY}" commit -m "Bad commit message"
}
configure_linters_for_test_cases() {
COMMAND_TO_RUN+=(-e TEST_CASE_RUN="true" -e JSCPD_CONFIG_FILE=".jscpd-test-linters.json" -e RENOVATE_SHAREABLE_CONFIG_PRESET_FILE_NAMES="default.json,hoge.json")
configure_typescript_for_test_cases
configure_git_commitlint_test_cases
}
run_test_cases_expect_failure() {
@ -79,16 +97,11 @@ run_test_case_dont_save_super_linter_output() {
initialize_git_repository_and_test_args() {
local GIT_REPOSITORY_PATH="${1}"
# shellcheck disable=SC2064 # Once the path is set, we don't expect it to change
trap "sudo rm -fr '${GIT_REPOSITORY_PATH}'" EXIT
debug "GIT_REPOSITORY_PATH: ${GIT_REPOSITORY_PATH}"
initialize_git_repository "${GIT_REPOSITORY_PATH}"
local GITHUB_EVENT_FILE_PATH="${2}"
git -C "${GIT_REPOSITORY_PATH}" init --initial-branch="${DEFAULT_BRANCH}"
git -C "${GIT_REPOSITORY_PATH}" config user.name "Super-linter Test"
git -C "${GIT_REPOSITORY_PATH}" config user.email "super-linter-test@example.com"
# Put an arbitrary JSON file in the repository to trigger some validation
cp -v "${GITHUB_EVENT_FILE_PATH}" "${GIT_REPOSITORY_PATH}/"
git -C "${GIT_REPOSITORY_PATH}" add .
@ -116,7 +129,11 @@ run_test_case_git_initial_commit() {
initialize_git_repository_and_test_args "${GIT_REPOSITORY_PATH}" "test/data/github-event/github-event-push.json"
initialize_github_sha "${GIT_REPOSITORY_PATH}"
COMMAND_TO_RUN+=(-e VALIDATE_JSON="true")
COMMAND_TO_RUN+=(--env VALIDATE_JSON="true")
# Validate commits using commitlint so we can check that we have a default
# commitlint configuration file
COMMAND_TO_RUN+=(--env VALIDATE_GIT_COMMITLINT="true")
}
run_test_case_merge_commit_push() {

View file

@ -219,3 +219,24 @@ RemoveTestLogsAndSuperLinterOutputs() {
debug "Cleaning eventual test logs and Super-linter outputs leftovers: ${LEFTOVERS_TO_CLEAN[*]}"
sudo rm -rf "${LEFTOVERS_TO_CLEAN[@]}"
}
initialize_git_repository() {
local GIT_REPOSITORY_PATH="${1}"
# Assuming that if sudo is available we aren't running inside a container,
# so we don't want to leave leftovers around.
if command -v sudo; then
# shellcheck disable=SC2064 # Once the path is set, we don't expect it to change
trap "sudo rm -fr '${GIT_REPOSITORY_PATH}'" EXIT
fi
if [[ ! -d "${GIT_REPOSITORY_PATH}" ]]; then
mkdir --parents "${GIT_REPOSITORY_PATH}"
fi
debug "GIT_REPOSITORY_PATH: ${GIT_REPOSITORY_PATH}"
git -C "${GIT_REPOSITORY_PATH}" init --initial-branch="${DEFAULT_BRANCH:-"main"}"
git -C "${GIT_REPOSITORY_PATH}" config user.name "Super-linter Test"
git -C "${GIT_REPOSITORY_PATH}" config user.email "super-linter-test@example.com"
}