yesod-mirror/tools/vscode/defs.bzl

102 lines
3.4 KiB
Python
Raw Normal View History

def _vsce_extension_impl(ctx):
out_file = ctx.outputs.out
tool = ctx.executable.tool
# Runfiles
# We need to make sure the tool's runfiles are available.
# ctx.actions.run_shell tools arg handles this.
# Shell script using environment variables to avoid python format issues
script = """
set -e
# Setup staging directory
mkdir -p staging/out
# Copy source files
for src in $SRCS; do
cp "$src" "staging/$(basename "$src")"
done
# Copy extension artifacts
for ext in $EXT_JS; do
cp "$ext" "staging/out/"
done
# Disable vscode:prepublish
sed -i.bak 's/"vscode:prepublish"/"vscode:ignore"/g' staging/package.json
rm staging/package.json.bak
# Create dummy secretlint modules
DUMMY_CONTENT='
const creator = {
meta: {
id: "dummy",
recommended: true,
type: "scanner",
supportedContentTypes: []
},
create(context) { return {}; }
};
module.exports = { creator };
'
mkdir -p staging/node_modules/@secretlint/secretlint-rule-preset-recommend
echo "$DUMMY_CONTENT" > staging/node_modules/@secretlint/secretlint-rule-preset-recommend/index.js
echo '{"main": "index.js", "name": "@secretlint/secretlint-rule-preset-recommend", "version": "1.0.0"}' > staging/node_modules/@secretlint/secretlint-rule-preset-recommend/package.json
mkdir -p staging/node_modules/@secretlint/secretlint-rule-no-dotenv
echo "$DUMMY_CONTENT" > staging/node_modules/@secretlint/secretlint-rule-no-dotenv/index.js
echo '{"main": "index.js", "name": "@secretlint/secretlint-rule-no-dotenv", "version": "1.0.0"}' > staging/node_modules/@secretlint/secretlint-rule-no-dotenv/package.json
# Create dummy formatter
mkdir -p staging/node_modules/@secretlint/secretlint-formatter-sarif
echo "module.exports = function(results){return JSON.stringify({version: '2.1.0', runs: []});}" > staging/node_modules/@secretlint/secretlint-formatter-sarif/index.js
echo '{"main": "index.js", "name": "@secretlint/secretlint-formatter-sarif", "version": "1.0.0"}' > staging/node_modules/@secretlint/secretlint-formatter-sarif/package.json
# Tool path (execroot relative)
# We need absolute path or correctly relative path when we cd into staging.
# $VSCE_TOOL is relative to execroot.
# $PWD is execroot.
TOOL_PATH="$PWD/$VSCE_TOOL"
# Setup environment
export NODE_PATH="$PWD/staging/node_modules:${NODE_PATH:-}"
export BAZEL_BINDIR=.
# Execute vsce
cd staging
"$TOOL_PATH" package --out "../$OUT_PATH" --no-dependencies --skip-license --allow-missing-repository
"""
ctx.actions.run_shell(
outputs = [out_file],
inputs = ctx.files.srcs + ctx.files.extension_js + ctx.files.data,
tools = [tool],
command = script,
mnemonic = "VscePackage",
progress_message = "Packaging VSCode extension...",
env = {
"SRCS": " ".join([f.path for f in ctx.files.srcs]),
"EXT_JS": " ".join([f.path for f in ctx.files.extension_js]),
"VSCE_TOOL": tool.path,
"OUT_PATH": out_file.path,
},
)
return [DefaultInfo(files = depset([out_file]))]
vsce_extension = rule(
implementation = _vsce_extension_impl,
attrs = {
"srcs": attr.label_list(allow_files = True),
"extension_js": attr.label_list(allow_files = True),
"data": attr.label_list(allow_files = True),
"out": attr.output(mandatory = True),
"tool": attr.label(
executable = True,
cfg = "exec",
default = Label("//tools/vscode:vsce_tool"),
),
},
)