{"id":22845475,"url":"https://github.com/tcncloud/wollemi","last_synced_at":"2025-09-07T08:42:02.691Z","repository":{"id":42046611,"uuid":"271054257","full_name":"tcncloud/wollemi","owner":"tcncloud","description":null,"archived":false,"fork":false,"pushed_at":"2022-04-15T17:56:57.000Z","size":3874,"stargazers_count":29,"open_issues_count":2,"forks_count":9,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-06-15T20:22:52.237Z","etag":null,"topics":["bazel","golang","please"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tcncloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-09T16:31:32.000Z","updated_at":"2025-05-07T02:15:51.000Z","dependencies_parsed_at":"2022-08-12T03:20:27.533Z","dependency_job_id":null,"html_url":"https://github.com/tcncloud/wollemi","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/tcncloud/wollemi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tcncloud%2Fwollemi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tcncloud%2Fwollemi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tcncloud%2Fwollemi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tcncloud%2Fwollemi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tcncloud","download_url":"https://codeload.github.com/tcncloud/wollemi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tcncloud%2Fwollemi/sbom","scorecard":{"id":870704,"data":{"date":"2025-08-11","repo":{"name":"github.com/tcncloud/wollemi","commit":"b19b8e46e400b33c947017066dff3a77be62117e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":5,"reason":"Found 4/8 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.8.1 not signed: https://api.github.com/repos/tcncloud/wollemi/releases/64553148","Warn: release artifact v0.8.0 not signed: https://api.github.com/repos/tcncloud/wollemi/releases/63559431","Warn: release artifact v0.7.1 not signed: https://api.github.com/repos/tcncloud/wollemi/releases/53046452","Warn: release artifact v0.7.0 not signed: https://api.github.com/repos/tcncloud/wollemi/releases/42047181","Warn: release artifact v0.6.0 not signed: https://api.github.com/repos/tcncloud/wollemi/releases/41024885","Warn: release artifact v0.8.1 does not have provenance: https://api.github.com/repos/tcncloud/wollemi/releases/64553148","Warn: release artifact v0.8.0 does not have provenance: https://api.github.com/repos/tcncloud/wollemi/releases/63559431","Warn: release artifact v0.7.1 does not have provenance: https://api.github.com/repos/tcncloud/wollemi/releases/53046452","Warn: release artifact v0.7.0 does not have provenance: https://api.github.com/repos/tcncloud/wollemi/releases/42047181","Warn: release artifact v0.6.0 does not have provenance: https://api.github.com/repos/tcncloud/wollemi/releases/41024885"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8","Warn: Project is vulnerable to: GO-2022-0603 / GHSA-hp87-p4gw-j4gq"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T04:07:29.103Z","repository_id":42046611,"created_at":"2025-08-24T04:07:29.103Z","updated_at":"2025-08-24T04:07:29.103Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274014551,"owners_count":25207686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-07T02:00:09.463Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bazel","golang","please"],"created_at":"2024-12-13T03:17:23.478Z","updated_at":"2025-09-07T08:42:02.658Z","avatar_url":"https://github.com/tcncloud.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wollemi\nPlease build file generator and formatter capable of generating `go_binary`,\n`go_library` and `go_test` build rules from existing go code while also\nensuring that unused dependencies are stripped from go build rules as the\nunderlying go code changes over time.\n\nWollemi currently does not generate third party `go_get` rules but may do so\nin a future release. When the `gofmt` command is unable to find a third party\ndependency to satisfy a go import it will issue an error with the message\n`\"could not resolve go import\"`.  This can be fixed by defining a `go_get`\nrule for the go import anywhere inside of the `third_party/go` directory.\n\n## Demo\nSee [Vim](#vim) setup.\n\n[![asciicast](https://asciinema.org/a/342181.svg)](https://asciinema.org/a/342181)\n\n## Requirements\n- [please](https://please.build)\n\n### Install\n```\nGO111MODULE=on go get github.com/tcncloud/wollemi\n```\n\nWollemi can also be installed by running the following install script from the\nroot of the repository which will build the binary using please.\n\n```\n./install.sh\n```\n\nLast, but not least you can download Wollemi with Please itself.\n\nIn your project create a file (eg. `tools/BUILD.plz`) with following content:\n\n```starlark\nWOLLEMI_VERSION = \"v0.2.1\"\nremote_file(\n    name = \"wollemi\",\n    url = f\"https://github.com/tcncloud/wollemi/releases/download/{WOLLEMI_VERSION}/wollemi-{WOLLEMI_VERSION}-{CONFIG.HOSTOS}-{CONFIG.HOSTARCH}.tar.gz\",\n    extract = True,\n    binary = True,\n)\n\n```\n\n**Note:** commands like `gofmt` require `GOROOT` to be set, so running Wollemi with `plz run` requires wrapper that sets `GOROOT` as an environment variable:\n\n```starlark\nbuild_rule(\n    name = \"wollemi-wrapper\",\n    outs = [\"wollemi.sh\"],\n    binary = True,\n    cmd = \"cat \u003e \\\"$OUT\\\" \u003c\u003c EOF\\n#!/bin/sh\\nexport GOROOT=$(\\\"$TOOLS_GO\\\" env GOROOT)\\n$(out_exe :wollemi) \\\\\\\\$@\\nEOF\\n\",\n    tools = {\"go\": [CONFIG.GO_TOOL]},\n    visibility = [\"PUBLIC\"],\n    deps = [\":wollemi\"],\n)\n```\n\n### Install Bash Completion\nThe wollemi completion script for Bash can be generated with the command wollemi\ncompletion bash. Sourcing the completion script in your shell enables wollemi\ncommand auto-completion.\n\nTo do so in all your shell sessions, add the following to your ~/.bash_profile file:\n\n```\nsource \u003c(wollemi completion bash)\n```\n\nAfter reloading your shell, wollemi autocompletion should be working.\n\nWollemi completions require bash version 4.1 or higher and bash-completion@2. You\ncan check your version by running echo $BASH_VERSION. If your version is too old\nand you are using macOS you can install or upgrade it using Homebrew.\n\n```\nbrew install bash\nbrew install bash-completion@2\n```\n\n### Install ZSH Completion\nThe wollemi completion script for Zsh can be generated with the command wollemi\ncompletion zsh. Sourcing the completion script in your shell enables wollemi\ncommand auto-completion.\n\nTo do so in all your shell sessions, add the following to your ~/.zshrc file:\n\n```\nautoload -Uz compinit \u0026\u0026 compinit -C\nsource \u003c(wollemi completion zsh)\ncompdef _wollemi wollemi\n```\n\nAfter reloading your shell, wollemi autocompletion should be working.\n\n### Vim\nVim can be setup to automatically run wollemi gofmt on file changes by adding\nthe following line to your vimrc. With this addition, whenever a go file is\nwritten, wollemi gofmt will be automatically run on the package containing the\nmodified file.\n\n```\nautocmd BufWritePost *.go silent exec '!wollemi --log fatal gofmt' shellescape(expand('%:h'), 1)\n```\n\n### VS Code \n\nThanks to @jamesjarvis wollemi have a VS Code plugin now https://github.com/jamesjarvis/vs-wollemi\nVSCode marketplace link: https://marketplace.visualstudio.com/items?itemName=jamesjarvis.vs-wollemi\n\n\n---\n\n## Commands\n\n### Format\nFormats please build files. Formatting modifications include:\n  - Double quoted strings instead of single quoted strings.\n  - Deduplication of attribute list entries.\n  - Ordering of attribute list entries.\n  - Ordering of rule attributes.\n  - Deletion of empty build files.\n  - Consistent build identifiers.\n  - Text alignment.\n\n```\nFormat a specific build file.\n    $ wollemi fmt project/service/routes\n\nRecursively format all build files under the routes directory.\n    $ wollemi fmt project/service/routes/...\n\nRecursively format all build files under the working directory.\n    $ wollemi fmt\n```\n\n### Go Format\nRewrites and generates go_binary, go_library and go_test rules according to\nexisting go code. It also applies all formatting modifications from the\nwollemi fmt command.\n\nWollemi is currently unable to parse build files which contain python\nstring interpolation. These build files will not be formatted because of\nthis issue. Also, when the unparseable build file contains go get rules\ngofmt will be unable to resolve go dependencies to targets contained in\nthis build file. To get around the unresolved go dependency issue you can\nwrite a .wollemi.json config file which contains a known dependency mapping\nfrom the unresolvable go package to the correct build target.\n\n```\n# project/.wollemi.json\n{\n  \"known_dependency\": {\n    \"go.opencensus.io\": \"//third_party/go/go.opencensus.io:all_libs\"\n  }\n}\n```\n\nOccasionally a go dependency will be able to be resolved to multiple go\nget rules and wollemi may choose the wrong target for your needs. These\ncases can be resolved using a config file which sets a known dependency\nmapping from the go package to the desired target.\n\n```\n# project/service/routes/.wollemi.json\n{\n  \"default_visibility\": \"//project/service/routes/...\",\n  \"known_dependency\": {\n    \"github.com/olivere/elastic\": \"//third_party/go/github.com/olivere/elastic:v7\"\n  }\n}\n```\n\nConfig files can be placed in any directory. Every build file gets\nformatted using a config which is the result of merging together all\nconfig files discovered between the build file directory and the\ndirectory gofmt was invoked from.\n\nThe config file can also define a default visibility. When wollemi gofmt\nis invoked recursively on a directory it will use a default visibility\nequal to the path it was given on any new go build rules generated. The\nvisibility of existing go build rules is never modified.\n\nFor example, the following gofmt would apply a default visibility of\n`[\"project/service/routes/...\"]` to any new go build rules generated.\n\n```\nwollemi gofmt project/service/routes/...\n```\n\nWhen gofmt is run on an individual package the default visiblity applied is\n`[\"PUBLIC\"]` for any new go build rules generated.\n\nAlternatively the default visiblity can be explicitly provided through\na `.wollemi.json` config file which will override both implicit cases above.\nThe format and usage of these config files is described in more detail below\nin [Configuration](#configuration).\n\nSometimes a third party dependency is required even though the go code\ndoesn't directly require it. To force gofmt to keep these dependencies you\nmust decorate the dependency with the following comment.\n\n```\n\"//third_party/go/cloud.google.com/go:container\", # wollemi:keep\n```\n\nThe keep comment can also be placed above go build rules you don't want gofmt\nto modify. These cases should be rare and this feature should be used only when\nabsolutely necessary.\n\n```\nGo format a specific build file.\n    $ wollemi gofmt project/service/routes\n\nRecursively go format all build files under the routes directory.\n    $ wollemi gofmt project/service/routes/...\n\nRecursively go format all build files under the working directory.\n    $ wollemi gofmt\n```\n\n### Rules Unused\nLists potentially unused build rules. Unused in this context simply means no\nother build files depend on this rule. User discretion is needed to make the\nfinal call whether an unused build rule listed here should be pruned.\n\n```\nList all unused go_get rules.\n    $ wollemi rules unused --kind go_get\n\nList all unused rules under the routes directory.\n    $ wollemi rules unused project/service/routes/...\n\nList all unused rules except those under k8s and third_party.\n    $ wollemi rules unused --exclude k8s,third_party\n\nPrune unused third_party go_get rules.\n    $ wollemi rules unused --prune --kind go_get third_party/go/...\n```\n\n### Symlink List\nLists and optionally prunes project symlinks. Listed symlinks can be filtered\nwith --broken in which case only broken symlinks are shown, --name in which\ncase only symlinks with a name matching the provided pattern will be shown.\nFor information on what the --name pattern can contain see go doc\npath/filepath.Match. Listed symlinks can also be filtered using --exclude\nin which case only symlinks which do not have the excluded prefix will be\nshown. The --prune flag can be added to any list in which case listed symlinks\nare deleted.\n\n```\nList all symlinks under the routes directory.\n    $ wollemi symlink list project/service/routes/...\n\nList only symlinks in a specific directory.\n    $ wollemi symlink list project/service/routes\n\nList all symlinks in the GOPATH. (excludes working directory)\n    $ wollemi symlink list --go-path\n\nList all broken symlinks.\n    $ wollemi symlink list --broken\n\nList all go_mock symlinks under the routes directory.\n    $ wollemi symlink list --name *.mg.go project/service/routes/...\n\nPrune all go_mock symlinks under the routes directory.\n    $ wollemi symlink list --prune --name *.mg.go project/service/routes/...\n```\n\n### Symlink Go Path\nSymlinks third party dependencies into the go path. Symlinks will not be created\nwhen there are existing files in the symlink path. Instead the command will\nissue warnings where symlink creation was not possible. When deletion of these\nfiles is acceptable the --force flag can be used to force symlink creation by\nfirst removing the existing files preventing the symlink creation.\n\n```\nSymlink all imported third party deps under the routes directory into the go path.\n    $ wollemi symlink go-path project/service/routes/...\n\nSymlink all third party deps for specific package into the go path.\n    $ wollemi symlink go-path project/service/routes\n```\n\n---\n\n### Configuration\n\nThe following is an example of a valid `.wollemi.json` config file.\n```\n{\n  \"default_visibility\": \"//project/service/routes/...\",\n  \"allow_unresolved_dependency\": true,\n  \"explicit_sources\": true,\n  \"known_dependency\": {\n    \"github.com/olivere/elastic\": \"//third_party/go/github.com/olivere/elastic:v7\"\n  },\n  \"gofmt\": {\n    \"rewrite\": true,\n    \"create\": [\"go_binary\", \"go_library\", \"go_test\"],\n    \"manage\": [\"default\", \"go_custom_binary\"]\n    \"mapped\": {\n      \"go_test\": \"go_custom_test\"\n    }\n  }\n}\n```\n\nThese config files may be placed in any directory and the settings defined apply\nto the package that contains the config file as well as to all sub directory\npackages.\n\n```\nfoo\n├── .plzconfig\n├── .wollemi.json\n├── BUILD.plz\n└── bar\n    ├── .wollemi.json\n    ├── BUILD.plz\n    ├── bar.go\n    └── baz\n        ├── BUILD.plz\n        └── baz.go\n```\n\nFor example, given the package layout above, the config defined in `foo` would\napply to package `foo` as well as packages `bar` and `baz`. In addition, a\nconfig file defined in `bar` inherits settings from the config in `foo`. This\nenables the config in `bar` to either override or extend the inherited config.\nIf the config in bar sets `default_visibility` then it overrides the previous\n`default_visibility` whereas each `known_dependency` key value defined either\noverrides or adds to the inherited `known_dependency` mapping. This inheritance\ncontinues up the directory chain and stops at the please root directory which\nis identified by the existence of a `.plzconfig` file.\n\nThe `wollemi gofmt` `--create`, `--manage` and `--mapped` flags, when explicitly\nset will override any configuration found on disk.\n\n##### `default_visibility`\n  When set all rules created by `wollemi gofmt` will be created using this\n  visibility. This does not effect the visibility of any existing rules.\n\n##### `allow_unresolved_dependency`\n  Whenever `wollemi gofmt` encounters a dependency it's unable to resolve it logs\n  a warning and skips rewriting the rules which required the dependency. When\n  this flag is set it unresolved depencies are ignored.\n\n##### `explicit_sources`\n  Whenever `wollemi gofmt` creates a new rule it uses glob patterns to define\n  a rules srcs. When this flag is set all new rules, as well as all existing\n  rules, will explicitly list every src file instead of using glob patterns.\n\n##### `known_dependency`\n  Whenever `wollemi gofmt` encounters a dependency it cannot resolve it checks\n  to see if a `known_dependency` was manually defined. If a manually defined\n  mapping can be found it recovers using the target defined.\n\n##### `gofmt.rewrite`\n  Allows `wollemi gofmt` to create new rules and or managing the src files and\n  dependencies of existing rules. This is enabled by default but could be\n  disabled on a per package basis.\n\n##### `gofmt.create`\n  Whitelist of rule kinds allowed to be created by `wollemi gofmt`. By default\n  this is `[\"go_binary\", \"go_library\", \"go_test\"]`. This can be completely\n  disabled by setting it to `[]` or `\"off\"`. Alternatively this can be\n  re-enabled in a child package by setting it to `\"on\"`, `\"default\"` or some\n  other subset of the default.\n\n##### `gofmt.manage`\n  Whitelist of rule kinds allowed to be managed by `wollemi gofmt`. Manage in\n  this context means updating an existing rules srcs and/or dependencies\n  according to the golang source files. By default this is set to\n  `[\"go_binary\", \"go_library\", \"go_test\"]`. This can be completely disabled by\n  setting it to `[]` or `\"off\"`. Alternatively this can be re-enabled in a\n  child package by setting it to `\"on\"`, `\"default\"`, some other list. The\n  keyword `\"default\"` within a list will expand to the original default managed\n  rules. Therefore the list `[\"default\", \"my_custom_rule\"]` is shorthand for\n  `[\"go_binary\", \"go_library\", \"go_test\", \"my_custom_rule\"]`.\n\n##### `gofmt.mapped`\n  This setting maps standard go rules such as `go_binary`, `go_library` and\n  `go_test` to custom go rules. For example, you might define a mapping from\n  `go_test` to `go_custom_test`. Defining a mapping like this has two effects.\n  First, whenever `wollemi gofmt` determines a package contains go test files\n  but lacks a test rule it will create one using `go_custom_test` instead of\n  `go_test`. Second, `wollemi gofmt` will manage existing `go_custom_test` rules\n  as if they were `go_test` rules instead.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftcncloud%2Fwollemi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftcncloud%2Fwollemi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftcncloud%2Fwollemi/lists"}