@jq.bzl//jq:jq.bzl
Load in your BUILD file with:
load("@jq.bzl", "jq")
Examples
Create a new file bazel-out/.../no_srcs.json containing some JSON data:
jq( name = "no_srcs", srcs = [], filter = ".name = "Alice"", )
Remove a field from package.json:
The output path
bazel-out/.../package.jsonmatches the path of the source file,
which means you must refer to the label:no_dev_depsto reference the output,
since Bazel doesn't provide a label for an output file that collides with an input file.
jq( name = "no_dev_deps", srcs = ["package.json"], out = "package.json", filter = "del(.devDependencies)", )
Merge data from bar.json on top of foo.json, producing foobar.json:
jq( name = "merged", srcs = ["foo.json", "bar.json"], filter = ".[0] * .[1]", args = ["--slurp"], out = "foobar.json", )
Long filters can be split over several lines with comments:
jq( name = "complex", srcs = ["a.json", "b.json"], filter = """ .[0] as $a # Take select fields from b.json | (.[1] | {foo, bar, tags}) as $b # Merge b onto a | ($a * $b) # Combine 'tags' array from both | .tags = ($a.tags + $b.tags) # Add new field + {\"aspect_is_cool\": true} """, args = ["--slurp"], )
Load filter from a file filter.jq, making it easier to edit complex filters:
jq( name = "merged", srcs = ["foo.json", "bar.json"], filter_file = "filter.jq", args = ["--slurp"], out = "foobar.json", )
Convert genquery output to JSON.
genquery( name = "deps", expression = "deps(//some:target)", scope = ["//some:target"], ) jq( name = "deps_json", srcs = [":deps"], args = [ "--raw-input", "--slurp", ], filter = "{ deps: split(\"\\n\") | map(select(. | length > 0)) }", )
When Bazel is run with --stamp, replace some properties with version control info:
jq( name = "stamped", srcs = ["package.json"], filter = "|".join([ # Don't directly reference $STAMP as it's only set when stamping # This 'as' syntax results in $stamp being null in unstamped builds. "$ARGS.named.STAMP as $stamp", # Provide a default using the "alternative operator" in case $stamp is null. ".version = ($stamp[0].BUILD_EMBED_LABEL // "<unstamped>")", ]), )
jq is exposed as a "Make variable", so you could use it directly from a genrule by referencing the toolchain.
genrule( name = "case_genrule", srcs = ["a.json"], outs = ["genrule_output.json"], cmd = "$(JQ_BIN) '.' $(location a.json) > $@", toolchains = ["@jq_toolchains//:resolved_toolchain"], )
Functions & Macros
jqInvoke jq with a filter on a set of json input files.
Parameters
*name | Name of the rule |
*srcs | List of input files. May be empty. |
filter | Filter expression (https://stedolan.github.io/jq/manual/#Basicfilters). Be careful to write the filter so that it handles unstamped builds, as in the example above. Default: None |
filter_file | File containing filter expression (alternative to Default: None |
args | Additional args to pass to jq Default: [] |
out | Name of the output json file; defaults to the rule name plus ".json" Default: None |
data | List of additional files. May be empty. Default: [] |
expand_args | Run bazel's location and make variable expansion on the args. Default: False |
kwargs | Other common named parameters such as |
Rules
jq_ruleMost users should use the jq macro instead.
| Attribute | Type | Description |
|---|---|---|
*name | name | A unique name for this target. |
*srcs | list of labels | |
data | list of labels | Default: [] |
filter | string | Default: "" |
filter_file | label | Default: None |
args | list of strings | Default: [] |
expand_args | boolean | Default: False |
out | label | Default: None |
stamp | integer | Whether to encode build information into the output. Possible values:
Default: -1 |