199 lines
5.8 KiB
Python
199 lines
5.8 KiB
Python
"""Dev-session rules for Bun-backed Wails apps."""
|
|
|
|
load("//wails:private/common.bzl", "bash_launcher")
|
|
|
|
def _shell_quote(value):
|
|
return "'" + value.replace("'", "'\"'\"'") + "'"
|
|
|
|
def _absolute_label(label_package, name):
|
|
if label_package:
|
|
return "//%s:%s" % (label_package, name)
|
|
return "//:%s" % name
|
|
|
|
def _wails_bun_watch_run_impl(ctx):
|
|
launcher = ctx.actions.declare_file(ctx.label.name)
|
|
|
|
resolve_lines = """
|
|
tool="$(resolve_runfile "{tool_short_path}")"
|
|
binary="$(resolve_runfile "{binary_short_path}")"
|
|
build_assets="$(resolve_runfile "{build_assets_short_path}")"
|
|
bindings=""
|
|
if [[ -n "{bindings_short_path}" ]]; then
|
|
bindings="$(resolve_runfile "{bindings_short_path}")"
|
|
fi
|
|
icon=""
|
|
if [[ -n "{icon_short_path}" ]]; then
|
|
icon="$(resolve_runfile "{icon_short_path}")"
|
|
fi
|
|
""".format(
|
|
tool_short_path = ctx.executable._tool.short_path,
|
|
binary_short_path = ctx.executable.binary.short_path,
|
|
build_assets_short_path = ctx.files.build_assets[0].short_path,
|
|
bindings_short_path = ctx.executable.bindings.short_path if ctx.executable.bindings else "",
|
|
icon_short_path = ctx.file.icon.short_path if ctx.file.icon else "",
|
|
)
|
|
|
|
binding_command = ""
|
|
if ctx.executable.bindings:
|
|
binding_command = "\"$bindings\"\n"
|
|
|
|
command_lines = """
|
|
{binding_command}exec "$tool" \
|
|
--binary "$binary" \
|
|
--build-assets "$build_assets" \
|
|
--frontend-url {frontend_url} \
|
|
--icon "$icon" \
|
|
--mode 'dev'
|
|
""".format(
|
|
binding_command = binding_command,
|
|
frontend_url = _shell_quote(ctx.attr.frontend_url),
|
|
)
|
|
|
|
ctx.actions.write(
|
|
output = launcher,
|
|
is_executable = True,
|
|
content = bash_launcher(resolve_lines, command_lines),
|
|
)
|
|
|
|
transitive_files = [
|
|
ctx.attr._tool[DefaultInfo].default_runfiles.files,
|
|
ctx.attr.binary[DefaultInfo].default_runfiles.files,
|
|
]
|
|
files = [
|
|
ctx.executable._tool,
|
|
ctx.executable.binary,
|
|
] + ctx.files.build_assets + ([ctx.file.icon] if ctx.file.icon else [])
|
|
|
|
if ctx.attr.bindings:
|
|
transitive_files.append(ctx.attr.bindings[DefaultInfo].default_runfiles.files)
|
|
files.append(ctx.executable.bindings)
|
|
|
|
runfiles = ctx.runfiles(
|
|
files = files,
|
|
transitive_files = depset(transitive = transitive_files),
|
|
)
|
|
|
|
return [DefaultInfo(executable = launcher, runfiles = runfiles)]
|
|
|
|
_wails_bun_watch_run = rule(
|
|
implementation = _wails_bun_watch_run_impl,
|
|
attrs = {
|
|
"binary": attr.label(
|
|
mandatory = True,
|
|
executable = True,
|
|
cfg = "target",
|
|
),
|
|
"bindings": attr.label(
|
|
executable = True,
|
|
cfg = "target",
|
|
),
|
|
"build_assets": attr.label(
|
|
mandatory = True,
|
|
allow_files = True,
|
|
),
|
|
"frontend_url": attr.string(default = "http://127.0.0.1:9245"),
|
|
"icon": attr.label(allow_single_file = True),
|
|
"_tool": attr.label(
|
|
default = "//wails/tools:launch_app",
|
|
cfg = "exec",
|
|
executable = True,
|
|
),
|
|
},
|
|
executable = True,
|
|
)
|
|
|
|
def _wails_bun_dev_session_impl(ctx):
|
|
launcher = ctx.actions.declare_file(ctx.label.name)
|
|
resolve_lines = """
|
|
tool="$(resolve_runfile "{tool_short_path}")"
|
|
frontend_dev="$(resolve_runfile "{frontend_dev_short_path}")"
|
|
""".format(
|
|
tool_short_path = ctx.executable._tool.short_path,
|
|
frontend_dev_short_path = ctx.executable.frontend_dev.short_path,
|
|
)
|
|
|
|
command_lines = """
|
|
exec "$tool" \
|
|
--frontend-dev "$frontend_dev" \
|
|
--frontend-url {frontend_url} \
|
|
--watch-target {watch_target} \
|
|
--workspace-dir {workspace_dir}
|
|
""".format(
|
|
frontend_url = _shell_quote(ctx.attr.frontend_url),
|
|
watch_target = _shell_quote(ctx.attr.watch_target),
|
|
workspace_dir = _shell_quote(ctx.attr.workspace_dir),
|
|
)
|
|
|
|
ctx.actions.write(
|
|
output = launcher,
|
|
is_executable = True,
|
|
content = bash_launcher(resolve_lines, command_lines),
|
|
)
|
|
|
|
runfiles = ctx.runfiles(
|
|
files = [
|
|
ctx.executable._tool,
|
|
ctx.executable.frontend_dev,
|
|
],
|
|
transitive_files = depset(transitive = [
|
|
ctx.attr._tool[DefaultInfo].default_runfiles.files,
|
|
ctx.attr.frontend_dev[DefaultInfo].default_runfiles.files,
|
|
]),
|
|
)
|
|
|
|
return [DefaultInfo(executable = launcher, runfiles = runfiles)]
|
|
|
|
_wails_bun_dev_session_rule = rule(
|
|
implementation = _wails_bun_dev_session_impl,
|
|
attrs = {
|
|
"frontend_dev": attr.label(
|
|
mandatory = True,
|
|
executable = True,
|
|
cfg = "target",
|
|
),
|
|
"frontend_url": attr.string(default = "http://127.0.0.1:9245"),
|
|
"watch_target": attr.string(mandatory = True),
|
|
"workspace_dir": attr.string(default = "."),
|
|
"_tool": attr.label(
|
|
default = "//wails_bun/tools:bun_dev_session",
|
|
cfg = "exec",
|
|
executable = True,
|
|
),
|
|
},
|
|
executable = True,
|
|
)
|
|
|
|
def wails_bun_dev_session(
|
|
name,
|
|
workspace_dir,
|
|
frontend_dev,
|
|
app_binary,
|
|
build_assets,
|
|
bindings_target = None,
|
|
icon = None,
|
|
frontend_url = "http://127.0.0.1:9245",
|
|
tags = None,
|
|
visibility = None):
|
|
watch_name = name + "_watch"
|
|
|
|
_wails_bun_watch_run(
|
|
name = watch_name,
|
|
binary = app_binary,
|
|
bindings = bindings_target,
|
|
build_assets = build_assets,
|
|
frontend_url = frontend_url,
|
|
icon = icon,
|
|
tags = ["manual"],
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
|
|
_wails_bun_dev_session_rule(
|
|
name = name,
|
|
frontend_dev = frontend_dev,
|
|
frontend_url = frontend_url,
|
|
tags = tags,
|
|
visibility = visibility,
|
|
watch_target = _absolute_label(native.package_name(), watch_name),
|
|
workspace_dir = workspace_dir,
|
|
)
|