--- version: '3' vars: PRETTIERIGNORE_CONFIG: .config/prettierignore SHELLCHECK_EXCLUDE: SC1091 tasks: all: deps: - eslint - misc - '{{if .REPOSITORY_TYPE eq "packer"}}packer{{else}}:donothing{{end}}' - '{{if .REPOSITORY_TYPE eq "python"}}python{{else}}:donothing{{end}}' - toml - xml log: start: Running all stable fixers in parallel cmds: - task: yaml:dashes eslint: deps: - :install:modules:local - :install:npm:eslint - :install:software:unbuffer desc: Fix ESLint errors automatically summary: | # Fix Errors with ESLint Automatically This task is an [`eslint`](https://eslint.org/) task. It will attempt to automatically fix `eslint` issues. It will report any issues it was unable to fix. The configuration found in `package.json` includes logic for fixing/linting TypeScript, JavaScript, JSON, TOML, and YAML. **Example using `eslint` to fix a single JS/TS file:** `task fix:js -- single.ts` **Example fixing all files in a project:** `task fix:js` vars: ESLINT_LOG: sh: mktemp log: error: ESLint found some issues that need to be fixed manually start: Auto-fixing with ESLint success: ESLint fixing appears to have corrected all the issues {{if .CLI_ARGS}}in `{{.CLI_ARGS}}`{{else}}in the project{{end}} cmds: - 'unbuffer eslint -c package.json --no-eslintrc --format {{.ESLINT_FORMATTER}} --cache --cache-location .cache/eslintcache --fix {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} | tee {{.ESLINT_LOG}}' - | if [ '{{.ESLINT_FIX_RECURSIVE}}' == 'true' ]; then COUNT=0 while [ $COUNT -le 5 ]; do COUNT=$((COUNT + 1)) if grep 'potentially fixable with the `--fix` option' < {{.ESLINT_LOG}} > /dev/null; then COUNT="$COUNT" unbuffer eslint -c package.json --no-eslintrc --format {{.ESLINT_FORMATTER}} --cache --cache-location .cache/eslintcache \ --fix {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} | tee {{.ESLINT_LOG}} fi done fi - rm {{.ESLINT_LOG}} eslint:staged: deps: - :install:modules:local - :install:npm:eslint desc: Auto-fix only modified files with ESLint env: ESLINT_STAGED_ONLY: on log: error: Failed to auto-fix modified files with ESLint start: Auto-fixing modified files with ESLint success: Successfully auto-fixed modified files with ESLint cmds: - > eslint -c package.json --no-eslintrc --format {{.ESLINT_FORMATTER}} --cache --cache-location .cache/eslintcache --fix {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} go: deps: - :install:software:go - :install:software:golangci-lint desc: Fix Go with all available Go fixers summary: | # Auto-Fix Go Files This task will attempt to auto-fix Go files with [golangci-lint](https://golangci-lint.run/) which runs multiple linters all defined in `.config/golangci-lint`. **Example auto-fixing an individual file:** `task fix:go -- path/filename.go` log: error: Encountered error while autofixing Go files start: Auto-fixing Go files.. success: Successfully auto-fixed Go files cmds: - golangci-lint run -c .config/golangci.yml --fix{{if .CLI_ARGS}} {{.CLI_ARGS}}{{end}} js: cmds: - task: eslint json: deps: - :install:modules:local - :install:npm:eslint desc: Format and sort JSON summary: | # Automatically Alphabetize and Format JSON This task will format and organize JSON files based on the configuration stored in `.eslintrc.cjs`. **Example sorting a single JSON file:** `task fix:json -- single.json` **Example looping through project:** `task fix:json` log: error: '{{if .CLI_ARGS}}Manual fixing is still required for `{{.CLI_ARGS}}`{{else}}Failed to fix all project JSON issues with ESLint{{end}}' start: Linting JSON with ESLint success: ESLint has fixed all of the JSON issues {{if .CLI_ARGS}}in `{{.CLI_ARGS}}`{{else}}in the project{{end}} cmds: - eslint -c package.json --no-eslintrc --cache --cache-location .cache/eslintcache --fix --format pretty --ext .json {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} markdown: deps: - :install:npm:markdown-table-formatter desc: Auto-fixes markdown files summary: | # Auto-Fix Markdown Files This task performs various tasks that cleanup markdown files. It currently: 1. Runs `markdown-table-formatter` which fixes up markdown tables You can either pass a file as a CLI argument or run it without a CLI argument to auto-fix all the markdown files in the project that are not ignored by .gitignore. **Example running against whole project:** `task fix:markdown` **Example running on single file:** `task fix:markdown -- README.md` log: error: Error encountered while auto-fixing markdown file(s) start: Auto-fixing markdown file(s) success: Successfully finished auto-fixing markdown file(s) cmds: - > {{if .CLI_ARGS}} markdown-table-formatter {{.CLI_ARGS}} {{else}} find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f \( -name '*.md' \) -print0 | xargs -0 -r -n1 markdown-table-formatter {{end}} misc: deps: - :install:pipx:pre-commit-hooks summary: | # Miscellaneous fixes This task allows you to loop through the files in the project and apply miscellaneous fixes. You can also specify a single file. The fixes applied are: 1. Remove UTF-8 BOM 2. Ensure line endings are LF **Example applying fixes to all files:** `task fix:misc` **Example applying fixes to single file:** `task fix:misc -- singlefile.js` log: error: Encountered an error while performing miscellaneous fixes{{if .CLI_ARGS}} on `{{.CLI_ARGS}}`{{end}} start: Performing miscellaneous fixes such as removing BOM and ensuring LF line endings success: Finished performing miscellaneous fixes{{if .CLI_ARGS}} on `{{.CLI_ARGS}}`{{end}} cmds: - | PATH="$PATH:$HOME/.local/bin" function misc() { fix-byte-order-marker "$1" mixed-line-ending --fix=lf "$1" } {{if .CLI_ARGS}} misc '{{.CLI_ARGS}}' {{else}} while read PATHH; do misc "$PATHH" done < <(find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f) {{end}} packer: deps: - :install:software:packer desc: Automatically fix and format Packer templates hide: '{{ne .REPOSITORY_TYPE "packer"}}' summary: | # Automatically fix and format Packer templates Packer has the ability to fix old templates that are using outdated methods. This task loops through all the files in the root of this repository that end with `template.json`. For each template, the task runs `packer fix`. **Example applying fixes to all files matching `*template.json`:** `task fix:packer` **Example applying fixes to single file:** `task fix:packer -- mytemplate.json` For more information on `packer fix`, see [Packer's website](https://www.packer.io/docs/commands/fix). log: start: Attempting to fix Packer template{{if .CLI_ARGS}}{{else}}s{{end}} stop: Error running `packer fix` success: Successfully ran `packer fix` on the template(s) cmds: - | function packerFix() { TMP="$(mktemp)" packer fix "$1" > "$TMP" mv "$TMP" "$1" .config/log success "Successfully ran `packer fix` on $1" } {{if .CLI_ARGS}} packerFix '{{.CLI_ARGS}}' {{else}} for TEMPLATE in *template.json; do packerFix "$TEMPLATE" done {{end}} php: desc: Fix PHP with all available PHP auto-fixers summary: | # Auto-Fix PHP Files This task will attempt to auto-fix PHP files with the following auto-fixers: * [go]() If you would like to skip auto-fixing on the whole project and instead auto-fix an individual file, then you can do so by passing the file path as a CLI parameter like so: **Example auto-fixing an individual file:** `task fix:php -- path/filename.php` cmds: - task: :donothing prettier: deps: - :install:modules:local - :install:npm:prettier desc: Automatically format most files using Prettier summary: | # Automatically Format Files Using Prettier This task will run Prettier on the project. Prettier will automatically fix formatting mistakes like inconsistent indent lengths, trailing spaces, and more. It will use the configuration specified in the `package.json` file under the `prettier` key. If this command is incompatible with a file then you can add the file to the `.prettierignore` file. **Example of bulk fixing:** `task fix:formatting` **Example of fixing a single file** `task fix:formatting -- path/filename.ext` For more information, see [Prettier's website](https://prettier.io/). log: start: Running Prettier on {{if .CLI_ARGS}}`{{.CLI_ARGS}}`{{else}}project{{end}} cmds: - cmd: | prettier --ignore-path {{.PRETTIERIGNORE_CONFIG}} \ --write {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} || EXIT_CODE=$? if [ -n "$EXIT_CODE" ]; then .config/log warn 'Failed to run `prettier` - falling back to `prettier`' prettier --ignore-path {{.PRETTIERIGNORE_CONFIG}} \ --write {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} fi ignore_error: true python: deps: - :install:pipx:add-trailing-comma - :install:pipx:isort - :install:pipx:pyformat desc: Automatically format Python files using Black hide: '{{ne .REPOSITORY_TYPE "python"}}' summary: | # Automatically Format Python Files with Black Black is the defacto standard when it comes to autoformatting Python files. This task will automatically format files that end with the `.py` extension. It ignores `.py` files that are in any of the locations specified in the `IGNORED_FOLDERS` variable in `Taskfile.yml`. **Example applying fixes to all Python files:** `task fix:python` **Example applying fixes to single Python file:** `task fix:python -- myfile.py` For more information, see [Black's GitHub page](https://github.com/psf/black). log: error: Error while running `black` auto-fixer start: Fixing Python with `black` success: Fixed {{if .CLI_ARGS}}`{{.CLI_ARGS}}`{{else}}project{{end}} with `black` cmds: - | PATH="$PATH:$HOME/.local/bin" {{if .CLI_ARGS}} pyformat -i {{.CLI_ARGS}} isort --overwrite-in-place {{.CLI_ARGS}} add-trailing-comma --exit-zero-even-if-changed {{.CLI_ARGS}} {{else}} while read PATHH; do pyformat -i "$PATHH" isort --overwrite-in-place "$PATHH" add-trailing-comma --exit-zero-even-if-changed "$PATHH" done < <(find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f \( -name '*.py' \)) {{end}} shell: cmds: - task: shellcheck - task: prettier shellcheck: deps: - :install:npm:shellcheck desc: Automatically apply fixes to `.sh` and `.sh.j2` files using Shellcheck summary: | # Automatically apply fixes to shell scripts using Shellcheck Shellcheck is generally used to lint shell scripts. This task uses Shellcheck and `git apply` to automatically apply Shellcheck's recommendations. It only runs on files that are not in the `IGNORED_FOLDERS` variable in `Taskfile.yml`. This task is experimental. It may work to get rid of the Shellcheck lin.config/log errors but the code should still be tested since it might break things. Ideally, you should apply Shellcheck's recommendations manually. **To see what changes Shellcheck will make to a file named `test.sh`, for example, you can run:** `npx shellcheck -f diff test.sh` **Example applying fixes to all shell scripts:** `task fix:scripts` **Example applying fixes to a single shell script:** `task fix:scripts -- myfile.sh` For more information, see [Shellcheck's GitHub page](https://github.com/koalaman/shellcheck). log: error: Encountered an error while linting with `shellcheck` on {{if .CLI_ARGS}}`{{.CLI_ARGS}}`{{else}}project{{end}} start: Running `shellcheck` auto-fixer success: Autofixed {{if .CLI_ARGS}}`{{.CLI_ARGS}}`{{else}}project{{end}} with `shellcheck` cmds: - | .config/log warn 'This is an experimental fix method - please manually inspect and test the scripts' {{if .CLI_ARGS}} shellcheck -e {{.SHELLCHECK_EXCLUDE}} -f diff {{.CLI_ARGS}} | git apply {{else}} find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f \( -name '*.sh' -o -name '*.sh.j2' \) \ -print0 | xargs -0 shellcheck -e {{.SHELLCHECK_EXCLUDE}} -f diff | git apply {{end}} spelling:markdown: deps: - :install:go:misspell desc: Auto-fix spelling errors in markdown files using `misspell` log: error: Encountered error while attempting to auto-correct spelling mistakes with `misspell` start: Auto-fixing using the `misspell` spell-check engine success: Successfully auto-fixed files using `misspell` cmds: - > {{if .CLI_ARGS}} misspell -w {{.CLI_ARGS}} {{else}} find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f \( -name '*.md' \) -print0 | xargs -0 -r -n1 misspell -w {{end}} toml: deps: - :install:pipx:toml-sort desc: Format `.toml` files by alphabetizing and flattening summary: | # Automatically format `.toml` files [toml-sort](https://pypi.org/project/toml-sort/) will automatically alphabetize and flatten `.toml` files. **Example running on whole project:** `task fix:toml` **Example usage on specific file:** `task fix:toml -- pyproject.toml` log: error: Encountered an error while running `toml-sort` start: Running `toml-sort` auto-fixer success: Successfully ran the `toml-sort` auto-fixer cmds: - | PATH="$PATH:$HOME/.local/bin" {{if .CLI_ARGS}} if [ -f '{{.CLI_ARGS}}' ]; then toml-sort -i --all {{.CLI_ARGS}} fi {{else}} while read PATHH; do toml-sort -i --all "$PATHH" done < <(find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f \( -name '*.toml' \)) {{end}} xml: deps: - :install:npm:eslint summary: | # Autofix XML files This task will automatically apply updates to XML files. It uses Prettier and the Prettier plugin named `@prettier/plugin-xml` for auto-formatting. **Example fixing all `.xml` files:** `task fix:xml` **Example fixing specific `.xml` file(s):** `task fix:xml -- 'file_name.xml'` log: error: Errors were reported by ESLint when auto-fixing XML start: Attempting to auto-fix any XML files with ESLint success: Any XML files present in the project were successfully fixed/validated by ESLint cmds: - eslint -c package.json --no-eslintrc --cache --cache-location .cache/eslintcache --fix --format pretty --ext .xml {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}} yaml: desc: Auto-format and sort YML files summary: | # Auto-Format and Sort YML files This task will automatically apply updates to YML files. It currently performs the following tasks: 1. Ensures the first line of the file is `---` 2. Sorts the file according to the layout specified by `.eslintrc.cjs` **Example usage:** `task fix:yaml` **Example fixing single file:** `task fix:yaml -- filename.yml` cmds: - task: yaml:dashes - task: yaml:order yaml:dashes: summary: | # Ensures YML files start with a "---" This task will add a `---` as the first line of YML files if it is missing. It only works on one YML file at a time. This task is intended to be used with lint-staged (with settings) normally found in the `package.json` file. You must specify the path/filename to the YML file you wish to fix with this task. If the file does not exist or if the file does not end with `.yml` or `yaml` then an error will be reported. This task is mainly intended to be used with `lint-staged`. **Example usage:** `task fix:yaml:dashes` **Example usage for one specific file:** `task fix:yaml:dashes -- path/filename.yml` log: error: Error encountered while ensuring YML dashes start: Ensuring {{if .CLI_ARGS}}`{{.CLI_ARGS}}`{{else}}project{{end}} has YML files that start with `---` success: Successfully ensured {{if .CLI_ARGS}}`{{.CLI_ARGS}}`{{else}}project{{end}} has YML files that start with `---` cmds: - | function yamlDashes() { if test -f "$1" && [[ "`head -c 14 "$1"`" != '$ANSIBLE_VAULT' ]] && [[ "`head -c 3 "$1"`" != '---' ]]; then TMP=$(mktemp) echo '---' | cat - "$1" > "$TMP" mv "$TMP" "$1" fi } {{if .CLI_ARGS}} yamlDashes '{{.CLI_ARGS}}' {{else}} while read YML_FILE; do yamlDashes "$YML_FILE" done < <(find . -type d \( {{.IGNORE_FOLDERS}} \) -prune -o -type f \( -name '*.yml' -o -name '*.yaml' \)) {{end}} yaml:order: deps: - :install:modules:local - :install:npm:eslint summary: | # Ensure YML files are sorted properly This task will sort YML keys alphabetically and also obey the order specified in `.eslintrc.cjs`. It uses [ESLint](https://eslint.org/) along with the [`eslint-plugin-yml`](https://ota-meshi.github.io/eslint-plugin-yml/) plugin. By default, the plugin will automatically fix all YML files but you can also pass in a single file or glob that needs to be fixed. **Example fixing all `.yml` files:** `task fix:yaml:order` **Example fixing specific `.yml` file(s):** `task fix:yaml:order -- 'file_name.{yml,yaml}'` log: error: There are still some errors. Try running the command again. start: Ensuring YML file(s) are in order specified in configuration success: Successfully ensured YML file order cmds: - eslint -c package.json --no-eslintrc --format pretty --fix --cache --cache-location .cache/eslintcache --ext yml,yaml {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}.{{end}}