113 lines
3.4 KiB
Python
113 lines
3.4 KiB
Python
load("@npm//svelte-check:index.bzl", _svelte_check = "svelte_check_test")
|
|
load("@build_bazel_rules_nodejs//:providers.bzl", "DeclarationInfo", "declaration_info")
|
|
load("@io_bazel_rules_sass//:defs.bzl", "SassInfo")
|
|
load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
|
|
load("@bazel_skylib//lib:paths.bzl", "paths")
|
|
|
|
def _get_declarations(dep):
|
|
if SassInfo in dep:
|
|
return dep[SassInfo].transitive_sources
|
|
elif DeclarationInfo in dep:
|
|
return dep[DeclarationInfo].transitive_declarations
|
|
else:
|
|
fail("unexpected dep", dep)
|
|
|
|
def _svelte(ctx):
|
|
args = ctx.actions.args()
|
|
args.use_param_file("@%s", use_always = True)
|
|
args.set_param_file_format("multiline")
|
|
|
|
# path to bin folder, for sass
|
|
args.add(ctx.var["BINDIR"])
|
|
args.add(ctx.var["GENDIR"])
|
|
|
|
# svelte and ts sources
|
|
outputs = []
|
|
dts_only = []
|
|
nondts_only = []
|
|
for src in ctx.files.srcs:
|
|
args.add(src.path)
|
|
|
|
if src.path.endswith(".svelte"):
|
|
# strip off external/ankidesktop if invoked from external workspace
|
|
path = src.path
|
|
if src.path.startswith("external/ankidesktop/"):
|
|
path = path[len("external/ankidesktop/"):]
|
|
|
|
# strip off package prefix, eg ts/editor/mathjax/Foo.svelte -> mathjax/Foo.svelte
|
|
base = path[len(ctx.label.package) + 1:]
|
|
for ext in ("d.ts", "css", "mjs"):
|
|
out = ctx.actions.declare_file(base.replace(".svelte", ".svelte." + ext))
|
|
args.add(out)
|
|
outputs.append(out)
|
|
if ext == "d.ts":
|
|
dts_only.append(out)
|
|
else:
|
|
nondts_only.append(out)
|
|
|
|
# dependencies
|
|
deps = depset([], transitive = [_get_declarations(dep) for dep in ctx.attr.deps])
|
|
args.add_all(deps)
|
|
|
|
ctx.actions.run(
|
|
execution_requirements = {"supports-workers": "1"},
|
|
executable = ctx.executable._svelte_bin,
|
|
outputs = outputs,
|
|
inputs = ctx.files.srcs + deps.to_list(),
|
|
mnemonic = "Svelte",
|
|
progress_message = "Compiling Svelte {}:{}".format(ctx.label.package, ctx.attr.name),
|
|
arguments = [args],
|
|
)
|
|
|
|
return [
|
|
declaration_info(depset(dts_only), deps = ctx.attr.deps),
|
|
DefaultInfo(
|
|
files = depset(nondts_only),
|
|
runfiles = ctx.runfiles(files = outputs, transitive_files = deps),
|
|
),
|
|
]
|
|
|
|
svelte = rule(
|
|
implementation = _svelte,
|
|
attrs = {
|
|
"srcs": attr.label_list(allow_files = True, doc = ".ts and .svelte files"),
|
|
"deps": attr.label_list(),
|
|
"_svelte_bin": attr.label(
|
|
default = Label("//ts/svelte:svelte_bin"),
|
|
executable = True,
|
|
cfg = "host",
|
|
),
|
|
},
|
|
)
|
|
|
|
def compile_svelte(name = "svelte", srcs = None, deps = [], visibility = ["//visibility:private"], repo="npm"):
|
|
if not srcs:
|
|
srcs = native.glob([
|
|
"**/*.svelte",
|
|
"**/*.ts",
|
|
])
|
|
|
|
svelte(
|
|
name = name,
|
|
srcs = srcs,
|
|
deps = deps + [
|
|
"@{}//svelte2tsx".format(repo),
|
|
],
|
|
visibility = visibility,
|
|
)
|
|
|
|
def svelte_check(name = "svelte_check", srcs = []):
|
|
_svelte_check(
|
|
name = name,
|
|
args = [
|
|
"--workspace",
|
|
native.package_name(),
|
|
"--fail-on-warnings",
|
|
"--fail-on-hints",
|
|
],
|
|
data = [
|
|
"@npm//sass",
|
|
] + srcs,
|
|
env = {"SASS_PATH": "sass"},
|
|
)
|