ea7611d8cc
The separate repo made it difficult to update the rules, and made things more complicated than they needed to be.
104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
load("@npm//svelte-check:index.bzl", _svelte_check = "svelte_check_test")
|
|
|
|
"Implementation of the svelte rule"
|
|
|
|
load("@build_bazel_rules_nodejs//:providers.bzl", "declaration_info")
|
|
|
|
SvelteFilesInfo = provider("transitive_sources")
|
|
|
|
def get_transitive_srcs(srcs, deps):
|
|
return depset(
|
|
srcs,
|
|
transitive = [dep[SvelteFilesInfo].transitive_sources for dep in deps],
|
|
)
|
|
|
|
def _svelte(ctx):
|
|
base = ctx.attr.name + ".svelte"
|
|
temp = ctx.actions.declare_directory(base + ".temp")
|
|
temptsx = temp.path + "/" + base + ".tsx"
|
|
ctx.actions.run_shell(
|
|
mnemonic = "Svelte",
|
|
command = """\
|
|
{svelte} {input} {output_js} {temp} && \
|
|
{tsc} {tsc_args} {temptsx} {shims} && \
|
|
mv {temp}/{base}.d.ts {output_def} && \
|
|
rm {temptsx}""".format(
|
|
svelte = ctx.executable._svelte.path,
|
|
input = ctx.file.entry_point.path,
|
|
output_js = ctx.outputs.build.path,
|
|
tsc = ctx.executable._typescript.path,
|
|
output_def = ctx.outputs.buildDef.path,
|
|
temp = temp.path,
|
|
temptsx = temptsx,
|
|
base = base,
|
|
tsc_args = "--jsx preserve --emitDeclarationOnly --declaration --skipLibCheck",
|
|
shims = " ".join([f.path for f in ctx.files._shims]),
|
|
),
|
|
outputs = [ctx.outputs.build, ctx.outputs.buildDef, temp],
|
|
inputs = [ctx.file.entry_point] + ctx.files._shims,
|
|
tools = [ctx.executable._svelte, ctx.executable._typescript],
|
|
)
|
|
|
|
trans_srcs = get_transitive_srcs(ctx.files.srcs + [ctx.outputs.build, ctx.outputs.buildDef], ctx.attr.deps)
|
|
|
|
return [
|
|
declaration_info(depset([ctx.outputs.buildDef]), deps = [ctx.attr._shims]),
|
|
SvelteFilesInfo(transitive_sources = trans_srcs),
|
|
DefaultInfo(files = trans_srcs),
|
|
]
|
|
|
|
svelte = rule(
|
|
implementation = _svelte,
|
|
attrs = {
|
|
"entry_point": attr.label(allow_single_file = True),
|
|
"deps": attr.label_list(),
|
|
"srcs": attr.label_list(allow_files = True),
|
|
"_svelte": attr.label(
|
|
default = Label("//ts/svelte:svelte"),
|
|
executable = True,
|
|
cfg = "host",
|
|
),
|
|
"_typescript": attr.label(
|
|
default = Label("//ts/svelte:typescript"),
|
|
executable = True,
|
|
cfg = "host",
|
|
),
|
|
"_shims": attr.label(
|
|
default = Label("@npm//svelte2tsx:svelte2tsx__typings"),
|
|
allow_files = True,
|
|
),
|
|
},
|
|
outputs = {
|
|
"build": "%{name}.svelte.mjs",
|
|
"buildDef": "%{name}.svelte.d.ts",
|
|
},
|
|
)
|
|
|
|
def compile_svelte(name, srcs):
|
|
for src in srcs:
|
|
svelte(
|
|
name = src.replace(".svelte", ""),
|
|
entry_point = src,
|
|
)
|
|
|
|
native.filegroup(
|
|
name = name,
|
|
srcs = srcs,
|
|
)
|
|
|
|
def svelte_check(name = "svelte_check", srcs = []):
|
|
_svelte_check(
|
|
name = name,
|
|
args = [
|
|
"--workspace",
|
|
native.package_name(),
|
|
],
|
|
data = [
|
|
"//ts:tsconfig.json",
|
|
"//ts/lib",
|
|
"//ts/lib:backend_proto",
|
|
"@npm//sass",
|
|
] + srcs,
|
|
link_workspace_root = True,
|
|
)
|